Quantcast

Hell of an update! Legion version is here

Darthpred [07-19-16 - 11:48]
Hell of an update! Legion version is here
Filename
ElvUI_SLE/Bindings.xml
ElvUI_SLE/ElvUI_SLE.toc
ElvUI_SLE/LICENSE.txt
ElvUI_SLE/core/communicate.lua
ElvUI_SLE/core/core.lua
ElvUI_SLE/core/dropdown.lua
ElvUI_SLE/core/elvprot.lua
ElvUI_SLE/core/gameMenu.lua
ElvUI_SLE/core/globals.lua
ElvUI_SLE/core/install.lua
ElvUI_SLE/core/installer/BigWigs.lua
ElvUI_SLE/core/installer/BigWigsFights.lua
ElvUI_SLE/core/installer/BigWigsIcon.lua
ElvUI_SLE/core/installer/Clique.lua
ElvUI_SLE/core/installer/Hermes.lua
ElvUI_SLE/core/installer/Skada.lua
ElvUI_SLE/core/installer/installer.lua
ElvUI_SLE/core/installer/load_install.xml
ElvUI_SLE/core/installer/xCT+.lua
ElvUI_SLE/core/load_core.xml
ElvUI_SLE/core/media.lua
ElvUI_SLE/core/modules.lua
ElvUI_SLE/core/staticpopups.lua
ElvUI_SLE/core/test.lua
ElvUI_SLE/core/toolkit.lua
ElvUI_SLE/core/toolsRu.lua
ElvUI_SLE/defaults/private.lua
ElvUI_SLE/defaults/profile.lua
ElvUI_SLE/libs/AceAddon-3.0/AceAddon-3.0.lua
ElvUI_SLE/libs/AceAddon-3.0/AceAddon-3.0.xml
ElvUI_SLE/libs/AceConfig-3.0/AceConfig-3.0.lua
ElvUI_SLE/libs/AceConfig-3.0/AceConfig-3.0.xml
ElvUI_SLE/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
ElvUI_SLE/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml
ElvUI_SLE/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
ElvUI_SLE/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml
ElvUI_SLE/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
ElvUI_SLE/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml
ElvUI_SLE/libs/AceConsole-3.0/AceConsole-3.0.lua
ElvUI_SLE/libs/AceConsole-3.0/AceConsole-3.0.xml
ElvUI_SLE/libs/AceDB-3.0/AceDB-3.0.lua
ElvUI_SLE/libs/AceDB-3.0/AceDB-3.0.xml
ElvUI_SLE/libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
ElvUI_SLE/libs/AceDBOptions-3.0/AceDBOptions-3.0.xml
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets.toc
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Changelog-AceGUI-3.0-SharedMediaWidgets-r52-release.txt
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/AceGUI-3.0.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/AceGUI-3.0.xml
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-SimpleGroup.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/LibStub/LibStub.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/LibStub/LibStub.toc
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/widget.xml
ElvUI_SLE/libs/AceGUI-3.0/AceGUI-3.0.lua
ElvUI_SLE/libs/AceGUI-3.0/AceGUI-3.0.xml
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-SimpleGroup.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
ElvUI_SLE/libs/LibAnim/LibAnim.lua
ElvUI_SLE/libs/LibAnim/LibAnim.toc
ElvUI_SLE/libs/LibElv-GameMenu-1.0/LibElv-GameMenu-1.0.lua
ElvUI_SLE/libs/LibElv-GameMenu-1.0/LibElv-GameMenu-1.0.toc
ElvUI_SLE/libs/LibElv-UIButtons-1.0/LibElv-UIButtons-1.0.lua
ElvUI_SLE/libs/LibElv-UIButtons-1.0/locales/english.lua
ElvUI_SLE/libs/LibElv-UIButtons-1.0/locales/russian.lua
ElvUI_SLE/libs/LibFishing-1.0/LibFishing-1.0.lua
ElvUI_SLE/libs/LibFishing-1.0/lib.xml
ElvUI_SLE/libs/LibTourist-3.0/Changelog-LibTourist-3.0-r181.txt
ElvUI_SLE/libs/LibTourist-3.0/LICENSE.txt
ElvUI_SLE/libs/LibTourist-3.0/LibTourist-3.0.lua
ElvUI_SLE/libs/LibTourist-3.0/LibTourist-3.0.toc
ElvUI_SLE/libs/LibTourist-3.0/lib.xml
ElvUI_SLE/libs/load_libs.xml
ElvUI_SLE/libs/oUF_NecroStrike/oUF_NecroStrike.lua
ElvUI_SLE/libs/oUF_NecroStrike/oUF_NecroStrike.toc
ElvUI_SLE/libs/oUF_OfflineSLE/oUF_OfflineSLE.lua
ElvUI_SLE/libs/oUF_OfflineSLE/oUF_OfflineSLE.toc
ElvUI_SLE/locales/english.lua
ElvUI_SLE/locales/russian.lua
ElvUI_SLE/media/fonts/KellySlab.ttf
ElvUI_SLE/media/fonts/Lobster.ttf
ElvUI_SLE/media/fonts/Neucha.ttf
ElvUI_SLE/media/fonts/RussoOne.ttf
ElvUI_SLE/media/fonts/StalinistOne.ttf
ElvUI_SLE/media/fonts/UbuntuCondensed.ttf
ElvUI_SLE/media/sharedmedia.lua
ElvUI_SLE/media/textures/Achievement_small.blp
ElvUI_SLE/media/textures/BuiOnePixel.tga
ElvUI_SLE/media/textures/Chat_RPG.blp
ElvUI_SLE/media/textures/Daily.blp
ElvUI_SLE/media/textures/Factions.blp
ElvUI_SLE/media/textures/Flightmaster.blp
ElvUI_SLE/media/textures/Legendary.blp
ElvUI_SLE/media/textures/NewQuestMinimize.blp
ElvUI_SLE/media/textures/Ohi_Dragon.blp
ElvUI_SLE/media/textures/Ohi_Dragon2.blp
ElvUI_SLE/media/textures/Ohi_MetalPlate.blp
ElvUI_SLE/media/textures/Ohi_MetalSheet.blp
ElvUI_SLE/media/textures/Ohi_Tribal4.blp
ElvUI_SLE/media/textures/Portal_Blue.blp
ElvUI_SLE/media/textures/Portal_Red.blp
ElvUI_SLE/media/textures/Quest.blp
ElvUI_SLE/media/textures/SVUI-StateIcon.blp
ElvUI_SLE/media/textures/Skull.blp
ElvUI_SLE/media/textures/Skull_Event.blp
ElvUI_SLE/media/textures/Swords.blp
ElvUI_SLE/media/textures/Swords_Event.blp
ElvUI_SLE/media/textures/WH.blp
ElvUI_SLE/media/textures/Weekly.blp
ElvUI_SLE/media/textures/adapt.blp
ElvUI_SLE/media/textures/bl_logo.blp
ElvUI_SLE/media/textures/chat_1.blp
ElvUI_SLE/media/textures/outfitter.blp
ElvUI_SLE/modules/AddOnSkins.lua
ElvUI_SLE/modules/Armory/CharacterArmory/CharacterArmory.lua
ElvUI_SLE/modules/Armory/Config.lua
ElvUI_SLE/modules/Armory/Constants.lua
ElvUI_SLE/modules/Armory/InspectArmory/Communication.lua
ElvUI_SLE/modules/Armory/InspectArmory/InspectArmory.lua
ElvUI_SLE/modules/Armory/InspectArmory/NotifyInspect.lua
ElvUI_SLE/modules/Armory/KnightFrame.lua
ElvUI_SLE/modules/actionbars.lua
ElvUI_SLE/modules/afk.lua
ElvUI_SLE/modules/auras.lua
ElvUI_SLE/modules/autorelease.lua
ElvUI_SLE/modules/backgrounds.lua
ElvUI_SLE/modules/baginfo.lua
ElvUI_SLE/modules/bags.lua
ElvUI_SLE/modules/blizzard.lua
ElvUI_SLE/modules/chat.lua
ElvUI_SLE/modules/chat/chat.lua
ElvUI_SLE/modules/chat/dpsSpam.lua
ElvUI_SLE/modules/chat/history.lua
ElvUI_SLE/modules/chat/load_chat.xml
ElvUI_SLE/modules/chat/tabs.lua
ElvUI_SLE/modules/dashboard/dashboard.lua
ElvUI_SLE/modules/dashboard/datapanels/bags.lua
ElvUI_SLE/modules/dashboard/datapanels/durability.lua
ElvUI_SLE/modules/dashboard/datapanels/fps.lua
ElvUI_SLE/modules/dashboard/datapanels/ms.lua
ElvUI_SLE/modules/dashboard/load_dashboard.xml
ElvUI_SLE/modules/databars/artifact.lua
ElvUI_SLE/modules/databars/databars.lua
ElvUI_SLE/modules/databars/exp.lua
ElvUI_SLE/modules/databars/honor.lua
ElvUI_SLE/modules/databars/load_databars.xml
ElvUI_SLE/modules/databars/rep.lua
ElvUI_SLE/modules/datatexts.lua
ElvUI_SLE/modules/elvConfig.lua
ElvUI_SLE/modules/equipmanager.lua
ElvUI_SLE/modules/errorframe.lua
ElvUI_SLE/modules/exprepbar.lua
ElvUI_SLE/modules/farm.lua
ElvUI_SLE/modules/garrison.lua
ElvUI_SLE/modules/lfr.lua
ElvUI_SLE/modules/load_modules.xml
ElvUI_SLE/modules/loot.lua
ElvUI_SLE/modules/minimap/instance.lua
ElvUI_SLE/modules/minimap/load_minimap.xml
ElvUI_SLE/modules/minimap/locationbar.lua
ElvUI_SLE/modules/minimap/minimapcoords.lua
ElvUI_SLE/modules/minimap/minimapicons.lua
ElvUI_SLE/modules/misc.lua
ElvUI_SLE/modules/nameplates.lua
ElvUI_SLE/modules/professions/deconstruct.lua
ElvUI_SLE/modules/professions/enchant.lua
ElvUI_SLE/modules/professions/fishing.lua
ElvUI_SLE/modules/professions/load_professions.xml
ElvUI_SLE/modules/professions/professions.lua
ElvUI_SLE/modules/pvp.lua
ElvUI_SLE/modules/pvpmover.lua
ElvUI_SLE/modules/quests.lua
ElvUI_SLE/modules/quests/load_quests.xml
ElvUI_SLE/modules/quests/questking/buttons/achievement.lua
ElvUI_SLE/modules/quests/questking/buttons/bonusobjective.lua
ElvUI_SLE/modules/quests/questking/buttons/challengetimer.lua
ElvUI_SLE/modules/quests/questking/buttons/quest.lua
ElvUI_SLE/modules/quests/questking/buttons/scenario.lua
ElvUI_SLE/modules/quests/questking/core/core.lua
ElvUI_SLE/modules/quests/questking/core/util.lua
ElvUI_SLE/modules/quests/questking/load_questking.xml
ElvUI_SLE/modules/quests/questking/questking.lua
ElvUI_SLE/modules/quests/questking/ui/progressbar.lua
ElvUI_SLE/modules/quests/questking/ui/rewardsframe.lua
ElvUI_SLE/modules/quests/questking/ui/timerbar.lua
ElvUI_SLE/modules/quests/questking/ui/tracker.lua
ElvUI_SLE/modules/quests/questking/ui/watchbutton.lua
ElvUI_SLE/modules/quests/quests.lua
ElvUI_SLE/modules/raidmarkers.lua
ElvUI_SLE/modules/raidroleicons.lua
ElvUI_SLE/modules/raidutility.lua
ElvUI_SLE/modules/screensaver.lua
ElvUI_SLE/modules/sledatatexts/agility.lua
ElvUI_SLE/modules/sledatatexts/currency.lua
ElvUI_SLE/modules/sledatatexts/durability.lua
ElvUI_SLE/modules/sledatatexts/energyregen.lua
ElvUI_SLE/modules/sledatatexts/friends.lua
ElvUI_SLE/modules/sledatatexts/guild.lua
ElvUI_SLE/modules/sledatatexts/intellect.lua
ElvUI_SLE/modules/sledatatexts/itemlevel.lua
ElvUI_SLE/modules/sledatatexts/lfr.lua
ElvUI_SLE/modules/sledatatexts/load_datatexts.xml
ElvUI_SLE/modules/sledatatexts/mail.lua
ElvUI_SLE/modules/sledatatexts/played.lua
ElvUI_SLE/modules/sledatatexts/range.lua
ElvUI_SLE/modules/sledatatexts/regen.lua
ElvUI_SLE/modules/sledatatexts/spirit.lua
ElvUI_SLE/modules/sledatatexts/stamina.lua
ElvUI_SLE/modules/sledatatexts/strength.lua
ElvUI_SLE/modules/sledatatexts/time.lua
ElvUI_SLE/modules/sledatatexts/version.lua
ElvUI_SLE/modules/threat.lua
ElvUI_SLE/modules/toolbars.lua
ElvUI_SLE/modules/tooltip.lua
ElvUI_SLE/modules/tooltips/load_tooltips.xml
ElvUI_SLE/modules/tooltips/raidprogress.lua
ElvUI_SLE/modules/tooltips/tooltip.lua
ElvUI_SLE/modules/uibuttons.lua
ElvUI_SLE/modules/unitframes.lua
ElvUI_SLE/modules/unitframes/load_unitframes.xml
ElvUI_SLE/modules/unitframes/offline.lua
ElvUI_SLE/modules/unitframes/roleIcons.lua
ElvUI_SLE/modules/unitframes/statusbars.lua
ElvUI_SLE/modules/unitframes/unitframes.lua
ElvUI_SLE/modules/unitframes/units/groupFrames.lua
ElvUI_SLE/modules/unitframes/units/load_units.xml
ElvUI_SLE/modules/unitframes/units/player.lua
ElvUI_SLE/modules/vehicle.lua
ElvUI_SLE/options/actionbars_c.lua
ElvUI_SLE/options/afk_c.lua
ElvUI_SLE/options/auras_c.lua
ElvUI_SLE/options/autorelease_c.lua
ElvUI_SLE/options/backgrounds_c.lua
ElvUI_SLE/options/bags_c.lua
ElvUI_SLE/options/blizzard_c.lua
ElvUI_SLE/options/chat/chat_c.lua
ElvUI_SLE/options/chat/history_c.lua
ElvUI_SLE/options/chat/load_chat.xml
ElvUI_SLE/options/chat/tabs_c.lua
ElvUI_SLE/options/chat_c.lua
ElvUI_SLE/options/core_c.lua
ElvUI_SLE/options/databars_c.lua
ElvUI_SLE/options/datatexts/currency_c.lua
ElvUI_SLE/options/datatexts/datatexts_c.lua
ElvUI_SLE/options/datatexts/friends_c.lua
ElvUI_SLE/options/datatexts/guild_c.lua
ElvUI_SLE/options/datatexts/load_datatexts.xml
ElvUI_SLE/options/datatexts/misc_c.lua
ElvUI_SLE/options/datatexts/time_c.lua
ElvUI_SLE/options/datatexts_c.lua
ElvUI_SLE/options/equipmanager_c.lua
ElvUI_SLE/options/errorframe_c.lua
ElvUI_SLE/options/exprepbar_c.lua
ElvUI_SLE/options/farm_c.lua
ElvUI_SLE/options/garrison_c.lua
ElvUI_SLE/options/help_c.lua
ElvUI_SLE/options/imports_c.lua
ElvUI_SLE/options/legacy_c.lua
ElvUI_SLE/options/load_options.xml
ElvUI_SLE/options/loot_c.lua
ElvUI_SLE/options/media_c.lua
ElvUI_SLE/options/minimap/coords_c.lua
ElvUI_SLE/options/minimap/instance_c.lua
ElvUI_SLE/options/minimap/load_minimap.xml
ElvUI_SLE/options/minimap/locpanel_c.lua
ElvUI_SLE/options/minimap/minimap_c.lua
ElvUI_SLE/options/minimap/minimapicons_c.lua
ElvUI_SLE/options/minimap_c.lua
ElvUI_SLE/options/misc_c.lua
ElvUI_SLE/options/nameplates_c.lua
ElvUI_SLE/options/professions_c.lua
ElvUI_SLE/options/pvp_c.lua
ElvUI_SLE/options/quests_c.lua
ElvUI_SLE/options/raidmarkers_c.lua
ElvUI_SLE/options/raidroleicons_c.lua
ElvUI_SLE/options/raidutility_c.lua
ElvUI_SLE/options/skins_c.lua
ElvUI_SLE/options/threat_c.lua
ElvUI_SLE/options/tooltip_c.lua
ElvUI_SLE/options/uibuttons_c.lua
ElvUI_SLE/options/unitframes_c.lua
ElvUI_SLE/options/vehicle_c.lua
ElvUI_SLE/options/viewport_c.lua
ElvUI_SLE/skins/blizzard/character.lua
ElvUI_SLE/skins/blizzard/load_blizzard.xml
ElvUI_SLE/skins/blizzard/merchant.lua
ElvUI_SLE/skins/blizzard/objectiveTracker.lua
ElvUI_SLE/skins/blizzard/petbattle.lua
ElvUI_SLE/skins/load_skins.xml
ElvUI_SLE/skins/skins.lua
diff --git a/ElvUI_SLE/Bindings.xml b/ElvUI_SLE/Bindings.xml
index 2d728ae..84d2336 100644
--- a/ElvUI_SLE/Bindings.xml
+++ b/ElvUI_SLE/Bindings.xml
@@ -1,20 +1,20 @@
 <Bindings>
-	<Binding name="CLICK ClearRaidFlares:LeftButton" description="Clear Flares" header="RAIDFLARE">
+	<Binding name="CLICK SLE_ClearRaidFlares:LeftButton" description="Clear Flares" header="RAIDFLARE" category="BINDING_HEADER_SLE">
 	</Binding>
-	<Binding name="CLICK RaidFlare1:LeftButton" description="Blue Flare">
+	<Binding name="CLICK SLE_RaidFlare1:LeftButton" description="Blue Flare" category="BINDING_HEADER_SLE">
 	</Binding>
-	<Binding name="CLICK RaidFlare2:LeftButton" description="Green Flare">
+	<Binding name="CLICK SLE_RaidFlare2:LeftButton" description="Green Flare" category="BINDING_HEADER_SLE">
 	</Binding>
-	<Binding name="CLICK RaidFlare3:LeftButton" description="Purple Flare">
+	<Binding name="CLICK SLE_RaidFlare3:LeftButton" description="Purple Flare" category="BINDING_HEADER_SLE">
 	</Binding>
-	<Binding name="CLICK RaidFlare4:LeftButton" description="Red Flare">
+	<Binding name="CLICK SLE_RaidFlare4:LeftButton" description="Red Flare" category="BINDING_HEADER_SLE">
 	</Binding>
-	<Binding name="CLICK RaidFlare5:LeftButton" description="Yellow Flare">
+	<Binding name="CLICK SLE_RaidFlare5:LeftButton" description="Yellow Flare" category="BINDING_HEADER_SLE">
 	</Binding>
-	<Binding name="CLICK RaidFlare6:LeftButton" description="Orange Flare">
+	<Binding name="CLICK SLE_RaidFlare6:LeftButton" description="Orange Flare" category="BINDING_HEADER_SLE">
 	</Binding>
-	<Binding name="CLICK RaidFlare7:LeftButton" description="White Flare">
+	<Binding name="CLICK SLE_RaidFlare7:LeftButton" description="White Flare" category="BINDING_HEADER_SLE">
 	</Binding>
-	<Binding name="CLICK RaidFlare8:LeftButton" description="Skull Flare">
+	<Binding name="CLICK SLE_RaidFlare8:LeftButton" description="Skull Flare" category="BINDING_HEADER_SLE">
 	</Binding>
 </Bindings>
\ No newline at end of file
diff --git a/ElvUI_SLE/ElvUI_SLE.toc b/ElvUI_SLE/ElvUI_SLE.toc
index f89e7b1..1584b97 100644
--- a/ElvUI_SLE/ElvUI_SLE.toc
+++ b/ElvUI_SLE/ElvUI_SLE.toc
@@ -1,10 +1,9 @@
-## Interface: 60200
+## Interface: 70000
 ## Title: |cff1784d1ElvUI|r |cff9482c9Shadow & Light|r
 ## Author: Darth Predator, Repooc
-## Version: 2.32
-## Notes: Plugin-edit for |cff1784d1ElvUI|r.
-## Notes-ruRU: Плагин-редакция для |cff1784d1ElvUI|r.
-## eMail: darthpred@gmail.com, repooc@tukui.org
+## Version: 3.00
+## Notes: Plugin-edit for |cff1784d1ElvUI|r implementing additional features.
+## Notes-ruRU: Плагин-редакция для |cff1784d1ElvUI|r, добавляющий новые функции.
 ## URL: http://tukui.org/
 ## RequiredDeps: ElvUI
 ## OptionalDeps: AddonSkins, BigWigs, Clique, Hermes, xCT+
@@ -12,14 +11,15 @@
 ## X-ElvVersion: 8.26
 ## SavedVariables: SLE_ArmoryDB

+
 libs\load_libs.xml
 locales\load_locales.xml
 media\load_media.xml
 core\load_core.xml
 defaults\load_defaults.xml
 modules\load_modules.xml
-options\load_options.xml
 skins\load_skins.xml
+options\load_options.xml
 Bindings.xml


diff --git a/ElvUI_SLE/LICENSE.txt b/ElvUI_SLE/LICENSE.txt
index 8ad5150..6d1040b 100644
--- a/ElvUI_SLE/LICENSE.txt
+++ b/ElvUI_SLE/LICENSE.txt
@@ -10,4 +10,4 @@ Authors of this addon hereby grants you the following rights:

 3.     This copyright notice shall be included in all copies or substantial portions of the Software.

-All rights not explicitly addressed in this license are reserved by the copyright holders.
\ No newline at end of file
+All rights not explicitly addressed in this license are reserved by the copyright holders.
diff --git a/ElvUI_SLE/core/communicate.lua b/ElvUI_SLE/core/communicate.lua
index 3ab252d..adef201 100644
--- a/ElvUI_SLE/core/communicate.lua
+++ b/ElvUI_SLE/core/communicate.lua
@@ -1,28 +1,31 @@
-local E, L, V, P, G = unpack(ElvUI);
-local SLE = E:GetModule('SLE');
-local split = string.split
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local BNET_CLIENT_WOW = BNET_CLIENT_WOW
+local BNSendGameData = BNSendGameData
+local SendAddonMessage = SendAddonMessage

+
+--Building user list for dev tool
 local function SendRecieve(self, event, prefix, message, channel, sender)
 	if event == "CHAT_MSG_ADDON" then
 		if prefix == 'SLE_DEV_REQ' then
 			local message = "wut?"
 			SendAddonMessage('SLE_USER_REQ', message, channel)
 		elseif prefix == 'SLE_USER_INFO' then
-			local message = UnitLevel('player')..'#'..E.myclass..'#'..E.myname..'#'..E.myrealm..'#'..SLE.version;
+			local message = T.UnitLevel('player')..'#'..E.myclass..'#'..E.myname..'#'..E.myrealm..'#'..SLE.version;
 			SendAddonMessage('SLE_DEV_INFO', message, channel)
 		end
 	elseif event == "BN_CHAT_MSG_ADDON" then
 		if (sender == E.myname.."-"..E.myrealm:gsub(' ','')) then return end

 		if prefix == 'SLE_DEV_REQ' then
-			local _, numBNetOnline = BNGetNumFriends()
+			local _, numBNetOnline = T.BNGetNumFriends()
 			for i = 1, numBNetOnline do
-				local presenceID, _, _, _, _, _, client, isOnline = BNGetFriendInfo(i)
+				local presenceID, _, _, _, _, _, client, isOnline = T.BNGetFriendInfo(i)
 				if isOnline and client == BNET_CLIENT_WOW then
-					local message, ID = split("#", message)
+					local message, ID = T.split("#", message)

 					if message == 'userlist' then
-						message = UnitLevel('player')..'#'..E.myclass..'#'..E.myname..'#'..E.myrealm..'#'..SLE.version;
+						message = T.UnitLevel('player')..'#'..E.myclass..'#'..E.myname..'#'..E.myrealm..'#'..SLE.version;
 					elseif message == 'slesay' then
 						message = "SLEinfo"..ID
 					end
diff --git a/ElvUI_SLE/core/core.lua b/ElvUI_SLE/core/core.lua
index b52a57a..05c3801 100644
--- a/ElvUI_SLE/core/core.lua
+++ b/ElvUI_SLE/core/core.lua
@@ -1,260 +1,138 @@
 local E, L, V, P, G = unpack(ElvUI);
-local SLE = E:GetModule('SLE')
 local EP = LibStub("LibElvUIPlugin-1.0")
-local UF = E:GetModule('UnitFrames')
-local Sk = E:GetModule("Skins")
-local addon = ...
+local AddOnName, Engine = ...;

---localizing functions--
-local tinsert = tinsert
+local _G = _G

-local elvV = tonumber(E.version)
-local elvR = tonumber(GetAddOnMetadata("ElvUI_SLE", "X-ElvVersion"))
+local SLE = LibStub("AceAddon-3.0"):NewAddon(AddOnName, "AceConsole-3.0", "AceEvent-3.0", 'AceTimer-3.0', 'AceHook-3.0');
+SLE.callbacks = SLE.callbacks or LibStub("CallbackHandler-1.0"):New(SLE)
+
+SLE.version = GetAddOnMetadata("ElvUI_SLE", "Version")

---SLE['media'] = {}
+BINDING_HEADER_SLE = "|cff9482c9Shadow & Light|r"

-function SLE:MismatchText()
-	local text = format(L['MSG_OUTDATED'],elvV,elvR)
-	return text
+--Creating a toolkit table
+local Toolkit = {}
+
+--localizing functions and stuff--
+
+SLE.elvV = tonumber(E.version)
+SLE.elvR = tonumber(GetAddOnMetadata("ElvUI_SLE", "X-ElvVersion"))
+
+--Setting up table to unpack. Why? no idea
+Engine[1] = SLE
+Engine[2] = Toolkit
+Engine[3] = E
+Engine[4] = L
+Engine[5] = V
+Engine[6] = P
+Engine[7] = G
+_G[AddOnName] = Engine;
+
+--A function to concentrate options from different modules to a single table used in plugin reg
+local function GetOptions()
+	for _, func in Toolkit.pairs(SLE.Configs) do
+		func()
+	end
 end

-local function AddTutorials() --Additional tutorials
-	tinsert(E.TutorialList, #(E.TutorialList)+1, L["To enable full values of health/power on unitframes in Shadow & Light add \":sl\" to the end of the health/power tag.\nExample: [health:current:sl]."]);
+function SLE:OnInitialize()
+	--Incompatibility stuff will go here
+	SLE:CheckIncompatible()
+	SLE:AddTutorials()
 end

-local function ConfigCats() --Additional mover groups
-	tinsert(E.ConfigModeLayouts, #(E.ConfigModeLayouts)+1, "S&L");
+local f=CreateFrame("Frame")
+f:RegisterEvent("PLAYER_LOGIN")
+f:SetScript("OnEvent", function()
+	SLE:Initialize()
+end)
+
+function SLE:ConfigCats() --Additional mover groups
+	Toolkit.tinsert(E.ConfigModeLayouts, #(E.ConfigModeLayouts)+1, "S&L");
 	E.ConfigModeLocalizedStrings["S&L"] = L["S&L: All"]
-	tinsert(E.ConfigModeLayouts, #(E.ConfigModeLayouts)+1, "S&L DT");
+	Toolkit.tinsert(E.ConfigModeLayouts, #(E.ConfigModeLayouts)+1, "S&L DT");
 	E.ConfigModeLocalizedStrings["S&L DT"] = L["S&L: Datatexts"]
-	if E.private.sle.backgrounds then
-		tinsert(E.ConfigModeLayouts, #(E.ConfigModeLayouts)+1, "S&L BG");
-		E.ConfigModeLocalizedStrings["S&L BG"] = L["S&L: Backgrounds"]
-	end
-	tinsert(E.ConfigModeLayouts, #(E.ConfigModeLayouts)+1, "S&L MISC");
+	-- if E.private.sle.backgrounds then
+	Toolkit.tinsert(E.ConfigModeLayouts, #(E.ConfigModeLayouts)+1, "S&L BG");
+	E.ConfigModeLocalizedStrings["S&L BG"] = L["S&L: Backgrounds"]
+	-- end
+	Toolkit.tinsert(E.ConfigModeLayouts, #(E.ConfigModeLayouts)+1, "S&L MISC");
 	E.ConfigModeLocalizedStrings["S&L MISC"] = L["S&L: Misc"]
 end

-local function GetOptions()
-	for _, func in pairs(E.SLEConfigs) do
-		func()
-	end
-end
-
-local function IncompatibleAddOn(addon, module, optiontable, value)
-	E.PopupDialogs['SLE_INCOMPATIBLE_ADDON'].button1 = addon
-	E.PopupDialogs['SLE_INCOMPATIBLE_ADDON'].button2 = 'S&L: '..module
-	E.PopupDialogs['SLE_INCOMPATIBLE_ADDON'].addon = addon
-	E.PopupDialogs['SLE_INCOMPATIBLE_ADDON'].module = module
-	E.PopupDialogs['SLE_INCOMPATIBLE_ADDON'].optiontable = optiontable
-	E.PopupDialogs['SLE_INCOMPATIBLE_ADDON'].value = value
-	E.PopupDialogs['SLE_INCOMPATIBLE_ADDON'].showAlert = true
+function SLE:IncompatibleAddOn(addon, module, optiontable, value)
+	E.PopupDialogs["SLE_INCOMPATIBLE_ADDON"].button1 = addon
+	E.PopupDialogs["SLE_INCOMPATIBLE_ADDON"].button2 = 'S&L: '..module
+	E.PopupDialogs["SLE_INCOMPATIBLE_ADDON"].addon = addon
+	E.PopupDialogs["SLE_INCOMPATIBLE_ADDON"].module = module
+	E.PopupDialogs["SLE_INCOMPATIBLE_ADDON"].optiontable = optiontable
+	E.PopupDialogs["SLE_INCOMPATIBLE_ADDON"].value = value
+	E.PopupDialogs["SLE_INCOMPATIBLE_ADDON"].showAlert = true
 	E:StaticPopup_Show('SLE_INCOMPATIBLE_ADDON', addon, module)
 end

-local function CheckIncompatible()
-	if IsAddOnLoaded('ElvUI_Enhanced') and not E.global.ignoreEnhancedIncompatible then
+function SLE:CheckIncompatible()
+	if Toolkit.IsAddOnLoaded('ElvUI_Enhanced') and not E.global.ignoreEnhancedIncompatible then
 		E:StaticPopup_Show('ENHANCED_SLE_INCOMPATIBLE')
 	end
-	if IsAddOnLoaded('SquareMinimapButtons') and E.private.sle.minimap.mapicons.enable then
-		IncompatibleAddOn('SquareMinimapButtons', 'SquareMinimapButtons', E.private.sle.minimap.mapicons, "enable")
+	if Toolkit.IsAddOnLoaded('SquareMinimapButtons') and E.private.sle.minimap.mapicons.enable then
+		SLE:IncompatibleAddOn('SquareMinimapButtons', 'SquareMinimapButtons', E.private.sle.minimap.mapicons, "enable")
 	end
-	if IsAddOnLoaded('LootConfirm') then
+	if Toolkit.IsAddOnLoaded('ElvUI_LocLite') and E.db.sle.minimap.locPanel.enable then
+		SLE:IncompatibleAddOn('Location Lite', 'Location Panel', E.db.sle.minimap.locPanel.enable, "enable")
+	end
+	if Toolkit.IsAddOnLoaded('LootConfirm') then
 		E:StaticPopup_Show('LOOTCONFIRM_SLE_INCOMPATIBLE')
 	end
-	-- if IsAddOnLoaded('oRA3') then
-		-- E:StaticPopup_Show('ORA_SLE_INCOMPATIBLE')
-	-- end
+	if Toolkit.IsAddOnLoaded('ElvUITransparentActionbars') then
+		E:StaticPopup_Show('TRANSAB_SLE_INCOMPATIBLE')
+	end
 end

-function SLE:CreateExport()
-	local frame = CreateFrame("Frame", "SLEExImFrame", E.UIParent)
-	tinsert(UISpecialFrames, "SLEExImFrame")
-	frame:SetTemplate('Transparent')
-	frame:Size(800, 400)
-	frame:Point('CENTER', E.UIParent)
-	frame:Hide()
-	frame:EnableMouse(true)
-	frame:SetFrameStrata("DIALOG")
-	frame:SetMovable(true)
-	frame:RegisterForDrag("LeftButton")
-	frame:SetScript("OnDragStart", function(self)
-		if IsShiftKeyDown() then
-			self:StartMoving()
-		end
-	end)
-	frame:SetScript("OnDragStop", frame.StopMovingOrSizing)
-
-	local text = frame:CreateFontString(nil, "OVERLAY")
-	text:SetFont(E["media"].normFont, 14)
-	text:SetPoint("TOP", frame, "TOP", -10, -10)
-	text:SetText("<  "..L["Export / Import"].."  >")
-	text:SetJustifyH("left")
-
-	local ExScrollArea = CreateFrame("ScrollFrame", "SLEExportScrollFrame", frame, "UIPanelScrollFrameTemplate")
-	ExScrollArea:Point("TOPLEFT", frame, "TOPLEFT", 10, -30)
-	ExScrollArea:Point("BOTTOMRIGHT", frame, "BOTTOM", -25, 10)
-	ExScrollArea:CreateBackdrop()
-	Sk:HandleScrollBar(SLEExportScrollFrameScrollBar)
-
-	local ImScrollArea = CreateFrame("ScrollFrame", "SLEImportScrollFrame", frame, "UIPanelScrollFrameTemplate")
-	ImScrollArea:Point("TOPRIGHT", frame, "TOPRIGHT", -30, -30)
-	ImScrollArea:Point("BOTTOMLEFT", frame, "BOTTOM", 5, 10)
-	ImScrollArea:CreateBackdrop()
-	Sk:HandleScrollBar(SLEImportScrollFrameScrollBar)
-
-	local ExEditBox = CreateFrame("EditBox", "SLEExportEditBox", frame)
-	ExEditBox:SetMultiLine(true)
-	ExEditBox:SetMaxLetters(0)
-	ExEditBox:EnableMouse(true)
-	ExEditBox:SetAutoFocus(false)
-	ExEditBox:SetFontObject(ChatFontNormal)
-	ExEditBox:Width(ExScrollArea:GetWidth())
-	ExEditBox:SetScript("OnEscapePressed", function() SLEExImFrame:Hide() end)
-	ExScrollArea:SetScrollChild(ExEditBox)
-	SLEExportEditBox:SetScript("OnTextChanged", function(self, userInput)
-		if userInput then return end
-		local _, max = SLEExportScrollFrameScrollBar:GetMinMaxValues()
-		for i=1, max do
-			ScrollFrameTemplate_OnMouseWheel(SLEExportScrollFrame, -1)
-		end
-	end)
-
-	local ImEditBox = CreateFrame("EditBox", "SLEImportEditBox", frame)
-	ImEditBox:SetMultiLine(true)
-	ImEditBox:SetMaxLetters(0)
-	ImEditBox:EnableMouse(true)
-	ImEditBox:SetAutoFocus(false)
-	ImEditBox:SetFontObject(ChatFontNormal)
-	ImEditBox:Width(ExScrollArea:GetWidth())
-	ImEditBox:SetScript("OnEscapePressed", function() SLEExImFrame:Hide() end)
-	ImScrollArea:SetScrollChild(ImEditBox)
-	SLEImportEditBox:SetScript("OnTextChanged", function(self, userInput)
-		if userInput then return end
-		local _, max = SLEImportScrollFrameScrollBar:GetMinMaxValues()
-		for i=1, max do
-			ScrollFrameTemplate_OnMouseWheel(SLEImportScrollFrame, -1)
-		end
-	end)
-
-
-	local close = CreateFrame("Button", "SLEExImFrameCloseButton", frame, "UIPanelCloseButton")
-	close:SetPoint("TOPRIGHT")
-	close:SetFrameLevel(close:GetFrameLevel() + 1)
-	close:EnableMouse(true)
-	Sk:HandleCloseButton(close)
-
-	local exHelp = CreateFrame("Button", "SLEExportHelp", frame)
-	exHelp:Size(20, 20)
-	exHelp:Point("TOPLEFT", frame, "TOPLEFT", 9, -6)
-	local exHelp_t = exHelp:CreateFontString(nil, "OVERLAY")
-	exHelp_t:SetFont(E["media"].normFont, 14)
-	exHelp_t:SetPoint("CENTER", exHelp)
-	exHelp_t:SetText("?")
-	Sk:HandleButton(exHelp)
-	exHelp:HookScript("OnEnter", function(self)
-		GameTooltip:SetOwner(self, 'ANCHOR_TOPLEFT', 2, 4)
-		GameTooltip:ClearLines()
-		GameTooltip:AddLine([[|cffFFFFFFExporting:
-Click the Export button and the settings that are different from defaults in selected options tables' will be dumped to the export box.
- - Profile will copy profile based settings;
- - Private will copy character specific settings;
- - Global will copy global settings.|r
-|cffFF0000Warning: exporting may cause your game to freeze for some time.|r
-
-|cffFFFFFFImporting:
-To import the settings you need to paste the setting table
-or line to the import editbox and click import button.
-You can use next formats for settings:
-1) E.db.chat.panelHeight = 185
-2) E.db['chat']['panelHeight'] = 185
-3) E.db['chat'] = {
-...
+local GetAddOnEnableState = GetAddOnEnableState
+--Check if some stuff happens to be enable
+SLE._Compatibility = {}
+local _CompList = {
+	"oRA3",
+	"ElvUI_CustomTweaks",
+	"ElvUI_MerathilisUI",
+	"QuestKing",
+	"ElvUI_Enhanced",
 }
-In case of the third format you should put at least 2 values.|r
-
-|cffFF0000Know issue: coloring options will be exported anyway no matter the values and exporting options set.|r]])
-		GameTooltip:Show()
-	end)
-	exHelp:HookScript("OnLeave", function() GameTooltip:Hide() end)
-	exHelp:SetScript("OnClick", function(self)
-		SLEExportEditBox:SetText(dropdown.selectedID)
-	end)
-
-	local exButton = CreateFrame("Button", "SLEExportButton", frame)
-	exButton:Size(100, 20)
-	exButton:Point("LEFT", exHelp, "RIGHT", 4, 0)
-	local exButton_t = exButton:CreateFontString(nil, "OVERLAY")
-	exButton_t:SetFont(E["media"].normFont, 14)
-	exButton_t:SetPoint("CENTER", exButton)
-	exButton_t:SetText(L["Export"])
-	Sk:HandleButton(exButton)
-	exButton:SetScript("OnClick", SLE.Exporting)
-
-	local imButton = CreateFrame("Button", "SLEImportButton", frame)
-	imButton:Size(100, 20)
-	imButton:Point("LEFT", exButton, "RIGHT", 4, 0)
-	local imButton_t = imButton:CreateFontString(nil, "OVERLAY")
-	imButton_t:SetFont(E["media"].normFont, 14)
-	imButton_t:SetPoint("CENTER", imButton)
-	imButton_t:SetText(L["Import"])
-	Sk:HandleButton(imButton)
-	imButton:SetScript("OnClick", function(self)
- 		local msg = ImEditBox:GetText()
-		msg = SLE:ImportTableReplace(msg)
-		if msg then
-			local func, err = loadstring(msg)
-			if not err then
-				func()
-				E:UpdateAll(true)
-				ReloadUI()
-			else
-				SLE:Print(err)
-			end
-		else
-			SLE:Print("Entered text is not a valid settings table!")
-		end
-	end)
-
-
-
-	local returnB = CreateFrame("Button", "SLEReturnButton", frame)
-	returnB:Size(100, 20)
-	returnB:Point("RIGHT", close, "LEFT", 4, 0)
-	local returnB_t = returnB:CreateFontString(nil, "OVERLAY")
-	returnB_t:SetFont(E["media"].normFont, 14)
-	returnB_t:SetPoint("CENTER", returnB)
-	returnB_t:SetText(L["Back"])
-	Sk:HandleButton(returnB)
-	returnB:SetScript("OnClick", function(self)
- 		E:ToggleConfig()
-		SLEExImFrame:Hide()
-	end)
-end
-
-function SLE:FixDatabase() --For when we dramatically change some options
-	if E.db.sle.chat.combathide == true then E.db.sle.chat.combathide = "BOTH" end
-	if E.db.sle.chat.combathide == false then E.db.sle.chat.combathide = "NONE" end
-	if E.db.sle.uibuttons.position == "uib_vert" then E.db.sle.uibuttons.orientation = "vertical" end
-	if E.db.sle.uibuttons.position == "uib_hor" then E.db.sle.uibuttons.orientation = "horizontal" end
+for i = 1, #_CompList do
+	if GetAddOnEnableState(E.myname, _CompList[i]) == 0 then SLE._Compatibility[_CompList[i]] = nil else SLE._Compatibility[_CompList[i]] = true end
 end

 function SLE:Initialize()
-	SLE:FixDatabase()
 	--ElvUI's version check
-	if elvV < elvR then
+	if SLE.elvV < 10 then return end
+
+	if SLE.elvV < SLE.elvR then
 		E:StaticPopup_Show("VERSION_MISMATCH")
+		return --Not loading shit if version is too old, prevents shit from being broken
 	end
-	EP:RegisterPlugin(addon, GetOptions)
-	if E.private.unitframe.enable then
-		self:RegisterEvent("PLAYER_REGEN_DISABLED", UF.Update_CombatIndicator);
-	end
-	if E.private.install_complete and E.private.sle.install_complete == nil then SLE:Install() end
+	SLE:ConfigCats()
+	self.initialized = true
+	self:InitializeModules(); --Load Modules
+
+	SLE:SetCompareItems() --Blizz cvar for item compare
+
+	hooksecurefunc(E, "UpdateAll", SLE.UpdateAll)
+	--Here goes installation script
+
+	--Annoying message
 	if E.db.general.loginmessage then
-		SLE:Print(format(L['SLE_LOGIN_MSG'], E["media"].hexvaluecolor, SLE.version))
+		Toolkit.print(Toolkit.format(L["SLE_LOGIN_MSG"], E["media"].hexvaluecolor, SLE.version))
 	end
-	E:GetModule('SLE_DTPanels'):DashboardShow()
-	AddTutorials()
-	ConfigCats()
-	CheckIncompatible()
+
+	SLE:BuildGameMenu()
+	SLE:CyrillicsInit()
+
+	if E.private.sle.install_complete == nil or tonumber(E.private.sle.install_complete) < 3 then
+		E:GetModule("PluginInstaller"):Queue(SLE.installTable)
+		-- E:GetModule("PluginInstaller"):Queue(SLE.installTable2)
+	end
+
+	LibStub("LibElvUIPlugin-1.0"):RegisterPlugin(AddOnName, GetOptions) --Registering as plugin
 end
\ No newline at end of file
diff --git a/ElvUI_SLE/core/dropdown.lua b/ElvUI_SLE/core/dropdown.lua
new file mode 100644
index 0000000..4b45afa
--- /dev/null
+++ b/ElvUI_SLE/core/dropdown.lua
@@ -0,0 +1,182 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local DD = SLE:NewModule("Dropdowns", "AceEvent-3.0")
+
+DD.RegisteredMenus = {}
+
+--Cache global variables
+local tinsert = tinsert
+--WoW API / Variables
+local CreateFrame = CreateFrame
+local ToggleFrame = ToggleFrame
+local GetCursorPosition = GetCursorPosition
+
+--Global variables that we don't cache, list them here for the mikk's Find Globals script
+-- GLOBALS: UIParent, UISpecialFrames,
+
+local PADDING = 10
+local BUTTON_HEIGHT = 16
+local BUTTON_WIDTH = 135
+local TITLE_OFFSET = 10
+
+local function OnClick(btn)
+	if btn.func then btn.func() end
+
+	btn:GetParent():Hide()
+end
+
+local function OnEnter(btn)
+	btn.hoverTex:Show()
+end
+
+local function OnLeave(btn)
+	btn.hoverTex:Hide()
+end
+
+function SLE:DropDown(list, frame, MenuAnchor, FramePoint, xOffset, yOffset, parent, customWidth, justify)
+	if T.InCombatLockdown() then return end
+	if not frame:IsShown() then
+		if not frame.buttons then
+			frame.buttons = {}
+			frame:SetFrameStrata("DIALOG")
+			frame:SetClampedToScreen(true)
+			T.tinsert(UISpecialFrames, frame:GetName())
+			frame:Hide()
+		end
+
+		xOffset = xOffset or 0
+		yOffset = yOffset or 0
+		local TitleCount = 0
+		local AddOffset = 0
+
+		for i=1, #frame.buttons do
+			frame.buttons[i]:Hide()
+		end
+		if not parent then FramePoint = "CURSOR" end
+
+		for i=1, #list do
+			if not frame.buttons[i] then
+				if list[i].secure then
+					frame.buttons[i] = CreateFrame("Button", nil, frame, "SecureActionButtonTemplate")
+				else
+					frame.buttons[i] = CreateFrame("Button", nil, frame)
+				end
+
+				frame.buttons[i].hoverTex = frame.buttons[i]:CreateTexture(nil, 'OVERLAY')
+				frame.buttons[i].hoverTex:SetAllPoints()
+				frame.buttons[i].hoverTex:SetTexture([[Interface\QuestFrame\UI-QuestTitleHighlight]])
+				frame.buttons[i].hoverTex:SetBlendMode("ADD")
+				frame.buttons[i].hoverTex:Hide()
+
+				frame.buttons[i].text = frame.buttons[i]:CreateFontString(nil, 'BORDER')
+				frame.buttons[i].text:SetAllPoints()
+				frame.buttons[i].text:FontTemplate()
+
+				if not list[i].nohighlight then
+					frame.buttons[i]:SetScript("OnEnter", OnEnter)
+					frame.buttons[i]:SetScript("OnLeave", OnLeave)
+				end
+
+				if list[i].func then
+					frame.buttons[i].func = list[i].func
+				end
+			end
+			frame.buttons[i].text:SetJustifyH(justify or "LEFT")
+			frame.buttons[i]:Show()
+			frame.buttons[i]:Height(BUTTON_HEIGHT)
+			frame.buttons[i]:Width(customWidth or BUTTON_WIDTH)
+			local icon = ""
+			if list[i].icon then
+				icon = "|T"..list[i].icon..":14:14|t "
+			end
+			frame.buttons[i].text:SetText(icon..list[i].text)
+			if list[i].title then
+				TitleCount = TitleCount + 1
+				frame.buttons[i].text:SetTextColor(0.98, 0.95, 0.05)
+				if list[i].ending or i == 1 or list[i-1].title then
+					AddOffset = AddOffset + 1
+				end
+			else
+				frame.buttons[i].text:SetTextColor(1, 1, 1)
+			end
+			if list[i].secure then
+				frame.buttons[i].secure = list[i].secure
+				frame.buttons[i]:SetAttribute("type", frame.buttons[i].secure.buttonType)
+				if frame.buttons[i].secure.buttonType == "item" then
+					local name = T.GetItemInfo(frame.buttons[i].secure.ID)
+					frame.buttons[i]:SetAttribute("item", name)
+				elseif frame.buttons[i].secure.buttonType == "spell" then
+					local name = T.GetSpellInfo(frame.buttons[i].secure.ID)
+					frame.buttons[i]:SetAttribute("spell", name)
+				elseif frame.buttons[i].secure.buttonType == "macro" then
+					frame.buttons[i]:SetAttribute("macrotext", frame.buttons[i].secure.ID)
+				else
+					SLE:Print("Wrong argument for button type: "..frame.buttons[i].secure.buttonType)
+				end
+				frame.buttons[i]:HookScript("OnClick", OnClick)
+			else
+				frame.buttons[i]:SetScript("OnClick", OnClick)
+			end
+
+			local MARGIN = 10
+			if justify then
+				if justify == "RIGHT" then MARGIN = -10 end
+				if justify == "CENTER" then MARGIN = 0 end
+			end
+
+			if i == 1 then
+				frame.buttons[i]:Point("TOPLEFT", frame, "TOPLEFT", MARGIN, -PADDING)
+			else
+				frame.buttons[i]:Point("TOPLEFT", frame.buttons[i-1], "BOTTOMLEFT", 0, -((list[i-1].title or list[i].title) and TITLE_OFFSET or 0))
+			end
+		end
+
+		frame:Height((#list * BUTTON_HEIGHT) + PADDING * 2 + TitleCount * (2 * TITLE_OFFSET) - AddOffset * TITLE_OFFSET)
+		frame:Width(customWidth or (BUTTON_WIDTH + PADDING * 2))
+
+		frame:ClearAllPoints()
+		if FramePoint == "CURSOR" then
+			local UIScale = UIParent:GetScale();
+			local x, y = GetCursorPosition();
+			x = x/UIScale
+			y = y/UIScale
+			frame:Point(MenuAnchor, UIParent, "BOTTOMLEFT", x + xOffset, y + yOffset)
+		else
+			frame:Point(MenuAnchor, parent, FramePoint, xOffset, yOffset)
+		end
+	end
+	ToggleFrame(frame)
+end
+
+function DD:GetCooldown(CDtype, id)
+	local cd, formatID
+	local start, duration = T["Get"..CDtype.."Cooldown"](id)
+	if start > 0 then
+		cd = duration - (T.GetTime() - start)
+		cd, formatID = E:GetTimeInfo(cd, 0)
+		cd = T.format(E.TimeFormats[formatID][2], cd)
+		return cd
+	end
+	return nil
+end
+
+function DD:HideMenus()
+	for name, menu in T.pairs(DD.RegisteredMenus) do
+		menu:Hide()
+	end
+end
+
+function DD:RegisterMenu(menu)
+	local name = menu:GetName()
+	if name then
+		DD.RegisteredMenus[name] = menu
+	else
+		SLE:Print("Dropdown not registered. Please chack if it has a name.")
+	end
+end
+
+function DD:Initialize()
+	self:RegisterEvent("PLAYER_ENTERING_WORLD", "HideMenus")
+	self:RegisterEvent("PLAYER_REGEN_DISABLED", "HideMenus")
+end
+
+SLE:RegisterModule(DD:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/core/elvprot.lua b/ElvUI_SLE/core/elvprot.lua
deleted file mode 100644
index cb97913..0000000
--- a/ElvUI_SLE/core/elvprot.lua
+++ /dev/null
@@ -1,61 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local SLE = E:GetModule('SLE');
---[[local find = string.find
-local tinsert = tinsert
-
-function E:IsFoolsDay()
-	if not SLE:Auth() then E.global.aprilFools = true end
-	if find(date(), '04/01/') and not E.global.aprilFools then
-		return true;
-	else
-		return false;
-	end
-end
-
-local function Fools2013()
-	tinsert(E.massiveShakeObjects, M1)
-	tinsert(E.massiveShakeObjects, M2)
-	tinsert(E.massiveShakeObjects, M3)
-	tinsert(E.massiveShakeObjects, M4)
-	tinsert(E.massiveShakeObjects, M5)
-	tinsert(E.massiveShakeObjects, M6)
-	tinsert(E.massiveShakeObjects, M7)
-	tinsert(E.massiveShakeObjects, M8)
-	for i=1, 5 do
-		if FseedButtons[i] then
-			for j = 1, #FseedButtons[i] do
-				tinsert(E.massiveShakeObjects, FseedButtons[i][j])
-			end
-		end
-	end
-	for i = 1, #FtoolButtons do
-		tinsert(E.massiveShakeObjects, FtoolButtons[i])
-	end
-	for i = 1, #FportalButtons do
-		tinsert(E.massiveShakeObjects, FportalButtons[i])
-	end
-	tinsert(E.massiveShakeObjects, ConfigUIButton)
-	tinsert(E.massiveShakeObjects, ReloadUIButton)
-	tinsert(E.massiveShakeObjects, MoveUIButton)
-	tinsert(E.massiveShakeObjects, Bbutton)
-	tinsert(E.massiveShakeObjects, Abutton)
-
-	if Fbutton then tinsert(E.massiveShakeObjects, Fbutton) end
-
-	tinsert(E.massiveShakeObjects, DP_1)
-	tinsert(E.massiveShakeObjects, DP_2)
-	tinsert(E.massiveShakeObjects, DP_3)
-	tinsert(E.massiveShakeObjects, DP_4)
-	tinsert(E.massiveShakeObjects, DP_5)
-	tinsert(E.massiveShakeObjects, DP_6)
-	tinsert(E.massiveShakeObjects, Top_Center)
-	tinsert(E.massiveShakeObjects, Bottom_Panel)
-	tinsert(E.massiveShakeObjects, BottomBG)
-	tinsert(E.massiveShakeObjects, LeftBG)
-	tinsert(E.massiveShakeObjects, RightBG)
-	tinsert(E.massiveShakeObjects, ActionBG)
-	tinsert(E.massiveShakeObjects, RaidUtility_ShowButton)
-	tinsert(E.massiveShakeObjects, RaidUtilityPanel)
-end
-
-hooksecurefunc(E, "BeginFoolsDayEvent", Fools2013)]]
\ No newline at end of file
diff --git a/ElvUI_SLE/core/gameMenu.lua b/ElvUI_SLE/core/gameMenu.lua
new file mode 100644
index 0000000..76c6a74
--- /dev/null
+++ b/ElvUI_SLE/core/gameMenu.lua
@@ -0,0 +1,24 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local lib = LibStub("LibElv-GameMenu-1.0")
+local _G = _G
+local HideUIPanel = HideUIPanel
+
+function SLE:BuildGameMenu()
+	if not E.global.sle.advanced.gameMenu.enable then return end
+	local buttons = {
+		[1] = {
+			["name"] = "GameMenu_SLEConfig",
+			["text"] = "|cff9482c9Shadow & Light|r",
+			["func"] = function() if T.InCombatLockdown() then return end; E:ToggleConfig(); SLE.ACD:SelectGroup("ElvUI", "sle"); HideUIPanel(_G["GameMenuFrame"]) end,
+		},
+	}
+	if E.global.sle.advanced.gameMenu.reload then
+		T.tinsert(buttons, {["name"] = "GameMenuReloadUI", ["text"] = L["Reload UI"], ["func"] = function() ReloadUI() end})
+	end
+	for i = 1, #buttons do
+		lib:AddMenuButton(buttons[i])
+	end
+
+
+	lib:UpdateHolder()
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/core/globals.lua b/ElvUI_SLE/core/globals.lua
index 0d4067c..ea832f7 100755
--- a/ElvUI_SLE/core/globals.lua
+++ b/ElvUI_SLE/core/globals.lua
@@ -1,22 +1,20 @@
-local E, L, V, P, G = unpack(ElvUI);
-local SLE = E:GetModule('SLE')
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local format = format

 --Chat icon paths--
 local slePath = [[|TInterface\AddOns\ElvUI_SLE\media\textures\]]
 local blizzPath = [[|TInterface\ICONS\]]
---sle
---local adapt = slePath..[[adapt:0:2|t]]
 local repooc = slePath..[[SLE_Chat_Logo:0:2|t ]]
 local darth = slePath..[[SLE_Chat_LogoD:0:2|t ]]
 local friend = slePath..[[Chat_Friend:16:16|t ]]
 local test = slePath..[[Chat_Test:16:16|t ]]
-local rpg = slePath..[[Chat_RPG:13:35|t]]
---blizz
+-- local rpg = slePath..[[Chat_RPG:13:35|t]]
 local kitalie = blizzPath..[[%s:12:12:0:0:64:64:4:60:4:60|t]]
 local orc = blizzPath..[[Achievement_Character_Orc_Male:16:16|t ]]
 local goldicon = blizzPath..[[rame\UI-GoldIcon:12:12|t]]
 local classTable = {
 	deathknight = blizzPath..[[ClassIcon_DeathKnight:16:16|t ]],
+	-- demonhunter = blizzPath..[[ClassIcon_DemonHunter:16:16|t ]],
 	druid = blizzPath..[[ClassIcon_Druid:16:16|t ]],
 	hunter = blizzPath..[[ClassIcon_Hunter:16:16|t ]],
 	mage = blizzPath..[[ClassIcon_Mage:16:16|t ]],
@@ -28,19 +26,52 @@ local classTable = {
 	warlock = blizzPath..[[ClassIcon_Warlock:16:16|t ]],
 	warrior = blizzPath..[[ClassIcon_Warrior:16:16|t ]],
 }
---Check if oRA3 happens to be enabled
-local enable = GetAddOnEnableState(E.myname, "oRA3")
-if enable == 0 then SLE.oraenabled = false else SLE.oraenabled = true end

-E.SLEConfigs = {}
+--Role icons
+SLE.rolePaths = {
+	["ElvUI"] = {
+		TANK = [[Interface\AddOns\ElvUI\media\textures\tank]],
+		HEALER = [[Interface\AddOns\ElvUI\media\textures\healer]],
+		DAMAGER = [[Interface\AddOns\ElvUI\media\textures\dps]]
+	},
+	["SupervillainUI"] = {
+		TANK = [[Interface\AddOns\ElvUI_SLE\media\textures\role\svui-tank]],
+		HEALER = [[Interface\AddOns\ElvUI_SLE\media\textures\role\svui-healer]],
+		DAMAGER = [[Interface\AddOns\ElvUI_SLE\media\textures\role\svui-dps]]
+	},
+	["Blizzard"] = {
+		TANK = [[Interface\AddOns\ElvUI_SLE\media\textures\role\blizz-tank]],
+		HEALER = [[Interface\AddOns\ElvUI_SLE\media\textures\role\blizz-healer]],
+		DAMAGER = [[Interface\AddOns\ElvUI_SLE\media\textures\role\blizz-dps]]
+	},
+	["MiirGui"] = {
+		TANK = [[Interface\AddOns\ElvUI_SLE\media\textures\role\mg-tank]],
+		HEALER = [[Interface\AddOns\ElvUI_SLE\media\textures\role\mg-healer]],
+		DAMAGER = [[Interface\AddOns\ElvUI_SLE\media\textures\role\mg-dps]]
+	},
+}
+
+--Epty Tables
+SLE.Configs = {}

-SLE.version = GetAddOnMetadata("ElvUI_SLE", "Version")
+--Variables
+SLE.region = false

+--Toonlists
 SLE.SpecialChatIcons = {
 	["EU"] = {
-		['Sylvanas'] = {
+		["Sylvanas"] = {
 			["Neeka"] = darth,
 		},
+		["DarkmoonFaire"] = {
+			["Shaylith"] = darth,
+			["Yandria"] = darth,
+			["Ardon"] = darth,
+		},
+		["TheSha'tar"] = {
+			["Lelora"] = darth,
+			["Alamira"] = darth,
+		},
 		["СвежевательДуш"] = {
 			--Darth's toons
 			["Большойгном"] = test, --Testing toon
@@ -105,17 +136,17 @@ SLE.SpecialChatIcons = {
 			["Repooc"] = repooc
 		},
 		["WyrmrestAccord"] = {
-			["Kìtalie"] = kitalie:format("inv_cloth_challengewarlock_d_01helm"),
-			["Sagome"] = kitalie:format("inv_helm_leather_challengemonk_d_01"),
-			["Sortokk"] = kitalie:format("inv_helm_plate_challengedeathknight_d_01"),
-			["Norinael"] = kitalie:format("inv_helmet_plate_challengepaladin_d_01"),
-			["Shalerie"] = kitalie:format("inv_helm_cloth_challengemage_d_01"),
-			["Chalini"] = kitalie:format("inv_helmet_mail_challengeshaman_d_01"),
-			["Marittie"] = kitalie:format("inv_helmet_leather_challengerogue_d_01"),
-			["Crielexie"] = kitalie:format("inv_helmet_cloth_challengepriest_d_01"),
-			["Varysa"] = kitalie:format("inv_helmet_mail_challengehunter_d_01"),
-			["Caylasena"] = kitalie:format("inv_helm_plate_challengewarrior_d_01"),
-			["Syralea"] = kitalie:format("inv_helmet_challengedruid_d_01"),
+			["Kìtalie"] = format(kitalie,"inv_cloth_challengewarlock_d_01helm"),
+			["Sagome"] = format(kitalie,"inv_helm_leather_challengemonk_d_01"),
+			["Sortokk"] = format(kitalie,"inv_helm_plate_challengedeathknight_d_01"),
+			["Norinael"] = format(kitalie,"inv_helmet_plate_challengepaladin_d_01"),
+			["Shalerie"] = format(kitalie,"inv_helm_cloth_challengemage_d_01"),
+			["Chalini"] = format(kitalie,"inv_helmet_mail_challengeshaman_d_01"),
+			["Marittie"] = format(kitalie,"inv_helmet_leather_challengerogue_d_01"),
+			["Lieliline"] = format(kitalie,"inv_helmet_cloth_challengepriest_d_01"),
+			["Varysa"] = format(kitalie,"inv_helmet_mail_challengehunter_d_01"),
+			["Kaelleigh"] = format(kitalie,"inv_helm_plate_challengewarrior_d_01"),
+			["Syralea"] = format(kitalie,"inv_helmet_challengedruid_d_01"),
 			["Dapooc"] = repooc,
 		},
 		["Andorhal"] = {
@@ -123,31 +154,13 @@ SLE.SpecialChatIcons = {
 			["Rovert"] = repooc,
 			["Sliceoflife"] = repooc
 		},
+		--Teh PTR
+		["Brill(EU)"] = {
+			["Дартпредатор"] = darth,
+			["Киландра"] = darth,
+		},
 	},
 	["CN"] = {},
 	["KR"] = {},
 	["TW"] = {},
-}
-
-SLE.rolePaths = {
-	["ElvUI"] = {
-		TANK = [[Interface\AddOns\ElvUI\media\textures\tank]],
-		HEALER = [[Interface\AddOns\ElvUI\media\textures\healer]],
-		DAMAGER = [[Interface\AddOns\ElvUI\media\textures\dps]]
-	},
-	["SupervillainUI"] = {
-		TANK = [[Interface\AddOns\ElvUI_SLE\media\textures\role\svui-tank]],
-		HEALER = [[Interface\AddOns\ElvUI_SLE\media\textures\role\svui-healer]],
-		DAMAGER = [[Interface\AddOns\ElvUI_SLE\media\textures\role\svui-dps]]
-	},
-	["Blizzard"] = {
-		TANK = [[Interface\AddOns\ElvUI_SLE\media\textures\role\blizz-tank]],
-		HEALER = [[Interface\AddOns\ElvUI_SLE\media\textures\role\blizz-healer]],
-		DAMAGER = [[Interface\AddOns\ElvUI_SLE\media\textures\role\blizz-dps]]
-	},
-	["MiirGui"] = {
-		TANK = [[Interface\AddOns\ElvUI_SLE\media\textures\role\mg-tank]],
-		HEALER = [[Interface\AddOns\ElvUI_SLE\media\textures\role\mg-healer]],
-		DAMAGER = [[Interface\AddOns\ElvUI_SLE\media\textures\role\mg-dps]]
-	},
 }
\ No newline at end of file
diff --git a/ElvUI_SLE/core/install.lua b/ElvUI_SLE/core/install.lua
index 4782e0c..aae1f21 100644
--- a/ElvUI_SLE/core/install.lua
+++ b/ElvUI_SLE/core/install.lua
@@ -1,374 +1,208 @@
-local E, L, V, P, G = unpack(ElvUI);
-local UF = E:GetModule('UnitFrames');
-local AI = E:GetModule('SLE_AddonInstaller');
-local SLE = E:GetModule('SLE');
-
-local CURRENT_PAGE = 0
-local MAX_PAGE = 5
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local PI = E:GetModule("PluginInstaller")
+PI.SLE_Auth = ""
+PI.SLE_Word = ""
+local locale = GetLocale()
+
+local _G = _G
+local ENABLE, DISABLE, NONE = ENABLE, DISABLE, NONE
+local SetCVar = SetCVar
+local SetAutoDeclineGuildInvites = SetAutoDeclineGuildInvites
+local SetInsertItemsLeftToRight = SetInsertItemsLeftToRight
+local GetCVarBool, StopMusic, ReloadUI = GetCVarBool, StopMusic, ReloadUI

 local dtbarsList = {}
 local dtbarsTexts = {}

-function AI:DarthCaster()
-	E.db["datatexts"]["panels"]["DP_6"]["right"] = "Crit Chance"
-	E.db["datatexts"]["panels"]["DP_6"]["left"] = "Spell/Heal Power"
-	E.db["datatexts"]["panels"]["DP_6"]["middle"] = "Haste"
-end
-
-function AI:DarthTank()
-	E.db["nameplate"]["healthBar"]["lowHPScale"]["toFront"] = false
-	E.db["nameplate"]["healthBar"]["lowThreshold"] = 0
-	E.db["nameplate"]["threat"]["badScale"] = 1.2
-	E.db["nameplate"]["threat"]["badColor"] = {
-		["r"] = 0.780392156862745,
-		["g"] = 0.0784313725490196,
-		["b"] = 0.101960784313725,
-	}
-
-	E.db["datatexts"]["panels"]["DP_6"]["right"] = "Armor"
-	E.db["datatexts"]["panels"]["DP_6"]["left"] = "Avoidance"
-	E.db["datatexts"]["panels"]["DP_6"]["middle"] = "Resolve"
-end
-
-function AI:DarthPhys()
-	E.db["datatexts"]["panels"]["DP_6"]["right"] = "Crit Chance"
-	E.db["datatexts"]["panels"]["DP_6"]["left"] = "Attack Power"
-	E.db["datatexts"]["panels"]["DP_6"]["middle"] = "Haste"
-end
-
-function AI:DarthHeal()
-	do
-		E.db["unitframe"]["debuffHighlighting"] = true
-
-		E.db["unitframe"]["units"]["party"]["health"]["frequentUpdates"] = true
-		E.db["unitframe"]["units"]["party"]["health"]["text_format"] = "[healthcolor][health:deficit]"
-		E.db["unitframe"]["units"]["party"]["debuffs"]["enable"] = true
-		E.db["unitframe"]["units"]["party"]["debuffs"]["anchorPoint"] = "TOPLEFT"
-		E.db["unitframe"]["units"]["party"]["debuffs"]["sizeOverride"] = 25
-
-		E.db["unitframe"]["units"]["raid"]["healPrediction"] = true
-		E.db["unitframe"]["units"]["raid"]["health"]["frequentUpdates"] = true
-		E.db["unitframe"]["units"]["raid"]["health"]["text_format"] = "[healthcolor][health:deficit]"
-		E.db["unitframe"]["units"]["raid"]["GPSArrow"]["enable"] = true
-		E.db["unitframe"]["units"]["raid"]["GPSArrow"]["size"] = 20
-		E.db["unitframe"]["units"]["raid"]["GPSArrow"]["xOffset"] = -27
-		E.db["unitframe"]["units"]["raid"]["GPSArrow"]["yOffset"] = 8
-
-		E.db["unitframe"]["units"]["raidpet"]["enable"] = true
-	end
-
-	E.db["datatexts"]["panels"]["DP_6"]["right"] = "Crit Chance"
-	E.db["datatexts"]["panels"]["DP_6"]["left"] = "Spell/Heal Power"
-	E.db["datatexts"]["panels"]["DP_6"]["middle"] = "MP5"
-	--Movers--
-	do
-		SLE:SetMoverPosition("ElvUF_PartyMover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 770, 143)
-		SLE:SetMoverPosition("ElvUF_RaidMover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 770, 143)
-		SLE:SetMoverPosition("ElvUF_Raid40Mover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 770, 143)
-		SLE:SetMoverPosition("AlertFrameMover", "BOTTOM", ElvUIParent, "BOTTOM", 0, 427)
-		SLE:SetMoverPosition("UIErrorsFrameMover", "TOP", ElvUIParent, "TOP", 8, -381)
-		SLE:SetMoverPosition("BossButton", "BOTTOMRIGHT", ElvUIParent, "BOTTOMRIGHT", -421, 382)
+local function DarthHeal()
+	E.db["unitframe"]["units"]["raid"]["GPSArrow"]["enable"] = true
+	E.db["unitframe"]["units"]["raid"]["health"]["frequentUpdates"] = true
+	E.db["unitframe"]["units"]["raid"]["height"] = 22
+
+	E.db["unitframe"]["units"]["player"]["castbar"]["width"] = 200
+
+	E.db["nameplates"]["units"]["PLAYER"]["enable"] = false
+
+	E.db["movers"]["ElvUF_PlayerCastbarMover"] = nil
+	E.db["movers"]["ElvUF_FocusCastbarMover"] = "BOTTOM,ElvUIParent,BOTTOM,285,36"
+	E.db["movers"]["PetAB"] = "BOTTOMLEFT,ElvUIParent,BOTTOMLEFT,522,124"
+	E.db["movers"]["ElvUF_RaidMover"] = "BOTTOMLEFT,ElvUIParent,BOTTOMLEFT,743,166"
+	E.db["movers"]["ClassBarMover"] = "BOTTOMLEFT,ElvUIParent,BOTTOMLEFT,527,251"
+	E.db["movers"]["ElvUF_PetCastbarMover"] = "BOTTOM,ElvUIParent,BOTTOM,-283,121"
+	E.db["movers"]["VehicleSeatMover"] = "BOTTOMLEFT,ElvUIParent,BOTTOMLEFT,522,32"
+	E.db["movers"]["ElvUF_TargetTargetMover"] = "BOTTOM,ElvUIParent,BOTTOM,222,113"
+	E.db["movers"]["ElvUF_FocusMover"] = "BOTTOM,ElvUIParent,BOTTOM,250,56"
+	E.db["movers"]["TotemBarMover"] = "BOTTOM,ElvUIParent,BOTTOM,-303,264"
+	E.db["movers"]["ElvUF_PlayerMover"] = "BOTTOMLEFT,ElvUIParent,BOTTOMLEFT,527,191"
+	E.db["movers"]["ElvUF_PetMover"] = "BOTTOM,ElvUIParent,BOTTOM,-283,140"
+	E.db["movers"]["BossButton"] = "BOTTOM,ElvUIParent,BOTTOM,-300,330"
+	E.db["movers"]["AlertFrameMover"] = "TOP,ElvUIParent,TOP,0,-186"
+	E.db["movers"]["ElvUF_TargetMover"] = "BOTTOMRIGHT,ElvUIParent,BOTTOMRIGHT,-523,187"
+	if T.IsAddOnLoaded("ElvUI_AuraBarsMovers") then
+		E.db["movers"]["ElvUF_PlayerAuraMover"] = "BOTTOMLEFT,ElvUIParent,BOTTOMLEFT,345,210"
+		E.db["movers"]["ElvUF_TargetAuraMover"] = "BOTTOMRIGHT,ElvUIParent,BOTTOMRIGHT,-341,207"
 	end
 end

-function AI:DarthSetup() --The function to switch from classic ElvUI settings to Darth's
+local function DarthSetup()
 	local layout = E.db.layoutSet
 	local installMark = E.private["install_complete"]
 	local installMarkSLE = E.private["sle"]["install_complete"]

-	local word = layout == 'tank' and L["Tank"] or layout == 'healer' and L["Healer"] or layout == 'dpsMelee' and L['Physical DPS'] or L['Caster DPS']
-	SLEInstallStepComplete.message = L["Darth's Default Set"]..": "..word
-	SLEInstallStepComplete:Show()
-
-	if IsAddOnLoaded("ElvUI_DTBars2") then
-		table.wipe(dtbarsList)
-		table.wipe(dtbarsTexts)
-		for name, data in pairs(E.global.dtbars) do
+	if T.IsAddOnLoaded("ElvUI_DTBars2") then
+		T.twipe(dtbarsList)
+		T.twipe(dtbarsTexts)
+		for name, data in T.pairs(E.global.dtbars) do
 			if E.db.dtbars and E.db.dtbars[name] then
 				dtbarsList[name] = E.db.dtbars[name]
 				dtbarsTexts[name] = E.db.datatexts.panels[name]
 			end
 		end
 	end
-	table.wipe(E.db)
+
+	T.twipe(E.db)
 	E:CopyTable(E.db, P)

-	table.wipe(E.private)
+	T.twipe(E.private)
 	E:CopyTable(E.private, V)
-
-	if E.db['movers'] then table.wipe(E.db['movers']) else E.db['movers'] = {} end

-	--General--
+	if E.db['movers'] then T.twipe(E.db['movers']) else E.db['movers'] = {} end
+
+	--General
 	do
-		E.db["general"]["totems"]["sortDirection"] = "DESCENDING"
-		E.db["general"]["hideErrorFrame"] = false
-		E.db["general"]["afk"] = false
-		E.db["general"]["autoRepair"] = "PLAYER"
-		E.db["general"]["minimap"]["locationText"] = "HIDE"
-		E.db["general"]["minimap"]["icons"]["garrison"]["xOffset"] = -22
-		E.db["general"]["minimap"]["icons"]["garrison"]["position"] = "LEFT"
-		E.db["general"]["minimap"]["size"] = 200
-		E.db["general"]["bottomPanel"] = false
-		E.db["general"]["objectiveFrameHeight"] = 620
+		E.db["general"]["totems"]["size"] = 30
+		E.db["general"]["totems"]["growthDirection"] = "HORIZONTAL"
 		E.db["general"]["threat"]["enable"] = false
 		E.db["general"]["stickyFrames"] = false
-		E.db["general"]["topPanel"] = false
-		E.db["general"]["experience"]["height"] = 186
-		E.db["general"]["reputation"]["height"] = 186
+		E.db["general"]["minimap"]["locationText"] = "HIDE"
+		E.db["general"]["bottomPanel"] = false
+		E.db["general"]["objectiveFrameHeight"] = 640
 		E.db["general"]["bonusObjectivePosition"] = "RIGHT"
-		E.db["general"]["vendorGrays"] = true
+		E.db["general"]["hideErrorFrame"] = false
 	end
-	--Nameplates--
+	--Actionbars
 	do
-		E.db["nameplate"]["fontSize"] = 10
-		E.db["nameplate"]["wrapName"] = true
-		E.db["nameplate"]["fontOutline"] = "OUTLINE"
-		E.db["nameplate"]["font"] = "PT Sans Narrow"
-		E.db["nameplate"]["colorNameByValue"] = false
-		E.db["nameplate"]["raidHealIcon"]["xOffset"] = 0
-		E.db["nameplate"]["healthBar"]["height"] = 10
-		E.db["nameplate"]["healthBar"]["text"]["enable"] = true
-		E.db["nameplate"]["healthBar"]["lowHPScale"]["height"] = 10
-		E.db["nameplate"]["healthBar"]["lowHPScale"]["enable"] = true
-		E.db["nameplate"]["buffs"]["fontOutline"] = "OUTLINE"
-		E.db["nameplate"]["buffs"]["font"] = "PT Sans Narrow"
-		E.db["nameplate"]["debuffs"]["font"] = "PT Sans Narrow"
-		E.db["nameplate"]["debuffs"]["numAuras"] = 6
-		E.db["nameplate"]["debuffs"]["fontOutline"] = "OUTLINE"
-		E.db["nameplate"]["debuffs"]["stretchTexture"] = false
+		E.db["actionbar"]["bar3"]["backdropSpacing"] = 0
+		E.db["actionbar"]["bar3"]["point"] = "TOPLEFT"
+		E.db["actionbar"]["bar3"]["buttons"] = 12
+		E.db["actionbar"]["bar3"]["buttonspacing"] = -1
+		E.db["actionbar"]["bar3"]["buttonsPerRow"] = 3
+		E.db["actionbar"]["bar3"]["buttonsize"] = 31
+		E.db["actionbar"]["bar2"]["enabled"] = true
+		E.db["actionbar"]["bar2"]["point"] = "TOPLEFT"
+		E.db["actionbar"]["bar2"]["backdropSpacing"] = 0
+		E.db["actionbar"]["bar2"]["buttonspacing"] = -1
+		E.db["actionbar"]["bar2"]["buttonsPerRow"] = 3
+		E.db["actionbar"]["bar2"]["buttonsize"] = 31
+		E.db["actionbar"]["bar1"]["point"] = "TOPLEFT"
+		E.db["actionbar"]["bar1"]["backdropSpacing"] = 0
+		E.db["actionbar"]["bar1"]["buttonsPerRow"] = 4
+		E.db["actionbar"]["bar1"]["buttonsize"] = 41
+		E.db["actionbar"]["bar1"]["buttonspacing"] = -1
+		E.db["actionbar"]["bar4"]["backdropSpacing"] = 0
+		E.db["actionbar"]["bar4"]["point"] = "TOPLEFT"
+		E.db["actionbar"]["bar4"]["backdrop"] = false
+		E.db["actionbar"]["bar4"]["buttonsPerRow"] = 2
+		E.db["actionbar"]["bar4"]["buttonsize"] = 31
+		E.db["actionbar"]["bar4"]["buttonspacing"] = -1
+		E.db["actionbar"]["bar5"]["backdropSpacing"] = 0
+		E.db["actionbar"]["bar5"]["point"] = "TOPLEFT"
+		E.db["actionbar"]["bar5"]["buttons"] = 12
+		E.db["actionbar"]["bar5"]["buttonspacing"] = -1
+		E.db["actionbar"]["bar5"]["buttonsPerRow"] = 2
+		E.db["actionbar"]["bar5"]["buttonsize"] = 31
+		E.db["actionbar"]["barPet"]["point"] = "TOPLEFT"
+		E.db["actionbar"]["barPet"]["buttonspacing"] = -1
+		E.db["actionbar"]["barPet"]["buttonsPerRow"] = 5
+		E.db["actionbar"]["barPet"]["backdrop"] = false
+		E.db["actionbar"]["barPet"]["buttonsize"] = 22
+		E.db["actionbar"]["backdropSpacingConverted"] = true
+		E.db["actionbar"]["font"] = "PT Sans Narrow"
+		E.db["actionbar"]["fontOutline"] = "OUTLINE"
+		E.db["actionbar"]["stanceBar"]["buttonspacing"] = -1
+		E.db["actionbar"]["stanceBar"]["buttonsPerRow"] = 1
+		E.db["actionbar"]["stanceBar"]["style"] = "classic"
+		E.db["actionbar"]["stanceBar"]["buttonsize"] = 28
+		E.db["actionbar"]["keyDown"] = false
 	end
-	--Bags--
+	--Auras
 	do
-		E.db["bags"]["yOffsetBank"] = 181
+		E.db["auras"]["font"] = "PT Sans Narrow"
+		E.db["auras"]["fontOutline"] = "OUTLINE"
+		E.db["auras"]["buffs"]["wrapAfter"] = 10
+		E.db["auras"]["fontSize"] = 12
+		E.db["auras"]["debuffs"]["size"] = 40
+		E.db["auras"]["debuffs"]["wrapAfter"] = 8
+	end
+	--Bags
+	do
+		E.db["bags"]["junkIcon"] = true
+		E.db["bags"]["countFont"] = "Univers"
 		E.db["bags"]["itemLevelFont"] = "PT Sans Narrow"
-		E.db["bags"]["yOffset"] = 181
-		E.db["bags"]["bagSize"] = 31
-		E.db["bags"]["itemLevelFontSize"] = 12
-		E.db["bags"]["alignToChat"] = false
-		E.db["bags"]["bagWidth"] = 476
-		E.db["bags"]["bankSize"] = 31
-		E.db["bags"]["bankWidth"] = 476
-		E.db["bags"]["moneyFormat"] = "CONDENSED"
-		E.db["bags"]["currencyFormat"] = "ICON"
+		E.db["bags"]["bagSize"] = 33
+		E.db["bags"]["bankWidth"] = 505
+		E.db["bags"]["itemLevelThreshold"] = 650
+		E.db["bags"]["bankSize"] = 33
+		E.db["bags"]["countFontOutline"] = "OUTLINE"
+		E.db["bags"]["itemLevelFontSize"] = 11
 		E.db["bags"]["itemLevelFontOutline"] = "OUTLINE"
+		E.db["bags"]["bagWidth"] = 505
+		E.db["bags"]["yOffsetBank"] = 175
+		E.db["bags"]["alignToChat"] = false
+		E.db["bags"]["yOffset"] = 175
 	end
-	--Chat--
+	--Chat
 	do
 		E.db["chat"]["tabFontOutline"] = "OUTLINE"
-		E.db["chat"]["timeStampFormat"] = "%H:%M:%S "
-		E.db["chat"]["editboxhistory"] = 10
 		E.db["chat"]["fontOutline"] = "OUTLINE"
-		E.db["chat"]["panelHeightRight"] = 187
-		E.db["chat"]["panelWidth"] = 445
+		E.db["chat"]["timeStampFormat"] = "%H:%M:%S "
+		E.db["chat"]["panelHeight"] = 181
 		E.db["chat"]["emotionIcons"] = false
-		E.db["chat"]["tabFontSize"] = 12
-		E.db["chat"]["editBoxPosition"] = "ABOVE_CHAT"
-		E.db["chat"]["panelWidthRight"] = 425
-		E.db["chat"]["tabFont"] = "PT Sans Narrow"
-		E.db["chat"]["panelHeight"] = 187
+		E.db["chat"]["panelWidth"] = 445
 	end
-	--Tooltip--
-	E.db["tooltip"]["healthBar"]["font"] = "PT Sans Narrow"
-	E.db["tooltip"]["itemCount"] = "NONE"
-	--Unitframes--
+	--Databars
 	do
-		E.db["unitframe"]["fontSize"] = 12
-		E.db["unitframe"]["statusbar"] = "Polished Wood"
-		E.db["unitframe"]["font"] = "PT Sans Narrow"
-		E.db["unitframe"]["debuffHighlighting"] = false
-		E.db["unitframe"]["fontOutline"] = "OUTLINE"
-		E.db["unitframe"]["smartRaidFilter"] = false
-		E.db["unitframe"]["colors"]["colorhealthbyvalue"] = false
-		E.db["unitframe"]["colors"]["healthclass"] = true
-		E.db["unitframe"]["colors"]["auraBarBuff"]["g"] = 0.552941176470588
-		E.db["unitframe"]["colors"]["auraBarBuff"]["r"] = 0.317647058823529
-		E.db["unitframe"]["colors"]["castColor"]["b"] = 0.180392156862745
-		E.db["unitframe"]["colors"]["castColor"]["g"] = 0.76078431372549
-		E.db["unitframe"]["colors"]["castColor"]["r"] = 0.803921568627451
-		E.db["unitframe"]["colors"]["castNoInterrupt"]["b"] = 0.250980392156863
-		E.db["unitframe"]["colors"]["castNoInterrupt"]["g"] = 0.250980392156863
-		E.db["unitframe"]["colors"]["castNoInterrupt"]["r"] = 0.780392156862745
-
-		E.db["unitframe"]["units"]["player"]["combatfade"] = true
-		E.db["unitframe"]["units"]["player"]["width"] = 190
-		E.db["unitframe"]["units"]["player"]["lowmana"] = 0
-		E.db["unitframe"]["units"]["player"]["height"] = 27
-		E.db["unitframe"]["units"]["player"]["health"]["text_format"] = "[healthcolor][perhp]% || [health:current]"
-		E.db["unitframe"]["units"]["player"]["power"]["attachTextToPower"] = true
-		E.db["unitframe"]["units"]["player"]["power"]["text_format"] = "[powercolor][perpp]% || [power:current]"
-		E.db["unitframe"]["units"]["player"]["power"]["position"] = "LEFT"
-		E.db["unitframe"]["units"]["player"]["power"]["height"] = 8
-		E.db["unitframe"]["units"]["player"]["name"]["yOffset"] = 15
-		E.db["unitframe"]["units"]["player"]["name"]["text_format"] = "[level] [namecolor][name:long]"
-		E.db["unitframe"]["units"]["player"]["name"]["position"] = "TOPLEFT"
-		E.db["unitframe"]["units"]["player"]["classbar"]["detachFromFrame"] = true
-		E.db["unitframe"]["units"]["player"]["classbar"]["detachedWidth"] = 200
-		E.db["unitframe"]["units"]["player"]["classbar"]["height"] = 8
-		E.db["unitframe"]["units"]["player"]["classbar"]["fill"] = "spaced"
-		E.db["unitframe"]["units"]["player"]["castbar"]["width"] = 240
-		E.db["unitframe"]["units"]["player"]["castbar"]["height"] = 14
-		E.db["unitframe"]["units"]["player"]["castbar"]["format"] = "CURRENTMAX"
-		E.db["unitframe"]["units"]["player"]["debuffs"]["useBlacklist"] = false
-		E.db["unitframe"]["units"]["player"]["debuffs"]["yOffset"] = 18
-		E.db["unitframe"]["units"]["player"]["aurabar"]["maxBars"] = 10
-		E.db["unitframe"]["units"]["player"]["aurabar"]["height"] = 18
-		E.db["unitframe"]["units"]["player"]["customTexts"] = {}
-		E.db["unitframe"]["units"]["player"]["pvp"]["text_format"] = "||cFFB04F4F[pvptimer]||r"
-		E.db["unitframe"]["units"]["player"]["raidicon"]["attachTo"] = "LEFT"
-		E.db["unitframe"]["units"]["player"]["raidicon"]["xOffset"] = -20
-		E.db["unitframe"]["units"]["player"]["raidicon"]["yOffset"] = 0
-		E.db["unitframe"]["units"]["player"]["raidicon"]["size"] = 22
-
-		E.db["unitframe"]["units"]["target"]["width"] = 190
-		E.db["unitframe"]["units"]["target"]["height"] = 27
-		E.db["unitframe"]["units"]["target"]["health"]["text_format"] = "[absorbs] [healthcolor][health:current] || [perhp]%"
-		E.db["unitframe"]["units"]["target"]["power"]["attachTextToPower"] = true
-		E.db["unitframe"]["units"]["target"]["power"]["text_format"] = "[powercolor][power:current] || [perpp]%"
-		E.db["unitframe"]["units"]["target"]["power"]["position"] = "RIGHT"
-		E.db["unitframe"]["units"]["target"]["power"]["height"] = 8
-		E.db["unitframe"]["units"]["target"]["power"]["hideonnpc"] = false
-		E.db["unitframe"]["units"]["target"]["name"]["xOffset"] = 5
-		E.db["unitframe"]["units"]["target"]["name"]["yOffset"] = 15
-		E.db["unitframe"]["units"]["target"]["name"]["text_format"] = "[namecolor][name:long]||r [difficultycolor][level] [shortclassification]||r"
-		E.db["unitframe"]["units"]["target"]["name"]["position"] = "TOPRIGHT"
-		E.db["unitframe"]["units"]["target"]["combobar"]["detachFromFrame"] = true
-		E.db["unitframe"]["units"]["target"]["combobar"]["detachedWidth"] = 200
-		E.db["unitframe"]["units"]["target"]["combobar"]["height"] = 8
-		E.db["unitframe"]["units"]["target"]["combobar"]["fill"] = "spaced"
-		E.db["unitframe"]["units"]["target"]["castbar"]["height"] = 14
-		E.db["unitframe"]["units"]["target"]["castbar"]["width"] = 190
-		E.db["unitframe"]["units"]["target"]["buffs"]["yOffset"] = 20
-		E.db["unitframe"]["units"]["target"]["buffs"]["useBlacklist"]["enemy"] = false
-		E.db["unitframe"]["units"]["target"]["debuffs"]["playerOnly"]["enemy"] = false
-		E.db["unitframe"]["units"]["target"]["aurabar"]["maxBars"] = 9
-		E.db["unitframe"]["units"]["target"]["aurabar"]["height"] = 18
-		E.db["unitframe"]["units"]["target"]["customTexts"] = {}
-		E.db["unitframe"]["units"]["target"]["raidicon"]["attachTo"] = "RIGHT"
-		E.db["unitframe"]["units"]["target"]["raidicon"]["xOffset"] = 20
-		E.db["unitframe"]["units"]["target"]["raidicon"]["yOffset"] = 0
-		E.db["unitframe"]["units"]["target"]["raidicon"]["size"] = 22
-
-		E.db["unitframe"]["units"]["targettarget"]["debuffs"]["enable"] = false
-		E.db["unitframe"]["units"]["targettarget"]["width"] = 100
-		E.db["unitframe"]["units"]["targettarget"]["height"] = 25
-
-		E.db["unitframe"]["units"]["pet"]["width"] = 80
-		E.db["unitframe"]["units"]["pet"]["height"] = 20
-		E.db["unitframe"]["units"]["pet"]["name"]["yOffset"] = -1
-		E.db["unitframe"]["units"]["pet"]["name"]["position"] = "LEFT"
-		E.db["unitframe"]["units"]["pet"]["castbar"]["enable"] = false
-		E.db["unitframe"]["units"]["pet"]["castbar"]["width"] = 80
-		E.db["unitframe"]["units"]["pet"]["power"]["height"] = 5
-
-		E.db["unitframe"]["units"]["focus"]["width"] = 120
-		E.db["unitframe"]["units"]["focus"]["height"] = 30
-		E.db["unitframe"]["units"]["focus"]["debuffs"]["sizeOverride"] = 29
-		E.db["unitframe"]["units"]["focus"]["debuffs"]["anchorPoint"] = "RIGHT"
-		E.db["unitframe"]["units"]["focus"]["debuffs"]["perrow"] = 3
-		E.db["unitframe"]["units"]["focus"]["castbar"]["height"] = 14
-		E.db["unitframe"]["units"]["focus"]["castbar"]["width"] = 208
-
-		E.db["unitframe"]["units"]["tank"]["enable"] = false
-		E.db["unitframe"]["units"]["assist"]["enable"] = false
-
-		E.db["unitframe"]["units"]["bodyguard"]["height"] = 20
-		E.db["unitframe"]["units"]["bodyguard"]["width"] = 90
-
-		E.db["unitframe"]["units"]["party"]["height"] = 32
-		E.db["unitframe"]["units"]["party"]["width"] = 75
-		E.db["unitframe"]["units"]["party"]["verticalSpacing"] = 1
-		E.db["unitframe"]["units"]["party"]["horizontalSpacing"] = 1
-		E.db["unitframe"]["units"]["party"]["growthDirection"] = "RIGHT_UP"
-		E.db["unitframe"]["units"]["party"]["health"]["position"] = "BOTTOMLEFT"
-		E.db["unitframe"]["units"]["party"]["health"]["text_format"] = "[healthcolor][health:current]"
-		E.db["unitframe"]["units"]["party"]["health"]["yOffset"] = -2
-		E.db["unitframe"]["units"]["party"]["power"]["text_format"] = ""
-		E.db["unitframe"]["units"]["party"]["power"]["height"] = 3
-		E.db["unitframe"]["units"]["party"]["name"]["yOffset"] = 1
-		E.db["unitframe"]["units"]["party"]["name"]["text_format"] = "[name:medium]"
-		E.db["unitframe"]["units"]["party"]["name"]["position"] = "TOP"
-		E.db["unitframe"]["units"]["party"]["debuffs"]["enable"] = false
-		E.db["unitframe"]["units"]["party"]["roleIcon"]["size"] = 13
-		E.db["unitframe"]["units"]["party"]["roleIcon"]["position"] = "BOTTOMRIGHT"
-		E.db["unitframe"]["units"]["party"]["GPSArrow"]["enable"] = false
-
-		E.db["unitframe"]["units"]["raid"]["height"] = 32
-		E.db["unitframe"]["units"]["raid"]["width"] = 75
-		E.db["unitframe"]["units"]["raid"]["verticalSpacing"] = 1
-		E.db["unitframe"]["units"]["raid"]["visibility"] = "[@raid6,noexists][@raid31,exists] hide;show"
-		E.db["unitframe"]["units"]["raid"]["horizontalSpacing"] = 1
-		E.db["unitframe"]["units"]["raid"]["numGroups"] = 6
-		E.db["unitframe"]["units"]["raid"]["growthDirection"] = "RIGHT_UP"
-		E.db["unitframe"]["units"]["raid"]["health"]["position"] = "BOTTOMLEFT"
-		E.db["unitframe"]["units"]["raid"]["health"]["text_format"] = "[healthcolor][health:current]"
-		E.db["unitframe"]["units"]["raid"]["health"]["yOffset"] = -2
-		E.db["unitframe"]["units"]["raid"]["name"]["text_format"] = "[name:medium]"
-		E.db["unitframe"]["units"]["raid"]["name"]["yOffset"] = 1
-		E.db["unitframe"]["units"]["raid"]["power"]["height"] = 3
-		E.db["unitframe"]["units"]["raid"]["roleIcon"]["size"] = 13
-		E.db["unitframe"]["units"]["raid"]["GPSArrow"]["enable"] = false
-		E.db["unitframe"]["units"]["raid"]["rdebuffs"]["size"] = 18
-
-		E.db["unitframe"]["units"]["raid40"]["horizontalSpacing"] = 1
-		E.db["unitframe"]["units"]["raid40"]["growthDirection"] = "RIGHT_UP"
-		E.db["unitframe"]["units"]["raid40"]["width"] = 75
-		E.db["unitframe"]["units"]["raid40"]["height"] = 23
-		E.db["unitframe"]["units"]["raid40"]["verticalSpacing"] = 1
-		E.db["unitframe"]["units"]["raid40"]["visibility"] = "[@raid31,noexists] hide;show"
-
-		E.db["unitframe"]["units"]["boss"]["height"] = 30
-		E.db["unitframe"]["units"]["boss"]["width"] = 198
-		E.db["unitframe"]["units"]["boss"]["growthDirection"] = "DOWN"
-		E.db["unitframe"]["units"]["boss"]["health"]["text_format"] = "[healthcolor][health:current-percent]"
-		E.db["unitframe"]["units"]["boss"]["power"]["yOffset"] = -4
-		E.db["unitframe"]["units"]["boss"]["power"]["width"] = "spaced"
-		E.db["unitframe"]["units"]["boss"]["castbar"]["height"] = 15
-		E.db["unitframe"]["units"]["boss"]["buffs"]["yOffset"] = 3
-		E.db["unitframe"]["units"]["boss"]["buffs"]["perrow"] = 4
-		E.db["unitframe"]["units"]["boss"]["debuffs"]["yOffset"] = 0
-		E.db["unitframe"]["units"]["boss"]["debuffs"]["anchorPoint"] = "BOTTOMRIGHT"
-		E.db["unitframe"]["units"]["boss"]["debuffs"]["numrows"] = 1
-		E.db["unitframe"]["units"]["boss"]["debuffs"]["perrow"] = 4
-		E.db["unitframe"]["units"]["boss"]["debuffs"]["attachTo"] = "BUFFS"
-
-		E.db["unitframe"]["units"]["arena"]["height"] = 30
-		E.db["unitframe"]["units"]["arena"]["width"] = 198
-		E.db["unitframe"]["units"]["arena"]["growthDirection"] = "DOWN"
-		E.db["unitframe"]["units"]["arena"]["health"]["text_format"] = "[healthcolor][health:current-percent]"
-		E.db["unitframe"]["units"]["arena"]["power"]["yOffset"] = -4
-		E.db["unitframe"]["units"]["arena"]["power"]["width"] = "spaced"
-		E.db["unitframe"]["units"]["arena"]["castbar"]["height"] = 14
-		E.db["unitframe"]["units"]["arena"]["castbar"]["width"] = 198
-		E.db["unitframe"]["units"]["arena"]["buffs"]["yOffset"] = 3
-		E.db["unitframe"]["units"]["arena"]["buffs"]["perrow"] = 4
-		E.db["unitframe"]["units"]["arena"]["debuffs"]["yOffset"] = 0
-		E.db["unitframe"]["units"]["arena"]["debuffs"]["anchorPoint"] = "BOTTOMRIGHT"
-		E.db["unitframe"]["units"]["arena"]["debuffs"]["perrow"] = 4
-		E.db["unitframe"]["units"]["arena"]["debuffs"]["attachTo"] = "BUFFS"
-		E.db["unitframe"]["units"]["arena"]["pvpTrinket"]["position"] = "LEFT"
+		E.db["databars"]["artifact"]["orientation"] = "HORIZONTAL"
+		E.db["databars"]["artifact"]["textFormat"] = "CURMAX"
+		E.db["databars"]["artifact"]["height"] = 10
+		E.db["databars"]["artifact"]["width"] = 380
+		E.db["databars"]["reputation"]["reverseFill"] = true
+		E.db["databars"]["reputation"]["orientation"] = "HORIZONTAL"
+		E.db["databars"]["reputation"]["height"] = 10
+		E.db["databars"]["reputation"]["enable"] = true
+		E.db["databars"]["reputation"]["width"] = 287
+		E.db["databars"]["experience"]["orientation"] = "HORIZONTAL"
+		E.db["databars"]["experience"]["height"] = 10
+		E.db["databars"]["experience"]["width"] = 286
+		E.db["databars"]["honor"]["orientation"] = "HORIZONTAL"
+		E.db["databars"]["honor"]["textFormat"] = "CURMAX"
+		E.db["databars"]["honor"]["height"] = 10
+		E.db["databars"]["honor"]["width"] = 380
 	end
-	--Datatexts--
+	--Datatexts
 	do
-		E.db["datatexts"]["minimapPanels"] = false
-		E.db["datatexts"]["fontSize"] = 12
-		E.db["datatexts"]["goldFormat"] = "CONDENSED"
+		E.db["datatexts"]["noCombatClick"] = true
+		E.db["datatexts"]["noCombatHover"] = true
+		E.db["datatexts"]["fontOutline"] = "OUTLINE"
 		E.db["datatexts"]["panelTransparency"] = true
 		E.db["datatexts"]["time24"] = true
+		E.db["datatexts"]["panels"]["SLE_DataPanel_7"] = "System"
 		E.db["datatexts"]["panels"]["RightChatDataPanel"]["right"] = "Talent/Loot Specialization"
 		E.db["datatexts"]["panels"]["RightChatDataPanel"]["left"] = "Mastery"
-		E.db["datatexts"]["panels"]["DP_5"]["right"] = "Durability"
-		E.db["datatexts"]["panels"]["DP_5"]["left"] = "S&L Currency"
-		E.db["datatexts"]["panels"]["DP_5"]["middle"] = "Bags"
-		E.db["datatexts"]["panels"]["LeftChatDataPanel"]["right"] = "S&L Friends"
+		E.db["datatexts"]["panels"]["RightChatDataPanel"]["middle"] = "S&L Item Level"
+		E.db["datatexts"]["panels"]["SLE_DataPanel_6"]["right"] = "Bags"
+		E.db["datatexts"]["panels"]["SLE_DataPanel_6"]["left"] = "S&L Friends"
+		E.db["datatexts"]["panels"]["SLE_DataPanel_6"]["middle"] = "S&L Currency"
 		E.db["datatexts"]["panels"]["LeftChatDataPanel"]["left"] = "Combat/Arena Time"
-		E.db["datatexts"]["panels"]["LeftChatDataPanel"]["middle"] = "S&L Guild"
-		E.db["datatexts"]["panels"]["Bottom_Panel"] = "System"
-		E.db["datatexts"]["font"] = "PT Sans Narrow"
-		E.db["datatexts"]["fontOutline"] = "OUTLINE"
-
-		if IsAddOnLoaded("ElvUI_DTBars2") then
+		E.db["datatexts"]["panels"]["LeftChatDataPanel"]["right"] = "S&L Guild"
+		E.db["datatexts"]["panels"]["RightMiniPanel"] = "Time"
+		E.db["datatexts"]["panels"]["SLE_DataPanel_8"]["right"] = "Haste"
+		E.db["datatexts"]["panels"]["SLE_DataPanel_8"]["left"] = "Spell/Heal Power"
+		E.db["datatexts"]["panels"]["SLE_DataPanel_8"]["middle"] = "Crit Chance"
+		E.db["datatexts"]["panels"]["LeftMiniPanel"] = "S&L Time Played"
+		if T.IsAddOnLoaded("ElvUI_DTBars2") then
 			if not E.db.dtbars then E.db.dtbars = {} end
-			for name, data in pairs(E.global.dtbars) do
+			for name, data in T.pairs(E.global.dtbars) do
 				if dtbarsList[name] then
 					E.db.dtbars[name] = dtbarsList[name]
 					E.db.datatexts.panels[name] = dtbarsTexts[name]
@@ -376,809 +210,629 @@ function AI:DarthSetup() --The function to switch from classic ElvUI settings to
 			end
 		end
 	end
-	--Actionbars--
+	--Nameplates
 	do
-		E.db["actionbar"]["fontSize"] = 12
-		E.db["actionbar"]["font"] = "PT Sans Narrow"
-		E.db["actionbar"]["fontOutline"] = "OUTLINE"
-		E.db["actionbar"]["keyDown"] = false
-		E.db["actionbar"]["hotkeytext"] = false
+		E.db["nameplates"]["lowHealthThreshold"] = 0.2
+		E.db["nameplates"]["font"] = "PT Sans Narrow"
+		E.db["nameplates"]["fontOutline"] = "OUTLINE"
+		E.db["nameplates"]["threat"]["beingTankedByTank"] = false
+		E.db["nameplates"]["castNoInterruptColor"]["b"] = 0.12549019607843
+		E.db["nameplates"]["castNoInterruptColor"]["g"] = 0.098039215686274
+		E.db["nameplates"]["castNoInterruptColor"]["r"] = 0.85882352941176
+		E.db["nameplates"]["statusbar"] = "ElvUI Gloss"
+		E.db["nameplates"]["fontSize"] = 12
+		E.db["nameplates"]["reactions"]["good"]["b"] = 0.10980392156863
+		E.db["nameplates"]["reactions"]["good"]["g"] = 0.74901960784314
+		E.db["nameplates"]["reactions"]["good"]["r"] = 0.082352941176471
+		E.db["nameplates"]["reactions"]["tapped"]["b"] = 0.72549019607843
+		E.db["nameplates"]["reactions"]["tapped"]["g"] = 0.72549019607843
+		E.db["nameplates"]["reactions"]["tapped"]["r"] = 0.72549019607843
+		E.db["nameplates"]["reactions"]["bad"]["b"] = 0.050980392156863
+		E.db["nameplates"]["reactions"]["bad"]["g"] = 0
+		E.db["nameplates"]["reactions"]["bad"]["r"] = 0.93725490196078
+		E.db["nameplates"]["reactions"]["neutral"]["b"] = 0.062745098039216
+		E.db["nameplates"]["reactions"]["neutral"]["g"] = 0.81176470588235
+		E.db["nameplates"]["reactions"]["neutral"]["r"] = 0.92156862745098
+		E.db["nameplates"]["units"]["FRIENDLY_PLAYER"]["healthbar"]["enable"] = true
+		E.db["nameplates"]["units"]["FRIENDLY_PLAYER"]["powerbar"]["height"] = 4
+		E.db["nameplates"]["units"]["FRIENDLY_NPC"]["powerbar"]["height"] = 4
+		E.db["nameplates"]["units"]["FRIENDLY_NPC"]["powerbar"]["enable"] = true
+		E.db["nameplates"]["units"]["ENEMY_NPC"]["powerbar"]["height"] = 4
+		E.db["nameplates"]["units"]["ENEMY_NPC"]["powerbar"]["enable"] = true
+		E.db["nameplates"]["units"]["ENEMY_NPC"]["buffs"]["numAuras"] = 6
+		E.db["nameplates"]["units"]["HEALER"]["powerbar"]["height"] = 4
+		E.db["nameplates"]["units"]["ENEMY_PLAYER"]["powerbar"]["height"] = 4
+		E.db["nameplates"]["units"]["ENEMY_PLAYER"]["powerbar"]["enable"] = true
+		E.db["nameplates"]["units"]["ENEMY_PLAYER"]["buffs"]["numAuras"] = 6
+		E.db["nameplates"]["units"]["PLAYER"]["alwaysShow"] = true
+		E.db["nameplates"]["units"]["PLAYER"]["debuffs"]["enable"] = false
+		E.db["nameplates"]["units"]["PLAYER"]["healthbar"]["width"] = 120
+		E.db["nameplates"]["units"]["PLAYER"]["castbar"]["enable"] = false
+		E.db["nameplates"]["units"]["PLAYER"]["powerbar"]["enable"] = false
+		E.db["nameplates"]["units"]["PLAYER"]["buffs"]["enable"] = false
+	end
+	--Tooltips
+	do
+		E.db["tooltip"]["itemCount"] = "NONE"
+		E.db["tooltip"]["healthBar"]["fontSize"] = 12
+		E.db["tooltip"]["healthBar"]["font"] = "PT Sans Narrow"
+	end
+	--Unitframes
+	do
+		E.db["unitframe"]["fontSize"] = 12
+		E.db["unitframe"]["font"] = "PT Sans Narrow"
+		E.db["unitframe"]["colors"]["auraBarBuff"]["b"] = 0.25490196078431
+		E.db["unitframe"]["colors"]["auraBarBuff"]["g"] = 0.76470588235294
+		E.db["unitframe"]["colors"]["auraBarBuff"]["r"] = 0.20392156862745
+		E.db["unitframe"]["colors"]["colorhealthbyvalue"] = false
+		E.db["unitframe"]["colors"]["healthclass"] = true
+		E.db["unitframe"]["colors"]["customhealthbackdrop"] = true
+		E.db["unitframe"]["colors"]["health_backdrop"]["b"] = 0
+		E.db["unitframe"]["colors"]["health_backdrop"]["g"] = 0
+		E.db["unitframe"]["colors"]["health_backdrop"]["r"] = 0
+		E.db["unitframe"]["colors"]["castColor"]["b"] = 0
+		E.db["unitframe"]["colors"]["castColor"]["g"] = 0.8156862745098
+		E.db["unitframe"]["colors"]["castColor"]["r"] = 1
+		E.db["unitframe"]["colors"]["healPrediction"]["personal"]["b"] = 0.50196078431373
+		E.db["unitframe"]["smartRaidFilter"] = false
+		E.db["unitframe"]["statusbar"] = "Ohi Dragon"
+		E.db["unitframe"]["fontOutline"] = "OUTLINE"
+		E.db["unitframe"]["debuffHighlighting"] = "GLOW"

-		E.db["actionbar"]["bar1"]["point"] = "TOPLEFT"
-		E.db["actionbar"]["bar1"]["buttonspacing"] = 1
-		E.db["actionbar"]["bar1"]["buttonsPerRow"] = 6
-		E.db["actionbar"]["bar1"]["buttonsize"] = 45
+		E.db["unitframe"]["units"]["player"]["raidicon"]["attachTo"] = "LEFT"
+		E.db["unitframe"]["units"]["player"]["raidicon"]["yOffset"] = 0
+		E.db["unitframe"]["units"]["player"]["raidicon"]["xOffset"] = -20
+		E.db["unitframe"]["units"]["player"]["raidicon"]["size"] = 24
+		E.db["unitframe"]["units"]["player"]["debuffs"]["yOffset"] = 15
+		E.db["unitframe"]["units"]["player"]["portrait"]["enable"] = true
+		E.db["unitframe"]["units"]["player"]["portrait"]["camDistanceScale"] = 6
+		E.db["unitframe"]["units"]["player"]["portrait"]["overlay"] = true
+		E.db["unitframe"]["units"]["player"]["castbar"]["height"] = 22
+		E.db["unitframe"]["units"]["player"]["castbar"]["width"] = 220
+		E.db["unitframe"]["units"]["player"]["customTexts"] = {}
+		E.db["unitframe"]["units"]["player"]["customTexts"]["Absorb"] = {}
+		E.db["unitframe"]["units"]["player"]["customTexts"]["Absorb"]["attachTextTo"] = "Health"
+		E.db["unitframe"]["units"]["player"]["customTexts"]["Absorb"]["font"] = "PT Sans Narrow"
+		E.db["unitframe"]["units"]["player"]["customTexts"]["Absorb"]["justifyH"] = "LEFT"
+		E.db["unitframe"]["units"]["player"]["customTexts"]["Absorb"]["fontOutline"] = "OUTLINE"
+		E.db["unitframe"]["units"]["player"]["customTexts"]["Absorb"]["xOffset"] = 2
+		E.db["unitframe"]["units"]["player"]["customTexts"]["Absorb"]["yOffset"] = -6
+		E.db["unitframe"]["units"]["player"]["customTexts"]["Absorb"]["text_format"] = "[absorbs:sl-short]"
+		E.db["unitframe"]["units"]["player"]["customTexts"]["Absorb"]["size"] = 12
+		E.db["unitframe"]["units"]["player"]["health"]["yOffset"] = -2
+		E.db["unitframe"]["units"]["player"]["health"]["position"] = "TOPLEFT"
+		E.db["unitframe"]["units"]["player"]["width"] = 200
+		E.db["unitframe"]["units"]["player"]["name"]["yOffset"] = 13
+		E.db["unitframe"]["units"]["player"]["name"]["text_format"] = "[level] [namecolor][name]"
+		E.db["unitframe"]["units"]["player"]["name"]["position"] = "TOPLEFT"
+		E.db["unitframe"]["units"]["player"]["power"]["position"] = "BOTTOMLEFT"
+		E.db["unitframe"]["units"]["player"]["power"]["xOffset"] = 2
+		E.db["unitframe"]["units"]["player"]["power"]["text_format"] = "[powercolor][curpp]"
+		E.db["unitframe"]["units"]["player"]["power"]["yOffset"] = -10
+		E.db["unitframe"]["units"]["player"]["height"] = 40
+		E.db["unitframe"]["units"]["player"]["classbar"]["detachFromFrame"] = true
+		E.db["unitframe"]["units"]["player"]["classbar"]["detachedWidth"] = 225
+		E.db["unitframe"]["units"]["player"]["pvp"]["text_format"] = "[pvptimer]"

-		E.db["actionbar"]["bar2"]["enabled"] = true
-		E.db["actionbar"]["bar2"]["point"] = "TOPLEFT"
-		E.db["actionbar"]["bar2"]["buttonsPerRow"] = 4
-		E.db["actionbar"]["bar2"]["visibility"] = " [petbattle] hide; show"
-		E.db["actionbar"]["bar2"]["buttonsize"] = 29
+		E.db["unitframe"]["units"]["target"]["portrait"]["enable"] = true
+		E.db["unitframe"]["units"]["target"]["portrait"]["camDistanceScale"] = 6
+		E.db["unitframe"]["units"]["target"]["portrait"]["overlay"] = true
+		E.db["unitframe"]["units"]["target"]["castbar"]["width"] = 200
+		E.db["unitframe"]["units"]["target"]["customTexts"] = {}
+		E.db["unitframe"]["units"]["target"]["customTexts"]["Absorb"] = {}
+		E.db["unitframe"]["units"]["target"]["customTexts"]["Absorb"]["attachTextTo"] = "Health"
+		E.db["unitframe"]["units"]["target"]["customTexts"]["Absorb"]["font"] = "PT Sans Narrow"
+		E.db["unitframe"]["units"]["target"]["customTexts"]["Absorb"]["justifyH"] = "RIGHT"
+		E.db["unitframe"]["units"]["target"]["customTexts"]["Absorb"]["fontOutline"] = "OUTLINE"
+		E.db["unitframe"]["units"]["target"]["customTexts"]["Absorb"]["xOffset"] = 0
+		E.db["unitframe"]["units"]["target"]["customTexts"]["Absorb"]["size"] = 12
+		E.db["unitframe"]["units"]["target"]["customTexts"]["Absorb"]["text_format"] = "[absorbs:sl-short]"
+		E.db["unitframe"]["units"]["target"]["customTexts"]["Absorb"]["yOffset"] = -6
+		E.db["unitframe"]["units"]["target"]["raidicon"]["attachTo"] = "RIGHT"
+		E.db["unitframe"]["units"]["target"]["raidicon"]["yOffset"] = 0
+		E.db["unitframe"]["units"]["target"]["raidicon"]["xOffset"] = 20
+		E.db["unitframe"]["units"]["target"]["raidicon"]["size"] = 24
+		E.db["unitframe"]["units"]["target"]["width"] = 200
+		E.db["unitframe"]["units"]["target"]["power"]["position"] = "BOTTOMRIGHT"
+		E.db["unitframe"]["units"]["target"]["power"]["xOffset"] = 0
+		E.db["unitframe"]["units"]["target"]["power"]["text_format"] = "[powercolor][curpp]"
+		E.db["unitframe"]["units"]["target"]["power"]["yOffset"] = -10
+		E.db["unitframe"]["units"]["target"]["health"]["yOffset"] = -2
+		E.db["unitframe"]["units"]["target"]["health"]["position"] = "TOPRIGHT"
+		E.db["unitframe"]["units"]["target"]["height"] = 40
+		E.db["unitframe"]["units"]["target"]["buffs"]["yOffset"] = 15
+		E.db["unitframe"]["units"]["target"]["name"]["yOffset"] = 13
+		E.db["unitframe"]["units"]["target"]["name"]["text_format"] = " [difficultycolor][level] [namecolor][name:medium] [shortclassification]"
+		E.db["unitframe"]["units"]["target"]["name"]["position"] = "TOPLEFT"

-		E.db["actionbar"]["bar3"]["point"] = "TOPLEFT"
-		E.db["actionbar"]["bar3"]["buttons"] = 12
-		E.db["actionbar"]["bar3"]["buttonsPerRow"] = 4
-		E.db["actionbar"]["bar3"]["visibility"] = "[petbattle] hide; show"
-		E.db["actionbar"]["bar3"]["buttonsize"] = 29
+		E.db["unitframe"]["units"]["targettarget"]["debuffs"]["enable"] = false
+		E.db["unitframe"]["units"]["targettarget"]["width"] = 100
+		E.db["unitframe"]["units"]["targettarget"]["height"] = 25
+		E.db["unitframe"]["units"]["targettarget"]["raidicon"]["yOffset"] = 14

-		E.db["actionbar"]["bar4"]["point"] = "TOPLEFT"
-		E.db["actionbar"]["bar4"]["buttonspacing"] = 1
-		E.db["actionbar"]["bar4"]["backdrop"] = false
-		E.db["actionbar"]["bar4"]["buttonsPerRow"] = 2
-		E.db["actionbar"]["bar4"]["buttonsize"] = 30
-		E.db["actionbar"]["bar4"]["visibility"] = "[petbattle] hide; show"
+		E.db["unitframe"]["units"]["focus"]["debuffs"]["sizeOverride"] = 25
+		E.db["unitframe"]["units"]["focus"]["debuffs"]["perrow"] = 3
+		E.db["unitframe"]["units"]["focus"]["debuffs"]["anchorPoint"] = "RIGHT"
+		E.db["unitframe"]["units"]["focus"]["width"] = 150
+		E.db["unitframe"]["units"]["focus"]["castbar"]["width"] = 220
+		E.db["unitframe"]["units"]["focus"]["height"] = 25

-		E.db["actionbar"]["bar5"]["point"] = "TOPLEFT"
-		E.db["actionbar"]["bar5"]["buttons"] = 12
-		E.db["actionbar"]["bar5"]["buttonspacing"] = 1
-		E.db["actionbar"]["bar5"]["buttonsPerRow"] = 2
-		E.db["actionbar"]["bar5"]["buttonsize"] = 30
-		E.db["actionbar"]["bar5"]["visibility"] = " [petbattle] hide; show"
+		E.db["unitframe"]["units"]["pet"]["castbar"]["width"] = 100
+		E.db["unitframe"]["units"]["pet"]["width"] = 100
+		E.db["unitframe"]["units"]["pet"]["height"] = 25

-		E.db["actionbar"]["barPet"]["point"] = "TOPLEFT"
-		E.db["actionbar"]["barPet"]["buttonspacing"] = 1
-		E.db["actionbar"]["barPet"]["backdrop"] = false
-		E.db["actionbar"]["barPet"]["buttonsPerRow"] = 5
-		E.db["actionbar"]["barPet"]["buttonsize"] = 18
-		E.db["actionbar"]["barPet"]["visibility"] = "[petbattle] hide;[pet, combat,novehicleui,nooverridebar,nopossessbar] show;hide"
+		E.db["unitframe"]["units"]["tank"]["enable"] = false
+		E.db["unitframe"]["units"]["assist"]["enable"] = false

-		E.db["actionbar"]["stanceBar"]["style"] = "classic"
-		E.db["actionbar"]["stanceBar"]["buttonsize"] = 18
-	end
-	--Auras--
-	do
-		E.db["auras"]["font"] = "PT Sans Narrow"
-		E.db["auras"]["fontOutline"] = "OUTLINE"
-		E.db["auras"]["fontSize"] = 12
-		E.db["auras"]["buffs"]["size"] = 28
-		E.db["auras"]["debuffs"]["horizontalSpacing"] = 8
-		E.db["auras"]["debuffs"]["size"] = 36
-		E.db["auras"]["debuffs"]["wrapAfter"] = 9
-		E.db["auras"]["consolidatedBuffs"]["fontSize"] = 12
-		E.db["auras"]["consolidatedBuffs"]["font"] = "PT Sans Narrow"
-		E.db["auras"]["consolidatedBuffs"]["fontOutline"] = "OUTLINE"
-		E.db["auras"]["consolidatedBuffs"]["filter"] = false
+		E.db["unitframe"]["units"]["boss"]["debuffs"]["numrows"] = 1
+		E.db["unitframe"]["units"]["boss"]["debuffs"]["sizeOverride"] = 27
+		E.db["unitframe"]["units"]["boss"]["debuffs"]["yOffset"] = -18
+		E.db["unitframe"]["units"]["boss"]["portrait"]["camDistanceScale"] = 2
+		E.db["unitframe"]["units"]["boss"]["portrait"]["width"] = 45
+		E.db["unitframe"]["units"]["boss"]["castbar"]["width"] = 200
+		E.db["unitframe"]["units"]["boss"]["width"] = 200
+		E.db["unitframe"]["units"]["boss"]["infoPanel"]["height"] = 17
+		E.db["unitframe"]["units"]["boss"]["power"]["xOffset"] = 2
+		E.db["unitframe"]["units"]["boss"]["power"]["text_format"] = "[powercolor][curpp]"
+		E.db["unitframe"]["units"]["boss"]["name"]["xOffset"] = 2
+		E.db["unitframe"]["units"]["boss"]["spacing"] = 22
+		E.db["unitframe"]["units"]["boss"]["height"] = 47
+		E.db["unitframe"]["units"]["boss"]["buffs"]["yOffset"] = 10
+		E.db["unitframe"]["units"]["boss"]["buffs"]["sizeOverride"] = 27
+
+		E.db["unitframe"]["units"]["arena"]["debuffs"]["yOffset"] = -18
+		E.db["unitframe"]["units"]["arena"]["power"]["xOffset"] = 2
+		E.db["unitframe"]["units"]["arena"]["power"]["text_format"] = "[powercolor][curpp]"
+		E.db["unitframe"]["units"]["arena"]["power"]["position"] = "BOTTOMLEFT"
+		E.db["unitframe"]["units"]["arena"]["width"] = 200
+		E.db["unitframe"]["units"]["arena"]["spacing"] = 22
+		E.db["unitframe"]["units"]["arena"]["name"]["xOffset"] = 2
+		E.db["unitframe"]["units"]["arena"]["name"]["position"] = "TOPLEFT"
+		E.db["unitframe"]["units"]["arena"]["buffs"]["yOffset"] = 10
+		E.db["unitframe"]["units"]["arena"]["castbar"]["width"] = 200
+
+		E.db["unitframe"]["units"]["party"]["enable"] = false
+
+		E.db["unitframe"]["units"]["raid"]["roleIcon"]["attachTo"] = "InfoPanel"
+		E.db["unitframe"]["units"]["raid"]["roleIcon"]["position"] = "LEFT"
+		E.db["unitframe"]["units"]["raid"]["roleIcon"]["xOffset"] = 0
+		E.db["unitframe"]["units"]["raid"]["roleIcon"]["yOffset"] = 0
+		E.db["unitframe"]["units"]["raid"]["rdebuffs"]["font"] = "PT Sans Narrow"
+		E.db["unitframe"]["units"]["raid"]['growthDirection'] = 'RIGHT_UP'
+		E.db["unitframe"]["units"]["raid"]["numGroups"] = 8
+		E.db["unitframe"]["units"]["raid"]["width"] = 86
+		E.db["unitframe"]["units"]["raid"]["infoPanel"]["enable"] = true
+		E.db["unitframe"]["units"]["raid"]["name"]["attachTextTo"] = "InfoPanel"
+		E.db["unitframe"]["units"]["raid"]["name"]["xOffset"] = 15
+		E.db["unitframe"]["units"]["raid"]["name"]["position"] = "LEFT"
+		E.db["unitframe"]["units"]["raid"]["GPSArrow"]["enable"] = false
+		E.db["unitframe"]["units"]["raid"]["health"]["xOffset"] = 4
+		E.db["unitframe"]["units"]["raid"]["health"]["yOffset"] = -4
+		E.db["unitframe"]["units"]["raid"]["health"]["text_format"] = ""
+		E.db["unitframe"]["units"]["raid"]["health"]["position"] = "TOPLEFT"
+		E.db["unitframe"]["units"]["raid"]["height"] = 28
+		E.db["unitframe"]["units"]["raid"]["power"]["enable"] = false
+		E.db["unitframe"]["units"]["raid"]["visibility"] = "[@raid31,exists][nogroup] hide;show"
+		E.db["unitframe"]["units"]["raid"]["raidicon"]["attachTo"] = "TOPRIGHT"
+		E.db["unitframe"]["units"]["raid"]["raidicon"]["xOffset"] = -2
+
+		E.db["unitframe"]["units"]["raid40"]["enable"] = false
 	end
-	--SLE--
+	--S&L
 	do
-		E.db["sle"]["nameplate"]["showthreat"] = true
-		E.db["sle"]["raidmarkers"]["buttonSize"] = 18
-		E.db["sle"]["raidmarkers"]["spacing"] = 1
-		E.db["sle"]["raidmarkers"]["visibility"] = "DEFAULT"
-		E.db["sle"]["raidmarkers"]["reverse"] = true
-		E.db["sle"]["errorframe"]["width"] = 470
-
+		E.db["sle"]["databars"]["artifact"]["longtext"] = true
+		E.db["sle"]["databars"]["artifact"]["chatfilter"]["enable"] = true
+		E.db["sle"]["databars"]["honor"]["chatfilter"]["awardStyle"] = "STYLE2"
+		E.db["sle"]["databars"]["honor"]["chatfilter"]["style"] = "STYLE8"
+		E.db["sle"]["databars"]["honor"]["chatfilter"]["enable"] = true
+		E.db["sle"]["databars"]["rep"]["chatfilter"]["enable"] = true
+		E.db["sle"]["databars"]["rep"]["chatfilter"]["styleDec"] = "STYLE2"
+		E.db["sle"]["databars"]["rep"]["chatfilter"]["style"] = "STYLE2"
+		E.db["sle"]["databars"]["exp"]["chatfilter"]["enable"] = true
+		E.db["sle"]["databars"]["exp"]["chatfilter"]["style"] = "STYLE2"
 		E.db["sle"]["media"]["fonts"]["zone"]["font"] = "Old Cyrillic"
 		E.db["sle"]["media"]["fonts"]["subzone"]["font"] = "Old Cyrillic"
 		E.db["sle"]["media"]["fonts"]["pvp"]["font"] = "Old Cyrillic"
-		E.db["sle"]["media"]["screensaver"]["enable"] = true
-		E.db["sle"]["media"]["screensaver"]["playermodel"]["rotation"] = 345
-		E.db["sle"]["media"]["screensaver"]["playermodel"]["xaxis"] = 0.1
-		E.db["sle"]["media"]["screensaver"]["playermodel"]["anim"] = 70
-		E.db["sle"]["media"]["screensaver"]["playermodel"]["distance"] = 0
-		E.db["sle"]["media"]["screensaver"]["playermodel"]["yaxis"] = -0.2
-		E.db["sle"]["media"]["screensaver"]["playermodel"]["width"] = 650
-		E.db["sle"]["media"]["screensaver"]["xpack"] = 200
-		E.db["sle"]["media"]["screensaver"]["crest"] = 150
-
-		E.db["sle"]["Armory"]["Character"]["Enchant"]["FontSize"] = 12
-		E.db["sle"]["Armory"]["Character"]["MissingIcon"] = false
-		E.db["sle"]["Armory"]["Character"]["Durability"]["Display"] = "DamagedOnly"
-		E.db["sle"]["Armory"]["Character"]["Durability"]["FontSize"] = 12
-		E.db["sle"]["Armory"]["Character"]["Level"]["FontSize"] = 12
-		E.db["sle"]["Armory"]["Character"]["Backdrop"]["SelectedBG"] = "Castle"
-		E.db["sle"]["Armory"]["Character"]["Gradation"]["Color"] = {
-			0.411764705882353, -- [1]
-			0.827450980392157, -- [2]
-			nil, -- [3]
-			1, -- [4]
-		}
-
-		E.db["sle"]["Armory"]["Inspect"]["Gem"]["SocketSize"] = 12
-		E.db["sle"]["Armory"]["Inspect"]["MissingIcon"] = false
-		E.db["sle"]["Armory"]["Inspect"]["Level"]["FontSize"] = 12
-		E.db["sle"]["Armory"]["Inspect"]["Backdrop"]["SelectedBG"] = "Castle"
-		E.db["sle"]["Armory"]["Inspect"]["Enchant"]["FontSize"] = 12
-		E.db["sle"]["Armory"]["Inspect"]["Gradation"]["Color"] = {
-			0.411764705882353, -- [1]
-			0.827450980392157, -- [2]
-			nil, -- [3]
-			1, -- [4]
-		}
-
-		E.db["sle"]["datatext"]["chathandle"] = true
-		E.db["sle"]["datatext"]["chatright"]["width"] = 428
-		E.db["sle"]["datatext"]["chatleft"]["width"] = 428
-		E.db["sle"]["datatext"]["bottom"]["enabled"] = true
-		E.db["sle"]["datatext"]["bottom"]["transparent"] = true
-		E.db["sle"]["datatext"]["bottom"]["width"] = 196
-		E.db["sle"]["datatext"]["top"]["enabled"] = true
-		E.db["sle"]["datatext"]["top"]["transparent"] = true
-		E.db["sle"]["datatext"]["dp5"]["enabled"] = true
-		E.db["sle"]["datatext"]["dp5"]["transparent"] = true
-		E.db["sle"]["datatext"]["dp6"]["enabled"] = true
-		E.db["sle"]["datatext"]["dp6"]["transparent"] = true
-
-		E.db["sle"]["dt"]["friends"]["sortBN"] = "REALID"
-		E.db["sle"]["dt"]["friends"]["combat"] = true
-		E.db["sle"]["dt"]["friends"]["hide_hintline"] = false
+		E.db["sle"]["blizzard"]["vehicleSeatScale"] = 0.7
+		E.db["sle"]["dt"]["durability"]["threshold"] = 30
+		E.db["sle"]["dt"]["durability"]["gradient"] = true
+		E.db["sle"]["dt"]["currency"]["Jewelcrafting"] = false
+		E.db["sle"]["dt"]["currency"]["Archaeology"] = false
+		E.db["sle"]["dt"]["currency"]["Unused"] = false
+		E.db["sle"]["dt"]["guild"]["hide_guildname"] = true
+		E.db["sle"]["dt"]["guild"]["totals"] = true
+		E.db["sle"]["dt"]["guild"]["hide_gmotd"] = true
 		E.db["sle"]["dt"]["friends"]["expandBNBroadcast"] = true
 		E.db["sle"]["dt"]["friends"]["totals"] = true
-		E.db["sle"]["dt"]["guild"]["totals"] = true
-		E.db["sle"]["dt"]["guild"]["combat"] = true
-		E.db["sle"]["dt"]["durability"]["threshold"] = 50
-		E.db["sle"]["dt"]["durability"]["gradient"] = true
-
-		E.db["sle"]["loot"]["enable"] = true
 		E.db["sle"]["loot"]["history"]["alpha"] = 0.7
 		E.db["sle"]["loot"]["history"]["autohide"] = true
-		E.db["sle"]["loot"]["autoroll"]["autode"] = true
+		E.db["sle"]["loot"]["looticons"]["enable"] = true
+		E.db["sle"]["loot"]["enable"] = true
 		E.db["sle"]["loot"]["autoroll"]["autoconfirm"] = true
 		E.db["sle"]["loot"]["autoroll"]["autogreed"] = true
-
-		E.db["sle"]["combatico"]["pos"] = "RIGHT"
-
-		E.db["sle"]["threat"]["enable"] = false
-
-		E.db["sle"]["quests"]["visibility"]["arena"] = "HIDE"
-		E.db["sle"]["quests"]["visibility"]["bg"] = "HIDE"
-		E.db["sle"]["quests"]["visibility"]["rested"] = "COLLAPSED"
-		E.db["sle"]["quests"]["visibility"]["garrison"] = "COLLAPSED"
-
-		E.db["sle"]["tooltip"]["showFaction"] = true
-
-		E.db["sle"]["garrison"]["autoOrder"] = true
-
-		E.db["sle"]["chat"]["dpsSpam"] = true
-		E.db["sle"]["chat"]["textureAlpha"]["enable"] = true
-		E.db["sle"]["chat"]["textureAlpha"]["alpha"] = 0.7
-
-		E.db["sle"]["minimap"]["instance"]["fontSize"] = 14
-		E.db["sle"]["minimap"]["instance"]["flag"] = false
-		E.db["sle"]["minimap"]["instance"]["enable"] = true
-
-		E.db["sle"]["powtext"] = true
-
 		E.db["sle"]["uibuttons"]["point"] = "TOPRIGHT"
 		E.db["sle"]["uibuttons"]["enable"] = true
 		E.db["sle"]["uibuttons"]["spacing"] = 1
 		E.db["sle"]["uibuttons"]["anchor"] = "BOTTOMRIGHT"
-		E.db["sle"]["uibuttons"]["size"] = 20
 		E.db["sle"]["uibuttons"]["orientation"] = "horizontal"
-		E.db["sle"]["uibuttons"]["yoffset"] = -2
+		E.db["sle"]["raidmanager"]["roles"] = true
+		E.db["sle"]["tooltip"]["alwaysCompareItems"] = true
+		E.db["sle"]["tooltip"]["showFaction"] = true
+		E.db["sle"]["raidmarkers"]["spacing"] = -1
+		E.db["sle"]["raidmarkers"]["buttonSize"] = 24
+		E.db["sle"]["nameplate"]["showthreat"] = true
+		E.db["sle"]["nameplate"]["targetcount"] = true
+		E.db["sle"]["chat"]["editboxhistory"] = 10
+		E.db["sle"]["chat"]["dpsSpam"] = true
+		E.db["sle"]["chat"]["tab"]["select"] = true
+		E.db["sle"]["datatexts"]["leftchat"]["width"] = 430
+		E.db["sle"]["datatexts"]["panel7"]["enabled"] = true
+		E.db["sle"]["datatexts"]["panel7"]["width"] = 191
+		E.db["sle"]["datatexts"]["panel7"]["transparent"] = true
+		E.db["sle"]["datatexts"]["panel3"]["enabled"] = true
+		E.db["sle"]["datatexts"]["panel3"]["transparent"] = true
+		E.db["sle"]["datatexts"]["panel6"]["enabled"] = true
+		E.db["sle"]["datatexts"]["panel6"]["width"] = 421
+		E.db["sle"]["datatexts"]["panel6"]["transparent"] = true
+		E.db["sle"]["datatexts"]["rightchat"]["width"] = 430
+		E.db["sle"]["datatexts"]["panel8"]["enabled"] = true
+		E.db["sle"]["datatexts"]["panel8"]["width"] = 422
+		E.db["sle"]["datatexts"]["panel8"]["transparent"] = true
+		E.db["sle"]["unitframes"]["statusTextures"]["auraTexture"] = "Ohi Tribal4"
+		E.db["sle"]["unitframes"]["statusTextures"]["castTexture"] = "Ohi Tribal4"
+		E.db["sle"]["unitframes"]["statusTextures"]["classTexture"] = "ElvUI Gloss"
+		E.db["sle"]["unitframes"]["unit"]["player"]["combatico"]["xoffset"] = 112
+		E.db["sle"]["unitframes"]["unit"]["player"]["combatico"]["red"] = false
+		E.db["sle"]["unitframes"]["unit"]["player"]["combatico"]["size"] = 32
+		E.db["sle"]["unitframes"]["unit"]["player"]["combatico"]["yoffset"] = 5
+		E.db["sle"]["unitframes"]["unit"]["player"]["portraitAlpha"] = 1
+		E.db["sle"]["unitframes"]["unit"]["player"]["rested"]["xoffset"] = 208
+		E.db["sle"]["unitframes"]["unit"]["player"]["rested"]["yoffset"] = -35
+		E.db["sle"]["unitframes"]["unit"]["player"]["higherPortrait"] = true
+		E.db["sle"]["unitframes"]["unit"]["target"]["higherPortrait"] = true
+		E.db["sle"]["unitframes"]["unit"]["target"]["portraitAlpha"] = 1
+		E.db["sle"]["minimap"]["locPanel"]["enable"] = true
+		E.db["sle"]["minimap"]["locPanel"]["width"] = 310
+		E.db["sle"]["minimap"]["instance"]["enable"] = true
+		E.db["sle"]["minimap"]["instance"]["flag"] = false
+		E.db["sle"]["quests"]["visibility"]["rested"] = "COLLAPSED"
+		E.db["sle"]["quests"]["visibility"]["garrison"] = "COLLAPSED"
+		E.db["sle"]["quests"]["autoReward"] = true
+		E.db["sle"]["pvp"]["duels"]["pet"] = true
+		E.db["sle"]["pvp"]["duels"]["regular"] = true
+		E.db["sle"]["pvp"]["autorelease"] = true
 	end
-	--Movers--
+	--Movers
 	do
-		SLE:SetMoverPosition("ElvAB_1", "BOTTOM", ElvUIParent, "BOTTOM", 0, 21)
-		SLE:SetMoverPosition("ElvAB_2", "BOTTOM", ElvUIParent, "BOTTOM", 202, 20)
-		SLE:SetMoverPosition("ElvAB_3", "BOTTOM", ElvUIParent, "BOTTOM", -202, 20)
-		SLE:SetMoverPosition("ElvAB_4", "BOTTOMRIGHT", ElvUIParent, "BOTTOMRIGHT", -445, 20)
-		SLE:SetMoverPosition("ElvAB_5", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 445, 20)
-		SLE:SetMoverPosition("ElvAB_6", "BOTTOMRIGHT", ElvUIParent, "BOTTOMRIGHT", -11, 210)
-		SLE:SetMoverPosition("ShiftAB", "TOPLEFT", ElvUIParent, "BOTTOMLEFT", 711, 136)
-		SLE:SetMoverPosition("PetAB", "BOTTOM", ElvUIParent, "BOTTOM", -287, 337)
-		SLE:SetMoverPosition("BossButton", "BOTTOM", ElvUIParent, "BOTTOM", 0, 170)
-		SLE:SetMoverPosition("RaidMarkerBarAnchor", "BOTTOM", ElvUIParent, "BOTTOM", 0, 113)
-		SLE:SetMoverPosition("ElvUF_PlayerMover", "BOTTOM", ElvUIParent, "BOTTOM", -240, 400)
-		SLE:SetMoverPosition("ElvUF_PlayerCastbarMover", "BOTTOM", ElvUIParent, "BOTTOM", 0, 381)
-		SLE:SetMoverPosition("ClassBarMover", "BOTTOM", ElvUIParent, "BOTTOM", 2, 419)
-		SLE:SetMoverPosition("ElvUF_TargetMover", "BOTTOM", ElvUIParent, "BOTTOM", 239, 400)
-		SLE:SetMoverPosition("ComboBarMover", "BOTTOM", ElvUIParent, "BOTTOM", 2, 408)
-		SLE:SetMoverPosition("ElvUF_PetMover", "BOTTOM", ElvUIParent, "BOTTOM", -295, 379)
-		SLE:SetMoverPosition("ElvUF_BodyGuardMover", "BOTTOM", ElvUIParent, "BOTTOM", -208, 379)
-		SLE:SetMoverPosition("ElvUF_TargetTargetMover", "BOTTOM", ElvUIParent, "BOTTOM", 194, 355)
-		SLE:SetMoverPosition("ElvUF_FocusMover", "BOTTOM", ElvUIParent, "BOTTOM", 296, 320)
-		SLE:SetMoverPosition("ElvUF_FocusCastbarMover", "BOTTOMRIGHT", ElvUIParent, "BOTTOMRIGHT", -516, 303)
-		SLE:SetMoverPosition("ElvUF_PartyMover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 0, 207)
-		SLE:SetMoverPosition("ElvUF_RaidMover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 0, 207)
-		SLE:SetMoverPosition("ElvUF_Raid40Mover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 0, 207)
-		SLE:SetMoverPosition("ElvUF_RaidpetMover", "TOPLEFT", ElvUIParent, "BOTTOMLEFT", 379, 369)
-		SLE:SetMoverPosition("BossHeaderMover", "TOPRIGHT", ElvUIParent, "TOPRIGHT", 0, -229)
-		SLE:SetMoverPosition("ArenaHeaderMover", "TOPRIGHT", ElvUIParent, "TOPRIGHT", 0, -229)
-		SLE:SetMoverPosition("TotemBarMover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 576, 337)
-		SLE:SetMoverPosition("MicrobarMover", "TOP", ElvUIParent, "TOP", 0, -20)
-		SLE:SetMoverPosition("GMMover", "TOPLEFT", ElvUIParent, "TOPLEFT", 267, -1)
-		SLE:SetMoverPosition("ObjectiveFrameMover", "TOPLEFT", ElvUIParent, "TOPLEFT", 80, 0)
-		SLE:SetMoverPosition("BNETMover", "TOPRIGHT", ElvUIParent, "TOPRIGHT", -88, -206)
-		SLE:SetMoverPosition("RaidUtility_Mover", "TOP", ElvUIParent, "TOP", -306, 0)
-		SLE:SetMoverPosition("AlertFrameMover", "BOTTOM", ElvUIParent, "BOTTOM", 0, 135)
-		SLE:SetMoverPosition("GhostFrameMover", "TOP", ElvUIParent, "TOP", 257, 0)
-		SLE:SetMoverPosition("AltPowerBarMover", "TOP", ElvUIParent, "TOP", 0, -113)
-		SLE:SetMoverPosition("PvPMover", "TOP", ElvUIParent, "TOP", 0, -70)
-		SLE:SetMoverPosition("MinimapMover", "TOPRIGHT", ElvUIParent, "TOPRIGHT", 0, 0)
-		SLE:SetMoverPosition("BuffsMover", "TOPRIGHT", ElvUIParent, "TOPRIGHT", -228, -1)
-		SLE:SetMoverPosition("DebuffsMover", "TOPRIGHT", ElvUIParent, "TOPRIGHT", -228, -149)
-		SLE:SetMoverPosition("LeftChatMover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 0, 19)
-		SLE:SetMoverPosition("RightChatMover", "BOTTOMRIGHT", ElvUIParent, "BOTTOMRIGHT", 0, 19)
-		SLE:SetMoverPosition("LootFrameMover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 420, 383)
-		SLE:SetMoverPosition("DigSiteProgressBarMover", "TOP", ElvUIParent, "TOP", 0, -106)
-		SLE:SetMoverPosition("SLE_UIButtonsMover", "TOPRIGHT", ElvUIParent, "TOPRIGHT", 0, -203)
-		SLE:SetMoverPosition("UIErrorsFrameMover", "BOTTOM", ElvUIParent, "BOTTOM", 0, 290)
-		SLE:SetMoverPosition("VehicleSeatMover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 545, 207)
-		SLE:SetMoverPosition("ExperienceBarMover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 508, 20)
-		SLE:SetMoverPosition("ReputationBarMover", "BOTTOMRIGHT", ElvUIParent, "BOTTOMRIGHT", -508, 20)
-		SLE:SetMoverPosition("Top_Center_Mover", "TOP", ElvUIParent, "TOP", 0, 0)
-		SLE:SetMoverPosition("DP_5_Mover", "BOTTOM", ElvUIParent, "BOTTOM", -307, 0)
-		SLE:SetMoverPosition("DP_6_Mover", "BOTTOM", ElvUIParent, "BOTTOM", 307, 0)
-		SLE:SetMoverPosition("SalvageCrateMover", "BOTTOM", ElvUIParent, "BOTTOM", -1, 350)
-		SLE:SetMoverPosition("PetBattleStatusMover", "TOP", ElvUIParent, "TOP", 0, -69)
-	end
-
-	E.private["general"]["minimap"]["hideGarrison"] = false
-	E.private["general"]["normTex"] = "Polished Wood"
-	E.private["general"]["glossTex"] = "Polished Wood"
-	E.private["sle"]["minimap"]["mapicons"]["enable"] = true
-	E.private["sle"]["farm"]["enable"] = true
-	E.private["sle"]["equip"]["spam"] = true
-	E.private["sle"]["equip"]["setoverlay"] = true
-	if E.myclass ~= "HUNTER" and E.myclass ~= "SHAMAN" and E.myclass ~= "ROGUE" then E.private["sle"]["auras"]["consolidatedMark"] = true end
-	E.private["ElvUI_Currency"]["Unused"] = false
-	E.private["ElvUI_Currency"]["Archaeology"] = false
-
-	if layout then
-		if layout == 'tank' then AI:DarthTank()
-		elseif layout == 'dpsMelee' then AI:DarthPhys()
-		elseif layout == 'healer' then AI:DarthHeal()
-		else AI:DarthCaster()
-		end
-		E.db.layoutSet = layout
-	else
-		AI:DarthCaster()
-		E.db.layoutSet = "dpsCaster"
-	end
-
-	if IsAddOnLoaded("ElvUI_LocLite") then
-		SLE:SetMoverPosition("LocationLiteMover", "TOP", ElvUIParent, "TOP", 0, -19)
-		E.db["loclite"]["dig"] = false
-		E.db["loclite"]["lpwidth"] = 300
-		E.db["loclite"]["dtheight"] = 20
-		E.db["loclite"]["lpauto"] = false
-		E.db["loclite"]["lpfontsize"] = 10
-		E.db["loclite"]["lpfontflags"] = "OUTLINE"
+		E.db["movers"]["ElvUF_FocusCastbarMover"] = "BOTTOM,ElvUIParent,BOTTOM,286,118"
+		E.db["movers"]["RaidMarkerBarAnchor"] = "BOTTOM,ElvUIParent,BOTTOM,0,137"
+		E.db["movers"]["ElvUF_PlayerCastbarMover"] = "BOTTOM,ElvUIParent,BOTTOM,0,165"
+		E.db["movers"]["ElvUF_RaidMover"] = "TOPLEFT,ElvUIParent,BOTTOMLEFT,2,574"
+		E.db["movers"]["LeftChatMover"] = "BOTTOMLEFT,UIParent,BOTTOMLEFT,0,19"
+		E.db["movers"]["GMMover"] = "TOPLEFT,ElvUIParent,TOPLEFT,285,0"
+		E.db["movers"]["GhostFrameMover"] = "TOP,ElvUIParent,TOP,288,0"
+		E.db["movers"]["BossButton"] = "BOTTOM,ElvUIParent,BOTTOM,1,245"
+		E.db["movers"]["LootFrameMover"] = "TOP,ElvUIParent,TOP,270,-528"
+		E.db["movers"]["ElvUF_RaidpetMover"] = "TOPLEFT,ElvUIParent,BOTTOMLEFT,4,736"
+		E.db["movers"]["ClassBarMover"] = "BOTTOM,ElvUIParent,BOTTOM,-4,228"
+		E.db["movers"]["ElvUF_PetCastbarMover"] = "BOTTOM,ElvUIParent,BOTTOM,-163,167"
+		E.db["movers"]["VehicleSeatMover"] = "BOTTOMLEFT,ElvUIParent,BOTTOMLEFT,520,44"
+		E.db["movers"]["ExperienceBarMover"] = "BOTTOMLEFT,ElvUIParent,BOTTOMLEFT,504,19"
+		E.db["movers"]["ElvUF_TargetTargetMover"] = "BOTTOM,ElvUIParent,BOTTOM,161,141"
+		E.db["movers"]["ElvUF_Raid40Mover"] = "TOPLEFT,ElvUIParent,BOTTOMLEFT,4,432"
+		E.db["movers"]["ElvUF_FocusMover"] = "BOTTOM,ElvUIParent,BOTTOM,290,141"
+		E.db["movers"]["ElvAB_1"] = "BOTTOM,ElvUIParent,BOTTOM,0,19"
+		E.db["movers"]["ElvAB_2"] = "BOTTOM,ElvUIParent,BOTTOM,125,19"
+		E.db["movers"]["ElvAB_4"] = "BOTTOMRIGHT,ElvUIParent,BOTTOMRIGHT,-444,19"
+		E.db["movers"]["ReputationBarMover"] = "BOTTOM,ElvUIParent,BOTTOM,313,19"
+		E.db["movers"]["TalkingHeadFrameMover"] = "TOP,ElvUIParent,TOP,0,-46"
+		E.db["movers"]["ElvUF_PartyMover"] = "BOTTOMLEFT,ElvUIParent,BOTTOMLEFT,4,195"
+		E.db["movers"]["AltPowerBarMover"] = "TOP,ElvUIParent,TOP,0,-65"
+		E.db["movers"]["ElvAB_3"] = "BOTTOM,ElvUIParent,BOTTOM,-125,19"
+		E.db["movers"]["ElvAB_5"] = "BOTTOMLEFT,ElvUIParent,BOTTOMLEFT,444,19"
+		E.db["movers"]["ArtifactBarMover"] = "TOP,ElvUIParent,TOP,0,-39"
+		E.db["movers"]["TotemBarMover"] = "BOTTOM,ElvUIParent,BOTTOM,-3,188"
+		E.db["movers"]["ElvUF_PlayerMover"] = "BOTTOM,ElvUIParent,BOTTOM,-220,186"
+		E.db["movers"]["ObjectiveFrameMover"] = "TOPLEFT,ElvUIParent,TOPLEFT,98,-4"
+		E.db["movers"]["BossHeaderMover"] = "TOPRIGHT,ElvUIParent,TOPRIGHT,-59,-299"
+		E.db["movers"]["ShiftAB"] = "TOPLEFT,ElvUIParent,BOTTOMLEFT,761,138"
+		E.db["movers"]["HonorBarMover"] = "TOP,ElvUIParent,TOP,0,-48"
+		E.db["movers"]["ArenaHeaderMover"] = "TOPRIGHT,ElvUIParent,TOPRIGHT,-59,-299"
+		E.db["movers"]["PetAB"] = "BOTTOM,ElvUIParent,BOTTOM,-267,142"
+		E.db["movers"]["PvPMover"] = "TOP,ElvUIParent,TOP,-5,-59"
+		E.db["movers"]["SLE_Location_Mover"] = "TOP,ElvUIParent,TOP,0,-19"
+		E.db["movers"]["ElvUF_PetMover"] = "BOTTOM,ElvUIParent,BOTTOM,-163,141"
+		E.db["movers"]["SLE_UIButtonsMover"] = "TOPRIGHT,ElvUIParent,TOPRIGHT,-2,-201"
+		E.db["movers"]["RightChatMover"] = "BOTTOMRIGHT,ElvUIParent,BOTTOMRIGHT,0,19"
+		E.db["movers"]["AlertFrameMover"] = "BOTTOM,ElvUIParent,BOTTOM,0,312"
+		E.db["movers"]["DebuffsMover"] = "TOPRIGHT,ElvUIParent,TOPRIGHT,-187,-158"
+		E.db["movers"]["ElvUF_TargetMover"] = "BOTTOM,ElvUIParent,BOTTOM,211,189"
 	end

-	if IsAddOnLoaded("ElvUI_EverySecondCounts") then
-		E.db["ESC"]["font"] = "PT Sans Narrow"
+	if T.IsAddOnLoaded("ElvUI_AuraBarsMovers") then
+		E.db["abm"]["target"] = true
+		E.db["abm"]["player"] = true
+		E.db["abm"]["playerw"] = 180
+		E.db["abm"]["targetw"] = 180
+		E.db["movers"]["ElvUF_PlayerAuraMover"] = "BOTTOMLEFT,ElvUIParent,BOTTOMLEFT,459,206"
+		E.db["movers"]["ElvUF_TargetAuraMover"] = "BOTTOMRIGHT,ElvUIParent,BOTTOMRIGHT,-468,209"
 	end

-	if AddOnSkins then
-		E.private["addonskins"]["Blizzard_WorldStateCaptureBar"] = true
-		E.private["addonskins"]["DBMFontSize"] = 10
-		E.private["addonskins"]["EmbedIsHidden"] = true
-		E.private["addonskins"]["AuctionHouse"] = false
-		E.private["addonskins"]["SkinTemplate"] = "Default"
-		E.private["addonskins"]["DBMSkinHalf"] = true
-		E.private["addonskins"]["DBMFont"] = "PT Sans Narrow"
-		E.private["addonskins"]["Blizzard_ExtraActionButton"] = true
-		E.private["addonskins"]["EmbedLeftWidth"] = 213
+	if T.IsAddOnLoaded("AddOnSkins") then
 		E.private["addonskins"]["EmbedOoC"] = true
-		E.private["addonskins"]["EmbedOoCDelay"] = 2
+		E.private["addonskins"]["EmbedOoCDelay"] = 5
 		E.private["addonskins"]["Blizzard_DraenorAbilityButton"] = true
 		E.private["addonskins"]["EmbedSystemDual"] = true
+		E.private["addonskins"]["LoginMsg"] = false
+		E.private["addonskins"]["Blizzard_ExtraActionButton"] = true
+		E.private["addonskins"]["DBMFont"] = "PT Sans Narrow"
+		E.private["addonskins"]["DBMSkinHalf"] = true
 	end

-	E.private["install_complete"] = installMark
-	E.private["sle"]["install_complete"] = installMarkSLE
-
-	E:UpdateAll(true)
-end
-
-function AI:RepoocSetup() --The function to switch from classic ElvUI settings to Repooc's
-	local layout = E.db.layoutSet
-	local installMark = E.private["install_complete"]
-	local installMarkSLE = E.private["sle"]["install_complete"]
-
-	SLEInstallStepComplete.message = L["Repooc's Default Set"]
-	SLEInstallStepComplete:Show()
-
-	if IsAddOnLoaded("ElvUI_DTBars2") then
-		table.wipe(dtbarsList)
-		table.wipe(dtbarsTexts)
-		for name, data in pairs(E.global.dtbars) do
-			if E.db.dtbars and E.db.dtbars[name] then
-				dtbarsList[name] = E.db.dtbars[name]
-				dtbarsTexts[name] = E.db.datatexts.panels[name]
-			end
-		end
-	end
-	table.wipe(E.db)
-	E:CopyTable(E.db, P)
-
-	table.wipe(E.private)
-	E:CopyTable(E.private, V)
-
-	if E.db['movers'] then table.wipe(E.db['movers']) else E.db['movers'] = {} end
-
-	E.db["actionbar"]["bar3"]["point"] = "TOPLEFT"
-	E.db["actionbar"]["bar3"]["buttons"] = 12
-	E.db["actionbar"]["fontOutline"] = "OUTLINE"
-	E.db["actionbar"]["bar2"]["enabled"] = true
-	E.db["actionbar"]["bar5"]["point"] = "TOPLEFT"
-	E.db["actionbar"]["bar5"]["buttons"] = 12
-	E.db["actionbar"]["font"] = "Rubino"
-	E.db["actionbar"]["fontSize"] = 12
-
-	E.db["auras"]["consolidatedBuffs"]["font"] = "Intro Black"
-	E.db["auras"]["consolidatedBuffs"]["fontOutline"] = "NONE"
-
-	E.db["chat"]["font"] = "Univers"
-	E.db["chat"]["tabFontSize"] = 12
-	E.db["chat"]["tabFont"] = "Rubino"
-
-	E.db["datatexts"]["minimapPanels"] = false
-	E.db["datatexts"]["panels"]["Top_Center"] = "S&L Guild"
-	E.db["datatexts"]["panels"]["Bottom_Panel"] = "S&L Friends"
-	E.db["datatexts"]["panels"]["DP_6"]["right"] = "Time"
-	E.db["datatexts"]["panels"]["DP_6"]["left"] = "S&L Currency"
-	E.db["datatexts"]["panels"]["DP_6"]["middle"] = "System"
-	E.db["datatexts"]["leftChatPanel"] = false
-	E.db["datatexts"]["rightChatPanel"] = false
-
-	if IsAddOnLoaded("ElvUI_DTBars2") then
-			if not E.db.dtbars then E.db.dtbars = {} end
-			for name, data in pairs(E.global.dtbars) do
-				if dtbarsList[name] then
-					E.db.dtbars[name] = dtbarsList[name]
-					E.db.datatexts.panels[name] = dtbarsTexts[name]
-				end
-			end
-		end
-
-	E.db["general"]["bottomPanel"] = false
-	E.db["general"]["valuecolor"] = {
-		["r"] = 0,
-		["g"] = 1,
-		["b"] = 0.59,
-	}
-	E.db["general"]["vendorGrays"] = true
-	E.db["general"]["bordercolor"] = {
-		["r"] = 0.31,
-		["g"] = 0.31,
-		["b"] = 0.31,
-	}
-	E.db["general"]["font"] = "Rubino"
-
-	SLE:SetMoverPosition("BossButton", "BOTTOMRIGHT", ElvUIParent, "BOTTOMRIGHT", -448, 415)
-	SLE:SetMoverPosition("Bottom_Panel_Mover", "BOTTOM", ElvUIParent, "BOTTOM", -312, 2)
-	SLE:SetMoverPosition("DP_6_Mover", "BOTTOM", ElvUIParent, "BOTTOM", 0, 2)
-	SLE:SetMoverPosition("ElvAB_1", "BOTTOM", ElvUIParent, "BOTTOM", 0, 57)
-	SLE:SetMoverPosition("ElvAB_2", "BOTTOM", ElvUIParent, "BOTTOM", 0, 22)
-	SLE:SetMoverPosition("ElvAB_3", "BOTTOM", ElvUIParent, "BOTTOM", 312, 23)
-	SLE:SetMoverPosition("ElvAB_5", "BOTTOM", ElvUIParent, "BOTTOM", -312, 23)
-	SLE:SetMoverPosition("ElvUF_PlayerMover", "BOTTOM", ElvUIParent, "BOTTOM", -311, 145)
-	SLE:SetMoverPosition("ElvUF_PetMover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 410, 240)
-	SLE:SetMoverPosition("ElvUF_RaidMover", "BOTTOM", ElvUIParent, "BOTTOM", 0, 95)
-	SLE:SetMoverPosition("ElvUF_TargetMover", "BOTTOM", ElvUIParent, "BOTTOM", 311, 145)
-	SLE:SetMoverPosition("ElvUF_TargetTargetMover", "BOTTOMRIGHT", ElvUIParent, "BOTTOMRIGHT", -410, 240)
-	SLE:SetMoverPosition("ElvUF_PlayerCastbarMover", "BOTTOM", ElvUIParent, "BOTTOM", -311, 122)
-	SLE:SetMoverPosition("LeftChatMover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 2, 2)
-	SLE:SetMoverPosition("RightChatMover", "BOTTOMRIGHT", ElvUIParent, "BOTTOMRIGHT", -2, 2)
-	SLE:SetMoverPosition("Top_Center_Mover", "BOTTOM", ElvUIParent, "BOTTOM", 312, 2)
-
-	E.db["nameplate"]["healthBar"]["text"]["enable"] = true
-	E.db["nameplate"]["healthBar"]["text"]["format"] = "CURRENT_PERCENT"
-	E.db["nameplate"]["threat"]["goodScale"] = 1.1
-	E.db["nameplate"]["targetIndicator"]["color"]["g"] = 0
-	E.db["nameplate"]["targetIndicator"]["color"]["b"] = 0
-	E.db["nameplate"]["font"] = "Intro Black"
-	E.db["nameplate"]["fontOutline"] = "OUTLINE"
-
-	E.db["sle"]["datatext"]["top"]["enabled"] = true
-	E.db["sle"]["datatext"]["top"]["width"] = 202
-	E.db["sle"]["datatext"]["bottom"]["enabled"] = true
-	E.db["sle"]["datatext"]["bottom"]["width"] = 202
-	E.db["sle"]["datatext"]["dp6"]["enabled"] = true
-	E.db["sle"]["datatext"]["dp6"]["width"] = 406
-	E.db["sle"]["loot"]["announcer"]["enable"] = true
-	E.db["sle"]["loot"]["autoroll"]["enable"] = false
-	E.db["sle"]["loot"]["enable"] = true
-	E.db["sle"]["media"]["fonts"]["zone"]["font"] = "Durandal Light"
-	E.db["sle"]["media"]["fonts"]["subzone"]["font"] = "Durandal Light"
-	E.db["sle"]["media"]["fonts"]["pvp"]["font"] = "Trafaret"
-	E.db["sle"]["media"]["fonts"]["pvp"]["size"] = 20
-	E.db["sle"]["minimap"]["mapicons"]["skindungeon"] = true
-	E.db["sle"]["tooltip"]["showFaction"] = true
-	E.db["sle"]["uibuttons"]["enable"] = true
-
-	E.db["tooltip"]["healthBar"]["font"] = "Rubino"
-	E.db["tooltip"]["healthBar"]["fontSize"] = 11
-
-	E.db["unitframe"]["colors"]["auraBarBuff"] = {
-		["r"] = 0,
-		["g"] = 1,
-		["b"] = 0.59,
-	}
-	E.db["unitframe"]["colors"]["healthclass"] = true
-	E.db["unitframe"]["colors"]["castClassColor"] = true
-	E.db["unitframe"]["colors"]["castColor"] = {
-		["r"] = 0.1,
-		["g"] = 0.1,
-		["b"] = 0.1,
-	}
-	E.db["unitframe"]["colors"]["health"] = {
-		["r"] = 0.1,
-		["g"] = 0.1,
-		["b"] = 0.1,
-	}
-	E.db["unitframe"]["statusbar"] = "Minimalist"
-	E.db["unitframe"]["smoothbars"] = true
-	E.db["unitframe"]["units"]["raid40"]["colorOverride"] = "FORCE_OFF"
-	E.db["unitframe"]["units"]["raid"]["width"] = 79
-	E.db["unitframe"]["units"]["raid"]["health"]["frequentUpdates"] = true
-	E.db["unitframe"]["units"]["raid"]["health"]["orientation"] = "VERTICAL"
-	E.db["unitframe"]["units"]["raid"]["GPSArrow"]["enable"] = false
-	E.db["unitframe"]["units"]["raid"]["colorOverride"] = "FORCE_OFF"
-	E.db["unitframe"]["units"]["target"]["castbar"]["width"] = 202
-	E.db["unitframe"]["units"]["target"]["width"] = 202
-	E.db["unitframe"]["units"]["player"]["restIcon"] = false
-	E.db["unitframe"]["units"]["player"]["castbar"]["width"] = 202
-	E.db["unitframe"]["units"]["player"]["width"] = 202
+	E.private["general"]["normTex"] = "Ohi MetalSheet"
+	E.private["general"]["glossTex"] = "Ohi MetalSheet"
+	E.private["general"]["minimap"]["hideClassHallReport"] = true

+	E.private["sle"]["module"]["screensaver"] = true
+	E.private["sle"]["uiButtonStyle"] = "dropdown"
+	E.private["sle"]["bags"]["transparentSlots"] = true
 	E.private["sle"]["minimap"]["mapicons"]["enable"] = true
-	E.private["sle"]["minimap"]["mapicons"]["barenable"] = true
+	E.private["sle"]["unitframe"]["resizeHealthPrediction"] = true
+	E.private["sle"]["unitframe"]["statusbarTextures"]["cast"] = true
+	E.private["sle"]["unitframe"]["statusbarTextures"]["class"] = true
+	E.private["sle"]["unitframe"]["statusbarTextures"]["aura"] = true
+	E.private["sle"]["chat"]["chatHistory"]["CHAT_MSG_GUILD_ACHIEVEMENT"] = false
+	E.private["sle"]["chat"]["chatHistory"]["CHAT_MSG_EMOTE"] = false
+	E.private["sle"]["skins"]["merchant"]["enable"] = true
 	E.private["sle"]["equip"]["setoverlay"] = true
-	E.private["sle"]["exprep"]["autotrack"] = true
+	E.private["sle"]["actionbars"]["transparentButtons"] = true

-	if AddOnSkins then
-		E.private["addonskins"]["Blizzard_WorldStateCaptureBar"] = true
-		E.private["addonskins"]["EmbedOoC"] = false
-		E.private["addonskins"]["DBMSkinHalf"] = true
-		E.private["addonskins"]["DBMFont"] = "PT Sans Narrow"
-		E.private["addonskins"]["EmbedSystemDual"] = true
-		E.private["addonskins"]["EmbedLeft"] = "Skada"
-		E.private["addonskins"]["EmbedRight"] = "Skada"
-		E.private["addonskins"]["EmbedSystem"] = false
+	E.global["sle"]["advanced"]["optionsLimits"] = true
+	E.global["sle"]["advanced"]["cyrillics"]["commands"] = true
+	E.global["general"]["animateConfig"] = false
+
+	if layout then
+		if layout == 'tank' then
+			E.db["nameplates"]["threat"]["beingTankedByTank"] = true
+			E.db["datatexts"]["panels"]["SLE_DataPanel_8"]["left"] = "Avoidance"
+			E.db["datatexts"]["panels"]["SLE_DataPanel_8"]["middle"] = "Versatility"
+			E.db["unitframe"]["units"]["raid"]["power"]["enable"] = true
+		elseif layout == 'dpsMelee' then
+			E.db["datatexts"]["panels"]["SLE_DataPanel_8"]["left"] = "Attack Power"
+		elseif layout == 'healer' then DarthHeal()
+		end
+		E.db.layoutSet = layout
+	else
+		E.db.layoutSet = "dpsCaster"
 	end

-	E.db.layoutSet = layout
 	E.private["install_complete"] = installMark
 	E.private["sle"]["install_complete"] = installMarkSLE

 	E:UpdateAll(true)
-end

-function AI:AffinitiiSetup() --The function to switch from class ElvUI settings to Affinitii's
-	local layout = E.db.layoutSet
-	local installMark = E.private["install_complete"]
-	local installMarkSLE = E.private["sle"]["install_complete"]
-	pixel = E.PixelMode  --Pull PixelMode
-
-	SLEInstallStepComplete.message = L["Affinitii's Default Set"]
-	SLEInstallStepComplete:Show()
+	_G["PluginInstallStepComplete"].message = L["Darth's Default Set"]..": "..(PI.SLE_Word == NONE and L['Caster DPS'] or PI.SLE_Word)
+	_G["PluginInstallStepComplete"]:Show()
+end

-	if IsAddOnLoaded("ElvUI_DTBars2") then
-		table.wipe(dtbarsList)
-		table.wipe(dtbarsTexts)
-		for name, data in pairs(E.global.dtbars) do
-			if E.db.dtbars and E.db.dtbars[name] then
-				dtbarsList[name] = E.db.dtbars[name]
-				dtbarsTexts[name] = E.db.datatexts.panels[name]
-			end
+local function DarthAddons()
+	if SkadaDB and T.IsAddOnLoaded("Skada") then
+		local damage, healing = locale == "ruRU" and "Нанесенный урон" or "Damage", locale == "ruRU" and "Исцеление" or "Healing"
+		local profileName = "Darth "..(locale == "ruRU" and "Ru" or "Eng")
+		if not SkadaDB["profiles"][profileName] then
+		SkadaDB["profiles"][profileName] = {
+			["icon"] = {
+				["hide"] = true,
+			},
+			["windows"] = {
+				{
+					["barslocked"] = true,
+					["background"] = {
+						["height"] = 164,
+					},
+					["barfont"] = "PT Sans Narrow",
+					["name"] = "Damage",
+					["point"] = "TOPRIGHT",
+					["roleicons"] = true,
+					["spark"] = false,
+					["bartexture"] = "BuiOnePixel",
+					["barwidth"] = 200.000061035156,
+					["modeincombat"] = damage,
+					["title"] = {
+						["color"] = {
+							["a"] = 0.800000011920929,
+							["r"] = 0,
+							["g"] = 0,
+							["b"] = 0,
+						},
+						["font"] = "PT Sans Narrow",
+						["texture"] = "ElvUI Norm",
+					},
+				}, -- [1]
+				{
+					["titleset"] = true,
+					["barheight"] = 15,
+					["classicons"] = true,
+					["barslocked"] = true,
+					["enabletitle"] = true,
+					["wipemode"] = "",
+					["set"] = "current",
+					["hidden"] = false,
+					["barfont"] = "PT Sans Narrow",
+					["name"] = "Healing",
+					["display"] = "bar",
+					["barfontflags"] = "",
+					["classcolortext"] = false,
+					["scale"] = 1,
+					["reversegrowth"] = false,
+					["returnaftercombat"] = false,
+					["roleicons"] = false,
+					["barorientation"] = 1,
+					["snapto"] = true,
+					["version"] = 1,
+					["modeincombat"] = healing,
+					["spark"] = false,
+					["bartexture"] = "BuiOnePixel",
+					["barwidth"] = 237.999954223633,
+					["barspacing"] = 0,
+					["clickthrough"] = false,
+					["barfontsize"] = 11,
+					["barbgcolor"] = {
+						["a"] = 0.6,
+						["b"] = 0.3,
+						["g"] = 0.3,
+						["r"] = 0.3,
+					},
+					["background"] = {
+						["borderthickness"] = 0,
+						["height"] = 71.939697265625,
+						["color"] = {
+							["a"] = 0.2,
+							["b"] = 0.5,
+							["g"] = 0,
+							["r"] = 0,
+						},
+						["bordertexture"] = "None",
+						["margin"] = 0,
+						["texture"] = "Solid",
+					},
+					["barcolor"] = {
+						["a"] = 1,
+						["b"] = 0.8,
+						["g"] = 0.3,
+						["r"] = 0.3,
+					},
+					["classcolorbars"] = true,
+					["title"] = {
+						["color"] = {
+							["a"] = 0.800000011920929,
+							["b"] = 0,
+							["g"] = 0,
+							["r"] = 0,
+						},
+						["bordertexture"] = "None",
+						["font"] = "PT Sans Narrow",
+						["borderthickness"] = 2,
+						["fontsize"] = 11,
+						["fontflags"] = "",
+						["height"] = 15,
+						["margin"] = 0,
+						["texture"] = "ElvUI Norm",
+					},
+					["buttons"] = {
+						["segment"] = true,
+						["menu"] = true,
+						["mode"] = true,
+						["report"] = true,
+						["reset"] = true,
+					},
+					["point"] = "TOPRIGHT",
+				}, -- [2]
+			},
+		}
 		end
+		Skada.db:SetProfile(profileName)
+	end
+	if xCTSavedDB and T.IsAddOnLoaded("xCT+") then
+		if not xCTSavedDB["profiles"]["S&L Darth"] then
+			xCTSavedDB["profiles"]["S&L Darth"] = {
+				["frames"] = {
+					["general"] = {
+						["fontOutline"] = "2OUTLINE",
+						["font"] = "PT Sans Narrow",
+						["enabledFrame"] = false,
+					},
+					["power"] = {
+						["fontOutline"] = "2OUTLINE",
+						["font"] = "PT Sans Narrow",
+						["enabledFrame"] = false,
+					},
+					["healing"] = {
+						["enableRealmNames"] = false,
+						["enableClassNames"] = false,
+						["fontOutline"] = "2OUTLINE",
+						["enableOverHeal"] = false,
+						["Width"] = 128,
+						["Y"] = 63,
+						["X"] = -209,
+						["Height"] = 164,
+						["showFriendlyHealers"] = false,
+						["font"] = "PT Sans Narrow",
+					},
+					["outgoing"] = {
+						["fontOutline"] = "2OUTLINE",
+						["Width"] = 142,
+						["Y"] = 71,
+						["font"] = "PT Sans Narrow",
+						["Height"] = 176,
+						["X"] = 333,
+					},
+					["critical"] = {
+						["fontOutline"] = "2OUTLINE",
+						["Width"] = 150,
+						["Y"] = 71,
+						["font"] = "PT Sans Narrow",
+						["Height"] = 174,
+						["X"] = 481,
+					},
+					["procs"] = {
+						["fontOutline"] = "2OUTLINE",
+						["Y"] = -68,
+						["font"] = "PT Sans Narrow",
+						["enabledFrame"] = false,
+						["X"] = -248,
+					},
+					["loot"] = {
+						["fontOutline"] = "2OUTLINE",
+						["Y"] = -76,
+						["font"] = "PT Sans Narrow",
+						["X"] = 8,
+					},
+					["class"] = {
+						["font"] = "PT Sans Narrow",
+						["fontOutline"] = "2OUTLINE",
+						["enabledFrame"] = false,
+					},
+					["damage"] = {
+						["X"] = -339,
+						["Y"] = 65,
+						["font"] = "PT Sans Narrow",
+						["fontOutline"] = "2OUTLINE",
+					},
+				},
+			}
+		end
+		xCT_Plus.db:SetProfile("S&L Darth")
 	end
-	table.wipe(E.db)
-	E:CopyTable(E.db, P)
-
-	table.wipe(E.private)
-	E:CopyTable(E.private, V)
-
-	if E.db['movers'] then table.wipe(E.db['movers']) else E.db['movers'] = {} end
-	if not E.db["unitframe"]["units"]["party"]["customTexts"] then E.db["unitframe"]["units"]["party"]["customTexts"] = {} end
-	if not E.db["unitframe"]["units"]["raid40"]["customTexts"] then E.db["unitframe"]["units"]["raid40"]["customTexts"] = {} end
-
-	E.db["sle"]["nameplate"]["showthreat"] = true
-	E.db["sle"]["nameplate"]["targetcount"] = true
-	E.db["sle"]["datatext"]["chathandle"] = true
-	E.db["sle"]["datatext"]["top"]["enabled"] = true
-	E.db["sle"]["datatext"]["top"]["transparent"] = true
-	E.db["sle"]["datatext"]["top"]["width"] = 100
-	E.db["sle"]["datatext"]["bottom"]["enabled"] = true
-	E.db["sle"]["datatext"]["bottom"]["transparent"] = true
-	E.db["sle"]["datatext"]["bottom"]["width"] = 100
-	E.db["sle"]["datatext"]["dp6"]["enabled"] = true
-	E.db["sle"]["datatext"]["dp6"]["transparent"] = true
-	E.db["sle"]["datatext"]["dp6"]["alpha"] = 0.8
-	E.db["sle"]["datatext"]["dp6"]["width"] = 399
-	E.db["sle"]["minimap"]["buttons"]["anchor"] = "VERTICAL"
-	E.db["sle"]["minimap"]["buttons"]["mouseover"] = true
-	E.db["sle"]["minimap"]["mapicons"]["skinmail"] = false
-	E.db["sle"]["minimap"]["mapicons"]["iconmouseover"] = true
-
-	SLE:SetMoverPosition("DP_6_Mover", "BOTTOM", ElvUIParent, "BOTTOM", 0, 3)
-	SLE:SetMoverPosition("ElvUF_PlayerCastbarMover", "BOTTOM", ElvUIParent, "BOTTOM", 0, 96)
-	SLE:SetMoverPosition("ElvUF_RaidMover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 440, 511)
-	SLE:SetMoverPosition("LeftChatMover", "BOTTOMLEFT", UIParent, "BOTTOMLEFT", 0, 21)
-	SLE:SetMoverPosition("ElvUF_Raid10Mover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 449, 511)
-	SLE:SetMoverPosition("BossButton", "TOPLEFT", ElvUIParent, "TOPLEFT", 622, -352)
-	SLE:SetMoverPosition("ElvUF_FocusMover", "BOTTOM", ElvUIParent, "BOTTOM", -63, 436)
-	SLE:SetMoverPosition("ClassBarMover", "BOTTOM", ElvUIParent, "BOTTOM", -337, 500)
-	SLE:SetMoverPosition("SquareMinimapBar", "TOPRIGHT", ElvUIParent, "TOPRIGHT", -4, -211)
-	SLE:SetMoverPosition("ElvUF_TargetMover", "BOTTOM", ElvUIParent, "BOTTOM", 278, 200)
-	SLE:SetMoverPosition("ElvUF_Raid40Mover", "TOPLEFT", ElvUIParent, "TOPLEFT", 447, -468)
-	SLE:SetMoverPosition("ElvAB_1", "BOTTOM", ElvUIParent, "BOTTOM", 0, 59)
-	SLE:SetMoverPosition("ElvAB_2", "BOTTOM", ElvUIParent, "BOTTOM", 0, 25)
-	SLE:SetMoverPosition("ElvAB_4", "BOTTOMLEFT", ElvUIParent, "BOTTOMRIGHT", -413, 200)
-	SLE:SetMoverPosition("AltPowerBarMover", "BOTTOM", ElvUIParent, "BOTTOM", -300, 338)
-	SLE:SetMoverPosition("ElvAB_3", "BOTTOM", ElvUIParent, "BOTTOM", 254, 25)
-	SLE:SetMoverPosition("ElvAB_5", "BOTTOM", ElvUIParent, "BOTTOM", -254, 25)
-	SLE:SetMoverPosition("MMButtonsMover", "TOPRIGHT", ElvUIParent, "TOPRIGHT", -214, -160)
-	SLE:SetMoverPosition("ElvUF_PlayerMover", "BOTTOM", ElvUIParent, "BOTTOM", -278, 200)
-	SLE:SetMoverPosition("ElvUF_TargetTargetMover", "BOTTOM", ElvUIParent, "BOTTOM", 0, 190)
-	SLE:SetMoverPosition("ShiftAB", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 414, 21)
-	SLE:SetMoverPosition("RightChatMover", "BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", 0, 21)
-	SLE:SetMoverPosition("TotemBarMover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 414, 21)
-	SLE:SetMoverPosition("ArenaHeaderMover", "TOPRIGHT", ElvUIParent, "TOPRIGHT", -210, -410)
-	SLE:SetMoverPosition("DP_5_Mover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 4, 327)
-	SLE:SetMoverPosition("Top_Center_Mover", "BOTTOM", ElvUIParent, "BOTTOM", -254, 3)
-	SLE:SetMoverPosition("BossHeaderMover", "BOTTOMRIGHT", ElvUIParent, "BOTTOMRIGHT", -210, 435)
-	SLE:SetMoverPosition("ElvUF_PetMover", "BOTTOM", ElvUIParent, "BOTTOM", 0, 230)
-	SLE:SetMoverPosition("ElvAB_6", "BOTTOM", ElvUIParent, "BOTTOM", 0, 102)
-	SLE:SetMoverPosition("ElvUF_PartyMover", "BOTTOMLEFT", ElvUIParent, "BOTTOMLEFT", 449, 511)
-	SLE:SetMoverPosition("Bottom_Panel_Mover", "BOTTOM", ElvUIParent, "BOTTOM", 254, 3)
-	SLE:SetMoverPosition("PetAB", "TOPRIGHT", ElvUIParent, "TOPRIGHT", -4, -433)
-	SLE:SetMoverPosition("ElvUF_Raid25Mover", "TOPLEFT", ElvUIParent, "TOPLEFT", 449, -448)

-	E.db["gridSize"] = 110
+	_G["PluginInstallStepComplete"].message = L["Addons settings imported"]
+	_G["PluginInstallStepComplete"]:Show()
+end

-	E.db["tooltip"]["style"] = "inset"
-	E.db["tooltip"]["visibility"]["combat"] = true
+local function SetupCVars()
+	SetCVar("mapFade", "0")
+	SetCVar("cameraSmoothStyle", "0")
+	SetCVar("autoLootDefault", "1")

-	E.db["chat"]["timeStampFormat"] = "%I:%M "
-	E.db["chat"]["editBoxPosition"] = "ABOVE_CHAT"
-	E.db["chat"]["lfgIcons"] = false
-	E.db["chat"]["emotionIcons"] = false
+	SetAutoDeclineGuildInvites(true)
+	SetInsertItemsLeftToRight(false)

-	E.db["unitframe"]["units"]["tank"]["enable"] = false
-	E.db["unitframe"]["units"]["party"]["horizontalSpacing"] = 1
-	E.db["unitframe"]["units"]["party"]["debuffs"]["sizeOverride"] = 21
-	E.db["unitframe"]["units"]["party"]["debuffs"]["yOffset"] = -7
-	E.db["unitframe"]["units"]["party"]["debuffs"]["anchorPoint"] = "TOPRIGHT"
-	E.db["unitframe"]["units"]["party"]["debuffs"]["xOffset"] = -4
-	E.db["unitframe"]["units"]["party"]["buffs"]["enable"] = true
-	E.db["unitframe"]["units"]["party"]["buffs"]["yOffset"] = 28
-	E.db["unitframe"]["units"]["party"]["buffs"]["anchorPoint"] = "BOTTOMLEFT"
-	E.db["unitframe"]["units"]["party"]["buffs"]["clickThrough"] = true
-	E.db["unitframe"]["units"]["party"]["buffs"]["useBlacklist"] = false
-	E.db["unitframe"]["units"]["party"]["buffs"]["noDuration"] = false
-	E.db["unitframe"]["units"]["party"]["buffs"]["playerOnly"] = false
-	E.db["unitframe"]["units"]["party"]["buffs"]["perrow"] = 1
-	E.db["unitframe"]["units"]["party"]["buffs"]["useFilter"] = "TurtleBuffs"
-	E.db["unitframe"]["units"]["party"]["buffs"]["noConsolidated"] = false
-	E.db["unitframe"]["units"]["party"]["buffs"]["sizeOverride"] = 22
-	E.db["unitframe"]["units"]["party"]["buffs"]["xOffset"] = 30
-	E.db["unitframe"]["units"]["party"]["growthDirection"] = "LEFT_UP"
-	E.db["unitframe"]["units"]["party"]["GPSArrow"]["size"] = 40
-	E.db["unitframe"]["units"]["party"]["buffIndicator"]["size"] = 10
-	E.db["unitframe"]["units"]["party"]["roleIcon"]["enable"] = false
-	E.db["unitframe"]["units"]["party"]["roleIcon"]["position"] = "BOTTOMRIGHT"
-	E.db["unitframe"]["units"]["party"]["targetsGroup"]["anchorPoint"] = "BOTTOM"
-	E.db["unitframe"]["units"]["party"]["power"]["text_format"] = ""
-	E.db["unitframe"]["units"]["party"]["power"]["width"] = "inset"
-	E.db["unitframe"]["units"]["party"]["customTexts"]["Health Text"] = {}
-	E.db["unitframe"]["units"]["party"]["customTexts"]["Health Text"]["font"] = "Homespun"
-	E.db["unitframe"]["units"]["party"]["customTexts"]["Health Text"]["justifyH"] = "CENTER"
-	E.db["unitframe"]["units"]["party"]["customTexts"]["Health Text"]["fontOutline"] = "MONOCHROMEOUTLINE"
-	E.db["unitframe"]["units"]["party"]["customTexts"]["Health Text"]["xOffset"] = 0
-	E.db["unitframe"]["units"]["party"]["customTexts"]["Health Text"]["yOffset"] = -7
-	E.db["unitframe"]["units"]["party"]["customTexts"]["Health Text"]["text_format"] = "[healthcolor][health:deficit]"
-	E.db["unitframe"]["units"]["party"]["customTexts"]["Health Text"]["size"] = 10
-	E.db["unitframe"]["units"]["party"]["healPrediction"] = true
-	E.db["unitframe"]["units"]["party"]["width"] = 80
-	E.db["unitframe"]["units"]["party"]["name"]["text_format"] = "[namecolor][name:veryshort] [difficultycolor][smartlevel]"
-	E.db["unitframe"]["units"]["party"]["name"]["position"] = "TOP"
-	E.db["unitframe"]["units"]["party"]["health"]["frequentUpdates"] = true
-	E.db["unitframe"]["units"]["party"]["health"]["position"] = "BOTTOM"
-	E.db["unitframe"]["units"]["party"]["health"]["text_format"] = ""
-	E.db["unitframe"]["units"]["party"]["height"] = 45
-	E.db["unitframe"]["units"]["party"]["verticalSpacing"] = 1
-	E.db["unitframe"]["units"]["party"]["petsGroup"]["anchorPoint"] = "BOTTOM"
-	E.db["unitframe"]["units"]["party"]["raidicon"]["attachTo"] = "LEFT"
-	E.db["unitframe"]["units"]["party"]["raidicon"]["xOffset"] = 9
-	E.db["unitframe"]["units"]["party"]["raidicon"]["yOffset"] = 0
-	E.db["unitframe"]["units"]["party"]["raidicon"]["size"] = 13
-	E.db["unitframe"]["units"]["raid40"]["horizontalSpacing"] = 1
-	E.db["unitframe"]["units"]["raid40"]["debuffs"]["enable"] = true
-	E.db["unitframe"]["units"]["raid40"]["debuffs"]["yOffset"] = -9
-	E.db["unitframe"]["units"]["raid40"]["debuffs"]["anchorPoint"] = "TOPRIGHT"
-	E.db["unitframe"]["units"]["raid40"]["debuffs"]["clickThrough"] = true
-	E.db["unitframe"]["units"]["raid40"]["debuffs"]["useBlacklist"] = false
-	E.db["unitframe"]["units"]["raid40"]["debuffs"]["perrow"] = 2
-	E.db["unitframe"]["units"]["raid40"]["debuffs"]["useFilter"] = "Blacklist"
-	E.db["unitframe"]["units"]["raid40"]["debuffs"]["sizeOverride"] = 21
-	E.db["unitframe"]["units"]["raid40"]["debuffs"]["xOffset"] = -4
-	E.db["unitframe"]["units"]["raid40"]["rdebuffs"]["size"] = 26
-	E.db["unitframe"]["units"]["raid40"]["growthDirection"] = "UP_LEFT"
-	E.db["unitframe"]["units"]["raid40"]["health"]["frequentUpdates"] = true
-	E.db["unitframe"]["units"]["raid40"]["power"]["enable"] = true
-	E.db["unitframe"]["units"]["raid40"]["power"]["width"] = "inset"
-	E.db["unitframe"]["units"]["raid40"]["power"]["position"] = "CENTER"
-	E.db["unitframe"]["units"]["raid40"]["customTexts"]["Health Text"] = {}
-	E.db["unitframe"]["units"]["raid40"]["customTexts"]["Health Text"]["font"] = "Homespun"
-	E.db["unitframe"]["units"]["raid40"]["customTexts"]["Health Text"]["justifyH"] = "CENTER"
-	E.db["unitframe"]["units"]["raid40"]["customTexts"]["Health Text"]["fontOutline"] = "MONOCHROMEOUTLINE"
-	E.db["unitframe"]["units"]["raid40"]["customTexts"]["Health Text"]["xOffset"] = 0
-	E.db["unitframe"]["units"]["raid40"]["customTexts"]["Health Text"]["yOffset"] = -7
-	E.db["unitframe"]["units"]["raid40"]["customTexts"]["Health Text"]["text_format"] = "[healthcolor][health:deficit]"
-	E.db["unitframe"]["units"]["raid40"]["customTexts"]["Health Text"]["size"] = 10
-	E.db["unitframe"]["units"]["raid40"]["healPrediction"] = true
-	E.db["unitframe"]["units"]["raid40"]["width"] = 50
-	E.db["unitframe"]["units"]["raid40"]["invertGroupingOrder"] = false
-	E.db["unitframe"]["units"]["raid40"]["name"]["text_format"] = "[namecolor][name:veryshort]"
-	E.db["unitframe"]["units"]["raid40"]["name"]["position"] = "TOP"
-	E.db["unitframe"]["units"]["raid40"]["buffs"]["enable"] = true
-	E.db["unitframe"]["units"]["raid40"]["buffs"]["yOffset"] = 25
-	E.db["unitframe"]["units"]["raid40"]["buffs"]["anchorPoint"] = "BOTTOMLEFT"
-	E.db["unitframe"]["units"]["raid40"]["buffs"]["clickThrough"] = true
-	E.db["unitframe"]["units"]["raid40"]["buffs"]["useBlacklist"] = false
-	E.db["unitframe"]["units"]["raid40"]["buffs"]["noDuration"] = false
-	E.db["unitframe"]["units"]["raid40"]["buffs"]["playerOnly"] = false
-	E.db["unitframe"]["units"]["raid40"]["buffs"]["perrow"] = 1
-	E.db["unitframe"]["units"]["raid40"]["buffs"]["useFilter"] = "TurtleBuffs"
-	E.db["unitframe"]["units"]["raid40"]["buffs"]["noConsolidated"] = false
-	E.db["unitframe"]["units"]["raid40"]["buffs"]["sizeOverride"] = 17
-	E.db["unitframe"]["units"]["raid40"]["buffs"]["xOffset"] = 21
-	E.db["unitframe"]["units"]["raid40"]["height"] = 43
-	E.db["unitframe"]["units"]["raid40"]["verticalSpacing"] = 1
-	E.db["unitframe"]["units"]["raid40"]["raidicon"]["attachTo"] = "LEFT"
-	E.db["unitframe"]["units"]["raid40"]["raidicon"]["xOffset"] = 9
-	E.db["unitframe"]["units"]["raid40"]["raidicon"]["yOffset"] = 0
-	E.db["unitframe"]["units"]["raid40"]["raidicon"]["size"] = 13
-	E.db["unitframe"]["units"]["focus"]["power"]["width"] = "inset"
-	E.db["unitframe"]["units"]["target"]["portrait"]["overlay"] = true
-	E.db["unitframe"]["units"]["target"]["aurabar"]["enable"] = false
-	E.db["unitframe"]["units"]["target"]["power"]["width"] = "inset"
-	E.db["unitframe"]["units"]["target"]["power"]["height"] = 11
-	E.db["unitframe"]["units"]["raid"]["debuffs"]["countFontSize"] = 13
-	E.db["unitframe"]["units"]["raid"]["debuffs"]["fontSize"] = 9
-	E.db["unitframe"]["units"]["raid"]["debuffs"]["enable"] = true
-	E.db["unitframe"]["units"]["raid"]["debuffs"]["yOffset"] = -7
-	E.db["unitframe"]["units"]["raid"]["debuffs"]["anchorPoint"] = "TOPRIGHT"
-	E.db["unitframe"]["units"]["raid"]["debuffs"]["sizeOverride"] = 21
-	E.db["unitframe"]["units"]["raid"]["debuffs"]["xOffset"] = -4
-	E.db["unitframe"]["units"]["raid"]["growthDirection"] = "LEFT_UP"
-	E.db["unitframe"]["units"]["raid"]["numGroups"] = 8
-	E.db["unitframe"]["units"]["raid"]["roleIcon"]["enable"] = false
-	E.db["unitframe"]["units"]["raid"]["healPrediction"] = true
-	E.db["unitframe"]["units"]["raid"]["power"]["height"] = 8
-	E.db["unitframe"]["units"]["raid"]["buffs"]["enable"] = true
-	E.db["unitframe"]["units"]["raid"]["buffs"]["yOffset"] = 28
-	E.db["unitframe"]["units"]["raid"]["buffs"]["anchorPoint"] = "BOTTOMLEFT"
-	E.db["unitframe"]["units"]["raid"]["buffs"]["clickThrough"] = true
-	E.db["unitframe"]["units"]["raid"]["buffs"]["useBlacklist"] = false
-	E.db["unitframe"]["units"]["raid"]["buffs"]["noDuration"] = false
-	E.db["unitframe"]["units"]["raid"]["buffs"]["playerOnly"] = false
-	E.db["unitframe"]["units"]["raid"]["buffs"]["perrow"] = 1
-	E.db["unitframe"]["units"]["raid"]["buffs"]["useFilter"] = "TurtleBuffs"
-	E.db["unitframe"]["units"]["raid"]["buffs"]["noConsolidated"] = false
-	E.db["unitframe"]["units"]["raid"]["buffs"]["sizeOverride"] = 22
-	E.db["unitframe"]["units"]["raid"]["buffs"]["xOffset"] = 30
-	E.db["unitframe"]["units"]["focustarget"]["power"]["width"] = "inset"
-	E.db["unitframe"]["units"]["pettarget"]["power"]["width"] = "inset"
-	E.db["unitframe"]["units"]["pet"]["power"]["width"] = "inset"
-	E.db["unitframe"]["units"]["player"]["debuffs"]["attachTo"] = "BUFFS"
-	E.db["unitframe"]["units"]["player"]["portrait"]["overlay"] = true
-	E.db["unitframe"]["units"]["player"]["classbar"]["detachFromFrame"] = true
-	E.db["unitframe"]["units"]["player"]["classbar"]["enable"] = false
-	E.db["unitframe"]["units"]["player"]["aurabar"]["enable"] = false
-	E.db["unitframe"]["units"]["player"]["power"]["width"] = "inset"
-	E.db["unitframe"]["units"]["player"]["power"]["height"] = 11
-	E.db["unitframe"]["units"]["player"]["buffs"]["enable"] = true
-	E.db["unitframe"]["units"]["player"]["buffs"]["noDuration"] = false
-	E.db["unitframe"]["units"]["player"]["buffs"]["attachTo"] = "FRAME"
-	E.db["unitframe"]["units"]["player"]["castbar"]["width"] = 399
-	E.db["unitframe"]["units"]["player"]["castbar"]["height"] = 25
-	E.db["unitframe"]["units"]["boss"]["portrait"]["enable"] = true
-	E.db["unitframe"]["units"]["boss"]["portrait"]["overlay"] = true
-	E.db["unitframe"]["units"]["boss"]["power"]["width"] = "inset"
-	E.db["unitframe"]["units"]["arena"]["power"]["width"] = "inset"
-	E.db["unitframe"]["units"]["targettarget"]["power"]["width"] = "inset"
-	E.db["unitframe"]["units"]["assist"]["targetsGroup"]["enable"] = false
-	E.db["unitframe"]["units"]["assist"]["enable"] = false
-	E.db["unitframe"]["statusbar"] = "Polished Wood"
-	E.db["unitframe"]["colors"]["auraBarBuff"] = {
-		["b"] = 0.0941176470588236,
-		["g"] = 0.0784313725490196,
-		["r"] = 0.309803921568628,
-	}
-	E.db["unitframe"]["colors"]["transparentPower"] = true
-	E.db["unitframe"]["colors"]["castColor"] = {
-		["b"] = 0.1,
-		["g"] = 0.1,
-		["r"] = 0.1,
-	}
-	E.db["unitframe"]["colors"]["health"] = {
-		["b"] = 0.235294117647059,
-		["g"] = 0.235294117647059,
-		["r"] = 0.235294117647059,
-	}
-	E.db["unitframe"]["colors"]["transparentHealth"] = true
-	E.db["unitframe"]["colors"]["transparentCastbar"] = true
-	E.db["unitframe"]["colors"]["transparentAurabars"] = true
+	_G["PluginInstallStepComplete"].message = L["CVars Set"]
+	_G["PluginInstallStepComplete"]:Show()
+end

-	E.db["datatexts"]["minimapPanels"] = false
-	E.db["datatexts"]["fontSize"] = 12
-	E.db["datatexts"]["panelTransparency"] = true
-	E.db["datatexts"]["panels"]["DP_3"]["middle"] = "DPS"
-	E.db["datatexts"]["panels"]["RightChatDataPanel"]["right"] = "Skada"
-	E.db["datatexts"]["panels"]["RightChatDataPanel"]["left"] = "Combat/Arena Time"
-	E.db["datatexts"]["panels"]["DP_1"]["middle"] = "Friends"
-	E.db["datatexts"]["panels"]["DP_5"]["middle"] = "Friends"
-	E.db["datatexts"]["panels"]["LeftChatDataPanel"]["right"] = "Haste"
-	E.db["datatexts"]["panels"]["LeftChatDataPanel"]["left"] = "Spell/Heal Power"
-	E.db["datatexts"]["panels"]["RightMiniPanel"] = "Gold"
-	E.db["datatexts"]["panels"]["Top_Center"] = "WIM"
-	E.db["datatexts"]["panels"]["Bottom_Panel"] = "Talent/Loot Specialization"
-	E.db["datatexts"]["panels"]["DP_6"]["right"] = "Gold"
-	E.db["datatexts"]["panels"]["DP_6"]["left"] = "System"
-	E.db["datatexts"]["panels"]["DP_6"]["middle"] = "Time"
-	E.db["datatexts"]["panels"]["DP_2"]["middle"] = "Attack Power"
-	E.db["datatexts"]["panels"]["LeftMiniPanel"] = "Time"
-	E.db["datatexts"]["font"] = "PT Sans Narrow"
-	E.db["datatexts"]["fontOutline"] = "None"
-	E.db["datatexts"]["battleground"] = false
+local function StartSetup()
+	if PI.SLE_Auth == "DARTH" then
+		DarthSetup()
+	elseif PI.SLE_Auth == "REPOOC" then

-	if IsAddOnLoaded("ElvUI_DTBars2") then
-		if not E.db.dtbars then E.db.dtbars = {} end
-		for name, data in pairs(E.global.dtbars) do
-			if dtbarsList[name] then
-				E.db.dtbars[name] = dtbarsList[name]
-				E.db.datatexts.panels[name] = dtbarsTexts[name]
-			end
-		end
 	end
+end

-	E.db["actionbar"]["bar3"]["buttonspacing"] = 1
-	E.db["actionbar"]["bar3"]["buttonsPerRow"] = 3
-	E.db["actionbar"]["bar3"]["alpha"] = 0.4
-	E.db["actionbar"]["bar2"]["enabled"] = true
-	E.db["actionbar"]["bar2"]["buttonspacing"] = 1
-	E.db["actionbar"]["bar2"]["alpha"] = 0.6
-	E.db["actionbar"]["bar5"]["buttonspacing"] = 1
-	E.db["actionbar"]["bar5"]["buttonsPerRow"] = 3
-	E.db["actionbar"]["bar5"]["alpha"] = 0.4
-	E.db["actionbar"]["bar1"]["buttonspacing"] = 1
-	E.db["actionbar"]["bar1"]["alpha"] = 0.6
-	E.db["actionbar"]["stanceBar"]["buttonsPerRow"] = 1
-	E.db["actionbar"]["stanceBar"]["alpha"] = 0.6
-	E.db["actionbar"]["bar4"]["enabled"] = false
-	E.db["actionbar"]["bar4"]["point"] = "BOTTOMLEFT"
-	E.db["actionbar"]["bar4"]["alpha"] = 0.4
-	E.db["actionbar"]["bar4"]["buttonsPerRow"] = 6
-	E.db["actionbar"]["bar4"]["backdrop"] = false
-
-	E.db["general"]["autoRepair"] = "GUILD"
-	E.db["general"]["bottomPanel"] = false
-	E.db["general"]["backdropfadecolor"]["b"] = 0.054
-	E.db["general"]["backdropfadecolor"]["g"] = 0.054
-	E.db["general"]["backdropfadecolor"]["r"] = 0.054
-	E.db["general"]["valuecolor"] = {
-		["b"] = 0.819,
-		["g"] = 0.513,
-		["r"] = 0.09,
-	}
-	E.db["general"]["threat"]["position"] = "LEFTCHAT"
-	E.db["general"]["topPanel"] = false
-	E.db["general"]["vendorGrays"] = true
-
-	E.private["general"]["normTex"] = "Polished Wood"
-	E.private["general"]["chatBubbles"] = "nobackdrop"
-	E.private["general"]["glossTex"] = "Polished Wood"
-
-	E.private["theme"] = "default"
-
-	if AddOnSkins then
-		E.private["addonskins"]["Blizzard_WorldStateCaptureBar"] = true
-		E.private["addonskins"]["EmbedSystem"] = false
-		E.private["addonskins"]["EmbedSystemDual"] = true
-		E.private["addonskins"]['EmbedLeft'] = 'Skada'
-		E.private["addonskins"]['EmbedRight'] = 'Skada'
+local function SetupAddons()
+	if PI.SLE_Auth == "DARTH" then
+		DarthAddons()
 	end
-
-	E.db.layoutSet = layout
-	E.private["install_complete"] = installMark
-	E.private["sle"]["install_complete"] = installMarkSLE
-
-	E:UpdateAll(true)
 end

 local function InstallComplete()
@@ -1191,303 +845,146 @@ local function InstallComplete()
 	ReloadUI()
 end

-local function ResetAll()
-	SLEInstallNextButton:Disable()
-	SLEInstallPrevButton:Disable()
-	SLEInstallOption1Button:Hide()
-	SLEInstallOption1Button:SetScript("OnClick", nil)
-	SLEInstallOption1Button:SetText("")
-	SLEInstallOption2Button:Hide()
-	SLEInstallOption2Button:SetScript('OnClick', nil)
-	SLEInstallOption2Button:SetText('')
-	SLEInstallOption3Button:Hide()
-	SLEInstallOption3Button:SetScript('OnClick', nil)
-	SLEInstallOption3Button:SetText('')
-	SLEInstallOption4Button:Hide()
-	SLEInstallOption4Button:SetScript('OnClick', nil)
-	SLEInstallOption4Button:SetText('')
-	SLEInstallFrame.SubTitle:SetText("")
-	SLEInstallFrame.Desc1:SetText("")
-	SLEInstallFrame.Desc2:SetText("")
-	SLEInstallFrame.Desc3:SetText("")
-	SLEInstallFrame:Size(550, 400)
-end
-
-local function SetPage(PageNum)
-	CURRENT_PAGE = PageNum
-	ResetAll()
-	SLEInstallStatus:SetValue(PageNum)
-
-	local f = SLEInstallFrame
-
-	if PageNum == MAX_PAGE then
-		SLEInstallNextButton:Disable()
-	else
-		SLEInstallNextButton:Enable()
-	end
-
-	if PageNum == 1 then
-		SLEInstallPrevButton:Disable()
-	else
-		SLEInstallPrevButton:Enable()
-	end
-
-	if PageNum == 1 then
-		f.SubTitle:SetText(format(L["Welcome to |cff1784d1Shadow & Light|r version %s!"], SLE.version))
-		f.Desc1:SetText(L["This will take you through a quick install process to setup some Shadow & Light features.\nIf you choose to not setup any options through this config, click Skip Process button to finish the installation."])
-		f.Desc2:SetText("")
-		f.Desc3:SetText(L["Please press the continue button to go onto the next step."])
-
-		SLEInstallOption1Button:Show()
-		SLEInstallOption1Button:SetScript("OnClick", InstallComplete)
-		SLEInstallOption1Button:SetText(L["Skip Process"])
-	elseif PageNum == 2 then
-		f.SubTitle:SetText(L["Chat"])
-		f.Desc1:SetText(L["This will determine if you want to use ElvUI's default layout for chat datatext panels or let Shadow & Light handle them."])
-		f.Desc2:SetText(L["If you select S&L Panels, the datatext panels will be attached below the left and right chat frames instead of being inside the chat frame."])
-		f.Desc3:SetText(L["Importance: |cffD3CF00Medium|r"])
-
-		SLEInstallOption1Button:Show()
-		SLEInstallOption1Button:SetScript("OnClick", function() E.db.sle.datatext.chathandle = false; E:GetModule('Layout'):ToggleChatPanels() end)
-		SLEInstallOption1Button:SetText("ElvUI")
-		SLEInstallOption2Button:Show()
-		SLEInstallOption2Button:SetScript('OnClick', function() E.db.sle.datatext.chathandle = true; E:GetModule('Layout'):ToggleChatPanels() end)
-		SLEInstallOption2Button:SetText("Shadow & Light")
-	elseif PageNum == 3 then
-		f.SubTitle:SetText(L["Armory Mode"])
-		f.Desc1:SetText(L["SLE_ARMORY_INSTALL"])
-		f.Desc2:SetText(L["This will enable S&L Armory mode components that will show more detailed information at a quick glance on the toons you inspect or your own character."])
-		f.Desc3:SetText(L["Importance: |cffFF0000Low|r"])
-
-		SLEInstallOption1Button:Show()
-		SLEInstallOption1Button:SetScript('OnClick', function() E.db.sle.Armory.Character.Enable = true; E.db.sle.Armory.Inspect.Enable = true; end)
-		SLEInstallOption1Button:SetText(ENABLE)
-
-		SLEInstallOption2Button:Show()
-		SLEInstallOption2Button:SetScript('OnClick', function() E.db.sle.Armory.Character.Enable = false; E.db.sle.Armory.Inspect.Enable = false; end)
-		SLEInstallOption2Button:SetText(DISABLE)
-
-	elseif PageNum == 4 then
-		f.SubTitle:SetText(L["Shadow & Light Layouts"])
-		f.Desc1:SetText(L["You can now choose if you want to use one of the authors' set of options. This will change the positioning of some elements as well of other various options."])
-		local word = E.db.layoutSet == 'tank' and L["Tank"] or E.db.layoutSet == 'healer' and L["Healer"] or E.db.layoutSet == 'dpsMelee' and L['Physical DPS'] or E.db.layoutSet == 'dpsCaster' and L['Caster DPS'] or NONE
-		f.Desc2:SetText(format(L["SLE_Install_Text2"], word))
-		f.Desc3:SetText(L["Importance: |cffFF0000Low|r"])
-
-		SLEInstallOption1Button:Show()
-		SLEInstallOption1Button:SetScript('OnClick', function() AI:DarthSetup() end)
-		SLEInstallOption1Button:SetText(L["Darth's Config"])
-
-		SLEInstallOption2Button:Show()
-		SLEInstallOption2Button:SetScript('OnClick', function() AI:AffinitiiSetup() end)
-		SLEInstallOption2Button:SetText(L["Affinitii's Config"])
-
-		SLEInstallOption3Button:Show()
-		SLEInstallOption3Button:SetScript('OnClick', function() AI:RepoocSetup() end)
-		SLEInstallOption3Button:SetText(L["Repooc's Config"])
-
-		SLEInstallFrame:Size(550, 500)
-	elseif PageNum == 5 then
-		f.SubTitle:SetText(L["Installation Complete"])
-		f.Desc1:SetText(L["You are now finished with the installation process. If you are in need of technical support please visit us at http://www.tukui.org."])
-		f.Desc2:SetText(L["Please click the button below so you can setup variables and ReloadUI."])
-		SLEInstallOption1Button:Show()
-		SLEInstallOption1Button:SetScript("OnClick", InstallComplete)
-		SLEInstallOption1Button:SetText(L["Finished"])
-		SLEInstallFrame:Size(550, 400)
-	end
-end
-
-local function NextPage()
-	if CURRENT_PAGE ~= MAX_PAGE then
-		CURRENT_PAGE = CURRENT_PAGE + 1
-		SetPage(CURRENT_PAGE)
-	end
-end
-
-local function PreviousPage()
-	if CURRENT_PAGE ~= 1 then
-		CURRENT_PAGE = CURRENT_PAGE - 1
-		SetPage(CURRENT_PAGE)
-	end
-end
-
---Install UI
-function SLE:Install()
-	if not SLEInstallStepComplete then
-		local imsg = CreateFrame("Frame", "SLEInstallStepComplete", E.UIParent)
-		imsg:Size(418, 72)
-		imsg:Point("TOP", 0, -190)
-		imsg:Hide()
-		imsg:SetScript('OnShow', function(self)
-			if self.message then
-				PlaySoundFile([[Sound\Interface\LevelUp.wav]])
-				self.text:SetText(self.message)
-				UIFrameFadeOut(self, 3.5, 1, 0)
-				E:Delay(4, function() self:Hide() end)
-				self.message = nil
-			else
-				self:Hide()
-			end
-		end)
-
-		imsg.firstShow = false
-
-		imsg.bg = imsg:CreateTexture(nil, 'BACKGROUND')
-		imsg.bg:SetTexture([[Interface\LevelUp\LevelUpTex]])
-		imsg.bg:SetPoint('BOTTOM')
-		imsg.bg:Size(326, 103)
-		imsg.bg:SetTexCoord(0.00195313, 0.63867188, 0.03710938, 0.23828125)
-		imsg.bg:SetVertexColor(1, 1, 1, 0.6)
-
-		imsg.lineTop = imsg:CreateTexture(nil, 'BACKGROUND')
-		imsg.lineTop:SetDrawLayer('BACKGROUND', 2)
-		imsg.lineTop:SetTexture([[Interface\LevelUp\LevelUpTex]])
-		imsg.lineTop:SetPoint("TOP")
-		imsg.lineTop:Size(418, 7)
-		imsg.lineTop:SetTexCoord(0.00195313, 0.81835938, 0.01953125, 0.03320313)
-
-		imsg.lineBottom = imsg:CreateTexture(nil, 'BACKGROUND')
-		imsg.lineBottom:SetDrawLayer('BACKGROUND', 2)
-		imsg.lineBottom:SetTexture([[Interface\LevelUp\LevelUpTex]])
-		imsg.lineBottom:SetPoint("BOTTOM")
-		imsg.lineBottom:Size(418, 7)
-		imsg.lineBottom:SetTexCoord(0.00195313, 0.81835938, 0.01953125, 0.03320313)
-
-		imsg.text = imsg:CreateFontString(nil, 'ARTWORK', 'GameFont_Gigantic')
-		imsg.text:Point("BOTTOM", 0, 12)
-		imsg.text:SetTextColor(1, 0.82, 0)
-		imsg.text:SetJustifyH("CENTER")
-	end
-
-	--Create Frame
-	if not SLEInstallFrame then
-		local f = CreateFrame("Button", "SLEInstallFrame", E.UIParent)
-		f.SetPage = SetPage
-		f:Size(550, 400)
-		f:SetTemplate("Transparent")
-		f:SetPoint("CENTER")
-		f:SetFrameStrata('TOOLTIP')
-
-		f.Title = f:CreateFontString(nil, 'OVERLAY')
-		f.Title:FontTemplate(nil, 17, nil)
-		f.Title:Point("TOP", 0, -5)
-		f.Title:SetText(L["|cff1784d1Shadow & Light|r Installation"])
-
-		f.Next = CreateFrame("Button", "SLEInstallNextButton", f, "UIPanelButtonTemplate")
-		f.Next:StripTextures()
-		f.Next:SetTemplate("Default", true)
-		f.Next:Size(110, 25)
-		f.Next:Point("BOTTOMRIGHT", -5, 5)
-		f.Next:SetText(CONTINUE)
-		f.Next:Disable()
-		f.Next:SetScript("OnClick", NextPage)
-		E.Skins:HandleButton(f.Next, true)
-
-		f.Prev = CreateFrame("Button", "SLEInstallPrevButton", f, "UIPanelButtonTemplate")
-		f.Prev:StripTextures()
-		f.Prev:SetTemplate("Default", true)
-		f.Prev:Size(110, 25)
-		f.Prev:Point("BOTTOMLEFT", 5, 5)
-		f.Prev:SetText(PREVIOUS)
-		f.Prev:Disable()
-		f.Prev:SetScript("OnClick", PreviousPage)
-		E.Skins:HandleButton(f.Prev, true)
-
-		f.Status = CreateFrame("StatusBar", "SLEInstallStatus", f)
-		f.Status:SetFrameLevel(f.Status:GetFrameLevel() + 2)
-		f.Status:CreateBackdrop("Default")
-		f.Status:SetStatusBarTexture(E["media"].normTex)
-		f.Status:SetStatusBarColor(unpack(E["media"].rgbvaluecolor))
-		f.Status:SetMinMaxValues(0, MAX_PAGE)
-		f.Status:Point("TOPLEFT", f.Prev, "TOPRIGHT", 6, -2)
-		f.Status:Point("BOTTOMRIGHT", f.Next, "BOTTOMLEFT", -6, 2)
-		f.Status.text = f.Status:CreateFontString(nil, 'OVERLAY')
-		f.Status.text:FontTemplate()
-		f.Status.text:SetPoint("CENTER")
-		f.Status.text:SetText(CURRENT_PAGE.." / "..MAX_PAGE)
-		f.Status:SetScript("OnValueChanged", function(self)
-			self.text:SetText(self:GetValue().." / "..MAX_PAGE)
-		end)
-
-		f.Option1 = CreateFrame("Button", "SLEInstallOption1Button", f, "UIPanelButtonTemplate")
-		f.Option1:StripTextures()
-		f.Option1:Size(160, 30)
-		f.Option1:Point("BOTTOM", 0, 55)
-		f.Option1:SetText("")
-		f.Option1:Hide()
-		E.Skins:HandleButton(f.Option1, true)
-
-		f.Option2 = CreateFrame("Button", "SLEInstallOption2Button", f, "UIPanelButtonTemplate")
-		f.Option2:StripTextures()
-		f.Option2:Size(110, 30)
-		f.Option2:Point('BOTTOMLEFT', f, 'BOTTOM', 4, 55)
-		f.Option2:SetText("")
-		f.Option2:Hide()
-		f.Option2:SetScript('OnShow', function() f.Option1:SetWidth(110); f.Option1:ClearAllPoints(); f.Option1:Point('BOTTOMRIGHT', f, 'BOTTOM', -4, 55) end)
-		f.Option2:SetScript('OnHide', function() f.Option1:SetWidth(160); f.Option1:ClearAllPoints(); f.Option1:Point("BOTTOM", 0, 55) end)
-		E.Skins:HandleButton(f.Option2, true)
-
-		f.Option3 = CreateFrame("Button", "SLEInstallOption3Button", f, "UIPanelButtonTemplate")
-		f.Option3:StripTextures()
-		f.Option3:Size(100, 30)
-		f.Option3:Point('LEFT', f.Option2, 'RIGHT', 4, 0)
-		f.Option3:SetText("")
-		f.Option3:Hide()
-		f.Option3:SetScript('OnShow', function() f.Option1:SetWidth(100); f.Option1:ClearAllPoints(); f.Option1:Point('RIGHT', f.Option2, 'LEFT', -4, 0); f.Option2:SetWidth(100); f.Option2:ClearAllPoints(); f.Option2:Point('BOTTOM', f, 'BOTTOM', 0, 55)  end)
-		f.Option3:SetScript('OnHide', function() f.Option1:SetWidth(160); f.Option1:ClearAllPoints(); f.Option1:Point("BOTTOM", 0, 55); f.Option2:SetWidth(110); f.Option2:ClearAllPoints(); f.Option2:Point('BOTTOMLEFT', f, 'BOTTOM', 4, 55) end)
-		E.Skins:HandleButton(f.Option3, true)
-
-		f.Option4 = CreateFrame("Button", "SLEInstallOption4Button", f, "UIPanelButtonTemplate")
-		f.Option4:StripTextures()
-		f.Option4:Size(100, 30)
-		f.Option4:Point('LEFT', f.Option3, 'RIGHT', 4, 0)
-		f.Option4:SetText("")
-		f.Option4:Hide()
-		f.Option4:SetScript('OnShow', function()
-			f.Option1:Width(100)
-			f.Option2:Width(100)
-
-			f.Option1:ClearAllPoints();
-			f.Option1:Point('RIGHT', f.Option2, 'LEFT', -4, 0);
-			f.Option2:ClearAllPoints();
-			f.Option2:Point('BOTTOMRIGHT', f, 'BOTTOM', -4, 55)
-		end)
-		f.Option4:SetScript('OnHide', function() f.Option1:SetWidth(160); f.Option1:ClearAllPoints(); f.Option1:Point("BOTTOM", 0, 55); f.Option2:SetWidth(110); f.Option2:ClearAllPoints(); f.Option2:Point('BOTTOMLEFT', f, 'BOTTOM', 4, 55) end)
-		E.Skins:HandleButton(f.Option4, true)
-
-		f.SubTitle = f:CreateFontString(nil, 'OVERLAY')
-		f.SubTitle:FontTemplate(nil, 15, nil)
-		f.SubTitle:Point("TOP", 0, -40)
-
-		f.Desc1 = f:CreateFontString(nil, 'OVERLAY')
-		f.Desc1:FontTemplate()
-		f.Desc1:Point("TOPLEFT", 20, -75)
-		f.Desc1:Width(f:GetWidth() - 40)
-
-		f.Desc2 = f:CreateFontString(nil, 'OVERLAY')
-		f.Desc2:FontTemplate()
-		f.Desc2:Point("TOPLEFT", 20, -125)
-		f.Desc2:Width(f:GetWidth() - 40)
-
-		f.Desc3 = f:CreateFontString(nil, 'OVERLAY')
-		f.Desc3:FontTemplate()
-		f.Desc3:Point("TOP", f.Desc2, "BOTTOM", 0, -30)
-		f.Desc3:Width(f:GetWidth() - 40)
-		local close = CreateFrame("Button", "SLEInstallCloseButton", f, "UIPanelCloseButton")
-		close:SetPoint("TOPRIGHT", f, "TOPRIGHT")
-		close:SetScript("OnClick", function()
-			f:Hide()
-			CURRENT_PAGE = 0
-		end)
-		E.Skins:HandleCloseButton(close)
-
-		f.tutorialImage = f:CreateTexture('SLEInstallTutorialImage', 'OVERLAY')
-		f.tutorialImage:Size(256, 128)
-		f.tutorialImage:SetTexture('Interface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Banner')
-		f.tutorialImage:Point('BOTTOM', 0, 85)
-	end
+SLE.installTable = {
+	["Name"] = "|cff9482c9Shadow & Light|r",
+	["Title"] = L["|cff9482c9Shadow & Light|r Installation"],
+	["tutorialImage"] = [[Interface\AddOns\ElvUI_SLE\media\textures\SLE_Banner]],
+	["Pages"] = {
+		[1] = function()
+			_G["PluginInstallFrame"].SubTitle:SetText(T.format(L["Welcome to |cff9482c9Shadow & Light|r version %s!"], SLE.version))
+			_G["PluginInstallFrame"].Desc1:SetText(L["SLE_INSTALL_WELCOME"])
+			_G["PluginInstallFrame"].Desc2:SetText("")
+			_G["PluginInstallFrame"].Desc3:SetText(L["Please press the continue button to go onto the next step."])
+
+			_G["PluginInstallFrame"].Option1:Show()
+			_G["PluginInstallFrame"].Option1:SetScript("OnClick", InstallComplete)
+			_G["PluginInstallFrame"].Option1:SetText(L["Skip Process"])
+		end,
+		[2] = function()
+			local KF, Info, Timer = T.unpack(_G["ElvUI_KnightFrame"])
+			_G["PluginInstallFrame"].SubTitle:SetText(L["Armory Mode"])
+			_G["PluginInstallFrame"].Desc1:SetText(L["SLE_ARMORY_INSTALL"])
+			_G["PluginInstallFrame"].Desc2:SetText(L["This will enable S&L Armory mode components that will show more detailed information at a quick glance on the toons you inspect or your own character."])
+			_G["PluginInstallFrame"].Desc3:SetText(L["Importance: |cffFF0000Low|r"])
+
+			_G["PluginInstallFrame"].Option1:Show()
+			_G["PluginInstallFrame"].Option1:SetScript('OnClick', function() E.db.sle.Armory.Character.Enable = true; E.db.sle.Armory.Inspect.Enable = true; KF.Modules.CharacterArmory() end)
+			_G["PluginInstallFrame"].Option1:SetText(ENABLE)
+
+			_G["PluginInstallFrame"].Option2:Show()
+			_G["PluginInstallFrame"].Option2:SetScript('OnClick', function() E.db.sle.Armory.Character.Enable = false; E.db.sle.Armory.Inspect.Enable = false; KF.Modules.CharacterArmory() end)
+			_G["PluginInstallFrame"].Option2:SetText(DISABLE)
+		end,
+		[3] = function()
+			_G["PluginInstallFrame"].SubTitle:SetText(L["AFK Mode"])
+			_G["PluginInstallFrame"].Desc1:SetText(L["AFK Mode in |cff9482c9Shadow & Light|r is additional settings/elements for standard |cff1784d1ElvUI|r AFK screen."])
+			_G["PluginInstallFrame"].Desc2:SetText(L["This option is bound to character and requires a UI reload to take effect."])
+			_G["PluginInstallFrame"].Desc3:SetText(L["Importance: |cffFF0000Low|r"])
+
+			_G["PluginInstallFrame"].Option1:Show()
+			_G["PluginInstallFrame"].Option1:SetScript('OnClick', function() E.private.sle.module.screensaver = true; end)
+			_G["PluginInstallFrame"].Option1:SetText(ENABLE)
+
+			_G["PluginInstallFrame"].Option2:Show()
+			_G["PluginInstallFrame"].Option2:SetScript('OnClick', function() E.private.sle.module.screensaver = false; end)
+			_G["PluginInstallFrame"].Option2:SetText(DISABLE)
+		end,
+		[4] = function()
+			_G["PluginInstallFrame"].SubTitle:SetText(L["Move Blizzard frames"])
+			_G["PluginInstallFrame"].Desc1:SetText(L["Allow some Blizzard frames to be moved around."])
+			_G["PluginInstallFrame"].Desc2:SetText(L["This option is bound to character and requires a UI reload to take effect."])
+			_G["PluginInstallFrame"].Desc3:SetText(L["Importance: |cffD3CF00Medium|r"])
+
+			_G["PluginInstallFrame"].Option1:Show()
+			_G["PluginInstallFrame"].Option1:SetScript('OnClick', function()
+				E.private.sle.module.blizzmove = true;
+				_G["PluginInstallStepComplete"].message = L["Move Blizzard frames"].." ".."Set to |cff00FF00"..ENABLE.."|r"
+				_G["PluginInstallStepComplete"]:Show()
+			end)
+			_G["PluginInstallFrame"].Option1:SetText(ENABLE)
+
+			_G["PluginInstallFrame"].Option2:Show()
+			_G["PluginInstallFrame"].Option2:SetScript('OnClick', function()
+				E.private.sle.module.blizzmove = false;
+				_G["PluginInstallStepComplete"].message = L["Move Blizzard frames"].." ".."Set to |cffFF0000"..DISABLE.."|r"
+				_G["PluginInstallStepComplete"]:Show()
+			end)
+			_G["PluginInstallFrame"].Option2:SetText(DISABLE)
+		end,
+		[5] = function()
+			PI.SLE_Auth = ""
+			PI.SLE_Word = E.db.layoutSet == 'tank' and L["Tank"] or E.db.layoutSet == 'healer' and L["Healer"] or E.db.layoutSet == 'dpsMelee' and L['Physical DPS'] or E.db.layoutSet == 'dpsCaster' and L['Caster DPS'] or NONE
+			_G["PluginInstallFrame"].SubTitle:SetText(L["Shadow & Light Imports"])
+			_G["PluginInstallFrame"].Desc1:SetText(L["You can now choose if you want to use one of the authors' set of options. This will change the positioning of some elements as well of other various options."])
+			_G["PluginInstallFrame"].Desc2:SetText(T.format(L["SLE_Install_Text_AUTHOR"], PI.SLE_Word))
+			_G["PluginInstallFrame"].Desc3:SetText(L["Importance: |cffFF0000Low|r"])
+
+			_G["PluginInstallFrame"].Option1:Show()
+			_G["PluginInstallFrame"].Option1:SetScript('OnClick', function() PI.SLE_Auth = "DARTH"; _G["PluginInstallFrame"].Next:Click() end)
+			_G["PluginInstallFrame"].Option1:SetText(L["Darth's Config"])
+
+			-- _G["PluginInstallFrame"].Option2:Show()
+			-- _G["PluginInstallFrame"].Option2:SetScript('OnClick', function() PI.SLE_Auth = "REPOOC"; _G["PluginInstallFrame"].Next:Click() end)
+			-- _G["PluginInstallFrame"].Option2:SetText(L["Repooc's Config"])
+
+			_G["PluginInstallFrame"]:Size(550, 500)
+		end,
+		[6] = function()
+			if PI.SLE_Auth == "" then _G["PluginInstallFrame"].SetPage(_G["PluginInstallFrame"].PrevPage == 5 and 7 or 5) return end
+			PI.SLE_Word = E.db.layoutSet == 'tank' and L["Tank"] or E.db.layoutSet == 'healer' and L["Healer"] or E.db.layoutSet == 'dpsMelee' and L['Physical DPS'] or E.db.layoutSet == 'dpsCaster' and L['Caster DPS'] or NONE
+			_G["PluginInstallFrame"].SubTitle:SetText(L["Layout & Settings Import"])
+			_G["PluginInstallFrame"].Desc1:SetText(T.format(L["You have selected to use %s and role %s."], PI.SLE_Auth == "DARTH" and L["Darth's Config"] or PI.SLE_Auth == "REPOOC" and L["Repooc's Config"], PI.SLE_Word))
+			_G["PluginInstallFrame"].Desc2:SetText(L["SLE_INSTALL_LAYOUT_TEXT2"])
+			_G["PluginInstallFrame"].Desc3:SetText(L["Importance: |cffD3CF00Medium|r"])
+
+			_G["PluginInstallFrame"].Option1:Show()
+			_G["PluginInstallFrame"].Option1:SetScript('OnClick', StartSetup)
+			_G["PluginInstallFrame"].Option1:SetText(L["Layout"])
+
+			_G["PluginInstallFrame"].Option2:Show()
+			_G["PluginInstallFrame"].Option2:SetScript('OnClick', SetupAddons)
+			_G["PluginInstallFrame"].Option2:SetText(L["Addons"])
+
+			_G["PluginInstallFrame"].Option3:Show()
+			_G["PluginInstallFrame"].Option3:SetScript('OnClick', SetupCVars)
+			_G["PluginInstallFrame"].Option3:SetText(L["CVars"])
+		end,
+		[7] = function()
+			_G["PluginInstallFrame"].SubTitle:SetText(L["Installation Complete"])
+			_G["PluginInstallFrame"].Desc1:SetText(L["You are now finished with the installation process. If you are in need of technical support please visit us at http://www.tukui.org."])
+			_G["PluginInstallFrame"].Desc2:SetText(L["Please click the button below so you can setup variables and ReloadUI."])
+
+			_G["PluginInstallFrame"].Option1:Show()
+			_G["PluginInstallFrame"].Option1:SetScript("OnClick", InstallComplete)
+			_G["PluginInstallFrame"].Option1:SetText(L["Finished"])
+		end,
+	},
+	["StepTitles"] = {
+		[1] = START,
+		[2] = L["Armory Mode"],
+		[3] = L["AFK Mode"],
+		[4] = L["Moving Frames"],
+		[5] = L["Import Profile"],
+		[6] = L["Author Presets"].." *",
+		[7] = L["Finished"],
+	},
+	["StepTitlesColorSelected"] = {.53,.53,.93},
+}
+
+-- SLE.installTable2 = {
+	-- ["Name"] = "S&L2",
+	-- ["tutorialImage"] = [[Interface\AddOns\ElvUI_SLE\media\textures\SLE_Banner]],
+	-- ["Pages"] = {
+		-- [1] = function()
+			-- _G["PluginInstallFrame"].SubTitle:SetText(format(L["Welcome to |cff1784d1Shadow & Light|r 42342 version %s!"], SLE.version))
+			-- _G["PluginInstallFrame"].Desc1:SetText(L["This will take you through a quick install process to setup some Shadow & Light features.\nIf you choose to not setup any options through this config, click Skip Process button to finish the installation."])
+			-- _G["PluginInstallFrame"].Desc2:SetText("")
+			-- _G["PluginInstallFrame"].Desc3:SetText(L["Please press the continue button to go onto the next step."])
+
+			-- _G["PluginInstallFrame"].Option1:Show()
+			-- _G["PluginInstallFrame"].Option1:SetScript("OnClick", InstallComplete)
+			-- _G["PluginInstallFrame"].Option1:SetText(L["Skip Process"])
+		-- end,
+	-- },
+-- }

-	SLEInstallFrame:Show()
-	NextPage()
-end
\ No newline at end of file
diff --git a/ElvUI_SLE/core/installer/BigWigs.lua b/ElvUI_SLE/core/installer/BigWigs.lua
deleted file mode 100644
index 594d904..0000000
--- a/ElvUI_SLE/core/installer/BigWigs.lua
+++ /dev/null
@@ -1,35 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local AI = E:GetModule('SLE_AddonInstaller')
-
-local ace3   = true               -- whether or not this database is a Ace3 profile
-local name   = 'BigWigs'          -- the name of the addon
-local dbname = 'BigWigs3DB'       -- name of the addon database
-
-local function OnDemand(profile)  -- function that creates the "load on demand" database
-	local database
-	if profile == "Affinitii" then
-		database = {
-			["showBlizzardWarnings"] = true,
-			["showBossmodChat"] = true,
-			["seenmovies"] = {
-				[73] = true,
-				[74] = true,
-				[75] = true,
-				[76] = true,
-			},
-		}
-	end
-
-	if profile == "Repooc" then
-		-- No Settings
-	end
-
-	if profile == "Darth" then
-		-- No Settings
-	end
-
-	return database
-end
-
--- register the profile with the engine
-AI:RegisterAddonProfile(name, ace3, dbname, OnDemand)
\ No newline at end of file
diff --git a/ElvUI_SLE/core/installer/BigWigsFights.lua b/ElvUI_SLE/core/installer/BigWigsFights.lua
deleted file mode 100644
index 1e8d6a8..0000000
--- a/ElvUI_SLE/core/installer/BigWigsFights.lua
+++ /dev/null
@@ -1,91 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local AI = E:GetModule('SLE_AddonInstaller')
-
-local ace3   = false              -- whether or not this database is a Ace3 profile
-local name   = 'BigWigs'          -- the name of the addon
-local dbname = 'BigWigs3DB'       -- name of the addon database
-
-local function OnDemand(profile)  -- function that creates the "load on demand" database
-	local database
-	if profile == "Affinitii" then
-		database = {
-			["namespaces"] = {
-				["BigWigs_Bosses_Madness of Deathwing"] = {
-					["profiles"] = {
-						["Shadow and Light (Affinitii)"] = {
-							["Elementium Bolt"] = 643,
-						},
-					},
-				},
-				["BigWigs_Plugins_Proximity"] = {
-					["profiles"] = {
-						["Shadow and Light (Affinitii)"] = {
-							["fontSize"] = 20.00000079528718,
-							["posy"] = 265.5998002156482,
-							["lock"] = true,
-							["posx"] = 244.6221205041632,
-							["sound"] = false,
-							["font"] = "PT Sans Narrow",
-						},
-					},
-				},
-				["BigWigs_Plugins_Sounds"] = {
-					["profiles"] = {
-						["Shadow and Light (Affinitii)"] = {
-							["Long"] = {
-							},
-							["Info"] = {
-							},
-							["Alarm"] = {
-							},
-							["Alert"] = {
-							},
-						},
-					},
-				},
-				["BigWigs_Plugins_Messages"] = {
-					["profiles"] = {
-						["Shadow and Light (Affinitii)"] = {
-							["fontSize"] = 20.00000079528718,
-							["monochrome"] = false,
-							["font"] = "PT Sans Narrow",
-							["BWEmphasizeMessageAnchor_y"] = 465.0667085654549,
-							["BWMessageAnchor_y"] = 440.8888495721501,
-							["BWEmphasizeMessageAnchor_x"] = 610.8445805698311,
-							["BWMessageAnchor_x"] = 610.8445307717618,
-						},
-					},
-				},
-				["BigWigs_Plugins_Bars"] = {
-					["profiles"] = {
-						["Shadow and Light (Affinitii)"] = {
-							["BigWigsEmphasizeAnchor_y"] = 303.2888646270365,
-							["BigWigsAnchor_y"] = 116.8001243424387,
-							["emphasizeGrowup"] = false,
-							["BigWigsAnchor_x"] = 19.73342363118923,
-							["fill"] = false,
-							["BigWigsAnchor_width"] = 381.8331333576473,
-							["BigWigsEmphasizeAnchor_width"] = 216.1665623191371,
-							["BigWigsEmphasizeAnchor_x"] = 272.8889300172694,
-							["font"] = "PT Sans Narrow",
-							["emphasizeScale"] = 1,
-						},
-					},
-				},
-			},
-		}
-	end
-
-	if profile == "Repooc" then
-		-- No Settings
-	end
-
-	if profile == "Darth" then
-		-- No Settings
-	end
-
-	return database
-end
-
--- register the profile with the engine
-AI:RegisterAddonProfile(name, ace3, dbname, OnDemand)
\ No newline at end of file
diff --git a/ElvUI_SLE/core/installer/BigWigsIcon.lua b/ElvUI_SLE/core/installer/BigWigsIcon.lua
deleted file mode 100644
index 4ec1ac4..0000000
--- a/ElvUI_SLE/core/installer/BigWigsIcon.lua
+++ /dev/null
@@ -1,29 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local AI = E:GetModule('SLE_AddonInstaller')
-
-local ace3   = false              -- whether or not this database is a Ace3 profile
-local name   = 'BigWigs'          -- the name of the addon
-local dbname = 'BigWigs3IconDB'   -- name of the addon database
-
-local function OnDemand(profile)  -- function that creates the "load on demand" database
-	local database
-	if profile == "Affinitii" then
-		database = {
-			["minimapPos"] = 158.126507574158,
-			["hide"] = true,
-		}
-	end
-
-	if profile == "Repooc" then
-		-- No Settings
-	end
-
-	if profile == "Darth" then
-		-- No Settings
-	end
-
-	return database
-end
-
--- register the profile with the engine
-AI:RegisterAddonProfile(name, ace3, dbname, OnDemand)
\ No newline at end of file
diff --git a/ElvUI_SLE/core/installer/Clique.lua b/ElvUI_SLE/core/installer/Clique.lua
deleted file mode 100644
index e44019b..0000000
--- a/ElvUI_SLE/core/installer/Clique.lua
+++ /dev/null
@@ -1,27 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local AI = E:GetModule('SLE_AddonInstaller')
-
-local ace3   = false              -- whether or not this database is a Ace3 profile
-local name   = 'Clique'          -- the name of the addon
-local dbname = 'CliqueDB3'       -- name of the addon database
-
-local function OnDemand(profile)  -- function that creates the "load on demand" database
-	local database
-	if profile == "Affinitii" then
-		-- No Settings
-	end
-
-	if profile == "Repooc" then
-		--database = {
-		--}
-	end
-
-	if profile == "Darth" then
-		-- No Settings
-	end
-
-	return database
-end
-
--- register the profile with the engine
-AI:RegisterAddonProfile(name, ace3, dbname, OnDemand)
\ No newline at end of file
diff --git a/ElvUI_SLE/core/installer/Hermes.lua b/ElvUI_SLE/core/installer/Hermes.lua
deleted file mode 100644
index 7c65d56..0000000
--- a/ElvUI_SLE/core/installer/Hermes.lua
+++ /dev/null
@@ -1,1046 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local AI = E:GetModule('SLE_AddonInstaller')
-
-local ace3   = true               -- whether or not this database is a Ace3 profile
-local name   = 'Hermes'           -- the name of the addon
-local dbname = 'HermesDB2'        -- name of the addon database
-
-local function OnDemand(profile)  -- function that creates the "load on demand" database
-	local database
-	if profile == "Affinitii" then
-		database = {
-			["configMode"] = false,
-			["pluginState"] = {
-				["UI"] = true,
-			},
-			["spells"] = {
-				{
-					["enabled"] = false,
-					["name"] = "Ancestral Guidance",
-					["id"] = 108281,
-					["class"] = "SHAMAN",
-					["icon"] = "Interface\\Icons\\ability_shaman_ancestralguidance",
-				}, -- [1]
-				{
-					["enabled"] = false,
-					["name"] = "Anti-Magic Shell",
-					["id"] = 48707,
-					["class"] = "DEATHKNIGHT",
-					["icon"] = "Interface\\Icons\\Spell_Shadow_AntiMagicShell",
-				}, -- [2]
-				{
-					["enabled"] = false,
-					["name"] = "Anti-Magic Zone",
-					["id"] = 51052,
-					["class"] = "DEATHKNIGHT",
-					["icon"] = "Interface\\Icons\\Spell_DeathKnight_AntiMagicZone",
-				}, -- [3]
-				{
-					["enabled"] = false,
-					["name"] = "Ardent Defender",
-					["id"] = 31850,
-					["class"] = "PALADIN",
-					["icon"] = "Interface\\Icons\\Spell_Holy_ArdentDefender",
-				}, -- [4]
-				{
-					["enabled"] = false,
-					["name"] = "Army of the Dead",
-					["id"] = 42650,
-					["class"] = "DEATHKNIGHT",
-					["icon"] = "Interface\\Icons\\Spell_DeathKnight_ArmyOfTheDead",
-				}, -- [5]
-				{
-					["enabled"] = false,
-					["name"] = "Barkskin",
-					["id"] = 22812,
-					["class"] = "DRUID",
-					["icon"] = "Interface\\Icons\\Spell_Nature_StoneClawTotem",
-				}, -- [6]
-				{
-					["enabled"] = false,
-					["name"] = "Blind",
-					["id"] = 2094,
-					["class"] = "ROGUE",
-					["icon"] = "Interface\\Icons\\Spell_Shadow_MindSteal",
-				}, -- [7]
-				{
-					["enabled"] = false,
-					["name"] = "Bloodlust",
-					["id"] = 2825,
-					["class"] = "SHAMAN",
-					["icon"] = "Interface\\Icons\\Spell_Nature_BloodLust",
-				}, -- [8]
-				{
-					["enabled"] = false,
-					["name"] = "Bone Shield",
-					["id"] = 49222,
-					["class"] = "DEATHKNIGHT",
-					["icon"] = "INTERFACE\\ICONS\\ability_deathknight_boneshield",
-				}, -- [9]
-				{
-					["enabled"] = false,
-					["name"] = "Cenarion Ward",
-					["id"] = 102351,
-					["class"] = "DRUID",
-					["icon"] = "Interface\\Icons\\Ability_Druid_NaturalPerfection",
-				}, -- [10]
-				{
-					["enabled"] = false,
-					["name"] = "Cloak of Shadows",
-					["id"] = 31224,
-					["class"] = "ROGUE",
-					["icon"] = "Interface\\Icons\\Spell_Shadow_NetherCloak",
-				}, -- [11]
-				{
-					["enabled"] = false,
-					["name"] = "Counterspell",
-					["id"] = 2139,
-					["class"] = "MAGE",
-					["icon"] = "Interface\\Icons\\Spell_Frost_IceShock",
-				}, -- [12]
-				{
-					["enabled"] = false,
-					["name"] = "Create Soulwell",
-					["id"] = 29893,
-					["class"] = "WARLOCK",
-					["icon"] = "Interface\\Icons\\Spell_Shadow_Shadesofdarkness",
-				}, -- [13]
-				{
-					["enabled"] = false,
-					["name"] = "Dancing Rune Weapon",
-					["id"] = 49028,
-					["class"] = "DEATHKNIGHT",
-					["icon"] = "Interface\\Icons\\INV_Sword_07",
-				}, -- [14]
-				{
-					["enabled"] = false,
-					["name"] = "Death Grip",
-					["id"] = 49576,
-					["class"] = "DEATHKNIGHT",
-					["icon"] = "Interface\\Icons\\Spell_DeathKnight_Strangulate",
-				}, -- [15]
-				{
-					["enabled"] = false,
-					["name"] = "Death Pact",
-					["id"] = 48743,
-					["class"] = "DEATHKNIGHT",
-					["icon"] = "Interface\\Icons\\Spell_Shadow_DeathPact",
-				}, -- [16]
-				{
-					["enabled"] = false,
-					["name"] = "Demoralizing Banner",
-					["id"] = 114203,
-					["class"] = "WARRIOR",
-					["icon"] = "Interface\\Icons\\demoralizing_banner",
-				}, -- [17]
-				{
-					["enabled"] = true,
-					["name"] = "Devotion Aura",
-					["id"] = 31821,
-					["class"] = "PALADIN",
-					["icon"] = "Interface\\Icons\\Spell_Holy_AuraMastery",
-				}, -- [18]
-				{
-					["enabled"] = false,
-					["name"] = "Disrupting Shout",
-					["id"] = 102060,
-					["class"] = "WARRIOR",
-					["icon"] = "Interface\\Icons\\warrior_disruptingshout",
-				}, -- [19]
-				{
-					["enabled"] = true,
-					["name"] = "Divine Hymn",
-					["id"] = 64843,
-					["class"] = "PRIEST",
-					["icon"] = "Interface\\Icons\\Spell_Holy_DivineHymn",
-				}, -- [20]
-				{
-					["enabled"] = false,
-					["name"] = "Divine Protection",
-					["id"] = 498,
-					["class"] = "PALADIN",
-					["icon"] = "Interface\\Icons\\spell_holy_divineprotection",
-				}, -- [21]
-				{
-					["enabled"] = false,
-					["name"] = "Divine Shield",
-					["id"] = 642,
-					["class"] = "PALADIN",
-					["icon"] = "Interface\\Icons\\spell_holy_divineshield",
-				}, -- [22]
-				{
-					["enabled"] = false,
-					["name"] = "Every Man for Himself",
-					["id"] = 59752,
-					["class"] = "ANY",
-					["icon"] = "Interface\\Icons\\Spell_Shadow_Charm",
-				}, -- [23]
-				{
-					["enabled"] = false,
-					["name"] = "Fist of Justice",
-					["id"] = 105593,
-					["class"] = "PALADIN",
-					["icon"] = "Interface\\Icons\\Spell_Holy_FistOfJustice",
-				}, -- [24]
-				{
-					["enabled"] = false,
-					["name"] = "Frenzied Regeneration",
-					["id"] = 22842,
-					["class"] = "DRUID",
-					["icon"] = "Interface\\Icons\\Ability_BullRush",
-				}, -- [25]
-				{
-					["enabled"] = false,
-					["name"] = "Guardian Spirit",
-					["id"] = 47788,
-					["class"] = "PRIEST",
-					["icon"] = "Interface\\Icons\\Spell_Holy_GuardianSpirit",
-				}, -- [26]
-				{
-					["enabled"] = false,
-					["name"] = "Guardian of Ancient Kings",
-					["id"] = 86659,
-					["class"] = "PALADIN",
-					["icon"] = "Interface\\Icons\\Spell_Holy_Heroism",
-				}, -- [27]
-				{
-					["enabled"] = false,
-					["name"] = "Hammer of Justice",
-					["id"] = 853,
-					["class"] = "PALADIN",
-					["icon"] = "Interface\\Icons\\Spell_Holy_SealOfMight",
-				}, -- [28]
-				{
-					["enabled"] = false,
-					["name"] = "Hand of Freedom",
-					["id"] = 1044,
-					["class"] = "PALADIN",
-					["icon"] = "Interface\\Icons\\Spell_Holy_SealOfValor",
-				}, -- [29]
-				{
-					["enabled"] = false,
-					["name"] = "Hand of Protection",
-					["id"] = 1022,
-					["class"] = "PALADIN",
-					["icon"] = "Interface\\Icons\\Spell_Holy_SealOfProtection",
-				}, -- [30]
-				{
-					["enabled"] = false,
-					["name"] = "Hand of Purity",
-					["id"] = 114039,
-					["class"] = "PALADIN",
-					["icon"] = "Interface\\Icons\\Spell_Holy_SealOfWisdom",
-				}, -- [31]
-				{
-					["enabled"] = false,
-					["name"] = "Hand of Sacrifice",
-					["id"] = 6940,
-					["class"] = "PALADIN",
-					["icon"] = "Interface\\Icons\\Spell_Holy_SealOfSacrifice",
-				}, -- [32]
-				{
-					["enabled"] = false,
-					["name"] = "Hand of Salvation",
-					["id"] = 1038,
-					["class"] = "PALADIN",
-					["icon"] = "Interface\\Icons\\Spell_Holy_SealOfSalvation",
-				}, -- [33]
-				{
-					["enabled"] = false,
-					["name"] = "Healing Stream Totem",
-					["id"] = 5394,
-					["class"] = "SHAMAN",
-					["icon"] = "Interface\\Icons\\INV_Spear_04",
-				}, -- [34]
-				{
-					["enabled"] = false,
-					["name"] = "Healing Tide Totem",
-					["id"] = 108280,
-					["class"] = "SHAMAN",
-					["icon"] = "Interface\\Icons\\ability_shaman_healingtide",
-				}, -- [35]
-				{
-					["enabled"] = true,
-					["name"] = "Hymn of Hope",
-					["id"] = 64901,
-					["class"] = "PRIEST",
-					["icon"] = "Interface\\Icons\\Spell_Holy_SymbolOfHope",
-				}, -- [36]
-				{
-					["enabled"] = false,
-					["name"] = "Ice Block",
-					["id"] = 45438,
-					["class"] = "MAGE",
-					["icon"] = "Interface\\Icons\\Spell_Frost_Frost",
-				}, -- [37]
-				{
-					["enabled"] = false,
-					["name"] = "Icebound Fortitude",
-					["id"] = 48792,
-					["class"] = "DEATHKNIGHT",
-					["icon"] = "Interface\\Icons\\Spell_DeathKnight_IceBoundFortitude",
-				}, -- [38]
-				{
-					["enabled"] = false,
-					["name"] = "Incarnation: Tree of Life",
-					["id"] = 33891,
-					["class"] = "DRUID",
-					["icon"] = "Interface\\Icons\\Ability_Druid_ImprovedTreeForm",
-				}, -- [39]
-				{
-					["enabled"] = false,
-					["name"] = "Innervate",
-					["id"] = 29166,
-					["class"] = "DRUID",
-					["icon"] = "Interface\\Icons\\Spell_Nature_Lightning",
-				}, -- [40]
-				{
-					["enabled"] = false,
-					["name"] = "Ironbark",
-					["id"] = 102342,
-					["class"] = "DRUID",
-					["icon"] = "Interface\\Icons\\spell_druid_ironbark",
-				}, -- [41]
-				{
-					["enabled"] = false,
-					["name"] = "Kick",
-					["id"] = 1766,
-					["class"] = "ROGUE",
-					["icon"] = "Interface\\Icons\\Ability_Kick",
-				}, -- [42]
-				{
-					["enabled"] = false,
-					["name"] = "Last Stand",
-					["id"] = 12975,
-					["class"] = "WARRIOR",
-					["icon"] = "Interface\\Icons\\Spell_Holy_AshesToAshes",
-				}, -- [43]
-				{
-					["enabled"] = false,
-					["name"] = "Lay on Hands",
-					["id"] = 633,
-					["class"] = "PALADIN",
-					["icon"] = "Interface\\Icons\\Spell_Holy_LayOnHands",
-				}, -- [44]
-				{
-					["enabled"] = false,
-					["name"] = "Leap of Faith",
-					["id"] = 73325,
-					["class"] = "PRIEST",
-					["icon"] = "INTERFACE\\ICONS\\priest_spell_leapoffaith_a",
-				}, -- [45]
-				{
-					["enabled"] = false,
-					["name"] = "Lichborne",
-					["id"] = 49039,
-					["class"] = "DEATHKNIGHT",
-					["icon"] = "Interface\\Icons\\Spell_Shadow_RaiseDead",
-				}, -- [46]
-				{
-					["enabled"] = false,
-					["name"] = "Life Cocoon",
-					["id"] = 116849,
-					["class"] = "MONK",
-					["icon"] = "Interface\\Icons\\ability_monk_chicocoon",
-				}, -- [47]
-				{
-					["enabled"] = true,
-					["name"] = "Mana Tide Totem",
-					["id"] = 16190,
-					["class"] = "SHAMAN",
-					["icon"] = "Interface\\Icons\\Spell_Frost_SummonWaterElemental",
-				}, -- [48]
-				{
-					["enabled"] = false,
-					["name"] = "Mass Spell Reflection",
-					["id"] = 114028,
-					["class"] = "WARRIOR",
-					["icon"] = "Interface\\Icons\\Ability_Warrior_ShieldBreak",
-				}, -- [49]
-				{
-					["enabled"] = false,
-					["name"] = "Mighty Bash",
-					["id"] = 5211,
-					["class"] = "DRUID",
-					["icon"] = "Interface\\Icons\\Ability_Druid_Bash",
-				}, -- [50]
-				{
-					["enabled"] = false,
-					["name"] = "Mind Freeze",
-					["id"] = 47528,
-					["class"] = "DEATHKNIGHT",
-					["icon"] = "Interface\\Icons\\Spell_DeathKnight_MindFreeze",
-				}, -- [51]
-				{
-					["enabled"] = false,
-					["name"] = "Misdirection",
-					["id"] = 34477,
-					["class"] = "HUNTER",
-					["icon"] = "Interface\\Icons\\Ability_Hunter_Misdirection",
-				}, -- [52]
-				{
-					["enabled"] = false,
-					["name"] = "Nature's Vigil",
-					["id"] = 124974,
-					["class"] = "DRUID",
-					["icon"] = "Interface\\Icons\\Achievement_Zone_Feralas",
-				}, -- [53]
-				{
-					["enabled"] = false,
-					["name"] = "Pain Suppression",
-					["id"] = 33206,
-					["class"] = "PRIEST",
-					["icon"] = "Interface\\Icons\\Spell_Holy_PainSupression",
-				}, -- [54]
-				{
-					["enabled"] = true,
-					["name"] = "Power Word: Barrier",
-					["id"] = 62618,
-					["class"] = "PRIEST",
-					["icon"] = "Interface\\Icons\\spell_holy_powerwordbarrier",
-				}, -- [55]
-				{
-					["enabled"] = false,
-					["name"] = "Pummel",
-					["id"] = 6552,
-					["class"] = "WARRIOR",
-					["icon"] = "Interface\\Icons\\INV_Gauntlets_04",
-				}, -- [56]
-				{
-					["enabled"] = true,
-					["name"] = "Raise Ally",
-					["id"] = 61999,
-					["class"] = "DEATHKNIGHT",
-					["icon"] = "Interface\\Icons\\Spell_Shadow_DeadofNight",
-				}, -- [57]
-				{
-					["enabled"] = false,
-					["name"] = "Raise Dead",
-					["id"] = 46584,
-					["class"] = "DEATHKNIGHT",
-					["icon"] = "Interface\\Icons\\Spell_Shadow_AnimateDead",
-				}, -- [58]
-				{
-					["enabled"] = true,
-					["name"] = "Rallying Cry",
-					["id"] = 97462,
-					["class"] = "WARRIOR",
-					["icon"] = "INTERFACE\\ICONS\\ability_toughness",
-				}, -- [59]
-				{
-					["enabled"] = true,
-					["name"] = "Rebirth",
-					["id"] = 20484,
-					["class"] = "DRUID",
-					["icon"] = "Interface\\Icons\\Spell_Nature_Reincarnation",
-				}, -- [60]
-				{
-					["enabled"] = false,
-					["name"] = "Rebuke",
-					["id"] = 96231,
-					["class"] = "PALADIN",
-					["icon"] = "Interface\\Icons\\spell_holy_rebuke",
-				}, -- [61]
-				{
-					["enabled"] = false,
-					["name"] = "Reincarnation",
-					["id"] = 20608,
-					["class"] = "SHAMAN",
-					["icon"] = "INTERFACE\\ICONS\\spell_shaman_improvedreincarnation",
-				}, -- [62]
-				{
-					["enabled"] = false,
-					["name"] = "Repentance",
-					["id"] = 20066,
-					["class"] = "PALADIN",
-					["icon"] = "Interface\\Icons\\Spell_Holy_PrayerOfHealing",
-				}, -- [63]
-				{
-					["enabled"] = true,
-					["name"] = "Revival",
-					["id"] = 115310,
-					["class"] = "MONK",
-					["icon"] = "Interface\\Icons\\Spell_Shaman_BlessingOfEternals",
-				}, -- [64]
-				{
-					["enabled"] = false,
-					["name"] = "Ritual of Summoning",
-					["id"] = 698,
-					["class"] = "WARLOCK",
-					["icon"] = "Interface\\Icons\\Spell_Shadow_Twilight",
-				}, -- [65]
-				{
-					["enabled"] = false,
-					["name"] = "Shattering Throw",
-					["id"] = 64382,
-					["class"] = "WARRIOR",
-					["icon"] = "Interface\\Icons\\Ability_Warrior_ShatteringThrow",
-				}, -- [66]
-				{
-					["enabled"] = false,
-					["name"] = "Shield Wall",
-					["id"] = 871,
-					["class"] = "WARRIOR",
-					["icon"] = "Interface\\Icons\\Ability_Warrior_ShieldWall",
-				}, -- [67]
-				{
-					["enabled"] = false,
-					["name"] = "Shroud of Concealment",
-					["id"] = 114018,
-					["class"] = "ROGUE",
-					["icon"] = "Interface\\Icons\\ability_rogue_shroudofconcealment",
-				}, -- [68]
-				{
-					["enabled"] = false,
-					["name"] = "Skull Banner",
-					["id"] = 114207,
-					["class"] = "WARRIOR",
-					["icon"] = "Interface\\Icons\\warrior_skullbanner",
-				}, -- [69]
-				{
-					["enabled"] = true,
-					["name"] = "Soulstone",
-					["id"] = 20707,
-					["class"] = "WARLOCK",
-					["icon"] = "Interface\\Icons\\Spell_Shadow_SoulGem",
-				}, -- [70]
-				{
-					["enabled"] = true,
-					["name"] = "Spirit Link Totem",
-					["id"] = 98008,
-					["class"] = "SHAMAN",
-					["icon"] = "Interface\\Icons\\Spell_Shaman_SpiritLink",
-				}, -- [71]
-				{
-					["enabled"] = false,
-					["name"] = "Spirit Shell",
-					["id"] = 109964,
-					["class"] = "PRIEST",
-					["icon"] = "Interface\\Icons\\ability_shaman_astralshift",
-				}, -- [72]
-				{
-					["enabled"] = false,
-					["name"] = "Stoneform",
-					["id"] = 20594,
-					["class"] = "ANY",
-					["icon"] = "Interface\\Icons\\Spell_Shadow_UnholyStrength",
-				}, -- [73]
-				{
-					["enabled"] = false,
-					["name"] = "Strangulate",
-					["id"] = 47476,
-					["class"] = "DEATHKNIGHT",
-					["icon"] = "Interface\\Icons\\Spell_Shadow_SoulLeech_3",
-				}, -- [74]
-				{
-					["enabled"] = false,
-					["name"] = "Summon Water Elemental",
-					["id"] = 31687,
-					["class"] = "MAGE",
-					["icon"] = "Interface\\Icons\\Spell_Frost_SummonWaterElemental_2",
-				}, -- [75]
-				{
-					["enabled"] = false,
-					["name"] = "Survival Instincts",
-					["id"] = 61336,
-					["class"] = "DRUID",
-					["icon"] = "Interface\\Icons\\Ability_Druid_TigersRoar",
-				}, -- [76]
-				{
-					["enabled"] = false,
-					["name"] = "Time Warp",
-					["id"] = 80353,
-					["class"] = "MAGE",
-					["icon"] = "INTERFACE\\ICONS\\ability_mage_timewarp",
-				}, -- [77]
-				{
-					["enabled"] = true,
-					["name"] = "Tranquility",
-					["id"] = 113277,
-					["class"] = "PRIEST",
-					["icon"] = "Interface\\Icons\\Spell_Nature_Tranquility",
-				}, -- [78]
-				{
-					["enabled"] = true,
-					["name"] = "Tranquility",
-					["id"] = 740,
-					["class"] = "DRUID",
-					["icon"] = "Interface\\Icons\\Spell_Nature_Tranquility",
-				}, -- [79]
-				{
-					["enabled"] = false,
-					["name"] = "Tricks of the Trade",
-					["id"] = 57934,
-					["class"] = "ROGUE",
-					["icon"] = "Interface\\Icons\\Ability_Rogue_TricksOftheTrade",
-				}, -- [80]
-				{
-					["enabled"] = false,
-					["name"] = "Vampiric Blood",
-					["id"] = 55233,
-					["class"] = "DEATHKNIGHT",
-					["icon"] = "Interface\\Icons\\Spell_Shadow_LifeDrain",
-				}, -- [81]
-				{
-					["enabled"] = false,
-					["name"] = "Vampiric Embrace",
-					["id"] = 15286,
-					["class"] = "PRIEST",
-					["icon"] = "Interface\\Icons\\Spell_Shadow_UnsummonBuilding",
-				}, -- [82]
-				{
-					["enabled"] = false,
-					["name"] = "Void Shift",
-					["id"] = 108968,
-					["class"] = "PRIEST",
-					["icon"] = "Interface\\Icons\\spell_priest_voidshift",
-				}, -- [83]
-				{
-					["enabled"] = false,
-					["name"] = "Void Tendrils",
-					["id"] = 108920,
-					["class"] = "PRIEST",
-					["icon"] = "Interface\\Icons\\spell_priest_voidtendrils",
-				}, -- [84]
-				{
-					["enabled"] = false,
-					["name"] = "Wind Shear",
-					["id"] = 57994,
-					["class"] = "SHAMAN",
-					["icon"] = "Interface\\Icons\\Spell_Nature_Cyclone",
-				}, -- [85]
-				{
-					["enabled"] = false,
-					["name"] = "Zen Meditation",
-					["id"] = 115176,
-					["class"] = "MONK",
-					["icon"] = "Interface\\Icons\\ability_monk_zenmeditation",
-				}, -- [86]
-			},
-			["items"] = {
-				{
-					["enabled"] = false,
-					["name"] = "Mirror of Broken Images",
-					["id"] = -62466,
-					["class"] = "ANY",
-					["icon"] = "Interface\\Icons\\INV_Misc_Platnumdisks",
-				}, -- [1]
-			},
-			["welcome"] = true,
-			["plugins"] = {
-				["Hermes-UI"] = {
-					["views"] = {
-						{
-							["module"] = "GridButtons",
-							["filterrange"] = false,
-							["filter10man"] = true,
-							["filterself"] = false,
-							["enabled"] = true,
-							["profiles"] = {
-								["GridBars"] = {
-									["barShowTime"] = true,
-									["npCCFont"] = true,
-									["barShowPlayerName"] = true,
-									["h"] = 838.6666870117188,
-									["hideNoAvailSender"] = false,
-									["barColorC"] = {
-										["a"] = 0.74,
-										["r"] = 0.55,
-										["g"] = 0.55,
-										["b"] = 0.55,
-									},
-									["locked"] = false,
-									["barFont"] = "Friz Quadrata TT",
-									["barBGColorU"] = {
-										["a"] = 0.16,
-										["r"] = 0,
-										["g"] = 0,
-										["b"] = 0,
-									},
-									["hideNoSender"] = true,
-									["barTexture"] = "Blizzard",
-									["osCooldownStyle"] = "empty",
-									["barColorU"] = {
-										["a"] = 0.23,
-										["r"] = 0,
-										["g"] = 0,
-										["b"] = 0,
-									},
-									["y"] = 1175.333374023438,
-									["x"] = 7.833518028259277,
-									["barPadding"] = 1,
-									["scale"] = 1,
-									["npTexture"] = "Blizzard",
-									["barCooldownDirection"] = "right",
-									["barThickFont"] = false,
-									["barBGCCU"] = false,
-									["barColorCFont"] = {
-										["a"] = 1,
-										["r"] = 1,
-										["g"] = 1,
-										["b"] = 1,
-									},
-									["barCCAFont"] = false,
-									["barTextRatio"] = 65,
-									["cellAnchor"] = "TOPLEFT",
-									["padding"] = 0,
-									["barW"] = 150,
-									["barIcon"] = "left",
-									["npShowLabel"] = true,
-									["barCCA"] = true,
-									["barIconMerged"] = "left",
-									["osFGColor"] = {
-										["a"] = 1,
-										["r"] = 0,
-										["g"] = 1,
-										["b"] = 0,
-									},
-									["barColorUFont"] = {
-										["a"] = 0.3,
-										["r"] = 1,
-										["g"] = 1,
-										["b"] = 1,
-									},
-									["barCooldownStyle"] = "empty",
-									["barBGColorC"] = {
-										["a"] = 0.16,
-										["r"] = 0,
-										["g"] = 0,
-										["b"] = 0,
-									},
-									["osCooldownDirection"] = "right",
-									["npThickFont"] = false,
-									["barColorA"] = {
-										["a"] = 1,
-										["r"] = 0.94,
-										["g"] = 0.94,
-										["b"] = 0.94,
-									},
-									["npFontColor"] = {
-										["a"] = 0.76,
-										["r"] = 0.92,
-										["g"] = 0.92,
-										["b"] = 0.92,
-									},
-									["barCCU"] = false,
-									["barCCC"] = true,
-									["npUseNameplate"] = true,
-									["barCCCFont"] = true,
-									["cellSide"] = false,
-									["npFont"] = "Friz Quadrata TT",
-									["w"] = 158.6666564941406,
-									["barTextSide"] = "left",
-									["barCCUFont"] = false,
-									["npOutlineFont"] = true,
-									["osEnabled"] = false,
-									["cellDir"] = false,
-									["barShowSpellName"] = false,
-									["barFontSize"] = 12,
-									["barH"] = 14,
-									["enableTooltip"] = true,
-									["barGap"] = 2,
-									["npCCBar"] = false,
-									["npW"] = 120,
-									["merged"] = false,
-									["npUseIcon"] = true,
-									["barColorAFont"] = {
-										["a"] = 1,
-										["r"] = 0.94,
-										["g"] = 0.94,
-										["b"] = 0.94,
-									},
-									["barBGCCC"] = true,
-									["npIcon"] = "right",
-									["cellMax"] = 3,
-									["npFontSize"] = 12,
-									["npTexColor"] = {
-										["a"] = 0.5,
-										["r"] = 0,
-										["g"] = 0,
-										["b"] = 0,
-									},
-									["npH"] = 15,
-									["cellBGColor"] = {
-										["a"] = 0,
-										["r"] = 0,
-										["g"] = 0,
-										["b"] = 0,
-									},
-									["npTextSide"] = "right",
-									["barOutlineFont"] = true,
-								},
-								["GridButtons"] = {
-								["scale"] = 1,
-								["hideNoSender"] = true,
-								["merged"] = false,
-								["coloredBorders"] = true,
-								["w"] = 78.49994614504892,
-								["mergedicon"] = "Interface\\ICONS\\INV_Misc_QuestionMark",
-								["y"] = 1040.833318755454,
-								["h"] = 621.6666788167995,
-								["locked"] = true,
-								["cellAnchor"] = "TOPLEFT",
-								["colorNS"] = {
-									["a"] = 0.75,
-									["r"] = 0.5,
-									["g"] = 0.5,
-									["b"] = 0.5,
-								},
-								["padding"] = 5,
-								["x"] = 3.333442160227062,
-								["colorU"] = {
-									["a"] = 1,
-									["r"] = 0.5,
-									["g"] = 0.5,
-									["b"] = 0.5,
-								},
-							},
-							["CooldownBars"] = {
-								["barheight"] = 14,
-								["scale"] = 1,
-								["barTextSide"] = "left",
-								["fontsize"] = 12,
-								["locked"] = false,
-								["barCooldownDirection"] = "right",
-								["hideSelf"] = false,
-								["textratio"] = 60,
-								["osFGColor"] = {
-									["a"] = 1,
-									["r"] = 0,
-									["g"] = 1,
-									["b"] = 0,
-								},
-								["barwidth"] = 180,
-								["bartexture"] = "Blizzard",
-								["growup"] = false,
-								["osCooldownDirection"] = "right",
-								["alpha"] = 1,
-								["barIcon"] = "left",
-								["y"] = 1022.333312988281,
-								["font"] = "Friz Quadrata TT",
-								["barCooldownStyle"] = "full",
-								["osEnabled"] = false,
-								["osCooldownStyle"] = "full",
-								["barShowSpellName"] = false,
-								["x"] = 71.66675567626953,
-								["barGap"] = 1,
-							},
-							["Bars"] = {
-								["barIcon"] = "none",
-								["npCCFont"] = true,
-								["barW"] = 150,
-								["barTextSide"] = "left",
-								["barShowPlayerName"] = true,
-								["barBGColorC"] = {
-									["a"] = 0.16,
-									["r"] = 0,
-									["g"] = 0,
-									["b"] = 0,
-								},
-								["barFontSize"] = 12,
-								["locked"] = false,
-								["barCCCFont"] = true,
-								["barColorC"] = {
-									["a"] = 0.74,
-									["r"] = 0.55,
-									["g"] = 0.55,
-									["b"] = 0.55,
-								},
-								["barCCA"] = true,
-								["barTextRatio"] = 65,
-								["barLocation"] = "BOTTOM",
-								["barCCC"] = true,
-								["barColorAFont"] = {
-									["a"] = 1,
-									["r"] = 0.94,
-									["g"] = 0.94,
-									["b"] = 0.94,
-								},
-								["osFGColor"] = {
-									["a"] = 1,
-									["r"] = 0,
-									["g"] = 1,
-									["b"] = 0,
-								},
-								["barBGColorU"] = {
-									["a"] = 0.16,
-									["r"] = 0,
-									["g"] = 0,
-									["b"] = 0,
-								},
-								["hideNoSender"] = true,
-								["barColorCFont"] = {
-									["a"] = 1,
-									["r"] = 1,
-									["g"] = 1,
-									["b"] = 1,
-								},
-								["barColorUFont"] = {
-									["a"] = 0.3,
-									["r"] = 1,
-									["g"] = 1,
-									["b"] = 1,
-								},
-								["osCooldownStyle"] = "empty",
-								["barColorU"] = {
-									["a"] = 0.23,
-									["r"] = 0,
-									["g"] = 0,
-									["b"] = 0,
-								},
-								["y"] = 609,
-								["x"] = 1016.666687011719,
-								["barCooldownStyle"] = "empty",
-								["npShowLabel"] = true,
-								["scale"] = 1,
-								["barPadding"] = 10,
-								["npThickFont"] = false,
-								["npUseNameplate"] = true,
-								["npFontColor"] = {
-									["a"] = 0.76,
-									["r"] = 0.92,
-									["g"] = 0.92,
-									["b"] = 0.92,
-								},
-								["barCCU"] = false,
-								["npOutlineFont"] = true,
-								["barBGCCU"] = false,
-								["npFontSize"] = 12,
-								["barShowTime"] = true,
-								["npFont"] = "Friz Quadrata TT",
-								["osCooldownDirection"] = "right",
-								["npTextSide"] = "right",
-								["barCCUFont"] = false,
-								["barH"] = 14,
-								["barThickFont"] = false,
-								["npTexture"] = "Blizzard",
-								["barIconMerged"] = "left",
-								["barCooldownDirection"] = "right",
-								["npIcon"] = "right",
-								["barShowSpellName"] = false,
-								["barGap"] = 1,
-								["npCCBar"] = false,
-								["npH"] = 15,
-								["merged"] = false,
-								["npUseIcon"] = true,
-								["barColorA"] = {
-									["a"] = 1,
-									["r"] = 0.94,
-									["g"] = 0.94,
-									["b"] = 0.94,
-								},
-								["barBGCCC"] = true,
-								["barCCAFont"] = false,
-								["growUp"] = false,
-								["osEnabled"] = false,
-								["barFont"] = "Friz Quadrata TT",
-								["npW"] = 120,
-								["npTexColor"] = {
-									["a"] = 0.5,
-									["r"] = 0,
-									["g"] = 0,
-									["b"] = 0,
-								},
-								["barTexture"] = "Blizzard",
-								["barOutlineFont"] = true,
-							},
-						},
-						["includeAll"] = true,
-						["filterdead"] = true,
-						["name"] = "Default",
-						["filterconnection"] = true,
-						["filterplayertype"] = "disabled",
-						["playerfilters"] = {
-						},
-						["filter25man"] = true,
-						["abilities"] = {
-							{
-								["id"] = 61999,
-								["enabled"] = false,
-							}, -- [1]
-							{
-								["id"] = 46584,
-								["enabled"] = false,
-							}, -- [2]
-							{
-								["id"] = 20484,
-								["enabled"] = false,
-							}, -- [3]
-							{
-								["id"] = 740,
-								["enabled"] = false,
-							}, -- [4]
-							{
-								["id"] = 115310,
-								["enabled"] = false,
-							}, -- [5]
-							{
-								["id"] = 31821,
-								["enabled"] = false,
-							}, -- [6]
-							{
-								["id"] = 64843,
-								["enabled"] = false,
-							}, -- [7]
-							{
-								["id"] = 64901,
-								["enabled"] = false,
-							}, -- [8]
-							{
-								["id"] = 62618,
-								["enabled"] = false,
-							}, -- [9]
-							{
-								["id"] = 113277,
-								["enabled"] = false,
-							}, -- [10]
-							{
-								["id"] = 16190,
-								["enabled"] = false,
-							}, -- [11]
-							{
-								["id"] = 108280,
-								["enabled"] = false,
-							}, -- [12]
-							{
-								["id"] = 98008,
-								["enabled"] = false,
-							}, -- [13]
-							{
-								["id"] = 20707,
-								["enabled"] = false,
-							}, -- [14]
-							{
-								["id"] = 97462,
-								["enabled"] = false,
-							}, -- [15]
-							{
-								["id"] = 115176,
-								["enabled"] = false,
-							}, -- [16]
-							{
-								["id"] = 116849,
-								["enabled"] = false,
-							}, -- [17]
-						},
-					}, -- [1]
-				},
-			},
-		},
-		["enableparty"] = true,
-	}
-end
-
-	if profile == "Repooc" then
-		-- No Settings
-	end
-
-	if profile == "Darth" then
-		-- No Settings
-	end
-
-	return database
-end
-
--- register the profile with the engine
-AI:RegisterAddonProfile(name, ace3, dbname, OnDemand)
\ No newline at end of file
diff --git a/ElvUI_SLE/core/installer/Skada.lua b/ElvUI_SLE/core/installer/Skada.lua
deleted file mode 100644
index e94a1b7..0000000
--- a/ElvUI_SLE/core/installer/Skada.lua
+++ /dev/null
@@ -1,160 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local AI = E:GetModule('SLE_AddonInstaller')
-
-local ace3   = true               -- whether or not this database is a Ace3 profile
-local name   = 'Skada'             -- the name of the addon
-local dbname = 'SkadaDB'       -- name of the addon database
-
-local function OnDemand(profile)  -- function that creates the "load on demand" database
-	local database
-	if profile == "Affinitii" then
-		database = {
-			["windows"] = {
-				{
-					["barheight"] = 17,
-					["barslocked"] = true,
-					["background"] = {
-						["height"] = 133.6666717529297,
-						["color"] = {
-							["a"] = 0.2000000476837158,
-							["b"] = 0,
-						},
-					},
-					["hidden"] = true,
-					["y"] = 39.89817468303028,
-					["x"] = -7.334928625263729,
-					["title"] = {
-						["color"] = {
-							["a"] = 1,
-							["b"] = 0,
-							["g"] = 0,
-							["r"] = 0,
-						},
-						["font"] = "PT Sans Narrow",
-						["fontsize"] = 15,
-					},
-					["point"] = "BOTTOMRIGHT",
-					["barbgcolor"] = {
-						["a"] = 1,
-						["b"] = 0.3019607843137255,
-						["g"] = 0.3019607843137255,
-						["r"] = 0.3019607843137255,
-					},
-					["barcolor"] = {
-						["g"] = 0.3019607843137255,
-						["r"] = 0.3019607843137255,
-					},
-					["name"] = "HPS",
-					["spark"] = false,
-					["bartexture"] = "Polished Wood",
-					["barwidth"] = 199.0832316080729,
-					["barfontsize"] = 12,
-					["mode"] = "Damage",
-					["barfont"] = "PT Sans Narrow",
-				}, -- [1]
-				{
-					["barheight"] = 17,
-					["classicons"] = true,
-					["barslocked"] = true,
-					["clickthrough"] = false,
-					["wipemode"] = "",
-					["set"] = "current",
-					["hidden"] = true,
-					["y"] = 39.89824908834681,
-					["barfont"] = "PT Sans Narrow",
-					["name"] = "DPS",
-					["display"] = "bar",
-					["barfontflags"] = "",
-					["classcolortext"] = false,
-					["scale"] = 1,
-					["reversegrowth"] = false,
-					["barfontsize"] = 12,
-					["barorientation"] = 1,
-					["snapto"] = true,
-					["point"] = "BOTTOMRIGHT",
-					["x"] = -214.2783479639852,
-					["spark"] = false,
-					["bartexture"] = "Polished Wood",
-					["barwidth"] = 199.0832316080729,
-					["barspacing"] = 0,
-					["barbgcolor"] = {
-						["a"] = 1,
-						["b"] = 0.3019607843137255,
-						["g"] = 0.3019607843137255,
-						["r"] = 0.3019607843137255,
-					},
-					["returnaftercombat"] = false,
-					["barcolor"] = {
-						["a"] = 1,
-						["b"] = 0.8,
-						["g"] = 0.3019607843137255,
-						["r"] = 0.3019607843137255,
-					},
-					["mode"] = "Healing",
-					["enabletitle"] = true,
-					["classcolorbars"] = true,
-					["modeincombat"] = "",
-					["title"] = {
-						["borderthickness"] = 2,
-						["font"] = "PT Sans Narrow",
-						["fontsize"] = 15,
-						["fontflags"] = "",
-						["color"] = {
-							["a"] = 1,
-							["b"] = 0,
-							["g"] = 0,
-							["r"] = 0,
-						},
-						["bordertexture"] = "None",
-						["margin"] = 0,
-						["texture"] = "Aluminium",
-					},
-					["buttons"] = {
-						["segment"] = true,
-						["menu"] = true,
-						["mode"] = true,
-						["report"] = true,
-						["reset"] = true,
-					},
-					["background"] = {
-						["borderthickness"] = 0,
-						["height"] = 133.6666717529297,
-						["color"] = {
-							["a"] = 0.2000000476837158,
-							["b"] = 0,
-							["g"] = 0,
-							["r"] = 0,
-						},
-						["bordertexture"] = "None",
-						["margin"] = 0,
-						["texture"] = "Solid",
-					},
-				}, -- [2]
-			},
-			["report"] = {
-				["number"] = 12,
-				["chantype"] = "whisper",
-				["channel"] = "whisper",
-				["target"] = "Affinitii",
-				["mode"] = "Riggimon's Death",
-			},
-			["icon"] = {
-				["minimapPos"] = 160.4361246854299,
-				["hide"] = true,
-			},
-		}
-	end
-
-	if profile == "Repooc" then
-		-- No Settings
-	end
-
-	if profile == "Darth" then
-
-	end
-
-	return database
-end
-
--- register the profile with the engine
-AI:RegisterAddonProfile(name, ace3, dbname, OnDemand)
\ No newline at end of file
diff --git a/ElvUI_SLE/core/installer/installer.lua b/ElvUI_SLE/core/installer/installer.lua
deleted file mode 100644
index c8b7fbf..0000000
--- a/ElvUI_SLE/core/installer/installer.lua
+++ /dev/null
@@ -1,153 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local AI = E:GetModule('SLE_AddonInstaller')
-
--- Upvalue for performance
-local pairs, string, table, unpack, _G = pairs, string, table, unpack, _G
-local string_find, string_format, string_gsub, string_sub, table_insert, table_remove
-  = string.find, string.format, string.gsub, string.sub, table.insert, table.remove
-
--- A local database of addons
-AI.addons = { }
-AI.MyProfileKey = string_format('%s - %s', UnitName('player'), GetRealmName() )
-AI.MyProfileName = "Shadow and Light"
-
--- Let's put all the RegEx stuff here
-local regex_trim  = '^%s*(.-)%s*$'
-local regex_match = '([ A-Za-z0-9_+*\\-]+)%s?,'
-
---[==[
-  AddonInstaller:RegisterAddonProfile(name, ace3, dbname, onDemand)
-
-  input:  (*optional)
-
-    name        [string]
-        The name name of the addon to use in the Command Args when enabling.
-
-    ace3        [boolean]
-        Indicator whether to treat this entry as an Ace3 compatible profile,
-      or just some random entries into an addon's database.
-
-    dbname      [string]
-        The name of the addon's database (e.g. 'ElvCharacterDB')
-
-    onDemand    [function]
-        The function that will generate the "load on demand" profile.
-
-  description:
-      This function allows addon modules to register themselves so that they can get
-    loaded when the user installs this UI.
-
-  returns:
-    nil
-]==]
-function AI:RegisterAddonProfile(name, ace3, dbname, onDemand)
-	if not self.addons[name] then self.addons[name] = { } end
-	table_insert(self.addons[name], { OnDemand = onDemand, dbname = dbname, ace3 = ace3 })
-end
-
--- A private function that loads a specific addon database entry
-local function LoadAddon(entry, profileName)
-	local ADDON_DB = _G[entry.dbname]
-	local myDB = entry.OnDemand(profileName)
-
-	if ADDON_DB and myDB then
-		if entry.ace3 then
-			-- Profile will be: "Shadow and Light (Affinitii)"
-			local profile = string_format('%s (%s)', AI.MyProfileName, profileName)
-
-			-- If the addon is loaded AND the profile is Ace3, lets load it
-			ADDON_DB.profiles[profile] = myDB                    -- Insert our new profile
-
-			-- Set the profile as the default for this toon
-			ADDON_DB.profileKeys[AI.MyProfileKey] = profile
-		else
-			for key, value in pairs(myDB) do
-				ADDON_DB[key] = value
-			end
-		end
-	end
-end
-
---[==[
-  AddonInstaller:LoadAddons(args)
-
-  input: (*optional)
-    args  [string]
-        This is a comma separated list, where the first value is the profile that you
-      want to load. The second arg can be "All" for all addons or the second and
-      following args can list the addons one at a time.
-
-        examples:
-
-        1.  args = "Repooc, All"
-
-            Loads all addons with the profile name "Repooc"
-
-        2.  args = "Darth, Hermes, xCT+,"
-
-            Loads Hermes and xCT+ addons with the profile name "Darth"
-
-  description:
-      This function was create to allow the loading of external addons profiles when a
-    UI is installed.
-
-  returns:
-    nil
-]==]
-
-function AI:LoadAddons(args)
-	-- This section of code parses the args
-	local ListArgs = { }
-
-	-- Trim the text (remove spaces), placed a nil check inside
-	args = string_gsub(args or '', regex_trim, '%1')
-
-	-- Add a comma onto the end
-	if string_sub(args, #args) ~= ',' then
-		args = args .. ','
-	end
-
-	local i, j = 0, 0
-	while i do
-		i, j = string_find(args, regex_match, j)    -- find all patterns that match 'Arg_1 Test+,'
-		if i then
-			-- Get the current pattern [ sub(index, length-1 ], trim all the spaces, and add it to the list of args
-			local arg = string_gsub(string_sub(args, i, j-1), regex_trim, '%1')
-			table_insert(ListArgs, arg)
-		end
-	end
-	-- Args parsing completed!
-
-	--[==[
-	-- DEBUG: See what args I have :)
-	for i, v in pairs(ListArgs) do
-		print(i,'=',v)
-	end
-	]==]
-
-	-- Get the profile name and see if we are loading All addons
-	local profileName, LOAD_ALL = ( ListArgs[1] or 'default' ), ( ListArgs[2] == 'All' )
-	table_remove(ListArgs, 1)  -- Remove the profile name, all we have left in the list are addons to load :)
-
-	if LOAD_ALL then -- Load all the addons
-		for name, entryList in pairs(self.addons) do      -- Just load all the addons for this profile
-			for _, entry in pairs(entryList) do             -- Loop through all the entries (could be multiple, like bigwigs)
-				LoadAddon(entry, profileName)
-			end
-		end
-	else  -- Load a specific set of addons
-		for _, name in pairs(ListArgs) do                 -- we need to figure out which addons to load
-			local entryList = self.addons[name]
-			for _, entry in pairs(entryList) do
-				-- Check for addon name
-				if entry then
-					for _, entry in pairs(entryList) do           -- Loop through all the entries
-						LoadAddon(entry, profileName)
-					end
-				else
-					E:Print("  |cffFF0000ERROR:|r No Addon named '"..name.."' was found in the SLE addon configs.")
-				end
-			end
-		end
-	end
-end
\ No newline at end of file
diff --git a/ElvUI_SLE/core/installer/load_install.xml b/ElvUI_SLE/core/installer/load_install.xml
deleted file mode 100644
index 9c61b11..0000000
--- a/ElvUI_SLE/core/installer/load_install.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-<Ui xmlns="http://www.blizzard.com/wow/ui/">
-	<Script file='installer.lua'/>
-	<Script file='install.lua'/>
-	<Script file='BigWigs.lua'/>
-	<Script file='BigWigsFights.lua'/>
-	<Script file='BigWigsIcon.lua'/>
-	<Script file='Clique.lua'/>
-	<Script file='Hermes.lua'/>
-	<Script file='Skada.lua'/>
-	<Script file='xCT+.lua'/>
-</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/core/installer/xCT+.lua b/ElvUI_SLE/core/installer/xCT+.lua
deleted file mode 100644
index ae5a0e6..0000000
--- a/ElvUI_SLE/core/installer/xCT+.lua
+++ /dev/null
@@ -1,215 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local AI = E:GetModule('SLE_AddonInstaller')
-
-local ace3   = true               -- whether or not this database is a Ace3 profile
-local name   = 'xCT+'             -- the name of the addon
-local dbname = 'xCTSavedDB'       -- name of the addon database
-
-local function OnDemand(profile)  -- function that creates the "load on demand" database
-	local database
-	if profile == "Affinitii" then
-		database = {
-			["blizzardFCT"] = {
-				["font"] = "KGSmallTownSouthernGirl",
-			},
-			["spells"] = {
-				["mergeCriticalsByThemselves"] = true,
-				["mergeDontMergeCriticals"] = false,
-			},
-			["frames"] = {
-				["general"] = {
-					["showBuffs"] = false,
-					["fontOutline"] = "2OUTLINE",
-					["Width"] = 510,
-					["font"] = "KGSmallTownSouthernGirl",
-					["enabledFrame"] = false,
-					["Height"] = 127,
-				},
-				["power"] = {
-					["enabledFrame"] = false,
-					["fontOutline"] = "2OUTLINE",
-					["Width"] = 255,
-					["font"] = "KGSmallTownSouthernGirl",
-				},
-				["healing"] = {
-					["enabledFrame"] = false,
-					["Width"] = 382,
-					["Y"] = 89,
-					["font"] = "KGSmallTownSouthernGirl",
-					["Height"] = 143,
-					["fontOutline"] = "2OUTLINE",
-					["X"] = -319,
-				},
-				["outgoing"] = {
-					["fontSize"] = 17,
-					["fontOutline"] = "2OUTLINE",
-					["enableScrollable"] = true,
-					["Width"] = 149,
-					["Y"] = -61,
-					["X"] = 901,
-					["iconsSize"] = 17,
-					["font"] = "KGSmallTownSouthernGirl",
-				},
-				["critical"] = {
-					["fontSize"] = 17,
-					["iconsSize"] = 19,
-					["fontOutline"] = "2OUTLINE",
-					["Width"] = 149,
-					["Y"] = 102,
-					["font"] = "KGSmallTownSouthernGirl",
-					["Height"] = 126,
-					["X"] = 901,
-				},
-				["procs"] = {
-					["enabledFrame"] = false,
-					["enableScrollable"] = true,
-					["Y"] = 101,
-					["X"] = 1,
-					["Height"] = 127,
-					["font"] = "KGSmallTownSouthernGirl",
-					["fontOutline"] = "2OUTLINE",
-				},
-				["loot"] = {
-					["fontOutline"] = "2OUTLINE",
-					["Width"] = 510,
-					["Y"] = -223,
-					["font"] = "KGSmallTownSouthernGirl",
-					["Height"] = 126,
-				},
-				["class"] = {
-					["fontOutline"] = "2OUTLINE",
-					["font"] = "KGSmallTownSouthernGirl",
-					["enabledFrame"] = false,
-				},
-				["damage"] = {
-					["fontSize"] = 17,
-					["X"] = 201,
-					["Width"] = 133,
-					["Y"] = -32,
-					["font"] = "KGSmallTownSouthernGirl",
-					["Height"] = 170,
-					["fontOutline"] = "2OUTLINE",
-				},
-			},
-		}
-	end
-
-	if profile == "Repooc" then
-		-- No Settings
-	end
-
-	if profile == "Darth" then
-		database = {
-			["megaDamage"] = {
-				["millionSymbol"] = "|cffFF0000м|r",
-				["thousandSymbol"] = "|cffFF8000к|r",
-			},
-			["frames"] = {
-				["general"] = {
-					["fontSize"] = 14,
-					["showBuffs"] = false,
-					["fontOutline"] = "2OUTLINE",
-					["showPartyKills"] = false,
-					["enableCustomFade"] = true,
-					["showDebuffs"] = false,
-					["font"] = "PT Sans Narrow",
-				},
-				["power"] = {
-					["fontOutline"] = "2OUTLINE",
-					["Width"] = 165,
-					["font"] = "PT Sans Narrow",
-					["enabledFrame"] = false,
-					["enableCustomFade"] = true,
-					["fontSize"] = 16,
-					["Y"] = 60,
-					["X"] = 5,
-					["Height"] = 155,
-				},
-				["healing"] = {
-					["fontSize"] = 16,
-					["megaDamage"] = true,
-					["showFriendlyHealers"] = false,
-					["fontOutline"] = "2OUTLINE",
-					["insertText"] = "top",
-					["enableCustomFade"] = true,
-					["Width"] = 112,
-					["Y"] = -306,
-					["X"] = -356,
-					["Height"] = 160,
-					["font"] = "PT Sans Narrow",
-				},
-				["outgoing"] = {
-					["fontSize"] = 16,
-					["megaDamage"] = true,
-					["fontOutline"] = "2OUTLINE",
-					["insertText"] = "top",
-					["enableCustomFade"] = true,
-					["Width"] = 119,
-					["Y"] = -317,
-					["font"] = "PT Sans Narrow",
-					["Height"] = 160,
-					["iconsSize"] = 10,
-					["X"] = 248,
-				},
-				["critical"] = {
-					["fontSize"] = 20,
-					["megaDamage"] = true,
-					["iconsSize"] = 14,
-					["fontOutline"] = "2OUTLINE",
-					["insertText"] = "top",
-					["enableCustomFade"] = true,
-					["Width"] = 171,
-					["Y"] = -306,
-					["font"] = "PT Sans Narrow",
-					["Height"] = 138,
-					["X"] = 391,
-				},
-				["procs"] = {
-					["enabledFrame"] = false,
-					["enableCustomFade"] = true,
-					["Width"] = 254,
-					["Y"] = -63,
-					["Height"] = 126,
-				},
-				["loot"] = {
-					["fontSize"] = 12,
-					["filterItemQuality"] = 2,
-					["X"] = -2,
-					["fontOutline"] = "2OUTLINE",
-					["visibilityTime"] = 2,
-					["enableCustomFade"] = true,
-					["fadeTime"] = 0.2,
-					["Width"] = 287,
-					["Y"] = 9,
-					["font"] = "PT Sans Narrow",
-					["showItemTypes"] = false,
-					["Height"] = 126,
-				},
-				["class"] = {
-					["enabledFrame"] = false,
-				},
-				["damage"] = {
-					["fontSize"] = 16,
-					["megaDamage"] = true,
-					["fontOutline"] = "2OUTLINE",
-					["font"] = "PT Sans Narrow",
-					["enableCustomFade"] = true,
-					["Width"] = 110,
-					["Y"] = -306,
-					["X"] = -246,
-					["Height"] = 160,
-				},
-			},
-			["showStartupText"] = false,
-			["frameSettings"] = {
-				["clearLeavingCombat"] = true,
-			},
-
-		}
-	end
-
-	return database
-end
-
--- register the profile with the engine
-AI:RegisterAddonProfile(name, ace3, dbname, OnDemand)
\ No newline at end of file
diff --git a/ElvUI_SLE/core/load_core.xml b/ElvUI_SLE/core/load_core.xml
index d6645c1..cc86576 100644
--- a/ElvUI_SLE/core/load_core.xml
+++ b/ElvUI_SLE/core/load_core.xml
@@ -1 +1 @@
-<Ui xmlns="http://www.blizzard.com/wow/ui/">
	<Script file='modules.lua'/>
	<Script file='globals.lua'/>
	<Script file='core.lua'/>
	<Script file='media.lua'/>
	<Script file='toolkit.lua'/>
	<Script file='communicate.lua'/>
	<Script file='staticpopups.lua'/>
	<Script file='install.lua'/>
	<Include file='installer\load_install.xml'/>
	<Script file='elvprot.lua'/>
	<Script file='test.lua'/>
</Ui>
\ No newline at end of file
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
	<Script file='core.lua'/>
	<Script file='globals.lua'/>
	<Script file='toolkit.lua'/>
	<Script file='dropdown.lua'/>
	<Script file='toolsRu.lua'/>
	<Script file='gameMenu.lua'/>
	<Script file='media.lua'/>
	<Script file='communicate.lua'/>
	<Script file='install.lua'/>
	<Script file='staticpopups.lua'/>
	<Include file='installer\load_install.xml'/>
	<Script file='test.lua'/>
</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/core/media.lua b/ElvUI_SLE/core/media.lua
index 23cced1..f6d5985 100644
--- a/ElvUI_SLE/core/media.lua
+++ b/ElvUI_SLE/core/media.lua
@@ -1,44 +1,14 @@
-local E, L, V, P, G = unpack(ElvUI);
-local M = E:GetModule('SLE_Media')
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local M = SLE:NewModule('Media', 'AceHook-3.0')
 local LSM = LibStub("LibSharedMedia-3.0")
+--GLOBALS: hooksecurefunc
+local _G = _G
+local FadingFrame_Show = FadingFrame_Show

-local Zones = {
-	"Washington",
-	"Moscow",
-	"Moon Base",
-	"Goblin Spa Resort",
-	"Illuminaty Headquaters",
-	"Elv's Closet",
-	"Pat's Cage",
-}
-
-local PvPInfo = {
-	"(Horde Territory)",
-	"(Alliance Territory)",
-	"(Contested Territory)",
-	"(Russian Territory)",
-	"(Aliens Territory)",
-	"(Cats Territory)",
-	"(Japanese Territory)",
-	"(EA Territory)",
-}
-
-local Subzones = {
-	"Administration",
-	"Hellhole",
-	"Alley of Bullshit",
-	"Dr. Pepper Storage",
-	"Vodka Storage",
-	"Last National Bank",
-}
-
-local PVPArena = {
-	"(PvP)",
-	"No Smoking!",
-	"Only 5% Taxes",
-	"Free For All",
-	"Self destruction is in process",
-}
+M.Zones = L["SLE_MEDIA_ZONES"]
+M.PvPInfo = L["SLE_MEDIA_PVP"]
+M.Subzones = L["SLE_MEDIA_SUBZONES"]
+M.PVPArena = L["SLE_MEDIA_PVPARENA"]

 local Colors = {
 	[1] = {0.41, 0.8, 0.94}, -- sanctuary
@@ -48,59 +18,94 @@ local Colors = {
 	[5] = {1.0, 0.9294, 0.7607}, --white
 }

+local ClassColor = RAID_CLASS_COLORS[E.myclass]
+
 local function ZoneTextPos()
-	if ( PVPInfoTextString:GetText() == "" ) then
-		SubZoneTextString:SetPoint("TOP", "ZoneTextString", "BOTTOM", 0, -E.db.sle.media.fonts.subzone.offset);
+	if ( _G["PVPInfoTextString"]:GetText() == "" ) then
+		_G["SubZoneTextString"]:SetPoint("TOP", "ZoneTextString", "BOTTOM", 0, -E.db.sle.media.fonts.subzone.offset);
 	else
-		SubZoneTextString:SetPoint("TOP", "PVPInfoTextString", "BOTTOM", 0, -E.db.sle.media.fonts.subzone.offset);
+		_G["SubZoneTextString"]:SetPoint("TOP", "PVPInfoTextString", "BOTTOM", 0, -E.db.sle.media.fonts.subzone.offset);
 	end
 end

-local function SetFonts()
+local function MakeFont(obj, font, size, style, r, g, b, sr, sg, sb, sox, soy)
+	obj:SetFont(font, size, style)
+	if sr and sg and sb then obj:SetShadowColor(sr, sg, sb) end
+	if sox and soy then obj:SetShadowOffset(sox, soy) end
+	if r and g and b then obj:SetTextColor(r, g, b)
+	elseif r then obj:SetAlpha(r) end
+end
+
+function M:SetBlizzFonts()
 	if E.private.general.replaceBlizzFonts then
 		local db = E.db.sle.media.fonts
+	-- print(E.db.sle.media, db)
+		_G["ZoneTextString"]:SetFont(LSM:Fetch('font', db.zone.font), db.zone.size, db.zone.outline) -- Main zone name
+		_G["PVPInfoTextString"]:SetFont(LSM:Fetch('font', db.pvp.font), db.pvp.size, db.pvp.outline) -- PvP status for main zone
+		_G["PVPArenaTextString"]:SetFont(LSM:Fetch('font', db.pvp.font), db.pvp.size, db.pvp.outline) -- PvP status for subzone
+		_G["SubZoneTextString"]:SetFont(LSM:Fetch('font', db.subzone.font), db.subzone.size, db.subzone.outline) -- Subzone name

-		ZoneTextString:SetFont(LSM:Fetch('font', db.zone.font), db.zone.size, db.zone.outline) -- Main zone name
-		PVPInfoTextString:SetFont(LSM:Fetch('font', db.pvp.font), db.pvp.size, db.pvp.outline) -- PvP status for main zone
-		PVPArenaTextString:SetFont(LSM:Fetch('font', db.pvp.font), db.pvp.size, db.pvp.outline) -- PvP status for subzone
-		SubZoneTextString:SetFont(LSM:Fetch('font', db.subzone.font), db.subzone.size, db.subzone.outline) -- Subzone name
-
-		SendMailBodyEditBox:SetFont(LSM:Fetch('font', db.mail.font), db.mail.size, db.mail.outline) --Writing letter text
-		OpenMailBodyText:SetFont(LSM:Fetch('font', db.mail.font), db.mail.size, db.mail.outline) --Received letter text
-		QuestFont:SetFont(LSM:Fetch('font', db.gossip.font), db.gossip.size, db.gossip.outline) -- Font in Quest Log/Petitions and shit. It's fucking hedious with any outline so fuck it.
-		--QuestFont_Large:SetFont(LSM:Fetch('font', "ElvUI Pixel"), 12, "") -- No idea what that is for
-		NumberFont_Shadow_Med:SetFont(LSM:Fetch('font', db.editbox.font), db.editbox.size, db.editbox.outline) --Chat editbox
+		_G["SendMailBodyEditBox"]:SetFont(LSM:Fetch('font', db.mail.font), db.mail.size, db.mail.outline) --Writing letter text
+		_G["OpenMailBodyText"]:SetFont(LSM:Fetch('font', db.mail.font), db.mail.size, db.mail.outline) --Received letter text
+		_G["QuestFont"]:SetFont(LSM:Fetch('font', db.gossip.font), db.gossip.size, db.gossip.outline) -- Font in Quest Log/Petitions and shit. It's fucking hedious with any outline so fuck it.
+		--QuestFont_Large:SetFont(LSM:Fetch('font', "Homespun"), 12, "") -- No idea what that is for
+		_G["NumberFont_Shadow_Med"]:SetFont(LSM:Fetch('font', db.editbox.font), db.editbox.size, db.editbox.outline) --Chat editbox
+		--Objective Frame
+		if SLE._Compatibility["QuestKing"] and E.private.sle.skins.QuestKing.enable then
+			_G["QuestKing"]:UpdateTrackerQuests()
+			_G["QuestKing"]:UpdateTrackerAchievements()
+		end
+		if not SLE._Compatibility["ElvUI_MerathilisUI"] or (SLE._Compatibility["ElvUI_MerathilisUI"] and not E.private.muiSkins.blizzard.objectivetracker) then
+			local COLOR
+			if E.db.sle.skins.objectiveTracker.classHeader then
+				COLOR = ClassColor
+			else
+				COLOR = E.db.sle.skins.objectiveTracker.colorHeader
+			end
+			_G["ObjectiveTrackerFrame"].HeaderMenu.Title:SetFont(LSM:Fetch('font', db.objectiveHeader.font), db.objectiveHeader.size, db.objectiveHeader.outline)
+			_G["ObjectiveTrackerBlocksFrame"].QuestHeader.Text:SetFont(LSM:Fetch('font', db.objectiveHeader.font), db.objectiveHeader.size, db.objectiveHeader.outline)
+			_G["ObjectiveTrackerBlocksFrame"].AchievementHeader.Text:SetFont(LSM:Fetch('font', db.objectiveHeader.font), db.objectiveHeader.size, db.objectiveHeader.outline)
+			_G["ObjectiveTrackerBlocksFrame"].ScenarioHeader.Text:SetFont(LSM:Fetch('font', db.objectiveHeader.font), db.objectiveHeader.size, db.objectiveHeader.outline)
+			_G["BONUS_OBJECTIVE_TRACKER_MODULE"].Header.Text:SetFont(LSM:Fetch('font', db.objectiveHeader.font), db.objectiveHeader.size, db.objectiveHeader.outline)
+			_G["ObjectiveTrackerFrame"].HeaderMenu.Title:SetTextColor(COLOR.r, COLOR.g, COLOR.b)
+			_G["ObjectiveTrackerBlocksFrame"].QuestHeader.Text:SetTextColor(COLOR.r, COLOR.g, COLOR.b)
+			_G["ObjectiveTrackerBlocksFrame"].AchievementHeader.Text:SetTextColor(COLOR.r, COLOR.g, COLOR.b)
+			_G["ObjectiveTrackerBlocksFrame"].ScenarioHeader.Text:SetTextColor(COLOR.r, COLOR.g, COLOR.b)
+			_G["BONUS_OBJECTIVE_TRACKER_MODULE"].Header.Text:SetTextColor(COLOR.r, COLOR.g, COLOR.b)
+			MakeFont(_G["ObjectiveFont"], LSM:Fetch('font', db.objective.font), db.objective.size, db.objective.outline)
+			if M.BonusObjectiveBarText then M.BonusObjectiveBarText:SetFont(LSM:Fetch('font', db.objective.font), db.objective.size, db.objective.outline) end
+		end
 	end
 end

 function M:TextWidth()
-	local db = E.db.sle.media.fonts
-	ZoneTextString:SetWidth(db.zone.width)
-	PVPInfoTextString:SetWidth(db.pvp.width)
-	PVPArenaTextString:SetWidth(db.pvp.width)
-	SubZoneTextString:SetWidth(db.subzone.width)
+	local db = E.db.sle.media.fonts or E.db.sle.media.fonts
+	_G["ZoneTextString"]:SetWidth(db.zone.width)
+	_G["PVPInfoTextString"]:SetWidth(db.pvp.width)
+	_G["PVPArenaTextString"]:SetWidth(db.pvp.width)
+	_G["SubZoneTextString"]:SetWidth(db.subzone.width)
 end

 function M:TextShow()
-	local z, i, a, s, c = random(1, #Zones), random(1, #PvPInfo), random(1, #PVPArena), random(1, #Subzones), random(1, #Colors)
-	local red, green, blue = unpack(Colors[c])
+	local z, i, a, s, c = T.random(1, #M.Zones), T.random(1, #M.PvPInfo), T.random(1, #M.PVPArena), T.random(1, #M.Subzones), T.random(1, #Colors)
+	local red, green, blue = T.unpack(Colors[c])

 	--Setting texts--
-	ZoneTextString:SetText(Zones[z])
-	PVPInfoTextString:SetText(PvPInfo[i])
-	PVPArenaTextString:SetText(PVPArena[a])
-	SubZoneTextString:SetText(Subzones[s])
-
+	_G["ZoneTextString"]:SetText(M.Zones[z])
+	_G["PVPInfoTextString"]:SetText(M.PvPInfo[i])
+	_G["PVPArenaTextString"]:SetText(M.PVPArena[a])
+	_G["SubZoneTextString"]:SetText(M.Subzones[s])
+
 	ZoneTextPos()--nil, true)
-
+
 	--Applying colors--
-	ZoneTextString:SetTextColor(red, green, blue)
-	PVPInfoTextString:SetTextColor(red, green, blue)
-	PVPArenaTextString:SetTextColor(red, green, blue)
-	SubZoneTextString:SetTextColor(red, green, blue)
-
-	FadingFrame_Show(ZoneTextFrame)
-	FadingFrame_Show(SubZoneTextFrame)
+	_G["ZoneTextString"]:SetTextColor(red, green, blue)
+	_G["PVPInfoTextString"]:SetTextColor(red, green, blue)
+	_G["PVPArenaTextString"]:SetTextColor(red, green, blue)
+	_G["SubZoneTextString"]:SetTextColor(red, green, blue)
+
+	FadingFrame_Show(_G["ZoneTextFrame"])
+	FadingFrame_Show(_G["SubZoneTextFrame"])
 end

 function M:Update()
@@ -108,8 +113,14 @@ function M:Update()
 end

 function M:Initialize()
+	if not SLE.initialized then return end
 	M:TextWidth()
-	hooksecurefunc(E, "UpdateBlizzardFonts", SetFonts)
+	hooksecurefunc(E, "UpdateBlizzardFonts", M.SetBlizzFonts)
 	hooksecurefunc("SetZoneText", ZoneTextPos)
+	M:SetBlizzFonts()
 	--E:CreateMover(ZoneTextFrame, "ZoneTextMover", "ZoneTextMover", nil, nil, nil, "S&L,S&L MISC")
-end
\ No newline at end of file
+
+	SLE.UpdateFunctions["Media"] = M.Update
+end
+
+SLE:RegisterModule(M:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/core/modules.lua b/ElvUI_SLE/core/modules.lua
deleted file mode 100644
index 6be7ad1..0000000
--- a/ElvUI_SLE/core/modules.lua
+++ /dev/null
@@ -1,39 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local unit
-
-local modules = {
-	['SLE_AutoRelease'] = {'AceHook-3.0', 'AceEvent-3.0'},
-	['SLE_AuraTimers'] = {'AceEvent-3.0'},
-	['SLE_DTPanels'] = {'AceHook-3.0', 'AceEvent-3.0'},
-	['SLE_BackGrounds'] = {'AceHook-3.0', 'AceEvent-3.0'},
-	['SLE_BagInfo'] = {'AceHook-3.0', 'AceEvent-3.0', 'AceTimer-3.0'},
-	['SLE_EquipManager'] = {'AceHook-3.0', 'AceEvent-3.0'},
-	['SLE_Farm'] = {'AceHook-3.0', 'AceEvent-3.0'},
-	['SLE_AddonInstaller'] = {},
-	['SLE_Bags'] = {'AceHook-3.0'},
-	['SLE_Loot'] = {'AceHook-3.0', 'AceEvent-3.0'},
-	['SLE_RaidMarkers'] = {'AceEvent-3.0'},
-	['SLE_SquareMinimapButtons'] = {'AceHook-3.0', 'AceEvent-3.0'},
-	['SLE_Threat'] = {'AceHook-3.0', 'AceEvent-3.0'},
-	['SLE_PvPMover'] = {'AceHook-3.0', 'AceEvent-3.0'},
-	['SLE_UIButtons'] = {'AceHook-3.0', 'AceEvent-3.0'},
-	['SLE_EnhancedVehicleBar'] = {},
-	['SLE_Test'] = {'AceHook-3.0', 'AceEvent-3.0'}, --Testing module in dev folder
-	['SLE_Media'] = {'AceHook-3.0'},
-	['SLE_InstDif'] = {'AceHook-3.0', 'AceEvent-3.0'},
-	['SLE_ScreenSaver'] = { 'AceHook-3.0', 'AceEvent-3.0', 'AceTimer-3.0'},
-	['SLE_Garrison'] = { 'AceEvent-3.0' },
-	['SLE_ErrorFrame'] = { },
-	['SLE_Quests'] = { 'AceEvent-3.0' },
-	['SLE_BlizzRaid'] = { 'AceEvent-3.0' },
-	['SLE'] = {'AceHook-3.0', 'AceEvent-3.0'},
-}
-
-local function Register()
-	for name, libs in pairs(modules) do
-		unit = E:NewModule(name, unpack(libs))
-		E:RegisterModule(unit:GetName())
-	end
-end
-
-Register()
\ No newline at end of file
diff --git a/ElvUI_SLE/core/staticpopups.lua b/ElvUI_SLE/core/staticpopups.lua
index 034ba26..ce98777 100644
--- a/ElvUI_SLE/core/staticpopups.lua
+++ b/ElvUI_SLE/core/staticpopups.lua
@@ -1,76 +1,103 @@
-local E, L, V, P, G = unpack(ElvUI);
-local SLE = E:GetModule('SLE')
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local CLOSE = CLOSE
+local ACCEPT = ACCEPT
+local CANCEL = CANCEL
+local _G = _G
+local ReloadUI = ReloadUI

+--Version check
 E.PopupDialogs["VERSION_MISMATCH"] = {
 	text = SLE:MismatchText(),
 	button1 = CLOSE,
 	timeout = 0,
-	whileDead = 1,
+	whileDead = 1,
 	preferredIndex = 3,
 }

-E.PopupDialogs['ENHANCED_SLE_INCOMPATIBLE'] = {
-	text = L['Oh lord, you have got ElvUI Enhanced and Shadow & Light both enabled at the same time. Select an addon to disable.'],
-	OnAccept = function() DisableAddOn("ElvUI_Enhanced"); ReloadUI() end,
-	OnCancel = function() DisableAddOn("ElvUI_SLE"); ReloadUI() end,
-	button1 = 'ElvUI Enhanced',
-	button2 = 'Shadow & Light',
-	button3 = L['Disable Warning'],
-	OnAlt = function ()
-		E.global.ignoreEnhancedIncompatible = true;
-	end,
+--Chat stuff
+E.PopupDialogs["SLE_CHAT_HISTORY_CLEAR"] = {
+	text = L["This will clear your chat history and reload your UI.\nContinue?"],
+	button1 = ACCEPT,
+	button2 = CANCEL,
+	OnAccept = function(self) if _G["ElvCharacterDB"].ChatLog then T.twipe(_G["ElvCharacterDB"].ChatLog); ReloadUI() end end,
 	timeout = 0,
-	whileDead = 1,
-	hideOnEscape = false,
+	whileDead = 1,
+	hideOnEscape = false,
 }

-E.PopupDialogs['LOOTCONFIRM_SLE_INCOMPATIBLE'] = {
-	text = L['You have got Loot Confirm and Shadow & Light both enabled at the same time. Select an addon to disable.'],
-	OnAccept = function() DisableAddOn("LootConfirm"); ReloadUI() end,
-	OnCancel = function() DisableAddOn("ElvUI_SLE"); ReloadUI() end,
-	button1 = 'Loot Confirm',
-	button2 = 'Shadow & Light',
+E.PopupDialogs["SLE_EDIT_HISTORY_CLEAR"] = {
+	text = L["This will clear your editbox history and reload your UI.\nContinue?"],
+	button1 = ACCEPT,
+	button2 = CANCEL,
+	OnAccept = function(self) if _G["ElvCharacterDB"].ChatEditHistory then T.twipe(_G["ElvCharacterDB"].ChatEditHistory); ReloadUI() end end,
+	timeout = 0,
+	whileDead = 1,
+	hideOnEscape = false,
+}
+--Do you sware you are not an idiot
+E.PopupDialogs["SLE_ADVANCED_POPUP"] = {
+	text = L["SLE_ADVANCED_POPUP_TEXT"],
+	button1 = L["I Swear"],
+	button2 = DECLINE,
+	OnAccept = function()
+		E.global.sle.advanced.confirmed = true
+		E.global.sle.advanced.general = true
+	end,
 	timeout = 0,
-	whileDead = 1,
-	hideOnEscape = false,
+	whileDead = 1,
+	hideOnEscape = false,
 }

-E.PopupDialogs['ORA_SLE_INCOMPATIBLE'] = {
-	text = L['You have got oRA3 and Shadow & Light both enabled at the same time. Select an addon to disable.'],
-	OnAccept = function() DisableAddOn("oRA3"); ReloadUI() end,
-	OnCancel = function() DisableAddOn("ElvUI_SLE"); ReloadUI() end,
-	button1 = 'oRA3',
-	button2 = 'Shadow & Light',
+--Gold clear popup
+E.PopupDialogs['SLE_CONFIRM_DELETE_CURRENCY_CHARACTER'] = {
+	button1 = YES,
+	button2 = NO,
+	OnCancel = E.noop;
+}
+
+--Incompatibility messages
+E.PopupDialogs["ENHANCED_SLE_INCOMPATIBLE"] = {
+	text = L["Oh lord, you have got ElvUI Enhanced and Shadow & Light both enabled at the same time. Select an addon to disable."],
+	OnAccept = function() T.DisableAddOn("ElvUI_Enhanced"); ReloadUI() end,
+	OnCancel = function() T.DisableAddOn("ElvUI_SLE"); ReloadUI() end,
+	button1 = 'ElvUI Enhanced',
+	button2 = 'Shadow & Light',
+	button3 = L["Disable Warning"],
+	OnAlt = function ()
+		E.global.ignoreEnhancedIncompatible = true;
+	end,
 	timeout = 0,
-	whileDead = 1,
-	hideOnEscape = false,
+	whileDead = 1,
+	hideOnEscape = false,
 }

-E.PopupDialogs['SLE_INCOMPATIBLE_ADDON'] = {
-	text = gsub(L["INCOMPATIBLE_ADDON"], "ElvUI", "Shadow & Light"),
-	OnAccept = function(self) DisableAddOn(E.PopupDialogs['SLE_INCOMPATIBLE_ADDON'].addon); ReloadUI(); end,
-	OnCancel = function(self) E.PopupDialogs['SLE_INCOMPATIBLE_ADDON'].optiontable[E.PopupDialogs['SLE_INCOMPATIBLE_ADDON'].value] = false; ReloadUI(); end,
+E.PopupDialogs["LOOTCONFIRM_SLE_INCOMPATIBLE"] = {
+	text = L["You have got Loot Confirm and Shadow & Light both enabled at the same time. Select an addon to disable."],
+	OnAccept = function() T.DisableAddOn("LootConfirm"); ReloadUI() end,
+	OnCancel = function() T.DisableAddOn("ElvUI_SLE"); ReloadUI() end,
+	button1 = 'Loot Confirm',
+	button2 = 'Shadow & Light',
 	timeout = 0,
-	whileDead = 1,
-	hideOnEscape = false,
+	whileDead = 1,
+	hideOnEscape = false,
 }

-E.PopupDialogs['SLE_CHAT_HISTORY'] = {
-	text = L["This will clear your chat history and reload your UI.\nContinue?"],
-	button1 = ACCEPT,
-	button2 = CANCEL,
-	OnAccept = function(self) if ElvCharacterDB.ChatLog then ElvCharacterDB.ChatLog = {}; ReloadUI() end end,
+E.PopupDialogs["TRANSAB_SLE_INCOMPATIBLE"] = {
+	text = L["You have got ElvUI Transparent Actionbar Backdrops and Shadow & Light both enabled at the same time. Select an addon to disable."],
+	OnAccept = function() T.DisableAddOn("ElvUITransparentActionbars"); ReloadUI() end,
+	OnCancel = function() T.DisableAddOn("ElvUI_SLE"); ReloadUI() end,
+	button1 = 'Transparent Actionbar Backdrops',
+	button2 = 'Shadow & Light',
 	timeout = 0,
-	whileDead = 1,
-	hideOnEscape = false,
+	whileDead = 1,
+	hideOnEscape = false,
 }

-E.PopupDialogs['SLE_EDIT_HISTORY'] = {
-	text = L["This will clear your editbox history and reload your UI.\nContinue?"],
-	button1 = ACCEPT,
-	button2 = CANCEL,
-	OnAccept = function(self) if ElvCharacterDB.ChatEditHistory then ElvCharacterDB.ChatEditHistory = {}; ReloadUI() end end,
+E.PopupDialogs["SLE_INCOMPATIBLE_ADDON"] = {
+	text = T.gsub(L["INCOMPATIBLE_ADDON"], "ElvUI", "Shadow & Light"),
+	OnAccept = function(self) T.DisableAddOn(E.PopupDialogs["SLE_INCOMPATIBLE_ADDON"].addon); ReloadUI(); end,
+	OnCancel = function(self) E.PopupDialogs["SLE_INCOMPATIBLE_ADDON"].optiontable[E.PopupDialogs["SLE_INCOMPATIBLE_ADDON"].value] = false; ReloadUI(); end,
 	timeout = 0,
-	whileDead = 1,
-	hideOnEscape = false,
+	whileDead = 1,
+	hideOnEscape = false,
 }
\ No newline at end of file
diff --git a/ElvUI_SLE/core/test.lua b/ElvUI_SLE/core/test.lua
deleted file mode 100644
index 9b03973..0000000
--- a/ElvUI_SLE/core/test.lua
+++ /dev/null
@@ -1,2 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local T = E:GetModule('SLE_Test');
diff --git a/ElvUI_SLE/core/toolkit.lua b/ElvUI_SLE/core/toolkit.lua
index 27d2644..e4710fb 100644
--- a/ElvUI_SLE/core/toolkit.lua
+++ b/ElvUI_SLE/core/toolkit.lua
@@ -1,43 +1,232 @@
-local E, L, V, P, G = unpack(ElvUI);
-local SLE = E:GetModule('SLE')
-local BG = E:GetModule('SLE_BackGrounds')
-local DTP = E:GetModule('SLE_DTPanels')
-local CH = E:GetModule("Chat")
-local UB = E:GetModule('SLE_UIButtons')
-local RM = E:GetModule('SLE_RaidMarkers')
-local F = E:GetModule('SLE_Farm')
-local LT = E:GetModule('SLE_Loot')
-local UF = E:GetModule('UnitFrames')
-local M = E:GetModule('SLE_Media')
-local I = E:GetModule('SLE_InstDif')
-local S = E:GetModule("SLE_ScreenSaver")
-local G = E:GetModule("SLE_Garrison")
-local EF = E:GetModule('SLE_ErrorFrame');
-local AT = E:GetModule('SLE_AuraTimers')
-local A = E:GetModule('Auras')
-local LocTable = {}
-LocTable[1], LocTable[2], LocTable[3], LocTable[4], LocTable[5], LocTable[6], LocTable[7] = GetAvailableLocales()
-
-local GetContainerNumSlots, GetContainerItemID = GetContainerNumSlots, GetContainerItemID
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local _G = _G
+local getmetatable = getmetatable
+local NUM_BAG_SLOTS = NUM_BAG_SLOTS

-function SLE:BagSearch(itemId)
-	for container = 0, NUM_BAG_SLOTS do
-		for slot = 1, GetContainerNumSlots(container) do
-			if itemId == GetContainerItemID(container, slot) then
-				return container, slot
-			end
-		end
-	end
+--Adding a lot of shit from global functions--
+T.format = format
+T.strlower = strlower
+T.random = random
+--Time/date
+T.date = date
+T.time = time
+T.difftime = difftime
+T.GetTime = GetTime
+--Unit infos
+T.UnitLevel = UnitLevel
+T.UnitClass = UnitClass
+T.UnitRace = UnitRace
+T.UnitName = UnitName
+T.GetUnitName = GetUnitName
+T.UnitFactionGroup = UnitFactionGroup
+T.UnitAura = UnitAura
+T.UnitBuff = UnitBuff
+T.UnitDebuff = UnitDebuff
+T.GetSpecialization = GetSpecialization
+T.GetNumSpecializationsForClassID = GetNumSpecializationsForClassID
+T.GetSpecializationInfoForClassID = GetSpecializationInfoForClassID
+T.GetActiveSpecGroup = GetActiveSpecGroup
+T.GetAverageItemLevel = GetAverageItemLevel
+T.UnitStat = UnitStat
+T.UnitIsPlayer = UnitIsPlayer
+T.UnitInRaid = UnitInRaid
+T.UnitInParty = UnitInParty
+T.UnitPVPName = UnitPVPName
+T.UnitIsAFK = UnitIsAFK
+T.UnitExists = UnitExists
+T.UnitIsConnected = UnitIsConnected
+T.UnitIsUnit = UnitIsUnit
+T.UnitGUID = UnitGUID
+T.UnitCanAttack = UnitCanAttack
+T.UnitDetailedThreatSituation = UnitDetailedThreatSituation
+T.GetThreatStatusColor = GetThreatStatusColor
+T.CanInspect = CanInspect
+T.GetStatistic = GetStatistic
+T.GetComparisonStatistic = GetComparisonStatistic
+T.GetAchievementInfo = GetAchievementInfo
+T.UnitHonor = UnitHonor
+T.UnitHonorMax = UnitHonorMax
+T.UnitHonorLevel = UnitHonorLevel
+T.GetMaxPlayerHonorLevel = GetMaxPlayerHonorLevel
+--Class
+T.GetNumClasses = GetNumClasses
+T.GetClassInfo = GetClassInfo
+-- T.
+--Items
+T.GetInventoryItemLink = GetInventoryItemLink
+T.GetInventorySlotInfo = GetInventorySlotInfo
+T.GetInventoryItemDurability = GetInventoryItemDurability
+T.GetInventoryItemQuality = GetInventoryItemQuality
+T.GetItemInfo = GetItemInfo
+T.GetItemIcon = GetItemIcon
+T.GetItemCooldown = GetItemCooldown
+T.GetItemCount = GetItemCount
+T.IsEquippableItem = IsEquippableItem
+T.GetItemQualityColor = GetItemQualityColor
+T.GetInventoryItemID = GetInventoryItemID
+-- T.
+--XP
+T.IsXPUserDisabled = IsXPUserDisabled
+T.GetMaxPlayerLevel = GetMaxPlayerLevel
+T.GetXPExhaustion = GetXPExhaustion
+--rep
+T.GetWatchedFactionInfo = GetWatchedFactionInfo
+T.GetNumFactions = GetNumFactions
+T.IsFactionInactive = IsFactionInactive
+T.SetWatchedFactionIndex = SetWatchedFactionIndex
+--Social
+T.IsInGuild = IsInGuild
+T.GuildRoster = GuildRoster
+T.GetGuildInfo = GetGuildInfo
+T.GetNumGuildMembers = GetNumGuildMembers
+T.GetGuildRosterInfo = GetGuildRosterInfo
+T.GetGuildRosterMOTD = GetGuildRosterMOTD
+T.CanEditOfficerNote = CanEditOfficerNote
+T.CanEditPublicNote = CanEditPublicNote
+T.InviteUnit = InviteUnit
+--Professions
+T.GetProfessions = GetProfessions
+T.GetProfessionInfo = GetProfessionInfo
+T.GetTradeSkillNumReagents = GetTradeSkillNumReagents
+T.GetTradeSkillReagentInfo = GetTradeSkillReagentInfo
+--Screen stuff
+T.GetScreenWidth = GetScreenWidth
+T.GetScreenHeight = GetScreenHeight
+T.GetMouseFocus = GetMouseFocus
+--Spells
+T.GetSpellCooldown = GetSpellCooldown
+T.GetSpellInfo = GetSpellInfo
+T.IsSpellKnown = IsSpellKnown
+T.GetSpellBookItemInfo = GetSpellBookItemInfo
+--Tables
+T.pairs = pairs
+T.ipairs = ipairs
+T.tinsert = tinsert
+T.tremove = tremove
+T.tcopy = table.copy
+T.twipe = table.wipe
+T.unpack = unpack
+T.select = select
+T.sort = sort
+--Camera
+T.FlipCameraYaw = FlipCameraYaw
+--Instance
+T.IsInInstance = IsInInstance
+T.GetLFGDungeonEncounterInfo = GetLFGDungeonEncounterInfo
+T.GetInstanceInfo = GetInstanceInfo
+--Combat
+T.InCombatLockdown = InCombatLockdown
+--PvP
+T.GetNumWorldPVPAreas = GetNumWorldPVPAreas
+T.GetWorldPVPAreaInfo = GetWorldPVPAreaInfo
+T.GetNumBattlefieldScores = GetNumBattlefieldScores
+T.GetBattlefieldScore = GetBattlefieldScore
+T.CanPrestige = CanPrestige
+--Map
+T.GetZoneText = GetZoneText
+T.GetRealZoneText = GetRealZoneText
+T.GetMinimapZoneText = GetMinimapZoneText
+T.GetMapNameByID = GetMapNameByID
+T.GetSubZoneText = GetSubZoneText
+T.GetPlayerMapPosition = GetPlayerMapPosition
+T.GetZonePVPInfo = GetZonePVPInfo
+--Currency
+T.GetCurrencyListSize = GetCurrencyListSize
+T.GetCurrencyInfo = GetCurrencyInfo
+
+T.error = error
+T.type = type
+T.GetInboxHeaderInfo = GetInboxHeaderInfo
+--Addons
+T.IsAddOnLoaded = IsAddOnLoaded
+T.DisableAddOn = DisableAddOn
+
+T.GetQuestDifficultyColor = GetQuestDifficultyColor
+
+--Strings
+T.split = string.split
+T.join = string.join
+T.match = string.match
+T.strlen = string.len
+T.gsub = gsub
+T.find = string.find
+T.print = print
+T.upper = string.upper
+T.StringToUpper = function(str)
+	return (T.gsub(str, "^%l", T.upper))
 end
+--Math
+T.floor = floor
+T.tonumber = tonumber
+--Groups
+T.IsInGroup = IsInGroup
+T.IsInRaid = IsInRaid
+T.IsPartyLFG = IsPartyLFG
+T.GetNumSubgroupMembers = GetNumSubgroupMembers
+T.GetNumGroupMembers = GetNumGroupMembers
+T.UnitGroupRolesAssigned = UnitGroupRolesAssigned
+T.GetRaidRosterInfo = GetRaidRosterInfo
+--Friend
+T.BNGetNumFriends = BNGetNumFriends
+T.BNGetFriendInfo = BNGetFriendInfo
+T.BNGetGameAccountInfo = BNGetGameAccountInfo --6.2.4
+T.BNGetFriendIndex = BNGetFriendIndex
+T.GetFriendInfo = GetFriendInfo
+T.GetNumFriends = GetNumFriends
+--Equip
+T.UseEquipmentSet = UseEquipmentSet
+T.GetEquipmentSetInfo = GetEquipmentSetInfo
+T.GetNumEquipmentSets = GetNumEquipmentSets
+T.GetEquipmentSetLocations = GetEquipmentSetLocations
+--Quests
+T.GetQuestLogTitle = GetQuestLogTitle
+T.GetNumQuestLogEntries = GetNumQuestLogEntries
+--Loot
+T.GetNumLootItems = GetNumLootItems
+T.GetLootSlotInfo = GetLootSlotInfo
+T.GetLootSlotType = GetLootSlotType
+T.GetLootSlotLink = GetLootSlotLink
+T.GetLootRollItemInfo = GetLootRollItemInfo
+T.GetLootRollItemLink = GetLootRollItemLink
+--Factions
+T.GetFactionInfo = GetFactionInfo
+T.GetFriendshipReputation = GetFriendshipReputation
+T.GetFriendshipReputationRanks = GetFriendshipReputationRanks
+--Bags
+T.GetContainerNumSlots = GetContainerNumSlots
+T.GetContainerItemID = GetContainerItemID
+T.GetContainerItemInfo = GetContainerItemInfo
+T.GetContainerItemLink = GetContainerItemLink

-function SLE:ValueTable(table, item)
-	for i, _ in pairs(table) do
-		if i == item then return true end
-	end
+T.GetTradeTargetItemLink = GetTradeTargetItemLink

-	return false
+T.GetSpell = function(id)
+	local name = T.GetSpellInfo(id)
+	return name
 end

+--Some of Simpy's herecy bullshit
+T.rgsub = function(pattern,...)
+	local z =  T.select('#',...)
+	local x = T.floor(z/2)
+	local s;
+	for i = 1,x do
+		z = T.select(i,...)
+		if T.match(pattern,z) then
+			s = T.select(i+x,...)
+			pattern = T.gsub(pattern,z,s)
+		end
+	end
+	return pattern
+end
+
+T.SafeHookScript = function (frame, handlername, newscript)
+	local oldValue = frame:GetScript(handlername);
+	frame:SetScript(handlername, newscript);
+	return oldValue;
+end
+
+--Search in a table like {"arg1", "arg2", "arg3"}
 function SLE:SimpleTable(table, item)
 	for i = 1, #table do
 		if table[i] == item then
@@ -47,124 +236,104 @@ function SLE:SimpleTable(table, item)

 	return false
 end
+--Search in a table like {["stuff"] = {}, ["stuff2"] = {} }
+function SLE:ValueTable(table, item)
+	for i, _ in T.pairs(table) do
+		if i == item then return true end
+	end

-function SLE:Print(msg)
-	print(E["media"].hexvaluecolor..'S&L:|r', msg)
+	return false
 end

-function SLE:Scale(f)
-		return f*GetCVar('uiScale')
+function SLE:GetIconFromID(type, id)
+	local path
+	if type == "item" then
+		path = T.select(10, T.GetItemInfo(id))
+	elseif type == "spell" then
+		path = T.select(3, T.GetSpellInfo(id))
+	elseif type == "achiev" then
+		path = T.select(10, T.GetAchievementInfo(id))
+	end
+	return path or nil
 end

-local function UpdateAll()
-	BG:UpdateFrames()
-	BG:RegisterHide()
-	DTP:Update()
-	DTP:DashboardShow()
-	DTP:DashWidth()
-	if E.private.unitframe.enable then
-		UF:Update_CombatIndicator()
+--For searching stuff in bags
+function SLE:BagSearch(itemId)
+	for container = 0, NUM_BAG_SLOTS do
+		for slot = 1, T.GetContainerNumSlots(container) do
+			if itemId == T.GetContainerItemID(container, slot) then
+				return container, slot
+			end
+		end
 	end
-	LT:LootShow()
-	LT:Update()
-	RM:UpdateBar(true)
-	F:UpdateLayout()
-	CH:GMIconUpdate()
-	M:TextWidth()
-	I:UpdateFrame()
-	S:Reg(true)
-	EF:SetSize()
-	AT:BuildCasts()
-	A:Update_ConsolidatedBuffsSettings()
+end

-	collectgarbage('collect');
+--Additional tutorials if any
+function SLE:AddTutorials()
 end

-function SLE:OpenExport()
-	E:ToggleConfig()
-	if not SLEExImFrame then SLE:CreateExport() end
-	if not SLEExImFrame:IsShown() then
-		SLEExportEditBox:SetText(L["SLE_Exp_Desc"])
-		SLEImportEditBox:SetText(L["SLE_Imp_Desc"])
-		SLEExImFrame:Show()
-	end
+--S&L print
+function SLE:Print(msg)
+	T.print(E["media"].hexvaluecolor..'S&L:|r', msg)
 end

-local datable = {}
+function SLE:ErrorPrint(msg)
+	T.print("|cffFF0000S&L Error:|r", msg)
+end

-function SLE:ExportPrint()
-	local text = ''
-	for i = 1, #datable do
-		text = text..datable[i]
-	end
-
+--A function to ensure any files which set movers will be recognised as text by git.
+function SLE:SetMoverPosition(mover, anchor, parent, point, x, y)
+	if not _G[mover] then return end
+	local frame = _G[mover]
+
+	frame:ClearAllPoints()
+	frame:SetPoint(anchor, parent, point, x, y)
+	E:SaveMoverPosition(mover)
+end
+
+--Function for generating a text when ElvUI version is way outdated
+function SLE:MismatchText()
+	local text = T.format(L["MSG_SLE_ELV_OUTDATED"],SLE.elvV,SLE.elvR)
 	return text
 end

-function SLE:SettingTable(t, s, root)
-	if not root then root = "" end
-	for k, v in pairs(t) do
-		if type(v) == "string" then
-			if root[k] ~= v or E.global.sle.export.full then
-				tinsert(datable, #(datable)+1, s.."."..k..' = "'..v..'"\n')
-			end
-		elseif type(v) == "number" then
-			if root[k] ~= v or E.global.sle.export.full then
-				tinsert(datable, #(datable)+1, s.."."..k.." = "..v.."\n")
-			else
-			end
-		elseif type(v) == "boolean" then
-			if root[k] ~= v or E.global.sle.export.full then
-				local b = v == true and "true" or "false"
-				tinsert(datable, #(datable)+1, s.."."..k.." = "..b.."\n")
-			end
-		else
-			local new = "."..k
-			SLE:SettingTable(t[k], s..new, root[k])
-		end
-	end
+--For when we dramatically change some options
+function SLE:FixDatabase()
 end

-function SLE:ImportTableReplace(msg)
-	if not string.find(msg, "E.db") and not string.find(msg, "E.private") and not string.find(msg, "E.global") then
-		return nil
-	end
-	if string.find(msg, "E.db") then
-		msg = gsub(msg, "E.db", "ElvUI[1].db")
-	end
-	if string.find(msg, "E.private") then
-		msg = gsub(msg, "E.private", "ElvUI[1].private")
-	end
-	if string.find(msg, "E.global") then
-		msg = gsub(msg, "E.global", "ElvUI[1].global")
+--When we need to get mutiple modules in a file
+function SLE:GetElvModules(...)
+	local returns = {}
+	local num = T.select("#", ...) --Getting the number of modules passed
+	for i = 1, num do
+		local name = T.select(i, ...)
+		if T.type(name) == "string" then --Checking if *cough* someone send not string as a module name
+			local mod = E:GetModule(name)
+			T.tinsert(returns, #(returns)+1, mod);
+		else
+			T.error([[Usage: SLE:GetElvModules(): expected a string as a module name got a ]]..T.type(name), 2)
+		end
 	end
-
-	return msg
+	return T.unpack(returns) --Returning modules back
 end

-function SLE:Exporting()
-	local msg = ''
-	datable = {}
-	if E.global.sle.export.profile then
-		tinsert(datable, #(datable)+1, "--Profile--\n")
-		SLE:SettingTable(E.db, "E.db", P)
-	end
-	if E.global.sle.export.private then
-		tinsert(datable, #(datable)+1, "--Character--\n")
-		SLE:SettingTable(E.private, "E.private", V)
-	end
-	if E.global.sle.export.global then
-		tinsert(datable, #(datable)+1, "--Global--\n")
-		SLE:SettingTable(E.global, "E.global", G)
+function SLE:GetModules(...)
+	local returns = {}
+	local num = T.select("#", ...)
+	for i = 1, num do
+		local name = T.select(i, ...)
+		if T.type(name) == "string" then
+			local mod = SLE:GetModule(name)
+			T.tinsert(returns, #(returns)+1, mod);
+		else
+			T.error([[Usage: SLE:GetModules(): expected a string as a module name got a ]]..T.type(name), 2)
+		end
 	end
-	msg = SLE:ExportPrint()
-	local editbox = SLEExportEditBox
-	editbox:SetText(msg)
-	editbox:SetFocus()
-	editbox:HighlightText()
+	return T.unpack(returns)
 end
-hooksecurefunc(E, "UpdateAll", UpdateAll)

+--Trying to determine the region player is in, not entirely reliable cause based on a client not an actual region id
+local GetCurrentRegion = GetCurrentRegion
 function SLE:GetRegion()
 	local rid = GetCurrentRegion()
 	local region = {
@@ -176,66 +345,147 @@ function SLE:GetRegion()
 	}
 	SLE.region = region[rid]
 	if not SLE.region then
-		SLE.region = format("An error happened. Your region is unknown. Realm: %s. Please report your realm name and the region you are playing in to |cff1784d1Shadow & Light|r authors.", E.myrealm)
+		SLE.region = T.format("An error happened. Your region is unknown. Realm: %s. RID: %s. Please report your realm name and the region you are playing in to |cff1784d1Shadow & Light|r authors.", E.myrealm, rid)
 		SLE:Print(SLE.region)
 		SLE.region = ""
 	end
 end

-function SLE:Reset(group)
-	if not group then print("U wot m8?") end
-	if group == "unitframes" or group == "all" then
-		E.db.sle.combatico.pos = 'TOP'
-		E.db.sle.roleicons = "ElvUI"
-		E.db.sle.powtext = false
-	end
-	if group == "backgrounds" or group == "all" then
-		E:CopyTable(E.db.sle.backgrounds, P.sle.backgrounds)
-		E:ResetMovers(L["Bottom BG"])
-		E:ResetMovers(L["Left BG"])
-		E:ResetMovers(L["Right BG"])
-		E:ResetMovers(L["Actionbar BG"])
+--Registering and loading modules
+SLE["RegisteredModules"] = {}
+function SLE:RegisterModule(name)
+	if self.initialized then
+		self:GetModule(name):Initialize()
+	else
+		self["RegisteredModules"][#self["RegisteredModules"] + 1] = name
 	end
-	if group == "datatexts" or group == "all" then
-		E:CopyTable(E.db.sle.datatext, P.sle.datatext)
-		E:CopyTable(E.db.sle.dt, P.sle.dt)
-		E:ResetMovers(L["DP_1"])
-		E:ResetMovers(L["DP_2"])
-		E:ResetMovers(L["DP_3"])
-		E:ResetMovers(L["DP_4"])
-		E:ResetMovers(L["DP_5"])
-		E:ResetMovers(L["DP_6"])
-		E:ResetMovers(L["Top_Center"])
-		E:ResetMovers(L["Bottom_Panel"])
-		E:ResetMovers(L["Dashboard"])
+end
+
+local GetCVarBool = GetCVarBool
+local pcall = pcall
+local ScriptErrorsFrame_OnError = ScriptErrorsFrame_OnError
+function SLE:InitializeModules()
+	for _, module in T.pairs(SLE["RegisteredModules"]) do
+		local module = self:GetModule(module)
+		if module.Initialize then
+			local _, catch = pcall(module.Initialize, module)
+
+			if catch and GetCVarBool('scriptErrors') == true then
+				ScriptErrorsFrame_OnError(catch, false)
+			end
+		end
 	end
-	if group == "marks" or group == "all" then
-		E:CopyTable(E.db.sle.raidmarkers, P.sle.raidmarkers)
-		E:ResetMovers(L['Raid Marker Bar'])
+end
+
+--[[
+Updating alongside with ElvUI. SLE:UpdateAll() is hooked to E:UpdateAll()
+Modules are supposed to provide a function(s) to call when profile change happens (or global update is called).
+Provided functions should be named Module:ForUpdateAll() or otherwise stored in SLE.UpdateFunctions table (when there is no need of reassigning settings table.
+Each modules insert their functions in respective files.
+]]
+local collectgarbage = collectgarbage
+SLE.UpdateFunctions = {}
+function SLE:UpdateAll()
+	if not SLE.initialized then return end
+
+	for _, name in T.pairs(SLE["RegisteredModules"]) do
+		local module = SLE:GetModule(name)
+		if module.ForUpdateAll then
+			module:ForUpdateAll()
+		else
+			if SLE.UpdateFunctions[name] then
+				SLE.UpdateFunctions[name]()
+			end
+		end
 	end
-	if group == "all" then
-		E:CopyTable(E.db.sle, P.sle)
-		E:ResetMovers("PvP")
-		E:ResetMovers(L["S&L UI Buttons"])
-		E:ResetMovers(L["Error Frame"])
-		E:ResetMovers(L["Pet Battle Status"])
-		E:ResetMovers(L["Pet Battle AB"])
-		E:ResetMovers(L["Farm Seed Bars"])
-		E:ResetMovers(L["Farm Tool Bar"])
-		E:ResetMovers(L["Farm Portal Bar"])
-		E:ResetMovers(L["Garrison Tools Bar"])
-		E:ResetMovers(L["Ghost Frame"])
-		E:ResetMovers(L["Raid Utility"])
+
+	if not SLE._Compatibility["oRA3"] then SLE:GetModule("BlizzRaid"):CreateAndUpdateIcons() end
+
+	SLE:SetCompareItems()
+
+	collectgarbage('collect');
+end
+
+--New API
+local function LevelUpBG(frame, topcolor, bottomcolor)
+	frame.bg = frame:CreateTexture(nil, 'BACKGROUND')
+	frame.bg:SetTexture([[Interface\LevelUp\LevelUpTex]])
+	frame.bg:SetPoint('CENTER')
+	frame.bg:SetTexCoord(0.00195313, 0.63867188, 0.03710938, 0.23828125)
+	frame.bg:SetVertexColor(1, 1, 1, 0.7)
+
+	frame.lineTop = frame:CreateTexture(nil, 'BACKGROUND')
+	frame.lineTop:SetDrawLayer('BACKGROUND', 2)
+	frame.lineTop:SetTexture([[Interface\LevelUp\LevelUpTex]])
+	frame.lineTop:SetPoint("TOP", frame.bg)
+	frame.lineTop:SetTexCoord(0.00195313, 0.81835938, 0.01953125, 0.03320313)
+	frame.lineTop:Size(frame:GetWidth(), 7)
+
+	frame.lineBottom = frame:CreateTexture(nil, 'BACKGROUND')
+	frame.lineBottom:SetDrawLayer('BACKGROUND', 2)
+	frame.lineBottom:SetTexture([[Interface\LevelUp\LevelUpTex]])
+	frame.lineBottom:SetPoint("BOTTOM", frame.bg)
+	frame.lineBottom:SetTexCoord(0.00195313, 0.81835938, 0.01953125, 0.03320313)
+	frame.lineBottom:Size(frame:GetWidth(), 7)
+
+	local ColorCode = {
+		["red"] = {1, 0, 0},
+		["green"] = {0, 1, 0},
+		["blue"] = {0.15, 0.3, 1},

+	}
+	if topcolor then
+		if T.type(topcolor) == "table" then
+			frame.lineTop:SetVertexColor(T.unpack(topcolor), 1)
+		elseif T.type(topcolor) == "string" then
+			if ColorCode[topcolor] then
+				local r, g, b = T.unpack(ColorCode[topcolor])
+				frame.lineTop:SetVertexColor(r, g, b, 1)
+			else
+				T.error(T.format("Invalid color setting in |cff00FFFFLevelUpBG|r(frame, |cffFF0000topcolor|r, bottomcolor). |cffFFFF00\"%s\"|r is not a supported color.", topcolor))
+				return
+			end
+		else
+			T.error("Invalid color setting in |cff00FFFFLevelUpBG|r(frame, |cffFF0000topcolor|r, bottomcolor).")
+			return
+		end
+	end
+	if bottomcolor then
+		if T.type(bottomcolor) == "table" then
+			frame.lineBottom:SetVertexColor(T.unpack(bottomcolor), 1)
+		elseif T.type(bottomcolor) == "string" then
+			if ColorCode[bottomcolor] then
+				local r, g, b = T.unpack(ColorCode[bottomcolor])
+				frame.lineBottom:SetVertexColor(r, g, b, 1)
+			else
+				T.error(T.format("Invalid color setting in |cff00FFFFLevelUpBG|r(frame, [topcolor, |cffFF0000bottomcolor|r). |cffFFFF00\"%s\"|r is not a supported color.", topcolor))
+				return
+			end
+		else
+			T.error("Invalid color setting in |cff00FFFFLevelUpBG|r(frame, [topcolor, |cffFF0000bottomcolor|r).")
+			return
+		end
 	end
-	E:UpdateAll()
 end

-function SLE:SetMoverPosition(mover, anchor, parent, point, x, y)
-	if not _G[mover] then return end
-	local frame = _G[mover]
-
-	frame:ClearAllPoints()
-	frame:SetPoint(anchor, parent, point, x, y)
-	E:SaveMoverPosition(mover)
+--Add API
+local function addapi(object)
+	local mt = getmetatable(object).__index
+	if not object.LevelUpBG then mt.LevelUpBG = LevelUpBG end
 end
+
+local handled = {["Frame"] = true}
+local object = CreateFrame("Frame")
+addapi(object)
+addapi(object:CreateTexture())
+addapi(object:CreateFontString())
+
+object = EnumerateFrames()
+while object do
+	if not object:IsForbidden() and not handled[object:GetObjectType()] then
+		addapi(object)
+		handled[object:GetObjectType()] = true
+	end
+
+	object = EnumerateFrames(object)
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/core/toolsRu.lua b/ElvUI_SLE/core/toolsRu.lua
new file mode 100644
index 0000000..7a6cbf4
--- /dev/null
+++ b/ElvUI_SLE/core/toolsRu.lua
@@ -0,0 +1,48 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+
+function SLE:CyrCommands()
+	SLASH_RELOADUI3 = "/кд"
+
+	E:RegisterChatCommand("шт", "DelayScriptCall") --in
+	E:RegisterChatCommand("ус", "ToggleConfig") --ec
+	E:RegisterChatCommand("удмгш", "ToggleConfig") --elvui
+	E:RegisterChatCommand('ипыефеы', 'BGStats') --bgstats
+	E:RegisterChatCommand('руддщлшеен', 'HelloKittyToggle') --hellokitty
+	E:RegisterChatCommand('руддщлшеенашч', 'HelloKittyFix') --hellokittyfix
+	E:RegisterChatCommand('рфкдуьырфлу', 'HarlemShakeToggle') --harlemshake
+	E:RegisterChatCommand('упкшв', 'Grid') --egrid
+	E:RegisterChatCommand("ьщмугш", "ToggleConfigMode") --moveui
+	E:RegisterChatCommand("куыуегш", "ResetUI") --resetui
+	-- E:RegisterChatCommand('сдуфтпгшдв', 'MassGuildKick') --cleanguild
+	-- E:RegisterChatCommand('фзкшдащщды', 'DisableTukuiMode') --aprilfools
+
+	if E.ActionBars then
+		self:RegisterChatCommand('ли', E.ActionBars.ActivateBindMode) --kb
+	end
+end
+
+function SLE:CyrDevCommands()
+	SLASH_FRAME2 = "/акфьу"
+	SLASH_FRAMELIST2 = "/акфьудшые"
+	SLASH_TEXLIST2 = "/еучдшые"
+
+	E:RegisterChatCommand('дгфуккщк', 'LuaError') --luaerror
+	E:RegisterChatCommand('сзгшьзфсе', 'GetCPUImpact') --cpuimpact
+	E:RegisterChatCommand('сзггыфпу', 'GetTopCPUFunc') --cpuusage
+	E:RegisterChatCommand('утфидуидшяяфкв', 'EnableBlizzardAddOns') --enableblizzard
+end
+
+function SLE:CyrillicsInit()
+	if GetLocale() == "ruRU" then
+		SLE.Russian = true
+
+		SLE.RuMonths = {"Января","Февраля","Марта","Апреля","Мая","Июня","Июля","Августа","Сентября","Октября","Ноября","Декабря"}
+		SLE.RuWeek = {"Воскресенье","Понедельник","Вторник","Среда","Четверг","Пятница","Суббота"}
+	end
+
+	if E.global.sle.advanced.cyrillics.commands or GetLocale() == "ruRU" then SLE:CyrCommands() end
+	if E.global.sle.advanced.cyrillics.devCommands or GetLocale() == "ruRU" then SLE:CyrDevCommands() end
+end
+-- if GetLocale() ~= "ruRU" then return end
+
+
diff --git a/ElvUI_SLE/defaults/private.lua b/ElvUI_SLE/defaults/private.lua
index 5d9bcb3..fa3e6fe 100644
--- a/ElvUI_SLE/defaults/private.lua
+++ b/ElvUI_SLE/defaults/private.lua
@@ -1,75 +1,188 @@
-local E, L, V, P, G = unpack(ElvUI);
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))

-V['skins']['addons'] = {
-	['EmbedSkada'] = true,
+V["skins"]["addons"] = {
+	["EmbedSkada"] = true,
 }

-V['sle'] = {
-	["datatext"] = {
-		["dp1hide"] = false,
-		["dp2hide"] = false,
-		["tophide"] = false,
-		["dp3hide"] = false,
-		["dp4hide"] = false,
-		["dp5hide"] = false,
-		["bottomhide"] = false,
-		["dp6hide"] = false,
+V["sle"] = {
+	["equip"] = {
+		["enable"] = false,
+		["spam"] = false,
+		["instanceSet"] = false,
+		["pvpSet"] = false,
+		["firstSpec"] = {
+			["general"] = "NONE",
+			["pvp"] = "NONE",
+			["instance"] = "NONE",
+		},
+		["secondSpec"] = {
+			["general"] = "NONE",
+			["pvp"] = "NONE",
+			["instance"] = "NONE",
+		},
+		["thirdSpec"] = {
+			["general"] = "NONE",
+			["pvp"] = "NONE",
+			["instance"] = "NONE",
+		},
+		["forthSpec"] = {
+			["general"] = "NONE",
+			["pvp"] = "NONE",
+			["instance"] = "NONE",
+		},
+		["setoverlay"] = false,
+	},
+
+	--Minimap Module
+	["minimap"] = {
+		["buttons"] = {
+			["enable"] = true,
+		},
+		["mapicons"] = {
+			["enable"] = false,
+			["barenable"] = false,
+		},
 	},

-	['exprep'] = {
-		['autotrack'] = false,
+	["bags"] = {
+		["transparentSlots"] = false,
 	},

-	['farm'] = {
-		['enable'] = false,
-		['seedtrash'] = false,
+	["vehicle"] = {
+		["enable"] = false,
 	},

-	['equip'] = {
-		['enable'] = false,
-		['spam'] = false,
-		['primary'] = "NONE",
-		['secondary'] = "NONE",
-		['instance'] = "NONE",
-		['pvp'] = "NONE",
-		['setoverlay'] = false,
+	["professions"] = {
+		["deconButton"] = {
+			["enable"] = true,
+			["style"] = "BIG",
+			["buttonGlow"] = true,
+		},
+		["enchant"] = {
+			["enchScroll"] = false,
+		},
+		["fishing"] = {
+			["EasyCast"] = false,
+			["FromMount"] = false,
+			["UseLures"] = true,
+			["IgnorePole"] = false,
+			["CastButton"] = "Shift",
+		},
 	},

-	--Minimap Moduel
-	['minimap'] = {
-		['buttons'] = {
-			['enable'] = true,
-		},
-		['mapicons'] = {
-			['enable'] = false,
+	["module"] = {
+		["screensaver"] = false,
+		["blizzmove"] = true,
+	},
+
+	["unitframe"] = {
+		["resizeHealthPrediction"] = false,
+		["statusbarTextures"] = {
+			["power"] = false,
+			["cast"] = false,
+			["aura"] = false,
+			["class"] = false,
 		},
 	},

-	['loot'] = {
-		['enable'] = false,
-		['autoconfirm'] = false,
-		['autogreed'] = false,
-		['autodisenchant'] = false,
+	["chat"] = {
+		["chatMax"] = 128,
+		["chatHistory"] = {
+			["CHAT_MSG_INSTANCE_CHAT"] = true,
+			["CHAT_MSG_INSTANCE_CHAT_LEADER"] = true,
+			["CHAT_MSG_BN_WHISPER"] = true,
+			["CHAT_MSG_BN_WHISPER_INFORM"] = true,
+			["CHAT_MSG_CHANNEL"] = true,
+			["CHAT_MSG_EMOTE"] = true,
+			["CHAT_MSG_GUILD"] = true,
+			["CHAT_MSG_GUILD_ACHIEVEMENT"] = true,
+			["CHAT_MSG_OFFICER"] = true,
+			["CHAT_MSG_PARTY"] = true,
+			["CHAT_MSG_PARTY_LEADER"] = true,
+			["CHAT_MSG_RAID"] = true,
+			["CHAT_MSG_RAID_LEADER"] = true,
+			["CHAT_MSG_RAID_WARNING"] = true,
+			["CHAT_MSG_SAY"] = true,
+			["CHAT_MSG_WHISPER"] = true,
+			["CHAT_MSG_WHISPER_INFORM"] = true,
+			["CHAT_MSG_YELL"] = true,
+			["size"] = 128,
+		},
 	},
-
-	['vehicle'] = {
-		['enable'] = false,
+	["pvp"] = {
+		["KBbanner"] = {
+			["enable"] = false,
+			["sound"] = true,
+		},
 	},
-
-	['backgrounds'] = false,
-
-	['uiButtonStyle'] = "dropdown",
-
-	['auras'] = {
-		['consolidatedMark'] = false,
+	["actionbars"] = {
+		["oorBind"] = false,
+		["checkedtexture"] = false,
+		["checkedColor"] = {r = 0, g = 1, b = 0, a = 0.3},
+		["transparentBackdrop"] = false,
+		["transparentButtons"] = false,
+	},
+	["skins"] = {
+		["objectiveTracker"] = {
+			["enable"] = true,
+			["texture"] = "ElvUI Norm",
+			["class"] = false,
+			["color"] = {r = 0.26, g = 0.42, b = 1},
+			["underlineHeight"] = 1,
+		},
+		["QuestKing"] = {
+			["enable"] = false,
+			["tooltipAnchor"] = "ANCHOR_LEFT",
+			["tooltipScale"] = 0.9,
+			["clickTemplate"] = "QuestKing",
+			["trackerIcon"] = "DEFAULT",
+			["trackerIconCustom"] = "",
+			["trackerSize"] = 10,
+			["questTypes"] = {
+				["daily"] = "DEFAULT",
+				["weekly"] = "DEFAULT",
+				["group"] = "DEFAULT",
+				["raid"] = "DEFAULT",
+				["dungeon"] = "DEFAULT",
+				["heroic"] = "DEFAULT",
+				["legend"] = "DEFAULT",
+				["scenario"] = "DEFAULT",
+			},
+		},
+		["petbattles"] = {
+			["enable"] = true,
+		},
+		["merchant"] = {
+			["enable"] = false,
+			["subpages"] = 2,
+		},
 	},
+	["uiButtonStyle"] = "classic"
 }

-G['sle'] = {
-	['export'] = {
-		['full'] = false,
-		['profile'] = true,
-		['private'] = false,
-		['global'] = false,
+G["sle"] = {
+	["DE"] = {
+		["Blacklist"] = "",
+		["IgnoreTabards"] = true,
+		["IgnorePanda"] = true,
+		["IgnoreCooking"] = true,
+		["IgnoreFishing"] = true,
+	},
+	["LOCK"] = {
+		["Blacklist"] = "",
+		["TradeOpen"] = false,
+	},
+	["advanced"] = {
+		["general"] = false,
+		["optionsLimits"] = false,
+		["gameMenu"] = {
+			["enable"] = true,
+			["reload"] = false,
+		},
+		["confirmed"] = false,
+		["cyrillics"] = {
+			["commands"] = false,
+			["devCommands"] = false,
+		},
 	},
 }
\ No newline at end of file
diff --git a/ElvUI_SLE/defaults/profile.lua b/ElvUI_SLE/defaults/profile.lua
index 021f1f3..04fe390 100644
--- a/ElvUI_SLE/defaults/profile.lua
+++ b/ElvUI_SLE/defaults/profile.lua
@@ -1,507 +1,774 @@
-local E, L, V, P, G = unpack(ElvUI);
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))

-P['sle'] = {
+P["sle"] = {
 	--Auras
-	['auras'] = {
-		['enable'] = false,
-		['buffs'] = {
-			['hideTimer'] = false,
-		},
-		['debuffs'] = {
-			['hideTimer'] = false,
-		},
-		['tempenchants'] = {
-			['hideTimer'] = false,
-		},
+	["auras"] = {
+		["hideBuffsTimer"] = false,
+		["hideDebuffsTimer"] = false,
 	},
-	--Background frames
-	['backgrounds'] = {
-		['bottom'] = {
-			['enabled'] = false,
-			['trans'] = false,
-			['texture'] = "",
-			['width'] = (E.eyefinity or E.screenwidth)/4 + 32,
-			['height'] = E.screenheight/6 - 13,
-			['xoffset'] = 0,
-			['yoffset'] = 0,
-			['pethide'] = true,
-			['template'] = "Default",
-			['alpha'] = 1,
-			['clickthrough'] = true,
-		},
-		['left'] = {
-			['enabled'] = false,
-			['trans'] = false,
-			['texture'] = "",
-			['width'] = (E.eyefinity or E.screenwidth)/10 - 4,
-			['height'] = E.screenheight/5 + 11,
-			['xoffset'] = 0,
-			['yoffset'] = 0,
-			['pethide'] = true,
-			['template'] = "Default",
-			['alpha'] = 1,
-			['clickthrough'] = false,
-		},
-		['right'] = {
-			['enabled'] = false,
-			['trans'] = false,
-			['texture'] = "",
-			['width'] = (E.eyefinity or E.screenwidth)/10 - 4,
-			['height'] = E.screenheight/5 + 11,
-			['xoffset'] = 0,
-			['yoffset'] = 0,
-			['pethide'] = true,
-			['template'] = "Default",
-			['alpha'] = 1,
-			['clickthrough'] = false,
-		},
-		['action'] = {
-			['enabled'] = false,
-			['trans'] = false,
-			['texture'] = "",
-			['width'] = (E.eyefinity or E.screenwidth)/4 + 32,
-			['height'] = E.screenheight/20 + 5,
-			['xoffset'] = 0,
-			['yoffset'] = 0,
-			['pethide'] = true,
-			['template'] = "Default",
-			['alpha'] = 1,
-			['clickthrough'] = true,
+	--Screensaver
+	["screensaver"] = {
+			["keydown"] = false,
+			["title"] = {
+				["font"] = "PT Sans Narrow",
+				["size"] = 28,
+				["outline"] = "OUTLINE",
+			},
+			["subtitle"] = {
+				["font"] = "PT Sans Narrow",
+				["size"] = 15,
+				["outline"] = "OUTLINE",
+			},
+			["date"] = {
+				["font"] = "PT Sans Narrow",
+				["size"] = 15,
+				["outline"] = "OUTLINE",
+			},
+			["player"] = {
+				["font"] = "PT Sans Narrow",
+				["size"] = 15,
+				["outline"] = "OUTLINE",
+			},
+			["tips"] = {
+				["font"] = "PT Sans Narrow",
+				["size"] = 20,
+				["outline"] = "OUTLINE",
+			},
+			["crest"] = 128,
+			["xpack"] = 150,
+			["height"] = 135,
+			["playermodel"] = {
+				["anim"] = 4,
+				["distance"] = 4.5,
+				["holderXoffset"] = 0,
+				["holderYoffset"] = 0,
+				["rotation"] = 0,
+			},
+			["animTime"] = 0,
+			["animBounce"] = true,
+			["animType"] = "SlideIn",
+			["tipThrottle"] = 15,
+			["panelTemplate"] = "Transparent",
+		},
+	--Backgrounds
+	["backgrounds"] = {
+		["bg1"] = {
+			["enabled"] = false,
+			["trans"] = false,
+			["texture"] = "",
+			["width"] = (E.eyefinity or E.screenwidth)/4 + 32,
+			["height"] = E.screenheight/6 - 13,
+			["xoffset"] = 0,
+			["yoffset"] = 0,
+			["pethide"] = true,
+			["template"] = "Default",
+			["alpha"] = 1,
+			["clickthrough"] = true,
+		},
+		["bg2"] = {
+			["enabled"] = false,
+			["trans"] = false,
+			["texture"] = "",
+			["width"] = (E.eyefinity or E.screenwidth)/10 - 4,
+			["height"] = E.screenheight/5 + 11,
+			["xoffset"] = 0,
+			["yoffset"] = 0,
+			["pethide"] = true,
+			["template"] = "Default",
+			["alpha"] = 1,
+			["clickthrough"] = false,
+		},
+		["bg3"] = {
+			["enabled"] = false,
+			["trans"] = false,
+			["texture"] = "",
+			["width"] = (E.eyefinity or E.screenwidth)/10 - 4,
+			["height"] = E.screenheight/5 + 11,
+			["xoffset"] = 0,
+			["yoffset"] = 0,
+			["pethide"] = true,
+			["template"] = "Default",
+			["alpha"] = 1,
+			["clickthrough"] = false,
+		},
+		["bg4"] = {
+			["enabled"] = false,
+			["trans"] = false,
+			["texture"] = "",
+			["width"] = (E.eyefinity or E.screenwidth)/4 + 32,
+			["height"] = E.screenheight/20 + 5,
+			["xoffset"] = 0,
+			["yoffset"] = 0,
+			["pethide"] = true,
+			["template"] = "Default",
+			["alpha"] = 1,
+			["clickthrough"] = true,
 		},
 	},
-
-	--Chat
-	['chat'] = {
-		['guildmaster'] = false,
-		['dpsSpam'] = false,
-		['textureAlpha'] = {
-			['enable'] = false,
-			['alpha'] = 0.5,
-		},
-		['combathide'] = "NONE",
-	},
-
-	--Combat Icon
-	['combatico'] = {
-		['pos'] = 'TOP',
+	--PvP
+	["pvp"] = {
+		["autorelease"] = false,
+		["rebirth"] = true,
+		["duels"] = {
+			["regular"] = false,
+			["pet"] = false,
+			["announce"] = false,
+		},
 	},
-
 	--Datatexts panels
-	['datatext'] = {
-		['dp1'] = {
-			['enabled'] = false,
-			['width'] = (E.eyefinity or E.screenwidth)/5,
-			['pethide'] = true,
-			['alpha'] = 1,
-		},
-		['dp2'] = {
-			['enabled'] = false,
-			['width'] = (E.eyefinity or E.screenwidth)/5,
-			['pethide'] = true,
-			['alpha'] = 1,
-		},
-		['top'] = {
-			['enabled'] = false,
-			['width'] = (E.eyefinity or E.screenwidth)/5 - 4,
-			['pethide'] = true,
-			['alpha'] = 1,
-		},
-		['dp3'] = {
-			['enabled'] = false,
-			['width'] = (E.eyefinity or E.screenwidth)/5,
-			['pethide'] = true,
-			['alpha'] = 1,
-		},
-		['dp4'] = {
-			['enabled'] = false,
-			['width'] = (E.eyefinity or E.screenwidth)/5,
-			['pethide'] = true,
-			['alpha'] = 1,
-		},
-		['dp5'] = {
-			['enabled'] = false,
-			['width'] = (E.eyefinity or E.screenwidth)/4 - 60,
-			['pethide'] = true,
-			['alpha'] = 1,
-		},
-		['bottom'] = {
-			['enabled'] = false,
-			['width'] = (E.eyefinity or E.screenwidth)/10 - 4,
-			['pethide'] = true,
-			['alpha'] = 1,
-		},
-		['dp6'] = {
-			['enabled'] = false,
-			['width'] = (E.eyefinity or E.screenwidth)/4 - 60,
-			['pethide'] = true,
-			['alpha'] = 1,
-		},
-		['chatleft'] = {
-			['enabled'] = true,
-			['width'] = 396,
-			['alpha'] = 1,
-		},
-		['chatright'] = {
-			['enabled'] = true,
-			['width'] = 396,
-			['alpha'] = 1,
-		},
-		['dashboard'] = {
-			['enable'] = false,
-			['width'] = 100,
-			['alpha'] = 1,
-		},
-		['chathandle'] = false,
+	["datatexts"] = {
+		["panel1"] = {
+			["enabled"] = false,
+			["width"] = (E.eyefinity or E.screenwidth)/5,
+			["pethide"] = true,
+			["alpha"] = 1,
+			["transparent"] = false,
+			["noback"] = false,
+			["mouseover"] = false,
+		},
+		["panel2"] = {
+			["enabled"] = false,
+			["width"] = (E.eyefinity or E.screenwidth)/5,
+			["pethide"] = true,
+			["alpha"] = 1,
+			["transparent"] = false,
+			["noback"] = false,
+			["mouseover"] = false,
+		},
+		["panel3"] = {
+			["enabled"] = false,
+			["width"] = (E.eyefinity or E.screenwidth)/5 - 4,
+			["pethide"] = true,
+			["alpha"] = 1,
+			["transparent"] = false,
+			["noback"] = false,
+			["mouseover"] = false,
+		},
+		["panel4"] = {
+			["enabled"] = false,
+			["width"] = (E.eyefinity or E.screenwidth)/5,
+			["pethide"] = true,
+			["alpha"] = 1,
+			["transparent"] = false,
+			["noback"] = false,
+			["mouseover"] = false,
+		},
+		["panel5"] = {
+			["enabled"] = false,
+			["width"] = (E.eyefinity or E.screenwidth)/5,
+			["pethide"] = true,
+			["alpha"] = 1,
+			["transparent"] = false,
+			["noback"] = false,
+			["mouseover"] = false,
+		},
+		["panel6"] = {
+			["enabled"] = false,
+			["width"] = (E.eyefinity or E.screenwidth)/4 - 60,
+			["pethide"] = true,
+			["alpha"] = 1,
+			["transparent"] = false,
+			["noback"] = false,
+			["mouseover"] = false,
+		},
+		["panel7"] = {
+			["enabled"] = false,
+			["width"] = (E.eyefinity or E.screenwidth)/10 - 4,
+			["pethide"] = true,
+			["alpha"] = 1,
+			["transparent"] = false,
+			["noback"] = false,
+			["mouseover"] = false,
+		},
+		["panel8"] = {
+			["enabled"] = false,
+			["width"] = (E.eyefinity or E.screenwidth)/4 - 60,
+			["pethide"] = true,
+			["alpha"] = 1,
+			["transparent"] = false,
+			["noback"] = false,
+
+		},
+		["leftchat"] = {
+			["enabled"] = true,
+			["width"] = 396,
+			["alpha"] = 1,
+		},
+		["rightchat"] = {
+			["enabled"] = true,
+			["width"] = 396,
+			["alpha"] = 1,
+		},
+		["chathandle"] = true,
 	},
-
-	--DT Options
-	['dt'] = {
-		['friends'] = {
-			['combat'] = false,
-			['hideFriends'] = false,
-			['sortBN'] = 'TOONNAME',
-			['tooltipAutohide'] = 0.2,
-			['totals'] = false,
-		},
-		['guild'] = {
-			['combat'] = false,
-			['hideGuild'] = false,
-			['sortGuild'] = 'TOONNAME',
-			['tooltipAutohide'] = 0.2,
-			['totals'] = false,
-		},
-		['mail'] = {
-			['icon'] = true,
-		},
-		['durability'] = {
-			['gradient'] = false,
-			['threshold'] = -1,
-		}
+	--LFR options
+	["lfr"] = {
+		["enabled"] = false,
+		["cata"] = {
+			["ds"] = false,
+		},
+		["mop"] = {
+			["mv"] = false,
+			["hof"] = false,
+			["toes"] = false,
+			["tot"] = false,
+			["soo"] = false,
+		},
+		["wod"] = {
+			["hm"] = false,
+			["brf"] = false,
+			["hfc"] = false,
+		},
+		["legion"] = {
+			["nightmare"] = false,
+			["palace"] = false,
+		},
 	},
-
-	--Exp/Rep Bar
-	['exprep'] = {
-		['explong'] = false,
-		['replong'] = false,
+	--SLE Datatexts
+	["dt"] = {
+		["friends"] = {
+			["combat"] = false,
+			["expandBNBroadcast"] = false,
+			["hideFriends"] = false,
+			["hide_hintline"] = false,
+			["sortBN"] = 'TOONNAME',
+			["tooltipAutohide"] = 0.2,
+			["totals"] = false,
+		},
+		["guild"] = {
+			["combat"] = false,
+			["hide_gmotd"] = false,
+			["hideGuild"] = false,
+			["hide_guildname"] = false,
+			["hide_hintline"] = false,
+			["sortGuild"] = 'TOONNAME',
+			["tooltipAutohide"] = 0.2,
+			["totals"] = false,
+		},
+		["mail"] = {
+			["icon"] = true,
+		},
+		["durability"] = {
+			["gradient"] = false,
+			["threshold"] = -1,
+		},
+		["currency"] = {
+			["Archaeology"] = true,
+			["Jewelcrafting"] = true,
+			["PvP"] = true,
+			["Raid"] = true,
+			["Cooking"] = true,
+			["Miscellaneous"] = true,
+			["Zero"] = true,
+			["Icons"] = true,
+			["Faction"] = true,
+			["Unused"] = true,
+		},
+		["regen"] = {
+			["short"] = false,
+		},
 	},
-
-	--Farm Module
-	['farm'] = {
-		['active'] = true,
-		['size'] = 30,
-		['autotarget'] = false,
-		['seedor'] = "TOP",
-		['quest'] = false,
+	--Misc
+	["misc"] = {
+		["threat"] = {
+			["enable"] = false,
+			["position"] = "RightChatDataPanel",
+		},
+		["viewport"] = {
+			["left"] = 0,
+			["right"] = 0,
+			["top"] = 0,
+			["bottom"] = 0,
+		},
 	},
-
-	--LFR options
-	['lfrshow'] = {
-		['enabled'] = false,
-		['ds'] = false,
-		['mv'] = false,
-		['hof'] = false,
-		['toes'] = false,
-		['tot'] = false,
-		['soo'] = false,
-		['leishen'] = false,
-		['hm'] = false,
-		['brf'] = false,
-		['hfc'] = false,
+	--Blizzard
+	["blizzard"] = {
+		["rumouseover"] = false,
+		["errorframe"] = {
+			["height"] = 60,
+			["width"] = 512,
+		},
+		["vehicleSeatScale"] = 1,
 	},
-
-	--Loot (Restructured)
-	['loot'] = {
-		['enable'] = false,
-		['autoroll'] = {
-			['enable'] = true,
-			['autoconfirm'] = false,
-			['autode'] = false,
-			['autogreed'] = false,
-			['autoqlty'] = 2,
-			['bylevel'] = false,
-			['level'] = 1,
-		},
-		['announcer'] = {
-			['auto'] = true,
-			['channel'] = "RAID",
-			['enable'] = false,
-			['override'] = '5',
-			['quality'] = "EPIC",
-		},
-		['history'] = {
-			['alpha'] = 1,
-			['autohide'] = false,
+	--Chat
+	["chat"] = {
+		["guildmaster"] = false,
+		["dpsSpam"] = false,
+		["textureAlpha"] = {
+			["enable"] = false,
+			["alpha"] = 0.5,
+		},
+		["combathide"] = "NONE",
+		["editboxhistory"] = 5,
+		["justify"] = {
+			["frame1"] = "LEFT",
+			["frame2"] = "LEFT",
+			["frame3"] = "LEFT",
+			["frame4"] = "LEFT",
+			["frame5"] = "LEFT",
+			["frame6"] = "LEFT",
+			["frame7"] = "LEFT",
+			["frame8"] = "LEFT",
+			["frame9"] = "LEFT",
+			["frame10"] = "LEFT",
+		},
+		["tab"] = {
+			["select"] = false,
+			["style"] = "DEFAULT",
+			["color"] = {r = 1, g = 1, b = 1},
 		},
 	},
-
-	--Media
-	['media'] = {
-		['fonts'] = {
-			['zone'] = {
-				['font'] = "PT Sans Narrow",
-				['size'] = 32,
-				['outline'] = "OUTLINE",
-				['width'] = 512,
-			},
-			['subzone'] = {
-				['font'] = "PT Sans Narrow",
-				['size'] = 25,
-				['outline'] = "OUTLINE",
-				['offset'] = 0,
-				['width'] = 512,
+	--Legacy
+	["legacy"] = {
+		["garrison"] = {
+			["autoOrder"] = {
+				["enable"] = false,
+				["autoWar"] = false,
+				["autoTrade"] = false,
+				["autoShip"] = false,
 			},
-			['pvp'] = {
-				['font'] = "PT Sans Narrow",
-				['size'] = 22,
-				['outline'] = "OUTLINE",
-				['width'] = 512,
-			},
-			['mail'] = {
-				['font'] = "PT Sans Narrow",
-				['size'] = 12,
-				['outline'] = "NONE",
-			},
-			['editbox'] = {
-				['font'] = "PT Sans Narrow",
-				['size'] = 12,
-				['outline'] = "NONE",
-			},
-			['gossip'] = {
-				['font'] = "PT Sans Narrow",
-				['size'] = 12,
-				['outline'] = "NONE",
+			["toolbar"] = {
+				["buttonsize"] = 30,
+				["active"] = true,
+				["enable"] = false,
 			},
 		},
-		['screensaver'] = {
-			['enable'] = false,
-			['title'] = {
-				['font'] = "PT Sans Narrow",
-				['size'] = 28,
-				['outline'] = "OUTLINE",
-			},
-			['subtitle'] = {
-				['font'] = "PT Sans Narrow",
-				['size'] = 15,
-				['outline'] = "OUTLINE",
-			},
-			['date'] = {
-				['font'] = "PT Sans Narrow",
-				['size'] = 15,
-				['outline'] = "OUTLINE",
+		["farm"] = {
+			["active"] = true,
+			["buttonsize"] = 30,
+			["autotarget"] = false,
+			["seedor"] = "TOP",
+			["quest"] = false,
+			["enable"] = false,
+		},
+	},
+	--Nameplate Options
+	["nameplate"] = {
+		["showthreat"] = false,
+		["targetcount"] = false,
+	},
+	--Loot
+	["loot"] = {
+		["enable"] = false,
+		["autoroll"] = {
+			["enable"] = true,
+			["autoconfirm"] = false,
+			["autode"] = false,
+			["autogreed"] = false,
+			["autoqlty"] = 2,
+			["bylevel"] = false,
+			["level"] = 1,
+		},
+		["announcer"] = {
+			["auto"] = true,
+			["channel"] = "RAID",
+			["enable"] = false,
+			["override"] = '5',
+			["quality"] = "EPIC",
+		},
+		["history"] = {
+			["alpha"] = 1,
+			["autohide"] = false,
+		},
+		["looticons"] = {
+			["enable"] = false,
+			["position"] = "LEFT",
+			["size"] = 12,
+			["channels"] = {
+				["CHAT_MSG_BN_WHISPER"] = false,
+				["CHAT_MSG_BN_WHISPER_INFORM"] = false,
+				["CHAT_MSG_BN_CONVERSATION"] = false,
+				["CHAT_MSG_CHANNEL"] = false,
+				["CHAT_MSG_EMOTE"] = false,
+				["CHAT_MSG_GUILD"] = false,
+				["CHAT_MSG_INSTANCE_CHAT"] = false,
+				["CHAT_MSG_INSTANCE_CHAT_LEADER"] = false,
+				["CHAT_MSG_LOOT"] = true,
+				["CHAT_MSG_OFFICER"] = false,
+				["CHAT_MSG_PARTY"] = false,
+				["CHAT_MSG_PARTY_LEADER"] = false,
+				["CHAT_MSG_RAID"] = false,
+				["CHAT_MSG_RAID_LEADER"] = false,
+				["CHAT_MSG_RAID_WARNING"] = false,
+				["CHAT_MSG_SAY"] = false,
+				["CHAT_MSG_SYSTEM"] = true,
+				["CHAT_MSG_WHISPER"] = false,
+				["CHAT_MSG_WHISPER_INFORM"] = false,
+				["CHAT_MSG_YELL"] = false,
 			},
-			['player'] = {
-				['font'] = "PT Sans Narrow",
-				['size'] = 15,
-				['outline'] = "OUTLINE",
+		},
+	},
+	--Datbars
+	["databars"] = {
+		["exp"] = {
+			["longtext"] = false,
+			["chatfilter"] = {
+				["enable"] = false,
+				["iconsize"] = 12,
+				["style"] = "STYLE1",
 			},
-			['tips'] = {
-				['font'] = "PT Sans Narrow",
-				['size'] = 20,
-				['outline'] = "OUTLINE",
+		},
+		["rep"] = {
+			["longtext"] = false,
+			["autotrack"] = false,
+			["chatfilter"] = {
+				["enable"] = false,
+				["iconsize"] = 12,
+				["style"] = "STYLE1",
+				["styleDec"] = "STYLE1",
+				["showAll"] = false,
+				["chatframe"] = "AUTO",
 			},
-			['playermodel'] = {
-				['anim'] = 47,
-				['position'] = "RIGHT",
-				['distance'] = 1,
-				['xaxis'] = -0.5,
-				['yaxis'] = 0,
-				['width'] = (E.eyefinity or E.screenwidth)/4,
-				['rotation'] = 0,
+		},
+		["honor"] = {
+			["longtext"] = false,
+			["chatfilter"] = {
+				["enable"] = false,
+				["iconsize"] = 12,
+				["style"] = "STYLE1",
+				["awardStyle"] = "STYLE1",
 			},
-			['crest'] = 128,
-			['xpack'] = 150,
-			['height'] = 135,
 		},
-	},
-
-	--Minimap Module
-	['minimap'] = {
-		['enable'] = false,
-		['combat'] = false,
-		['alpha'] = 1,
-		['coords'] = {
-			['display'] = "SHOW",
-			['middle'] = "CORNERS",
-			['decimals'] = true,
-		},
-		['buttons'] = {
-			['anchor'] = "NOANCHOR",
-			['size'] = 24,
-			['mouseover'] = false,
-		},
-		['mapicons'] = {
-			['iconmouseover'] = false,
-			['iconsize'] = 27,
-			['iconperrow'] = 12,
-			['pethide'] = false,
-			['skindungeon'] = false,
-		},
-		['instance'] = {
-			['enable'] = false,
-			['flag'] = true,
-			['xoffset'] = -10,
-			['yoffset'] = 0,
-			['colors'] = {
-				['lfr'] = {r = 0.32,g = 0.91,b = 0.25 },
-				['normal'] = {r = 0.09,g = 0.51,b = 0.82 },
-				['heroic'] = {r = 0.82,g = 0.42,b = 0.16 },
-				['challenge'] = {r = 0.9,g = 0.89,b = 0.27 },
-				['mythic'] = {r = 0.9,g = 0.14,b = 0.15 },
+		["artifact"] = {
+			["longtext"] = false,
+			["chatfilter"] = {
+				["enable"] = false,
+				["iconsize"] = 12,
+				["style"] = "STYLE1",
 			},
-			['font'] = "PT Sans Narrow",
-			['fontSize'] = 12,
-			['fontOutline'] = "OUTLINE",
 		},
 	},
-
-	--Nameplate Options
-	['nameplate'] = {
-		['showthreat'] = false,
-		['targetcount'] = false,
-	},
-
-	--Power text on classbars
-	['powtext'] = false,
-
-	--PvP Auto release
-	['pvpautorelease'] = true,
-
 	--Raid Markers
-	['raidmarkers'] = {
-		['enable'] = true,
-		['visibility'] = 'DEFAULT',
-		['customVisibility'] = "[noexists, nogroup] hide; show",
-		['backdrop'] = false,
-		['buttonSize'] = 22,
-		['spacing'] = 2,
-		['orientation'] = 'HORIZONTAL',
-		['modifier'] = 'shift-',
-		['reverse'] = false,
+	["raidmarkers"] = {
+		["enable"] = true,
+		["visibility"] = 'DEFAULT',
+		["customVisibility"] = "[noexists, nogroup] hide; show",
+		["backdrop"] = false,
+		["buttonSize"] = 22,
+		["spacing"] = 2,
+		["orientation"] = 'HORIZONTAL',
+		["modifier"] = 'shift-',
+		["reverse"] = false,
 	},
-
-	--Threat
-	['threat'] = {
-		['enable'] = true,
-		['position'] = "RightChatDataPanel",
+	--Quests
+	["quests"] = {
+		["visibility"] = {
+			["bg"] = "COLLAPSED",
+			["arena"] = "COLLAPSED",
+			["dungeon"] = "FULL",
+			["raid"] = "COLLAPSED",
+			["scenario"] = "FULL",
+			["rested"] = "FULL",
+			["garrison"] = "FULL",
+		},
+		["autoReward"] = false,
 	},
-
 	--Tooltip
-	['tooltip'] = {
-		['enable'] = false,
-		['showFaction'] = false,
-		['xOffset'] = 0,
-		['yOffset'] = 0,
+	["tooltip"] = {
+		["showFaction"] = false,
+		["xOffset"] = 0,
+		["yOffset"] = 0,
+		["alwaysCompareItems"] = false,
+		["RaidProg"] = {
+			["enable"] = false,
+			["NameStyle"] = "SHORT",
+			["DifStyle"] = "SHORT",
+		},
 	},
-	--Tooltip Faction Icon
-	--["tooltipicon"] = false,
-
-	--UI Buttons
-	['uibuttons'] = {
-		['enable'] = false,
-		['size'] = 17,
-		['mouse'] = false,
-		['menuBackdrop'] = false,
-		['dropdownBackdrop'] = false,
-		['orientation'] = "vertical",
-		['spacing'] = 3,
-		['point'] = "TOPLEFT",
-		['anchor'] = "TOPRIGHT",
-		['xoffset'] = 0,
-		['yoffset'] = 0,
-		['customroll'] = {
-			['min'] = "1",
-			['max'] = "50",
-		},
-		['Config'] = {
-			['enabled'] = false,
-			['called'] = "Reload",
-		},
-		['Addon'] = {
-			['enabled'] = false,
-			['called'] = "Manager",
-		},
-		['Status'] = {
-			['enabled'] = false,
-			['called'] = "AFK",
-		},
-		['Roll'] = {
-			['enabled'] = false,
-			['called'] = "Hundred",
+	--Minimap Module
+	["minimap"] = {
+		["combat"] = false,
+		["alpha"] = 1,
+		["coords"] = {
+			["enable"] = false,
+			["display"] = "SHOW",
+			["position"] = "BOTTOM",
+			["format"] = "%.0f",
+			["font"] = "PT Sans Narrow",
+			["fontSize"] = 12,
+			["fontOutline"] = "OUTLINE",
+			["throttle"] = 0.2,
+		},
+		["buttons"] = {
+			["anchor"] = "NOANCHOR",
+			["size"] = 24,
+			["mouseover"] = false,
+		},
+		["mapicons"] = {
+			["iconmouseover"] = false,
+			["iconsize"] = 27,
+			["iconperrow"] = 12,
+			["pethide"] = false,
+			["skindungeon"] = false,
+		},
+		["instance"] = {
+			["enable"] = false,
+			["flag"] = true,
+			["xoffset"] = -10,
+			["yoffset"] = 0,
+			["colors"] = {
+				["lfr"] = {r = 0.32,g = 0.91,b = 0.25},
+				["normal"] = {r = 0.09,g = 0.51,b = 0.82},
+				["heroic"] = {r = 0.82,g = 0.42,b = 0.16},
+				["challenge"] = {r = 0.9,g = 0.89,b = 0.27},
+				["mythic"] = {r = 0.9,g = 0.14,b = 0.15},
+				["time"] = {r = 0.41,g = 0.80,b = 0.94}
+			},
+			["font"] = "PT Sans Narrow",
+			["fontSize"] = 12,
+			["fontOutline"] = "OUTLINE",
+		},
+		["locPanel"] = {
+			["enable"] = false,
+			["width"] = 200,
+			["height"] = 21,
+			["linkcoords"] = true,
+			["template"] = "Transparent",
+			["font"] = "PT Sans Narrow",
+			["fontSize"] = 12,
+			["fontOutline"] = "OUTLINE",
+			["throttle"] = 0.2,
+			["format"] = "%.0f",
+			["zoneText"] = true,
+			["colorType"] = "REACTION",
+			["customColor"] = {r = 1, g = 1, b = 1 },
+			["portals"] = {
+				["enable"] = true,
+				["customWidth"] = false,
+				["customWidthValue"] = 200,
+				["justify"] = "LEFT",
+				["cdFormat"] = "DEFAULT",
+			},
 		},
 	},
-
-	['rumouseover'] = false,
-
-	['bags'] = {
-		['lootflash'] = true,
+	--Bags
+	["bags"] = {
+		["lootflash"] = true,
 	},
-
-	['garrison'] = {
-		['autoOrder'] = false,
-		['autoWar'] = false,
-		['autoTrade'] = false,
-		['autoShip'] = false,
+	--Skins
+	["skins"] = {
+		["objectiveTracker"] = {
+			["classHeader"] = false,
+			["colorHeader"] = {r = 1, g = 0.82, b = 0},
+			["underline"] = true,
+			["underlineClass"] = false,
+			["underlineColor"] = {r = 1, g = 0.82, b = 0},
+		},
 	},
-
-	['errorframe'] = {
-		['height'] = 60,
-		['width'] = 512,
+	--Unitfrmes
+	["unitframes"] = {
+		["unit"] = {
+			["player"] = {
+				["combatico"] = {
+					["xoffset"] = 0,
+					["yoffset"] = 0,
+					["size"] = 19,
+					["texture"] = "DEFAULT",
+					["red"] = true,
+				},
+				["rested"] = {
+					["xoffset"] = 0,
+					["yoffset"] = 0,
+					["size"] = 22,
+					["texture"] = "DEFAULT",
+					["customTexture"] = "",
+				},
+				["higherPortrait"] = false,
+				["portraitAlpha"] = 0.35,
+			},
+			["target"] = {
+				["higherPortrait"] = false,
+				["portraitAlpha"] = 0.35,
+			},
+			["focus"] = {
+				["higherPortrait"] = false,
+				["portraitAlpha"] = 0.35,
+			},
+			["party"] = {
+				["offline"] = {
+					["enable"] = false,
+					["size"] = 36,
+					["xOffset"] = 0,
+					["yOffset"] = 0,
+					["texture"] = "ALERT",
+					["CustomTexture"] = "",
+				},
+				["role"] = {
+					["xoffset"] = 0,
+					["yoffset"] = 0,
+				},
+				["higherPortrait"] = false,
+				["portraitAlpha"] = 0.35,
+			},
+			["raid"] = {
+				["offline"] = {
+					["enable"] = false,
+					["size"] = 36,
+					["xOffset"] = 0,
+					["yOffset"] = 0,
+					["texture"] = "ALERT",
+					["CustomTexture"] = "",
+				},
+				["role"] = {
+					["xoffset"] = 0,
+					["yoffset"] = 0,
+				},
+				["higherPortrait"] = false,
+				["portraitAlpha"] = 0.35,
+			},
+			["raid40"] = {
+				["offline"] = {
+					["enable"] = false,
+					["size"] = 20,
+					["xOffset"] = 0,
+					["yOffset"] = 0,
+					["texture"] = "ALERT",
+					["CustomTexture"] = "",
+				},
+				["role"] = {
+					["xoffset"] = 0,
+					["yoffset"] = 0,
+				},
+				["higherPortrait"] = false,
+				["portraitAlpha"] = 0.35,
+			},
+			["boss"] = {
+				["higherPortrait"] = false,
+				["portraitAlpha"] = 0.35,
+			},
+			["arena"] = {
+				["higherPortrait"] = false,
+				["portraitAlpha"] = 0.35,
+			},
+		},
+		["roleicons"] = "ElvUI",
+		["statusTextures"] = {
+			["powerTexture"] = "ElvUI Norm",
+			["castTexture"] = "ElvUI Norm",
+			["auraTexture"] = "ElvUI Norm",
+			["classTexture"] = "ElvUI Norm",
+		},
 	},
-
-	['roleicons'] = "ElvUI",
-
-	['quests'] = {
-		['visibility'] = {
-			['bg'] = "COLLAPSED",
-			['arena'] = "COLLAPSED",
-			['dungeon'] = "FULL",
-			['raid'] = "COLLAPSED",
-			['scenario'] = "FULL",
-			['rested'] = "FULL",
-			['garrison'] = "FULL",
+	--Raid Manager
+	["raidmanager"] = {
+		["level"] = true,
+		["roles"] = false,
+	},
+	--Media
+	["media"] = {
+		["fonts"] = {
+			["zone"] = {
+				["font"] = "PT Sans Narrow",
+				["size"] = 32,
+				["outline"] = "OUTLINE",
+				["width"] = 512,
+			},
+			["subzone"] = {
+				["font"] = "PT Sans Narrow",
+				["size"] = 25,
+				["outline"] = "OUTLINE",
+				["offset"] = 0,
+				["width"] = 512,
+			},
+			["pvp"] = {
+				["font"] = "PT Sans Narrow",
+				["size"] = 22,
+				["outline"] = "OUTLINE",
+				["width"] = 512,
+			},
+			["mail"] = {
+				["font"] = "PT Sans Narrow",
+				["size"] = 12,
+				["outline"] = "NONE",
+			},
+			["editbox"] = {
+				["font"] = "PT Sans Narrow",
+				["size"] = 12,
+				["outline"] = "NONE",
+			},
+			["gossip"] = {
+				["font"] = "PT Sans Narrow",
+				["size"] = 12,
+				["outline"] = "NONE",
+			},
+			["objective"] = {
+				["font"] = "PT Sans Narrow",
+				["size"] = 12,
+				["outline"] = "NONE",
+			},
+			["objectiveHeader"] = {
+				["font"] = "PT Sans Narrow",
+				["size"] = 12,
+				["outline"] = "NONE",
+			},
 		},
 	},
-
-	['raidmanager'] = {
-		['level'] = true,
-		['roles'] = false,
+	--UI Buttons
+	["uibuttons"] = {
+		["enable"] = false,
+		["size"] = 17,
+		["mouse"] = false,
+		["menuBackdrop"] = false,
+		["dropdownBackdrop"] = false,
+		["orientation"] = "vertical",
+		["spacing"] = 3,
+		["point"] = "TOPLEFT",
+		["anchor"] = "TOPRIGHT",
+		["xoffset"] = 0,
+		["yoffset"] = 0,
+		["customroll"] = {
+			["min"] = "1",
+			["max"] = "50",
+		},
+		["Config"] = {
+			["enabled"] = false,
+			["called"] = "Reload",
+		},
+		["Addon"] = {
+			["enabled"] = false,
+			["called"] = "Manager",
+		},
+		["Status"] = {
+			["enabled"] = false,
+			["called"] = "AFK",
+		},
+		["Roll"] = {
+			["enabled"] = false,
+			["called"] = "Hundred",
+		},
 	},
-
 }

-P.chat.editboxhistory = 5
-P.auras.perRow = 19
-
 --Datatexts
-P.datatexts.panels.DP_1 = {
-	['left'] = '',
-	['middle'] = '',
-	['right'] = '',
-}
-P.datatexts.panels.DP_2 = {
-	['left'] = '',
-	['middle'] = '',
-	['right'] = '',
+P.datatexts.panels["SLE_DataPanel_1"] = {
+	["left"] = '',
+	["middle"] = '',
+	["right"] = '',
 }
-P.datatexts.panels.DP_3 = {
-	['left'] = '',
-	['middle'] = '',
-	['right'] = '',
+P.datatexts.panels["SLE_DataPanel_2"] = {
+	["left"] = '',
+	["middle"] = '',
+	["right"] = '',
 }
-P.datatexts.panels.DP_4 = {
-	['left'] = '',
-	['middle'] = '',
-	['right'] = '',
+P.datatexts.panels["SLE_DataPanel_3"] = 'Version'
+P.datatexts.panels["SLE_DataPanel_4"] = {
+	["left"] = '',
+	["middle"] = '',
+	["right"] = '',
 }
-P.datatexts.panels.DP_5 = {
-	['left'] = '',
-	['middle'] = '',
-	['right'] = '',
+P.datatexts.panels["SLE_DataPanel_5"] = {
+	["left"] = '',
+	["middle"] = '',
+	["right"] = '',
 }
-P.datatexts.panels.DP_6 = {
-	['left'] = '',
-	['middle'] = '',
-	['right'] = '',
+P.datatexts.panels["SLE_DataPanel_6"] = {
+	["left"] = '',
+	["middle"] = '',
+	["right"] = '',
 }
-P.datatexts.panels.Top_Center = 'Version'
-P.datatexts.panels.Bottom_Panel = ''
\ No newline at end of file
+P.datatexts.panels["SLE_DataPanel_7"] = ''
+P.datatexts.panels["SLE_DataPanel_8"] = {
+	["left"] = '',
+	["middle"] = '',
+	["right"] = '',
+}
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/AceAddon-3.0/AceAddon-3.0.lua b/ElvUI_SLE/libs/AceAddon-3.0/AceAddon-3.0.lua
new file mode 100644
index 0000000..a7f7279
--- /dev/null
+++ b/ElvUI_SLE/libs/AceAddon-3.0/AceAddon-3.0.lua
@@ -0,0 +1,674 @@
+--- **AceAddon-3.0** provides a template for creating addon objects.
+-- It'll provide you with a set of callback functions that allow you to simplify the loading
+-- process of your addon.\\
+-- Callbacks provided are:\\
+-- * **OnInitialize**, which is called directly after the addon is fully loaded.
+-- * **OnEnable** which gets called during the PLAYER_LOGIN event, when most of the data provided by the game is already present.
+-- * **OnDisable**, which is only called when your addon is manually being disabled.
+-- @usage
+-- -- A small (but complete) addon, that doesn't do anything,
+-- -- but shows usage of the callbacks.
+-- local MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
+--
+-- function MyAddon:OnInitialize()
+--   -- do init tasks here, like loading the Saved Variables,
+--   -- or setting up slash commands.
+-- end
+--
+-- function MyAddon:OnEnable()
+--   -- Do more initialization here, that really enables the use of your addon.
+--   -- Register Events, Hook functions, Create Frames, Get information from
+--   -- the game that wasn't available in OnInitialize
+-- end
+--
+-- function MyAddon:OnDisable()
+--   -- Unhook, Unregister Events, Hide frames that you created.
+--   -- You would probably only use an OnDisable if you want to
+--   -- build a "standby" mode, or be able to toggle modules on/off.
+-- end
+-- @class file
+-- @name AceAddon-3.0.lua
+-- @release $Id: AceAddon-3.0.lua 1084 2013-04-27 20:14:11Z nevcairiel $
+
+local MAJOR, MINOR = "AceAddon-3.0", 12
+local AceAddon, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+
+if not AceAddon then return end -- No Upgrade needed.
+
+AceAddon.frame = AceAddon.frame or CreateFrame("Frame", "AceAddon30Frame") -- Our very own frame
+AceAddon.addons = AceAddon.addons or {} -- addons in general
+AceAddon.statuses = AceAddon.statuses or {} -- statuses of addon.
+AceAddon.initializequeue = AceAddon.initializequeue or {} -- addons that are new and not initialized
+AceAddon.enablequeue = AceAddon.enablequeue or {} -- addons that are initialized and waiting to be enabled
+AceAddon.embeds = AceAddon.embeds or setmetatable({}, {__index = function(tbl, key) tbl[key] = {} return tbl[key] end }) -- contains a list of libraries embedded in an addon
+
+-- Lua APIs
+local tinsert, tconcat, tremove = table.insert, table.concat, table.remove
+local fmt, tostring = string.format, tostring
+local select, pairs, next, type, unpack = select, pairs, next, type, unpack
+local loadstring, assert, error = loadstring, assert, error
+local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget
+
+-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
+-- List them here for Mikk's FindGlobals script
+-- GLOBALS: LibStub, IsLoggedIn, geterrorhandler
+
+--[[
+	 xpcall safecall implementation
+]]
+local xpcall = xpcall
+
+local function errorhandler(err)
+	return geterrorhandler()(err)
+end
+
+local function CreateDispatcher(argCount)
+	local code = [[
+		local xpcall, eh = ...
+		local method, ARGS
+		local function call() return method(ARGS) end
+
+		local function dispatch(func, ...)
+			 method = func
+			 if not method then return end
+			 ARGS = ...
+			 return xpcall(call, eh)
+		end
+
+		return dispatch
+	]]
+
+	local ARGS = {}
+	for i = 1, argCount do ARGS[i] = "arg"..i end
+	code = code:gsub("ARGS", tconcat(ARGS, ", "))
+	return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
+end
+
+local Dispatchers = setmetatable({}, {__index=function(self, argCount)
+	local dispatcher = CreateDispatcher(argCount)
+	rawset(self, argCount, dispatcher)
+	return dispatcher
+end})
+Dispatchers[0] = function(func)
+	return xpcall(func, errorhandler)
+end
+
+local function safecall(func, ...)
+	-- we check to see if the func is passed is actually a function here and don't error when it isn't
+	-- this safecall is used for optional functions like OnInitialize OnEnable etc. When they are not
+	-- present execution should continue without hinderance
+	if type(func) == "function" then
+		return Dispatchers[select('#', ...)](func, ...)
+	end
+end
+
+-- local functions that will be implemented further down
+local Enable, Disable, EnableModule, DisableModule, Embed, NewModule, GetModule, GetName, SetDefaultModuleState, SetDefaultModuleLibraries, SetEnabledState, SetDefaultModulePrototype
+
+-- used in the addon metatable
+local function addontostring( self ) return self.name end
+
+-- Check if the addon is queued for initialization
+local function queuedForInitialization(addon)
+	for i = 1, #AceAddon.initializequeue do
+		if AceAddon.initializequeue[i] == addon then
+			return true
+		end
+	end
+	return false
+end
+
+--- Create a new AceAddon-3.0 addon.
+-- Any libraries you specified will be embeded, and the addon will be scheduled for
+-- its OnInitialize and OnEnable callbacks.
+-- The final addon object, with all libraries embeded, will be returned.
+-- @paramsig [object ,]name[, lib, ...]
+-- @param object Table to use as a base for the addon (optional)
+-- @param name Name of the addon object to create
+-- @param lib List of libraries to embed into the addon
+-- @usage
+-- -- Create a simple addon object
+-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceEvent-3.0")
+--
+-- -- Create a Addon object based on the table of a frame
+-- local MyFrame = CreateFrame("Frame")
+-- MyAddon = LibStub("AceAddon-3.0"):NewAddon(MyFrame, "MyAddon", "AceEvent-3.0")
+function AceAddon:NewAddon(objectorname, ...)
+	local object,name
+	local i=1
+	if type(objectorname)=="table" then
+		object=objectorname
+		name=...
+		i=2
+	else
+		name=objectorname
+	end
+	if type(name)~="string" then
+		error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2)
+	end
+	if self.addons[name] then
+		error(("Usage: NewAddon([object,] name, [lib, lib, lib, ...]): 'name' - Addon '%s' already exists."):format(name), 2)
+	end
+
+	object = object or {}
+	object.name = name
+
+	local addonmeta = {}
+	local oldmeta = getmetatable(object)
+	if oldmeta then
+		for k, v in pairs(oldmeta) do addonmeta[k] = v end
+	end
+	addonmeta.__tostring = addontostring
+
+	setmetatable( object, addonmeta )
+	self.addons[name] = object
+	object.modules = {}
+	object.orderedModules = {}
+	object.defaultModuleLibraries = {}
+	Embed( object ) -- embed NewModule, GetModule methods
+	self:EmbedLibraries(object, select(i,...))
+
+	-- add to queue of addons to be initialized upon ADDON_LOADED
+	tinsert(self.initializequeue, object)
+	return object
+end
+
+
+--- Get the addon object by its name from the internal AceAddon registry.
+-- Throws an error if the addon object cannot be found (except if silent is set).
+-- @param name unique name of the addon object
+-- @param silent if true, the addon is optional, silently return nil if its not found
+-- @usage
+-- -- Get the Addon
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+function AceAddon:GetAddon(name, silent)
+	if not silent and not self.addons[name] then
+		error(("Usage: GetAddon(name): 'name' - Cannot find an AceAddon '%s'."):format(tostring(name)), 2)
+	end
+	return self.addons[name]
+end
+
+-- - Embed a list of libraries into the specified addon.
+-- This function will try to embed all of the listed libraries into the addon
+-- and error if a single one fails.
+--
+-- **Note:** This function is for internal use by :NewAddon/:NewModule
+-- @paramsig addon, [lib, ...]
+-- @param addon addon object to embed the libs in
+-- @param lib List of libraries to embed into the addon
+function AceAddon:EmbedLibraries(addon, ...)
+	for i=1,select("#", ... ) do
+		local libname = select(i, ...)
+		self:EmbedLibrary(addon, libname, false, 4)
+	end
+end
+
+-- - Embed a library into the addon object.
+-- This function will check if the specified library is registered with LibStub
+-- and if it has a :Embed function to call. It'll error if any of those conditions
+-- fails.
+--
+-- **Note:** This function is for internal use by :EmbedLibraries
+-- @paramsig addon, libname[, silent[, offset]]
+-- @param addon addon object to embed the library in
+-- @param libname name of the library to embed
+-- @param silent marks an embed to fail silently if the library doesn't exist (optional)
+-- @param offset will push the error messages back to said offset, defaults to 2 (optional)
+function AceAddon:EmbedLibrary(addon, libname, silent, offset)
+	local lib = LibStub:GetLibrary(libname, true)
+	if not lib and not silent then
+		error(("Usage: EmbedLibrary(addon, libname, silent, offset): 'libname' - Cannot find a library instance of %q."):format(tostring(libname)), offset or 2)
+	elseif lib and type(lib.Embed) == "function" then
+		lib:Embed(addon)
+		tinsert(self.embeds[addon], libname)
+		return true
+	elseif lib then
+		error(("Usage: EmbedLibrary(addon, libname, silent, offset): 'libname' - Library '%s' is not Embed capable"):format(libname), offset or 2)
+	end
+end
+
+--- Return the specified module from an addon object.
+-- Throws an error if the addon object cannot be found (except if silent is set)
+-- @name //addon//:GetModule
+-- @paramsig name[, silent]
+-- @param name unique name of the module
+-- @param silent if true, the module is optional, silently return nil if its not found (optional)
+-- @usage
+-- -- Get the Addon
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- -- Get the Module
+-- MyModule = MyAddon:GetModule("MyModule")
+function GetModule(self, name, silent)
+	if not self.modules[name] and not silent then
+		error(("Usage: GetModule(name, silent): 'name' - Cannot find module '%s'."):format(tostring(name)), 2)
+	end
+	return self.modules[name]
+end
+
+local function IsModuleTrue(self) return true end
+
+--- Create a new module for the addon.
+-- The new module can have its own embeded libraries and/or use a module prototype to be mixed into the module.\\
+-- A module has the same functionality as a real addon, it can have modules of its own, and has the same API as
+-- an addon object.
+-- @name //addon//:NewModule
+-- @paramsig name[, prototype|lib[, lib, ...]]
+-- @param name unique name of the module
+-- @param prototype object to derive this module from, methods and values from this table will be mixed into the module (optional)
+-- @param lib List of libraries to embed into the addon
+-- @usage
+-- -- Create a module with some embeded libraries
+-- MyModule = MyAddon:NewModule("MyModule", "AceEvent-3.0", "AceHook-3.0")
+--
+-- -- Create a module with a prototype
+-- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
+-- MyModule = MyAddon:NewModule("MyModule", prototype, "AceEvent-3.0", "AceHook-3.0")
+function NewModule(self, name, prototype, ...)
+	if type(name) ~= "string" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - string expected got '%s'."):format(type(name)), 2) end
+	if type(prototype) ~= "string" and type(prototype) ~= "table" and type(prototype) ~= "nil" then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'prototype' - table (prototype), string (lib) or nil expected got '%s'."):format(type(prototype)), 2) end
+
+	if self.modules[name] then error(("Usage: NewModule(name, [prototype, [lib, lib, lib, ...]): 'name' - Module '%s' already exists."):format(name), 2) end
+
+	-- modules are basically addons. We treat them as such. They will be added to the initializequeue properly as well.
+	-- NewModule can only be called after the parent addon is present thus the modules will be initialized after their parent is.
+	local module = AceAddon:NewAddon(fmt("%s_%s", self.name or tostring(self), name))
+
+	module.IsModule = IsModuleTrue
+	module:SetEnabledState(self.defaultModuleState)
+	module.moduleName = name
+
+	if type(prototype) == "string" then
+		AceAddon:EmbedLibraries(module, prototype, ...)
+	else
+		AceAddon:EmbedLibraries(module, ...)
+	end
+	AceAddon:EmbedLibraries(module, unpack(self.defaultModuleLibraries))
+
+	if not prototype or type(prototype) == "string" then
+		prototype = self.defaultModulePrototype or nil
+	end
+
+	if type(prototype) == "table" then
+		local mt = getmetatable(module)
+		mt.__index = prototype
+		setmetatable(module, mt)  -- More of a Base class type feel.
+	end
+
+	safecall(self.OnModuleCreated, self, module) -- Was in Ace2 and I think it could be a cool thing to have handy.
+	self.modules[name] = module
+	tinsert(self.orderedModules, module)
+
+	return module
+end
+
+--- Returns the real name of the addon or module, without any prefix.
+-- @name //addon//:GetName
+-- @paramsig
+-- @usage
+-- print(MyAddon:GetName())
+-- -- prints "MyAddon"
+function GetName(self)
+	return self.moduleName or self.name
+end
+
+--- Enables the Addon, if possible, return true or false depending on success.
+-- This internally calls AceAddon:EnableAddon(), thus dispatching a OnEnable callback
+-- and enabling all modules of the addon (unless explicitly disabled).\\
+-- :Enable() also sets the internal `enableState` variable to true
+-- @name //addon//:Enable
+-- @paramsig
+-- @usage
+-- -- Enable MyModule
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyModule = MyAddon:GetModule("MyModule")
+-- MyModule:Enable()
+function Enable(self)
+	self:SetEnabledState(true)
+
+	-- nevcairiel 2013-04-27: don't enable an addon/module if its queued for init still
+	-- it'll be enabled after the init process
+	if not queuedForInitialization(self) then
+		return AceAddon:EnableAddon(self)
+	end
+end
+
+--- Disables the Addon, if possible, return true or false depending on success.
+-- This internally calls AceAddon:DisableAddon(), thus dispatching a OnDisable callback
+-- and disabling all modules of the addon.\\
+-- :Disable() also sets the internal `enableState` variable to false
+-- @name //addon//:Disable
+-- @paramsig
+-- @usage
+-- -- Disable MyAddon
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyAddon:Disable()
+function Disable(self)
+	self:SetEnabledState(false)
+	return AceAddon:DisableAddon(self)
+end
+
+--- Enables the Module, if possible, return true or false depending on success.
+-- Short-hand function that retrieves the module via `:GetModule` and calls `:Enable` on the module object.
+-- @name //addon//:EnableModule
+-- @paramsig name
+-- @usage
+-- -- Enable MyModule using :GetModule
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyModule = MyAddon:GetModule("MyModule")
+-- MyModule:Enable()
+--
+-- -- Enable MyModule using the short-hand
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyAddon:EnableModule("MyModule")
+function EnableModule(self, name)
+	local module = self:GetModule( name )
+	return module:Enable()
+end
+
+--- Disables the Module, if possible, return true or false depending on success.
+-- Short-hand function that retrieves the module via `:GetModule` and calls `:Disable` on the module object.
+-- @name //addon//:DisableModule
+-- @paramsig name
+-- @usage
+-- -- Disable MyModule using :GetModule
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyModule = MyAddon:GetModule("MyModule")
+-- MyModule:Disable()
+--
+-- -- Disable MyModule using the short-hand
+-- MyAddon = LibStub("AceAddon-3.0"):GetAddon("MyAddon")
+-- MyAddon:DisableModule("MyModule")
+function DisableModule(self, name)
+	local module = self:GetModule( name )
+	return module:Disable()
+end
+
+--- Set the default libraries to be mixed into all modules created by this object.
+-- Note that you can only change the default module libraries before any module is created.
+-- @name //addon//:SetDefaultModuleLibraries
+-- @paramsig lib[, lib, ...]
+-- @param lib List of libraries to embed into the addon
+-- @usage
+-- -- Create the addon object
+-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
+-- -- Configure default libraries for modules (all modules need AceEvent-3.0)
+-- MyAddon:SetDefaultModuleLibraries("AceEvent-3.0")
+-- -- Create a module
+-- MyModule = MyAddon:NewModule("MyModule")
+function SetDefaultModuleLibraries(self, ...)
+	if next(self.modules) then
+		error("Usage: SetDefaultModuleLibraries(...): cannot change the module defaults after a module has been registered.", 2)
+	end
+	self.defaultModuleLibraries = {...}
+end
+
+--- Set the default state in which new modules are being created.
+-- Note that you can only change the default state before any module is created.
+-- @name //addon//:SetDefaultModuleState
+-- @paramsig state
+-- @param state Default state for new modules, true for enabled, false for disabled
+-- @usage
+-- -- Create the addon object
+-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon")
+-- -- Set the default state to "disabled"
+-- MyAddon:SetDefaultModuleState(false)
+-- -- Create a module and explicilty enable it
+-- MyModule = MyAddon:NewModule("MyModule")
+-- MyModule:Enable()
+function SetDefaultModuleState(self, state)
+	if next(self.modules) then
+		error("Usage: SetDefaultModuleState(state): cannot change the module defaults after a module has been registered.", 2)
+	end
+	self.defaultModuleState = state
+end
+
+--- Set the default prototype to use for new modules on creation.
+-- Note that you can only change the default prototype before any module is created.
+-- @name //addon//:SetDefaultModulePrototype
+-- @paramsig prototype
+-- @param prototype Default prototype for the new modules (table)
+-- @usage
+-- -- Define a prototype
+-- local prototype = { OnEnable = function(self) print("OnEnable called!") end }
+-- -- Set the default prototype
+-- MyAddon:SetDefaultModulePrototype(prototype)
+-- -- Create a module and explicitly Enable it
+-- MyModule = MyAddon:NewModule("MyModule")
+-- MyModule:Enable()
+-- -- should print "OnEnable called!" now
+-- @see NewModule
+function SetDefaultModulePrototype(self, prototype)
+	if next(self.modules) then
+		error("Usage: SetDefaultModulePrototype(prototype): cannot change the module defaults after a module has been registered.", 2)
+	end
+	if type(prototype) ~= "table" then
+		error(("Usage: SetDefaultModulePrototype(prototype): 'prototype' - table expected got '%s'."):format(type(prototype)), 2)
+	end
+	self.defaultModulePrototype = prototype
+end
+
+--- Set the state of an addon or module
+-- This should only be called before any enabling actually happend, e.g. in/before OnInitialize.
+-- @name //addon//:SetEnabledState
+-- @paramsig state
+-- @param state the state of an addon or module  (enabled=true, disabled=false)
+function SetEnabledState(self, state)
+	self.enabledState = state
+end
+
+
+--- Return an iterator of all modules associated to the addon.
+-- @name //addon//:IterateModules
+-- @paramsig
+-- @usage
+-- -- Enable all modules
+-- for name, module in MyAddon:IterateModules() do
+--    module:Enable()
+-- end
+local function IterateModules(self) return pairs(self.modules) end
+
+-- Returns an iterator of all embeds in the addon
+-- @name //addon//:IterateEmbeds
+-- @paramsig
+local function IterateEmbeds(self) return pairs(AceAddon.embeds[self]) end
+
+--- Query the enabledState of an addon.
+-- @name //addon//:IsEnabled
+-- @paramsig
+-- @usage
+-- if MyAddon:IsEnabled() then
+--     MyAddon:Disable()
+-- end
+local function IsEnabled(self) return self.enabledState end
+local mixins = {
+	NewModule = NewModule,
+	GetModule = GetModule,
+	Enable = Enable,
+	Disable = Disable,
+	EnableModule = EnableModule,
+	DisableModule = DisableModule,
+	IsEnabled = IsEnabled,
+	SetDefaultModuleLibraries = SetDefaultModuleLibraries,
+	SetDefaultModuleState = SetDefaultModuleState,
+	SetDefaultModulePrototype = SetDefaultModulePrototype,
+	SetEnabledState = SetEnabledState,
+	IterateModules = IterateModules,
+	IterateEmbeds = IterateEmbeds,
+	GetName = GetName,
+}
+local function IsModule(self) return false end
+local pmixins = {
+	defaultModuleState = true,
+	enabledState = true,
+	IsModule = IsModule,
+}
+-- Embed( target )
+-- target (object) - target object to embed aceaddon in
+--
+-- this is a local function specifically since it's meant to be only called internally
+function Embed(target, skipPMixins)
+	for k, v in pairs(mixins) do
+		target[k] = v
+	end
+	if not skipPMixins then
+		for k, v in pairs(pmixins) do
+			target[k] = target[k] or v
+		end
+	end
+end
+
+
+-- - Initialize the addon after creation.
+-- This function is only used internally during the ADDON_LOADED event
+-- It will call the **OnInitialize** function on the addon object (if present),
+-- and the **OnEmbedInitialize** function on all embeded libraries.
+--
+-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
+-- @param addon addon object to intialize
+function AceAddon:InitializeAddon(addon)
+	safecall(addon.OnInitialize, addon)
+
+	local embeds = self.embeds[addon]
+	for i = 1, #embeds do
+		local lib = LibStub:GetLibrary(embeds[i], true)
+		if lib then safecall(lib.OnEmbedInitialize, lib, addon) end
+	end
+
+	-- we don't call InitializeAddon on modules specifically, this is handled
+	-- from the event handler and only done _once_
+end
+
+-- - Enable the addon after creation.
+-- Note: This function is only used internally during the PLAYER_LOGIN event, or during ADDON_LOADED,
+-- if IsLoggedIn() already returns true at that point, e.g. for LoD Addons.
+-- It will call the **OnEnable** function on the addon object (if present),
+-- and the **OnEmbedEnable** function on all embeded libraries.\\
+-- This function does not toggle the enable state of the addon itself, and will return early if the addon is disabled.
+--
+-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
+-- Use :Enable on the addon itself instead.
+-- @param addon addon object to enable
+function AceAddon:EnableAddon(addon)
+	if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
+	if self.statuses[addon.name] or not addon.enabledState then return false end
+
+	-- set the statuses first, before calling the OnEnable. this allows for Disabling of the addon in OnEnable.
+	self.statuses[addon.name] = true
+
+	safecall(addon.OnEnable, addon)
+
+	-- make sure we're still enabled before continueing
+	if self.statuses[addon.name] then
+		local embeds = self.embeds[addon]
+		for i = 1, #embeds do
+			local lib = LibStub:GetLibrary(embeds[i], true)
+			if lib then safecall(lib.OnEmbedEnable, lib, addon) end
+		end
+
+		-- enable possible modules.
+		local modules = addon.orderedModules
+		for i = 1, #modules do
+			self:EnableAddon(modules[i])
+		end
+	end
+	return self.statuses[addon.name] -- return true if we're disabled
+end
+
+-- - Disable the addon
+-- Note: This function is only used internally.
+-- It will call the **OnDisable** function on the addon object (if present),
+-- and the **OnEmbedDisable** function on all embeded libraries.\\
+-- This function does not toggle the enable state of the addon itself, and will return early if the addon is still enabled.
+--
+-- **Note:** Do not call this function manually, unless you're absolutely sure that you know what you are doing.
+-- Use :Disable on the addon itself instead.
+-- @param addon addon object to enable
+function AceAddon:DisableAddon(addon)
+	if type(addon) == "string" then addon = AceAddon:GetAddon(addon) end
+	if not self.statuses[addon.name] then return false end
+
+	-- set statuses first before calling OnDisable, this allows for aborting the disable in OnDisable.
+	self.statuses[addon.name] = false
+
+	safecall( addon.OnDisable, addon )
+
+	-- make sure we're still disabling...
+	if not self.statuses[addon.name] then
+		local embeds = self.embeds[addon]
+		for i = 1, #embeds do
+			local lib = LibStub:GetLibrary(embeds[i], true)
+			if lib then safecall(lib.OnEmbedDisable, lib, addon) end
+		end
+		-- disable possible modules.
+		local modules = addon.orderedModules
+		for i = 1, #modules do
+			self:DisableAddon(modules[i])
+		end
+	end
+
+	return not self.statuses[addon.name] -- return true if we're disabled
+end
+
+--- Get an iterator over all registered addons.
+-- @usage
+-- -- Print a list of all installed AceAddon's
+-- for name, addon in AceAddon:IterateAddons() do
+--   print("Addon: " .. name)
+-- end
+function AceAddon:IterateAddons() return pairs(self.addons) end
+
+--- Get an iterator over the internal status registry.
+-- @usage
+-- -- Print a list of all enabled addons
+-- for name, status in AceAddon:IterateAddonStatus() do
+--   if status then
+--     print("EnabledAddon: " .. name)
+--   end
+-- end
+function AceAddon:IterateAddonStatus() return pairs(self.statuses) end
+
+-- Following Iterators are deprecated, and their addon specific versions should be used
+-- e.g. addon:IterateEmbeds() instead of :IterateEmbedsOnAddon(addon)
+function AceAddon:IterateEmbedsOnAddon(addon) return pairs(self.embeds[addon]) end
+function AceAddon:IterateModulesOfAddon(addon) return pairs(addon.modules) end
+
+-- Event Handling
+local function onEvent(this, event, arg1)
+	-- 2011-08-17 nevcairiel - ignore the load event of Blizzard_DebugTools, so a potential startup error isn't swallowed up
+	if (event == "ADDON_LOADED"  and arg1 ~= "Blizzard_DebugTools") or event == "PLAYER_LOGIN" then
+		-- if a addon loads another addon, recursion could happen here, so we need to validate the table on every iteration
+		while(#AceAddon.initializequeue > 0) do
+			local addon = tremove(AceAddon.initializequeue, 1)
+			-- this might be an issue with recursion - TODO: validate
+			if event == "ADDON_LOADED" then addon.baseName = arg1 end
+			AceAddon:InitializeAddon(addon)
+			tinsert(AceAddon.enablequeue, addon)
+		end
+
+		if IsLoggedIn() then
+			while(#AceAddon.enablequeue > 0) do
+				local addon = tremove(AceAddon.enablequeue, 1)
+				AceAddon:EnableAddon(addon)
+			end
+		end
+	end
+end
+
+AceAddon.frame:RegisterEvent("ADDON_LOADED")
+AceAddon.frame:RegisterEvent("PLAYER_LOGIN")
+AceAddon.frame:SetScript("OnEvent", onEvent)
+
+-- upgrade embeded
+for name, addon in pairs(AceAddon.addons) do
+	Embed(addon, true)
+end
+
+-- 2010-10-27 nevcairiel - add new "orderedModules" table
+if oldminor and oldminor < 10 then
+	for name, addon in pairs(AceAddon.addons) do
+		addon.orderedModules = {}
+		for module_name, module in pairs(addon.modules) do
+			tinsert(addon.orderedModules, module)
+		end
+	end
+end
diff --git a/ElvUI_SLE/libs/AceAddon-3.0/AceAddon-3.0.xml b/ElvUI_SLE/libs/AceAddon-3.0/AceAddon-3.0.xml
new file mode 100644
index 0000000..e6ad639
--- /dev/null
+++ b/ElvUI_SLE/libs/AceAddon-3.0/AceAddon-3.0.xml
@@ -0,0 +1,4 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
+..\FrameXML\UI.xsd">
+	<Script file="AceAddon-3.0.lua"/>
+</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/AceConfig-3.0/AceConfig-3.0.lua b/ElvUI_SLE/libs/AceConfig-3.0/AceConfig-3.0.lua
deleted file mode 100644
index f581e95..0000000
--- a/ElvUI_SLE/libs/AceConfig-3.0/AceConfig-3.0.lua
+++ /dev/null
@@ -1,57 +0,0 @@
---- AceConfig-3.0 wrapper library.
--- Provides an API to register an options table with the config registry,
--- as well as associate it with a slash command.
--- @class file
--- @name AceConfig-3.0
--- @release $Id: AceConfig-3.0.lua 969 2010-10-07 02:11:48Z shefki $
-
---[[
-AceConfig-3.0
-
-Very light wrapper library that combines all the AceConfig subcomponents into one more easily used whole.
-
-]]
-
-local MAJOR, MINOR = "AceConfig-3.0-ElvUI", 1
-local AceConfig = LibStub:NewLibrary(MAJOR, MINOR)
-
-if not AceConfig then return end
-
-local cfgreg = LibStub("AceConfigRegistry-3.0-ElvUI")
-local cfgcmd = LibStub("AceConfigCmd-3.0-ElvUI")
---TODO: local cfgdlg = LibStub("AceConfigDialog-3.0", true)
---TODO: local cfgdrp = LibStub("AceConfigDropdown-3.0", true)
-
--- Lua APIs
-local pcall, error, type, pairs = pcall, error, type, pairs
-
--- -------------------------------------------------------------------
--- :RegisterOptionsTable(appName, options, slashcmd, persist)
---
--- - appName - (string) application name
--- - options - table or function ref, see AceConfigRegistry
--- - slashcmd - slash command (string) or table with commands, or nil to NOT create a slash command
-
---- Register a option table with the AceConfig registry.
--- You can supply a slash command (or a table of slash commands) to register with AceConfigCmd directly.
--- @paramsig appName, options [, slashcmd]
--- @param appName The application name for the config table.
--- @param options The option table (or a function to generate one on demand).  http://www.wowace.com/addons/ace3/pages/ace-config-3-0-options-tables/
--- @param slashcmd A slash command to register for the option table, or a table of slash commands.
--- @usage
--- local AceConfig = LibStub("AceConfig-3.0")
--- AceConfig:RegisterOptionsTable("MyAddon", myOptions, {"/myslash", "/my"})
-function AceConfig:RegisterOptionsTable(appName, options, slashcmd)
-	local ok,msg = pcall(cfgreg.RegisterOptionsTable, self, appName, options)
-	if not ok then error(msg, 2) end
-
-	if slashcmd then
-		if type(slashcmd) == "table" then
-			for _,cmd in pairs(slashcmd) do
-				cfgcmd:CreateChatCommand(cmd, appName)
-			end
-		else
-			cfgcmd:CreateChatCommand(slashcmd, appName)
-		end
-	end
-end
diff --git a/ElvUI_SLE/libs/AceConfig-3.0/AceConfig-3.0.xml b/ElvUI_SLE/libs/AceConfig-3.0/AceConfig-3.0.xml
deleted file mode 100644
index 87972ad..0000000
--- a/ElvUI_SLE/libs/AceConfig-3.0/AceConfig-3.0.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<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="AceConfigRegistry-3.0\AceConfigRegistry-3.0.xml"/>
-	<Include file="AceConfigCmd-3.0\AceConfigCmd-3.0.xml"/>
-	<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
diff --git a/ElvUI_SLE/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua b/ElvUI_SLE/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
deleted file mode 100644
index 8e1f93f..0000000
--- a/ElvUI_SLE/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.lua
+++ /dev/null
@@ -1,794 +0,0 @@
---- AceConfigCmd-3.0 handles access to an options table through the "command line" interface via the ChatFrames.
--- @class file
--- @name AceConfigCmd-3.0
--- @release $Id: AceConfigCmd-3.0.lua 1045 2011-12-09 17:58:40Z nevcairiel $
-
---[[
-AceConfigCmd-3.0
-
-Handles commandline optionstable access
-
-REQUIRES: AceConsole-3.0 for command registration (loaded on demand)
-
-]]
-
--- TODO: plugin args
-
-
-local MAJOR, MINOR = "AceConfigCmd-3.0-ElvUI", 1
-local AceConfigCmd = LibStub:NewLibrary(MAJOR, MINOR)
-
-if not AceConfigCmd then return end
-
-AceConfigCmd.commands = AceConfigCmd.commands or {}
-local commands = AceConfigCmd.commands
-
-local cfgreg = LibStub("AceConfigRegistry-3.0-ElvUI")
-local AceConsole -- LoD
-local AceConsoleName = "AceConsole-3.0"
-
--- Lua APIs
-local strsub, strsplit, strlower, strmatch, strtrim = string.sub, string.split, string.lower, string.match, string.trim
-local format, tonumber, tostring = string.format, tonumber, tostring
-local tsort, tinsert = table.sort, table.insert
-local select, pairs, next, type = select, pairs, next, type
-local error, assert = error, assert
-
--- WoW APIs
-local _G = _G
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: LibStub, SELECTED_CHAT_FRAME, DEFAULT_CHAT_FRAME
-
-
-local L = setmetatable({}, {	-- TODO: replace with proper locale
-	__index = function(self,k) return k end
-})
-
-
-
-local function print(msg)
-	(SELECTED_CHAT_FRAME or DEFAULT_CHAT_FRAME):AddMessage(msg)
-end
-
--- constants used by getparam() calls below
-
-local handlertypes = {["table"]=true}
-local handlermsg = "expected a table"
-
-local functypes = {["function"]=true, ["string"]=true}
-local funcmsg = "expected function or member name"
-
-
--- pickfirstset() - picks the first non-nil value and returns it
-
-local function pickfirstset(...)
-	for i=1,select("#",...) do
-		if select(i,...)~=nil then
-			return select(i,...)
-		end
-	end
-end
-
-
--- err() - produce real error() regarding malformed options tables etc
-
-local function err(info,inputpos,msg )
-	local cmdstr=" "..strsub(info.input, 1, inputpos-1)
-	error(MAJOR..": /" ..info[0] ..cmdstr ..": "..(msg or "malformed options table"), 2)
-end
-
-
--- usererr() - produce chatframe message regarding bad slash syntax etc
-
-local function usererr(info,inputpos,msg )
-	local cmdstr=strsub(info.input, 1, inputpos-1);
-	print("/" ..info[0] .. " "..cmdstr ..": "..(msg or "malformed options table"))
-end
-
-
--- callmethod() - call a given named method (e.g. "get", "set") with given arguments
-
-local function callmethod(info, inputpos, tab, methodtype, ...)
-	local method = info[methodtype]
-	if not method then
-		err(info, inputpos, "'"..methodtype.."': not set")
-	end
-
-	info.arg = tab.arg
-	info.option = tab
-	info.type = tab.type
-
-	if type(method)=="function" then
-		return method(info, ...)
-	elseif type(method)=="string" then
-		if type(info.handler[method])~="function" then
-			err(info, inputpos, "'"..methodtype.."': '"..method.."' is not a member function of "..tostring(info.handler))
-		end
-		return info.handler[method](info.handler, info, ...)
-	else
-		assert(false)	-- type should have already been checked on read
-	end
-end
-
--- callfunction() - call a given named function (e.g. "name", "desc") with given arguments
-
-local function callfunction(info, tab, methodtype, ...)
-	local method = tab[methodtype]
-
-	info.arg = tab.arg
-	info.option = tab
-	info.type = tab.type
-
-	if type(method)=="function" then
-		return method(info, ...)
-	else
-		assert(false) -- type should have already been checked on read
-	end
-end
-
--- do_final() - do the final step (set/execute) along with validation and confirmation
-
-local function do_final(info, inputpos, tab, methodtype, ...)
-	if info.validate then
-		local res = callmethod(info,inputpos,tab,"validate",...)
-		if type(res)=="string" then
-			usererr(info, inputpos, "'"..strsub(info.input, inputpos).."' - "..res)
-			return
-		end
-	end
-	-- console ignores .confirm
-
-	callmethod(info,inputpos,tab,methodtype, ...)
-end
-
-
--- getparam() - used by handle() to retreive and store "handler", "get", "set", etc
-
-local function getparam(info, inputpos, tab, depth, paramname, types, errormsg)
-	local old,oldat = info[paramname], info[paramname.."_at"]
-	local val=tab[paramname]
-	if val~=nil then
-		if val==false then
-			val=nil
-		elseif not types[type(val)] then
-			err(info, inputpos, "'" .. paramname.. "' - "..errormsg)
-		end
-		info[paramname] = val
-		info[paramname.."_at"] = depth
-	end
-	return old,oldat
-end
-
-
--- iterateargs(tab) - custom iterator that iterates both t.args and t.plugins.*
-local dummytable={}
-
-local function iterateargs(tab)
-	if not tab.plugins then
-		return pairs(tab.args)
-	end
-
-	local argtabkey,argtab=next(tab.plugins)
-	local v
-
-	return function(_, k)
-		while argtab do
-			k,v = next(argtab, k)
-			if k then return k,v end
-			if argtab==tab.args then
-				argtab=nil
-			else
-				argtabkey,argtab = next(tab.plugins, argtabkey)
-				if not argtabkey then
-					argtab=tab.args
-				end
-			end
-		end
-	end
-end
-
-local function checkhidden(info, inputpos, tab)
-	if tab.cmdHidden~=nil then
-		return tab.cmdHidden
-	end
-	local hidden = tab.hidden
-	if type(hidden) == "function" or type(hidden) == "string" then
-		info.hidden = hidden
-		hidden = callmethod(info, inputpos, tab, 'hidden')
-		info.hidden = nil
-	end
-	return hidden
-end
-
-local function showhelp(info, inputpos, tab, depth, noHead)
-	if not noHead then
-		print("|cff33ff99"..info.appName.."|r: Arguments to |cffffff78/"..info[0].."|r "..strsub(info.input,1,inputpos-1)..":")
-	end
-
-	local sortTbl = {}	-- [1..n]=name
-	local refTbl = {}   -- [name]=tableref
-
-	for k,v in iterateargs(tab) do
-		if not refTbl[k] then	-- a plugin overriding something in .args
-			tinsert(sortTbl, k)
-			refTbl[k] = v
-		end
-	end
-
-	tsort(sortTbl, function(one, two)
-		local o1 = refTbl[one].order or 100
-		local o2 = refTbl[two].order or 100
-		if type(o1) == "function" or type(o1) == "string" then
-			info.order = o1
-			info[#info+1] = one
-			o1 = callmethod(info, inputpos, refTbl[one], "order")
-			info[#info] = nil
-			info.order = nil
-		end
-		if type(o2) == "function" or type(o1) == "string" then
-			info.order = o2
-			info[#info+1] = two
-			o2 = callmethod(info, inputpos, refTbl[two], "order")
-			info[#info] = nil
-			info.order = nil
-		end
-		if o1<0 and o2<0 then return o1<o2 end
-		if o2<0 then return true end
-		if o1<0 then return false end
-		if o1==o2 then return tostring(one)<tostring(two) end   -- compare names
-		return o1<o2
-	end)
-
-	for i = 1, #sortTbl do
-		local k = sortTbl[i]
-		local v = refTbl[k]
-		if not checkhidden(info, inputpos, v) then
-			if v.type ~= "description" and v.type ~= "header" then
-				-- recursively show all inline groups
-				local name, desc = v.name, v.desc
-				if type(name) == "function" then
-					name = callfunction(info, v, 'name')
-				end
-				if type(desc) == "function" then
-					desc = callfunction(info, v, 'desc')
-				end
-				if v.type == "group" and pickfirstset(v.cmdInline, v.inline, false) then
-					print("  "..(desc or name)..":")
-					local oldhandler,oldhandler_at = getparam(info, inputpos, v, depth, "handler", handlertypes, handlermsg)
-					showhelp(info, inputpos, v, depth, true)
-					info.handler,info.handler_at = oldhandler,oldhandler_at
-				else
-					local key = k:gsub(" ", "_")
-					print("  |cffffff78"..key.."|r - "..(desc or name or ""))
-				end
-			end
-		end
-	end
-end
-
-
-local function keybindingValidateFunc(text)
-	if text == nil or text == "NONE" then
-		return nil
-	end
-	text = text:upper()
-	local shift, ctrl, alt
-	local modifier
-	while true do
-		if text == "-" then
-			break
-		end
-		modifier, text = strsplit('-', text, 2)
-		if text then
-			if modifier ~= "SHIFT" and modifier ~= "CTRL" and modifier ~= "ALT" then
-				return false
-			end
-			if modifier == "SHIFT" then
-				if shift then
-					return false
-				end
-				shift = true
-			end
-			if modifier == "CTRL" then
-				if ctrl then
-					return false
-				end
-				ctrl = true
-			end
-			if modifier == "ALT" then
-				if alt then
-					return false
-				end
-				alt = true
-			end
-		else
-			text = modifier
-			break
-		end
-	end
-	if text == "" then
-		return false
-	end
-	if not text:find("^F%d+$") and text ~= "CAPSLOCK" and text:len() ~= 1 and (text:byte() < 128 or text:len() > 4) and not _G["KEY_" .. text] then
-		return false
-	end
-	local s = text
-	if shift then
-		s = "SHIFT-" .. s
-	end
-	if ctrl then
-		s = "CTRL-" .. s
-	end
-	if alt then
-		s = "ALT-" .. s
-	end
-	return s
-end
-
--- handle() - selfrecursing function that processes input->optiontable
--- - depth - starts at 0
--- - retfalse - return false rather than produce error if a match is not found (used by inlined groups)
-
-local function handle(info, inputpos, tab, depth, retfalse)
-
-	if not(type(tab)=="table" and type(tab.type)=="string") then err(info,inputpos) end
-
-	-------------------------------------------------------------------
-	-- Grab hold of handler,set,get,func,etc if set (and remember old ones)
-	-- Note that we do NOT validate if method names are correct at this stage,
-	-- the handler may change before they're actually used!
-
-	local oldhandler,oldhandler_at = getparam(info,inputpos,tab,depth,"handler",handlertypes,handlermsg)
-	local oldset,oldset_at = getparam(info,inputpos,tab,depth,"set",functypes,funcmsg)
-	local oldget,oldget_at = getparam(info,inputpos,tab,depth,"get",functypes,funcmsg)
-	local oldfunc,oldfunc_at = getparam(info,inputpos,tab,depth,"func",functypes,funcmsg)
-	local oldvalidate,oldvalidate_at = getparam(info,inputpos,tab,depth,"validate",functypes,funcmsg)
-	--local oldconfirm,oldconfirm_at = getparam(info,inputpos,tab,depth,"confirm",functypes,funcmsg)
-
-	-------------------------------------------------------------------
-	-- Act according to .type of this table
-
-	if tab.type=="group" then
-		------------ group --------------------------------------------
-
-		if type(tab.args)~="table" then err(info, inputpos) end
-		if tab.plugins and type(tab.plugins)~="table" then err(info,inputpos) end
-
-		-- grab next arg from input
-		local _,nextpos,arg = (info.input):find(" *([^ ]+) *", inputpos)
-		if not arg then
-			showhelp(info, inputpos, tab, depth)
-			return
-		end
-		nextpos=nextpos+1
-
-		-- loop .args and try to find a key with a matching name
-		for k,v in iterateargs(tab) do
-			if not(type(k)=="string" and type(v)=="table" and type(v.type)=="string") then err(info,inputpos, "options table child '"..tostring(k).."' is malformed") end
-
-			-- is this child an inline group? if so, traverse into it
-			if v.type=="group" and pickfirstset(v.cmdInline, v.inline, false) then
-				info[depth+1] = k
-				if handle(info, inputpos, v, depth+1, true)==false then
-					info[depth+1] = nil
-					-- wasn't found in there, but that's ok, we just keep looking down here
-				else
-					return	-- done, name was found in inline group
-				end
-			-- matching name and not a inline group
-			elseif strlower(arg)==strlower(k:gsub(" ", "_")) then
-				info[depth+1] = k
-				return handle(info,nextpos,v,depth+1)
-			end
-		end
-
-		-- no match
-		if retfalse then
-			-- restore old infotable members and return false to indicate failure
-			info.handler,info.handler_at = oldhandler,oldhandler_at
-			info.set,info.set_at = oldset,oldset_at
-			info.get,info.get_at = oldget,oldget_at
-			info.func,info.func_at = oldfunc,oldfunc_at
-			info.validate,info.validate_at = oldvalidate,oldvalidate_at
-			--info.confirm,info.confirm_at = oldconfirm,oldconfirm_at
-			return false
-		end
-
-		-- couldn't find the command, display error
-		usererr(info, inputpos, "'"..arg.."' - " .. L["unknown argument"])
-		return
-	end
-
-	local str = strsub(info.input,inputpos);
-
-	if tab.type=="execute" then
-		------------ execute --------------------------------------------
-		do_final(info, inputpos, tab, "func")
-
-
-
-	elseif tab.type=="input" then
-		------------ input --------------------------------------------
-
-		local res = true
-		if tab.pattern then
-			if not(type(tab.pattern)=="string") then err(info, inputpos, "'pattern' - expected a string") end
-			if not strmatch(str, tab.pattern) then
-				usererr(info, inputpos, "'"..str.."' - " .. L["invalid input"])
-				return
-			end
-		end
-
-		do_final(info, inputpos, tab, "set", str)
-
-
-
-	elseif tab.type=="toggle" then
-		------------ toggle --------------------------------------------
-		local b
-		local str = strtrim(strlower(str))
-		if str=="" then
-			b = callmethod(info, inputpos, tab, "get")
-
-			if tab.tristate then
-				--cycle in true, nil, false order
-				if b then
-					b = nil
-				elseif b == nil then
-					b = false
-				else
-					b = true
-				end
-			else
-				b = not b
-			end
-
-		elseif str==L["on"] then
-			b = true
-		elseif str==L["off"] then
-			b = false
-		elseif tab.tristate and str==L["default"] then
-			b = nil
-		else
-			if tab.tristate then
-				usererr(info, inputpos, format(L["'%s' - expected 'on', 'off' or 'default', or no argument to toggle."], str))
-			else
-				usererr(info, inputpos, format(L["'%s' - expected 'on' or 'off', or no argument to toggle."], str))
-			end
-			return
-		end
-
-		do_final(info, inputpos, tab, "set", b)
-
-
-	elseif tab.type=="range" then
-		------------ range --------------------------------------------
-		local val = tonumber(str)
-		if not val then
-			usererr(info, inputpos, "'"..str.."' - "..L["expected number"])
-			return
-		end
-		if type(info.step)=="number" then
-			val = val- (val % info.step)
-		end
-		if type(info.min)=="number" and val<info.min then
-			usererr(info, inputpos, val.." - "..format(L["must be equal to or higher than %s"], tostring(info.min)) )
-			return
-		end
-		if type(info.max)=="number" and val>info.max then
-			usererr(info, inputpos, val.." - "..format(L["must be equal to or lower than %s"], tostring(info.max)) )
-			return
-		end
-
-		do_final(info, inputpos, tab, "set", val)
-
-
-	elseif tab.type=="select" then
-		------------ select ------------------------------------
-		local str = strtrim(strlower(str))
-
-		local values = tab.values
-		if type(values) == "function" or type(values) == "string" then
-			info.values = values
-			values = callmethod(info, inputpos, tab, "values")
-			info.values = nil
-		end
-
-		if str == "" then
-			local b = callmethod(info, inputpos, tab, "get")
-			local fmt = "|cffffff78- [%s]|r %s"
-			local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r"
-			print(L["Options for |cffffff78"..info[#info].."|r:"])
-			for k, v in pairs(values) do
-				if b == k then
-					print(fmt_sel:format(k, v))
-				else
-					print(fmt:format(k, v))
-				end
-			end
-			return
-		end
-
-		local ok
-		for k,v in pairs(values) do
-			if strlower(k)==str then
-				str = k	-- overwrite with key (in case of case mismatches)
-				ok = true
-				break
-			end
-		end
-		if not ok then
-			usererr(info, inputpos, "'"..str.."' - "..L["unknown selection"])
-			return
-		end
-
-		do_final(info, inputpos, tab, "set", str)
-
-	elseif tab.type=="multiselect" then
-		------------ multiselect -------------------------------------------
-		local str = strtrim(strlower(str))
-
-		local values = tab.values
-		if type(values) == "function" or type(values) == "string" then
-			info.values = values
-			values = callmethod(info, inputpos, tab, "values")
-			info.values = nil
-		end
-
-		if str == "" then
-			local fmt = "|cffffff78- [%s]|r %s"
-			local fmt_sel = "|cffffff78- [%s]|r %s |cffff0000*|r"
-			print(L["Options for |cffffff78"..info[#info].."|r (multiple possible):"])
-			for k, v in pairs(values) do
-				if callmethod(info, inputpos, tab, "get", k) then
-					print(fmt_sel:format(k, v))
-				else
-					print(fmt:format(k, v))
-				end
-			end
-			return
-		end
-
-		--build a table of the selections, checking that they exist
-		--parse for =on =off =default in the process
-		--table will be key = true for options that should toggle, key = [on|off|default] for options to be set
-		local sels = {}
-		for v in str:gmatch("[^ ]+") do
-			--parse option=on etc
-			local opt, val = v:match('(.+)=(.+)')
-			--get option if toggling
-			if not opt then
-				opt = v
-			end
-
-			--check that the opt is valid
-			local ok
-			for k,v in pairs(values) do
-				if strlower(k)==opt then
-					opt = k	-- overwrite with key (in case of case mismatches)
-					ok = true
-					break
-				end
-			end
-
-			if not ok then
-				usererr(info, inputpos, "'"..opt.."' - "..L["unknown selection"])
-				return
-			end
-
-			--check that if val was supplied it is valid
-			if val then
-				if val == L["on"] or val == L["off"] or (tab.tristate and val == L["default"]) then
-					--val is valid insert it
-					sels[opt] = val
-				else
-					if tab.tristate then
-						usererr(info, inputpos, format(L["'%s' '%s' - expected 'on', 'off' or 'default', or no argument to toggle."], v, val))
-					else
-						usererr(info, inputpos, format(L["'%s' '%s' - expected 'on' or 'off', or no argument to toggle."], v, val))
-					end
-					return
-				end
-			else
-				-- no val supplied, toggle
-				sels[opt] = true
-			end
-		end
-
-		for opt, val in pairs(sels) do
-			local newval
-
-			if (val == true) then
-				--toggle the option
-				local b = callmethod(info, inputpos, tab, "get", opt)
-
-				if tab.tristate then
-					--cycle in true, nil, false order
-					if b then
-						b = nil
-					elseif b == nil then
-						b = false
-					else
-						b = true
-					end
-				else
-					b = not b
-				end
-				newval = b
-			else
-				--set the option as specified
-				if val==L["on"] then
-					newval = true
-				elseif val==L["off"] then
-					newval = false
-				elseif val==L["default"] then
-					newval = nil
-				end
-			end
-
-			do_final(info, inputpos, tab, "set", opt, newval)
-		end
-
-
-	elseif tab.type=="color" then
-		------------ color --------------------------------------------
-		local str = strtrim(strlower(str))
-		if str == "" then
-			--TODO: Show current value
-			return
-		end
-
-		local r, g, b, a
-
-		local hasAlpha = tab.hasAlpha
-		if type(hasAlpha) == "function" or type(hasAlpha) == "string" then
-			info.hasAlpha = hasAlpha
-			hasAlpha = callmethod(info, inputpos, tab, 'hasAlpha')
-			info.hasAlpha = nil
-		end
-
-		if hasAlpha then
-			if str:len() == 8 and str:find("^%x*$")  then
-				--parse a hex string
-				r,g,b,a = tonumber(str:sub(1, 2), 16) / 255, tonumber(str:sub(3, 4), 16) / 255, tonumber(str:sub(5, 6), 16) / 255, tonumber(str:sub(7, 8), 16) / 255
-			else
-				--parse seperate values
-				r,g,b,a = str:match("^([%d%.]+) ([%d%.]+) ([%d%.]+) ([%d%.]+)$")
-				r,g,b,a = tonumber(r), tonumber(g), tonumber(b), tonumber(a)
-			end
-			if not (r and g and b and a) then
-				usererr(info, inputpos, format(L["'%s' - expected 'RRGGBBAA' or 'r g b a'."], str))
-				return
-			end
-
-			if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 and a >= 0.0 and a <= 1.0 then
-				--values are valid
-			elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 and a >= 0 and a <= 255 then
-				--values are valid 0..255, convert to 0..1
-				r = r / 255
-				g = g / 255
-				b = b / 255
-				a = a / 255
-			else
-				--values are invalid
-				usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0..1 or 0..255."], str))
-			end
-		else
-			a = 1.0
-			if str:len() == 6 and str:find("^%x*$") then
-				--parse a hex string
-				r,g,b = tonumber(str:sub(1, 2), 16) / 255, tonumber(str:sub(3, 4), 16) / 255, tonumber(str:sub(5, 6), 16) / 255
-			else
-				--parse seperate values
-				r,g,b = str:match("^([%d%.]+) ([%d%.]+) ([%d%.]+)$")
-				r,g,b = tonumber(r), tonumber(g), tonumber(b)
-			end
-			if not (r and g and b) then
-				usererr(info, inputpos, format(L["'%s' - expected 'RRGGBB' or 'r g b'."], str))
-				return
-			end
-			if r >= 0.0 and r <= 1.0 and g >= 0.0 and g <= 1.0 and b >= 0.0 and b <= 1.0 then
-				--values are valid
-			elseif r >= 0 and r <= 255 and g >= 0 and g <= 255 and b >= 0 and b <= 255 then
-				--values are valid 0..255, convert to 0..1
-				r = r / 255
-				g = g / 255
-				b = b / 255
-			else
-				--values are invalid
-				usererr(info, inputpos, format(L["'%s' - values must all be either in the range 0-1 or 0-255."], str))
-			end
-		end
-
-		do_final(info, inputpos, tab, "set", r,g,b,a)
-
-	elseif tab.type=="keybinding" then
-		------------ keybinding --------------------------------------------
-		local str = strtrim(strlower(str))
-		if str == "" then
-			--TODO: Show current value
-			return
-		end
-		local value = keybindingValidateFunc(str:upper())
-		if value == false then
-			usererr(info, inputpos, format(L["'%s' - Invalid Keybinding."], str))
-			return
-		end
-
-		do_final(info, inputpos, tab, "set", value)
-
-	elseif tab.type=="description" then
-		------------ description --------------------
-		-- ignore description, GUI config only
-	else
-		err(info, inputpos, "unknown options table item type '"..tostring(tab.type).."'")
-	end
-end
-
---- Handle the chat command.
--- This is usually called from a chat command handler to parse the command input as operations on an aceoptions table.\\
--- AceConfigCmd uses this function internally when a slash command is registered with `:CreateChatCommand`
--- @param slashcmd The slash command WITHOUT leading slash (only used for error output)
--- @param appName The application name as given to `:RegisterOptionsTable()`
--- @param input The commandline input (as given by the WoW handler, i.e. without the command itself)
--- @usage
--- MyAddon = LibStub("AceAddon-3.0"):NewAddon("MyAddon", "AceConsole-3.0")
--- -- Use AceConsole-3.0 to register a Chat Command
--- MyAddon:RegisterChatCommand("mychat", "ChatCommand")
---
--- -- Show the GUI if no input is supplied, otherwise handle the chat input.
--- function MyAddon:ChatCommand(input)
---   -- Assuming "MyOptions" is the appName of a valid options table
---   if not input or input:trim() == "" then
---     LibStub("AceConfigDialog-3.0"):Open("MyOptions")
---   else
---     LibStub("AceConfigCmd-3.0").HandleCommand(MyAddon, "mychat", "MyOptions", input)
---   end
--- end
-function AceConfigCmd:HandleCommand(slashcmd, appName, input)
-
-	local optgetter = cfgreg:GetOptionsTable(appName)
-	if not optgetter then
-		error([[Usage: HandleCommand("slashcmd", "appName", "input"): 'appName' - no options table "]]..tostring(appName)..[[" has been registered]], 2)
-	end
-	local options = assert( optgetter("cmd", MAJOR) )
-
-	local info = {   -- Don't try to recycle this, it gets handed off to callbacks and whatnot
-		[0] = slashcmd,
-		appName = appName,
-		options = options,
-		input = input,
-		self = self,
-		handler = self,
-		uiType = "cmd",
-		uiName = MAJOR,
-	}
-
-	handle(info, 1, options, 0)  -- (info, inputpos, table, depth)
-end
-
---- Utility function to create a slash command handler.
--- Also registers tab completion with AceTab
--- @param slashcmd The slash command WITHOUT leading slash (only used for error output)
--- @param appName The application name as given to `:RegisterOptionsTable()`
-function AceConfigCmd:CreateChatCommand(slashcmd, appName)
-	if not AceConsole then
-		AceConsole = LibStub(AceConsoleName)
-	end
-	if AceConsole.RegisterChatCommand(self, slashcmd, function(input)
-				AceConfigCmd.HandleCommand(self, slashcmd, appName, input)	-- upgradable
-		end,
-	true) then -- succesfully registered so lets get the command -> app table in
-		commands[slashcmd] = appName
-	end
-end
-
---- Utility function that returns the options table that belongs to a slashcommand.
--- Designed to be used for the AceTab interface.
--- @param slashcmd The slash command WITHOUT leading slash (only used for error output)
--- @return The options table associated with the slash command (or nil if the slash command was not registered)
-function AceConfigCmd:GetChatCommandOptions(slashcmd)
-	return commands[slashcmd]
-end
diff --git a/ElvUI_SLE/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml b/ElvUI_SLE/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml
deleted file mode 100644
index 188d354..0000000
--- a/ElvUI_SLE/libs/AceConfig-3.0/AceConfigCmd-3.0/AceConfigCmd-3.0.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<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
diff --git a/ElvUI_SLE/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua b/ElvUI_SLE/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
deleted file mode 100644
index cc8dc5d..0000000
--- a/ElvUI_SLE/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.lua
+++ /dev/null
@@ -1,1954 +0,0 @@
---- 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 $
-
-local LibStub = LibStub
-local MAJOR, MINOR = "AceConfigDialog-3.0-ElvUI", 1
-local AceConfigDialog, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
-
-if not AceConfigDialog then return end
-
-AceConfigDialog.OpenFrames = AceConfigDialog.OpenFrames or {}
-AceConfigDialog.Status = AceConfigDialog.Status or {}
-AceConfigDialog.frame = AceConfigDialog.frame or CreateFrame("Frame")
-
-AceConfigDialog.frame.apps = AceConfigDialog.frame.apps or {}
-AceConfigDialog.frame.closing = AceConfigDialog.frame.closing or {}
-AceConfigDialog.frame.closeAllOverride = AceConfigDialog.frame.closeAllOverride or {}
-
-local gui = LibStub("AceGUI-3.0")
-local reg = LibStub("AceConfigRegistry-3.0-ElvUI")
-
--- Lua APIs
-local tconcat, tinsert, tsort, tremove, tsort = table.concat, table.insert, table.sort, table.remove, table.sort
-local strmatch, format = string.match, string.format
-local assert, loadstring, error = assert, loadstring, error
-local pairs, next, select, type, unpack, wipe, ipairs = pairs, next, select, type, unpack, wipe, ipairs
-local rawset, tostring, tonumber = rawset, tostring, tonumber
-local math_min, math_max, math_floor = math.min, math.max, math.floor
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: NORMAL_FONT_COLOR, GameTooltip, StaticPopupDialogs, ACCEPT, CANCEL, StaticPopup_Show
--- GLOBALS: PlaySound, GameFontHighlight, GameFontHighlightSmall, GameFontHighlightLarge
--- GLOBALS: CloseSpecialWindows, InterfaceOptions_AddCategory, geterrorhandler
-
-local emptyTbl = {}
-
---[[
-	 xpcall safecall implementation
-]]
-local xpcall = xpcall
-
-local function errorhandler(err)
-	return geterrorhandler()(err)
-end
-
-local function CreateDispatcher(argCount)
-	local code = [[
-		local xpcall, eh = ...
-		local method, ARGS
-		local function call() return method(ARGS) end
-
-		local function dispatch(func, ...)
-			 method = func
-			 if not method then return end
-			 ARGS = ...
-			 return xpcall(call, eh)
-		end
-
-		return dispatch
-	]]
-
-	local ARGS = {}
-	for i = 1, argCount do ARGS[i] = "arg"..i end
-	code = code:gsub("ARGS", tconcat(ARGS, ", "))
-	return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
-end
-
-local Dispatchers = setmetatable({}, {__index=function(self, argCount)
-	local dispatcher = CreateDispatcher(argCount)
-	rawset(self, argCount, dispatcher)
-	return dispatcher
-end})
-Dispatchers[0] = function(func)
-	return xpcall(func, errorhandler)
-end
-
-local function safecall(func, ...)
-	return Dispatchers[select("#", ...)](func, ...)
-end
-
-local width_multiplier = 170
-
---[[
-Group Types
-  Tree 	- All Descendant Groups will all become nodes on the tree, direct child options will appear above the tree
-  		- Descendant Groups with inline=true and thier children will not become nodes
-
-  Tab	- Direct Child Groups will become tabs, direct child options will appear above the tab control
-  		- Grandchild groups will default to inline unless specified otherwise
-
-  Select- Same as Tab but with entries in a dropdown rather than tabs
-
-
-  Inline Groups
-  	- Will not become nodes of a select group, they will be effectivly part of thier parent group seperated by a border
-  	- If declared on a direct child of a root node of a select group, they will appear above the group container control
-  	- When a group is displayed inline, all descendants will also be inline members of the group
-
-]]
-
--- Recycling functions
-local new, del, copy
---newcount, delcount,createdcount,cached = 0,0,0
-do
-	local pool = setmetatable({},{__mode="k"})
-	function new()
-		--newcount = newcount + 1
-		local t = next(pool)
-		if t then
-			pool[t] = nil
-			return t
-		else
-			--createdcount = createdcount + 1
-			return {}
-		end
-	end
-	function copy(t)
-		local c = new()
-		for k, v in pairs(t) do
-			c[k] = v
-		end
-		return c
-	end
-	function del(t)
-		--delcount = delcount + 1
-		wipe(t)
-		pool[t] = true
-	end
---	function cached()
---		local n = 0
---		for k in pairs(pool) do
---			n = n + 1
---		end
---		return n
---	end
-end
-
--- picks the first non-nil value and returns it
-local function pickfirstset(...)
-  for i=1,select("#",...) do
-    if select(i,...)~=nil then
-      return select(i,...)
-    end
-  end
-end
-
---gets an option from a given group, checking plugins
-local function GetSubOption(group, key)
-	if group.plugins then
-		for plugin, t in pairs(group.plugins) do
-			if t[key] then
-				return t[key]
-			end
-		end
-	end
-
-	return group.args[key]
-end
-
---Option member type definitions, used to decide how to access it
-
---Is the member Inherited from parent options
-local isInherited = {
-	set = true,
-	get = true,
-	func = true,
-	confirm = true,
-	validate = true,
-	disabled = true,
-	hidden = true
-}
-
---Does a string type mean a literal value, instead of the default of a method of the handler
-local stringIsLiteral = {
-	name = true,
-	desc = true,
-	icon = true,
-	usage = true,
-	width = true,
-	image = true,
-	fontSize = true,
-}
-
---Is Never a function or method
-local allIsLiteral = {
-	type = true,
-	descStyle = true,
-	imageWidth = true,
-	imageHeight = true,
-}
-
---gets the value for a member that could be a function
---function refs are called with an info arg
---every other type is returned
-local function GetOptionsMemberValue(membername, option, options, path, appName, ...)
-	--get definition for the member
-	local inherits = isInherited[membername]
-
-
-	--get the member of the option, traversing the tree if it can be inherited
-	local member
-
-	if inherits then
-		local group = options
-		if group[membername] ~= nil then
-			member = group[membername]
-		end
-		for i = 1, #path do
-			group = GetSubOption(group, path[i])
-			if group[membername] ~= nil then
-				member = group[membername]
-			end
-		end
-	else
-		member = option[membername]
-	end
-
-	--check if we need to call a functon, or if we have a literal value
-	if ( not allIsLiteral[membername] ) and ( type(member) == "function" or ((not stringIsLiteral[membername]) and type(member) == "string") ) then
-		--We have a function to call
-		local info = new()
-		--traverse the options table, picking up the handler and filling the info with the path
-		local handler
-		local group = options
-		handler = group.handler or handler
-
-		for i = 1, #path do
-			group = GetSubOption(group, path[i])
-			info[i] = path[i]
-			handler = group.handler or handler
-		end
-
-		info.options = options
-		info.appName = appName
-		info[0] = appName
-		info.arg = option.arg
-		info.handler = handler
-		info.option = option
-		info.type = option.type
-		info.uiType = "dialog"
-		info.uiName = MAJOR
-
-		local a, b, c ,d, e, f, g, h
-		--using 4 returns for the get of a color type, increase if a type needs more
-		if type(member) == "function" then
-			--Call the function
-			a,b,c,d, e, f, g, h = member(info, ...)
-		else
-			--Call the method
-			if handler and handler[member] then
-				a,b,c,d,e, f, g, h = handler[member](handler, info, ...)
-			else
-				error(format("Method %s doesn't exist in handler for type %s", member, membername))
-			end
-		end
-		del(info)
-		return a,b,c,d,e, f, g, h
-	else
-		--The value isnt a function to call, return it
-		return member
-	end
-end
-
---[[calls an options function that could be inherited, method name or function ref
-local function CallOptionsFunction(funcname ,option, options, path, appName, ...)
-	local info = new()
-
-	local func
-	local group = options
-	local handler
-
-	--build the info table containing the path
-	-- pick up functions while traversing the tree
-	if group[funcname] ~= nil then
-		func = group[funcname]
-	end
-	handler = group.handler or handler
-
-	for i, v in ipairs(path) do
-		group = GetSubOption(group, v)
-		info[i] = v
-		if group[funcname] ~= nil then
-			func =  group[funcname]
-		end
-		handler = group.handler or handler
-	end
-
-	info.options = options
-	info[0] = appName
-	info.arg = option.arg
-
-	local a, b, c ,d
-	if type(func) == "string" then
-		if handler and handler[func] then
-			a,b,c,d = handler[func](handler, info, ...)
-		else
-			error(string.format("Method %s doesn't exist in handler for type func", func))
-		end
-	elseif type(func) == "function" then
-		a,b,c,d = func(info, ...)
-	end
-	del(info)
-	return a,b,c,d
-end
---]]
-
---tables to hold orders and names for options being sorted, will be created with new()
---prevents needing to call functions repeatedly while sorting
-local tempOrders
-local tempNames
-
-local function compareOptions(a,b)
-	if not a then
-		return true
-	end
-	if not b then
-		return false
-	end
-	local OrderA, OrderB = tempOrders[a] or 100, tempOrders[b] or 100
-	if OrderA == OrderB then
-		local NameA = (type(tempNames[a]) == "string") and tempNames[a] or ""
-		local NameB = (type(tempNames[b]) == "string") and tempNames[b] or ""
-		return NameA:upper() < NameB:upper()
-	end
-	if OrderA < 0 then
-		if OrderB > 0 then
-			return false
-		end
-	else
-		if OrderB < 0 then
-			return true
-		end
-	end
-	return OrderA < OrderB
-end
-
-
-
---builds 2 tables out of an options group
--- keySort, sorted keys
--- opts, combined options from .plugins and args
-local function BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
-	tempOrders = new()
-	tempNames = new()
-
-	if group.plugins then
-		for plugin, t in pairs(group.plugins) do
-			for k, v in pairs(t) do
-				if not opts[k] then
-					tinsert(keySort, k)
-					opts[k] = v
-
-					path[#path+1] = k
-					tempOrders[k] = GetOptionsMemberValue("order", v, options, path, appName)
-					tempNames[k] = GetOptionsMemberValue("name", v, options, path, appName)
-					path[#path] = nil
-				end
-			end
-		end
-	end
-
-	for k, v in pairs(group.args) do
-		if not opts[k] then
-			tinsert(keySort, k)
-			opts[k] = v
-
-			path[#path+1] = k
-			tempOrders[k] = GetOptionsMemberValue("order", v, options, path, appName)
-			tempNames[k] = GetOptionsMemberValue("name", v, options, path, appName)
-			path[#path] = nil
-		end
-	end
-
-	tsort(keySort, compareOptions)
-
-	del(tempOrders)
-	del(tempNames)
-end
-
-local function DelTree(tree)
-	if tree.children then
-		local childs = tree.children
-		for i = 1, #childs do
-			DelTree(childs[i])
-			del(childs[i])
-		end
-		del(childs)
-	end
-end
-
-local function CleanUserData(widget, event)
-
-	local user = widget:GetUserDataTable()
-
-	if user.path then
-		del(user.path)
-	end
-
-	if widget.type == "TreeGroup" then
-		local tree = user.tree
-		widget:SetTree(nil)
-		if tree then
-			for i = 1, #tree do
-				DelTree(tree[i])
-				del(tree[i])
-			end
-			del(tree)
-		end
-	end
-
-	if widget.type == "TabGroup" then
-		widget:SetTabs(nil)
-		if user.tablist then
-			del(user.tablist)
-		end
-	end
-
-	if widget.type == "DropdownGroup" then
-		widget:SetGroupList(nil)
-		if user.grouplist then
-			del(user.grouplist)
-		end
-		if user.orderlist then
-			del(user.orderlist)
-		end
-	end
-end
-
--- - Gets a status table for the given appname and options path.
--- @param appName The application name as given to `:RegisterOptionsTable()`
--- @param path The path to the options (a table with all group keys)
--- @return
-function AceConfigDialog:GetStatusTable(appName, path)
-	local status = self.Status
-
-	if not status[appName] then
-		status[appName] = {}
-		status[appName].status = {}
-		status[appName].children = {}
-	end
-
-	status = status[appName]
-
-	if path then
-		for i = 1, #path do
-			local v = path[i]
-			if not status.children[v] then
-				status.children[v] = {}
-				status.children[v].status = {}
-				status.children[v].children = {}
-			end
-			status = status.children[v]
-		end
-	end
-
-	return status.status
-end
-
---- Selects the specified path in the options window.
--- The path specified has to match the keys of the groups in the table.
--- @param appName The application name as given to `:RegisterOptionsTable()`
--- @param ... The path to the key that should be selected
-function AceConfigDialog:SelectGroup(appName, ...)
-	local path = new()
-
-
-	local app = reg:GetOptionsTable(appName)
-	if not app then
-		error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2)
-	end
-	local options = app("dialog", MAJOR)
-	local group = options
-	local status = self:GetStatusTable(appName, path)
-	if not status.groups then
-		status.groups = {}
-	end
-	status = status.groups
-	local treevalue
-	local treestatus
-
-	for n = 1, select("#",...) do
-		local key = select(n, ...)
-
-		if group.childGroups == "tab" or group.childGroups == "select" then
-			--if this is a tab or select group, select the group
-			status.selected = key
-			--children of this group are no longer extra levels of a tree
-			treevalue = nil
-		else
-			--tree group by default
-			if treevalue then
-				--this is an extra level of a tree group, build a uniquevalue for it
-				treevalue = treevalue.."\001"..key
-			else
-				--this is the top level of a tree group, the uniquevalue is the same as the key
-				treevalue = key
-				if not status.groups then
-					status.groups = {}
-				end
-				--save this trees status table for any extra levels or groups
-				treestatus = status
-			end
-			--make sure that the tree entry is open, and select it.
-			--the selected group will be overwritten if a child is the final target but still needs to be open
-			treestatus.selected = treevalue
-			treestatus.groups[treevalue] = true
-
-		end
-
-		--move to the next group in the path
-		group = GetSubOption(group, key)
-		if not group then
-			break
-		end
-		tinsert(path, key)
-		status = self:GetStatusTable(appName, path)
-		if not status.groups then
-			status.groups = {}
-		end
-		status = status.groups
-	end
-
-	del(path)
-	reg:NotifyChange(appName)
-end
-
-local function OptionOnMouseOver(widget, event)
-	--show a tooltip/set the status bar to the desc text
-	local user = widget:GetUserDataTable()
-	local opt = user.option
-	local options = user.options
-	local path = user.path
-	local appName = user.appName
-
-	GameTooltip:SetOwner(widget.frame, "ANCHOR_TOPRIGHT")
-	local name = GetOptionsMemberValue("name", opt, options, path, appName)
-	local desc = GetOptionsMemberValue("desc", opt, options, path, appName)
-	local usage = GetOptionsMemberValue("usage", opt, options, path, appName)
-	local descStyle = opt.descStyle
-
-	if descStyle and descStyle ~= "tooltip" then return end
-
-	GameTooltip:SetText(name, 1, .82, 0, true)
-
-	if opt.type == "multiselect" then
-		GameTooltip:AddLine(user.text, 0.5, 0.5, 0.8, true)
-	end
-	if type(desc) == "string" then
-		GameTooltip:AddLine(desc, 1, 1, 1, true)
-	end
-	if type(usage) == "string" then
-		GameTooltip:AddLine("Usage: "..usage, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, true)
-	end
-
-	GameTooltip:Show()
-end
-
-local function OptionOnMouseLeave(widget, event)
-	GameTooltip:Hide()
-end
-
-local function GetFuncName(option)
-	local type = option.type
-	if type == "execute" then
-		return "func"
-	else
-		return "set"
-	end
-end
-local function confirmPopup(appName, rootframe, basepath, info, message, func, ...)
-	if not StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] then
-		StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"] = {}
-	end
-	local t = StaticPopupDialogs["ACECONFIGDIALOG30_CONFIRM_DIALOG"]
-	for k in pairs(t) do
-		t[k] = nil
-	end
-	t.text = message
-	t.button1 = ACCEPT
-	t.button2 = CANCEL
-	t.preferredIndex = STATICPOPUP_NUMDIALOGS
-	local dialog, oldstrata
-	t.OnAccept = function()
-		safecall(func, unpack(t))
-		if dialog and oldstrata then
-			dialog:SetFrameStrata(oldstrata)
-		end
-		AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl))
-		del(info)
-	end
-	t.OnCancel = function()
-		if dialog and oldstrata then
-			dialog:SetFrameStrata(oldstrata)
-		end
-		AceConfigDialog:Open(appName, rootframe, unpack(basepath or emptyTbl))
-		del(info)
-	end
-	for i = 1, select("#", ...) do
-		t[i] = select(i, ...) or false
-	end
-	t.timeout = 0
-	t.whileDead = 1
-	t.hideOnEscape = 1
-
-	dialog = StaticPopup_Show("ACECONFIGDIALOG30_CONFIRM_DIALOG")
-	if dialog then
-		oldstrata = dialog:GetFrameStrata()
-		dialog:SetFrameStrata("TOOLTIP")
-	end
-end
-
-local function ActivateControl(widget, event, ...)
-	--This function will call the set / execute handler for the widget
-	--widget:GetUserDataTable() contains the needed info
-	local user = widget:GetUserDataTable()
-	local option = user.option
-	local options = user.options
-	local path = user.path
-	local info = new()
-
-	local func
-	local group = options
-	local funcname = GetFuncName(option)
-	local handler
-	local confirm
-	local validate
-	--build the info table containing the path
-	-- pick up functions while traversing the tree
-	if group[funcname] ~= nil then
-		func =  group[funcname]
-	end
-	handler = group.handler or handler
-	confirm = group.confirm
-	validate = group.validate
-	for i = 1, #path do
-		local v = path[i]
-		group = GetSubOption(group, v)
-		info[i] = v
-		if group[funcname] ~= nil then
-			func =  group[funcname]
-		end
-		handler = group.handler or handler
-		if group.confirm ~= nil then
-			confirm = group.confirm
-		end
-		if group.validate ~= nil then
-			validate = group.validate
-		end
-	end
-
-	info.options = options
-	info.appName = user.appName
-	info.arg = option.arg
-	info.handler = handler
-	info.option = option
-	info.type = option.type
-	info.uiType = "dialog"
-	info.uiName = MAJOR
-
-	local name
-	if type(option.name) == "function" then
-		name = option.name(info)
-	elseif type(option.name) == "string" then
-		name = option.name
-	else
-		name = ""
-	end
-	local usage = option.usage
-	local pattern = option.pattern
-
-	local validated = true
-
-	if option.type == "input" then
-		if type(pattern)=="string" then
-			if not strmatch(..., pattern) then
-				validated = false
-			end
-		end
-	end
-
-	local success
-	if validated and option.type ~= "execute" then
-		if type(validate) == "string" then
-			if handler and handler[validate] then
-				success, validated = safecall(handler[validate], handler, info, ...)
-				if not success then validated = false end
-			else
-				error(format("Method %s doesn't exist in handler for type execute", validate))
-			end
-		elseif type(validate) == "function" then
-			success, validated = safecall(validate, info, ...)
-			if not success then validated = false end
-		end
-	end
-
-	local rootframe = user.rootframe
-	if type(validated) == "string" then
-		--validate function returned a message to display
-		if rootframe.SetStatusText then
-			rootframe:SetStatusText(validated)
-		else
-			-- TODO: do something else.
-		end
-		PlaySound("igPlayerInviteDecline")
-		del(info)
-		return true
-	elseif not validated then
-		--validate returned false
-		if rootframe.SetStatusText then
-			if usage then
-				rootframe:SetStatusText(name..": "..usage)
-			else
-				if pattern then
-					rootframe:SetStatusText(name..": Expected "..pattern)
-				else
-					rootframe:SetStatusText(name..": Invalid Value")
-				end
-			end
-		else
-			-- TODO: do something else
-		end
-		PlaySound("igPlayerInviteDecline")
-		del(info)
-		return true
-	else
-
-		local confirmText = option.confirmText
-		--call confirm func/method
-		if type(confirm) == "string" then
-			if handler and handler[confirm] then
-				success, confirm = safecall(handler[confirm], handler, info, ...)
-				if success and type(confirm) == "string" then
-					confirmText = confirm
-					confirm = true
-				elseif not success then
-					confirm = false
-				end
-			else
-				error(format("Method %s doesn't exist in handler for type confirm", confirm))
-			end
-		elseif type(confirm) == "function" then
-			success, confirm = safecall(confirm, info, ...)
-			if success and type(confirm) == "string" then
-				confirmText = confirm
-				confirm = true
-			elseif not success then
-				confirm = false
-			end
-		end
-
-		--confirm if needed
-		if type(confirm) == "boolean" then
-			if confirm then
-				if not confirmText then
-					local name, desc = option.name, option.desc
-					if type(name) == "function" then
-						name = name(info)
-					end
-					if type(desc) == "function" then
-						desc = desc(info)
-					end
-					confirmText = name
-					if desc then
-						confirmText = confirmText.." - "..desc
-					end
-				end
-
-				local iscustom = user.rootframe:GetUserData("iscustom")
-				local rootframe
-
-				if iscustom then
-					rootframe = user.rootframe
-				end
-				local basepath = user.rootframe:GetUserData("basepath")
-				if type(func) == "string" then
-					if handler and handler[func] then
-						confirmPopup(user.appName, rootframe, basepath, info, confirmText, handler[func], handler, info, ...)
-					else
-						error(format("Method %s doesn't exist in handler for type func", func))
-					end
-				elseif type(func) == "function" then
-					confirmPopup(user.appName, rootframe, basepath, info, confirmText, func, info, ...)
-				end
-				--func will be called and info deleted when the confirm dialog is responded to
-				return
-			end
-		end
-
-		--call the function
-		if type(func) == "string" then
-			if handler and handler[func] then
-				safecall(handler[func],handler, info, ...)
-			else
-				error(format("Method %s doesn't exist in handler for type func", func))
-			end
-		elseif type(func) == "function" then
-			safecall(func,info, ...)
-		end
-
-
-
-		local iscustom = user.rootframe:GetUserData("iscustom")
-		local basepath = user.rootframe:GetUserData("basepath") or emptyTbl
-		--full refresh of the frame, some controls dont cause this on all events
-		if option.type == "color" then
-			if event == "OnValueConfirmed" then
-
-				if iscustom then
-					AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
-				else
-					AceConfigDialog:Open(user.appName, unpack(basepath))
-				end
-			end
-		elseif option.type == "range" then
-			if event == "OnMouseUp" then
-				if iscustom then
-					AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
-				else
-					AceConfigDialog:Open(user.appName, unpack(basepath))
-				end
-			end
-		--multiselects don't cause a refresh on 'OnValueChanged' only 'OnClosed'
-		elseif option.type == "multiselect" then
-			user.valuechanged = true
-		else
-			if iscustom then
-				AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
-			else
-				AceConfigDialog:Open(user.appName, unpack(basepath))
-			end
-		end
-
-	end
-	del(info)
-end
-
-local function ActivateSlider(widget, event, value)
-	local option = widget:GetUserData("option")
-	local min, max, step = option.min or (not option.softMin and 0 or nil), option.max or (not option.softMax and 100 or nil), option.step
-	if min then
-		if step then
-			value = math_floor((value - min) / step + 0.5) * step + min
-		end
-		value = math_max(value, min)
-	end
-	if max then
-		value = math_min(value, max)
-	end
-	ActivateControl(widget,event,value)
-end
-
---called from a checkbox that is part of an internally created multiselect group
---this type is safe to refresh on activation of one control
-local function ActivateMultiControl(widget, event, ...)
-	ActivateControl(widget, event, widget:GetUserData("value"), ...)
-	local user = widget:GetUserDataTable()
-	local iscustom = user.rootframe:GetUserData("iscustom")
-	local basepath = user.rootframe:GetUserData("basepath") or emptyTbl
-	if iscustom then
-		AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
-	else
-		AceConfigDialog:Open(user.appName, unpack(basepath))
-	end
-end
-
-local function MultiControlOnClosed(widget, event, ...)
-	local user = widget:GetUserDataTable()
-	if user.valuechanged then
-		local iscustom = user.rootframe:GetUserData("iscustom")
-		local basepath = user.rootframe:GetUserData("basepath") or emptyTbl
-		if iscustom then
-			AceConfigDialog:Open(user.appName, user.rootframe, unpack(basepath))
-		else
-			AceConfigDialog:Open(user.appName, unpack(basepath))
-		end
-	end
-end
-
-local function FrameOnClose(widget, event)
-	local appName = widget:GetUserData("appName")
-	AceConfigDialog.OpenFrames[appName] = nil
-	gui:Release(widget)
-end
-
-local function CheckOptionHidden(option, options, path, appName)
-	--check for a specific boolean option
-	local hidden = pickfirstset(option.dialogHidden,option.guiHidden)
-	if hidden ~= nil then
-		return hidden
-	end
-
-	return GetOptionsMemberValue("hidden", option, options, path, appName)
-end
-
-local function CheckOptionDisabled(option, options, path, appName)
-	--check for a specific boolean option
-	local disabled = pickfirstset(option.dialogDisabled,option.guiDisabled)
-	if disabled ~= nil then
-		return disabled
-	end
-
-	return GetOptionsMemberValue("disabled", option, options, path, appName)
-end
---[[
-local function BuildTabs(group, options, path, appName)
-	local tabs = new()
-	local text = new()
-	local keySort = new()
-	local opts = new()
-
-	BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
-
-	for i = 1, #keySort do
-		local k = keySort[i]
-		local v = opts[k]
-		if v.type == "group" then
-			path[#path+1] = k
-			local inline = pickfirstset(v.dialogInline,v.guiInline,v.inline, false)
-			local hidden = CheckOptionHidden(v, options, path, appName)
-			if not inline and not hidden then
-				tinsert(tabs, k)
-				text[k] = GetOptionsMemberValue("name", v, options, path, appName)
-			end
-			path[#path] = nil
-		end
-	end
-
-	del(keySort)
-	del(opts)
-
-	return tabs, text
-end
-]]
-local function BuildSelect(group, options, path, appName)
-	local groups = new()
-	local order = new()
-	local keySort = new()
-	local opts = new()
-
-	BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
-
-	for i = 1, #keySort do
-		local k = keySort[i]
-		local v = opts[k]
-		if v.type == "group" then
-			path[#path+1] = k
-			local inline = pickfirstset(v.dialogInline,v.guiInline,v.inline, false)
-			local hidden = CheckOptionHidden(v, options, path, appName)
-			if not inline and not hidden then
-				groups[k] = GetOptionsMemberValue("name", v, options, path, appName)
-				tinsert(order, k)
-			end
-			path[#path] = nil
-		end
-	end
-
-	del(opts)
-	del(keySort)
-
-	return groups, order
-end
-
-local function BuildSubGroups(group, tree, options, path, appName)
-	local keySort = new()
-	local opts = new()
-
-	BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
-
-	for i = 1, #keySort do
-		local k = keySort[i]
-		local v = opts[k]
-		if v.type == "group" then
-			path[#path+1] = k
-			local inline = pickfirstset(v.dialogInline,v.guiInline,v.inline, false)
-			local hidden = CheckOptionHidden(v, options, path, appName)
-			if not inline and not hidden then
-				local entry = new()
-				entry.value = k
-				entry.text = GetOptionsMemberValue("name", v, options, path, appName)
-				entry.icon = GetOptionsMemberValue("icon", v, options, path, appName)
-				entry.iconCoords = GetOptionsMemberValue("iconCoords", v, options, path, appName)
-				entry.disabled = CheckOptionDisabled(v, options, path, appName)
-				if not tree.children then tree.children = new() end
-				tinsert(tree.children,entry)
-				if (v.childGroups or "tree") == "tree" then
-					BuildSubGroups(v,entry, options, path, appName)
-				end
-			end
-			path[#path] = nil
-		end
-	end
-
-	del(keySort)
-	del(opts)
-end
-
-local function BuildGroups(group, options, path, appName, recurse)
-	local tree = new()
-	local keySort = new()
-	local opts = new()
-
-	BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
-
-	for i = 1, #keySort do
-		local k = keySort[i]
-		local v = opts[k]
-		if v.type == "group" then
-			path[#path+1] = k
-			local inline = pickfirstset(v.dialogInline,v.guiInline,v.inline, false)
-			local hidden = CheckOptionHidden(v, options, path, appName)
-			if not inline and not hidden then
-				local entry = new()
-				entry.value = k
-				entry.text = GetOptionsMemberValue("name", v, options, path, appName)
-				entry.icon = GetOptionsMemberValue("icon", v, options, path, appName)
-				entry.disabled = CheckOptionDisabled(v, options, path, appName)
-				tinsert(tree,entry)
-				if recurse and (v.childGroups or "tree") == "tree" then
-					BuildSubGroups(v,entry, options, path, appName)
-				end
-			end
-			path[#path] = nil
-		end
-	end
-	del(keySort)
-	del(opts)
-	return tree
-end
-
-local function InjectInfo(control, options, option, path, rootframe, appName)
-	local user = control:GetUserDataTable()
-	for i = 1, #path do
-		user[i] = path[i]
-	end
-	user.rootframe = rootframe
-	user.option = option
-	user.options = options
-	user.path = copy(path)
-	user.appName = appName
-	control:SetCallback("OnRelease", CleanUserData)
-	control:SetCallback("OnLeave", OptionOnMouseLeave)
-	control:SetCallback("OnEnter", OptionOnMouseOver)
-end
-
-
---[[
-	options - root of the options table being fed
-	container - widget that controls will be placed in
-	rootframe - Frame object the options are in
-	path - table with the keys to get to the group being fed
---]]
-
-local function FeedOptions(appName, options,container,rootframe,path,group,inline)
-	local keySort = new()
-	local opts = new()
-
-	BuildSortedOptionsTable(group, keySort, opts, options, path, appName)
-
-	for i = 1, #keySort do
-		local k = keySort[i]
-		local v = opts[k]
-		tinsert(path, k)
-		local hidden = CheckOptionHidden(v, options, path, appName)
-		local name = GetOptionsMemberValue("name", v, options, path, appName)
-		if not hidden then
-			if v.type == "group" then
-				if inline or pickfirstset(v.dialogInline,v.guiInline,v.inline, false) then
-					--Inline group
-					local GroupContainer
-					if name and name ~= "" then
-						GroupContainer = gui:Create("InlineGroup")
-						GroupContainer:SetTitle(name or "")
-					else
-						GroupContainer = gui:Create("SimpleGroup")
-					end
-
-					GroupContainer.width = "fill"
-					GroupContainer:SetLayout("flow")
-					container:AddChild(GroupContainer)
-					FeedOptions(appName,options,GroupContainer,rootframe,path,v,true)
-				end
-			else
-				--Control to feed
-				local control
-
-				local name = GetOptionsMemberValue("name", v, options, path, appName)
-
-				if v.type == "execute" then
-
-					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
-					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
-
-					if type(image) == "string" then
-						control = gui:Create("Icon")
-						if not width then
-							width = GetOptionsMemberValue("imageWidth",v, options, path, appName)
-						end
-						if not height then
-							height = GetOptionsMemberValue("imageHeight",v, options, path, appName)
-						end
-						if type(imageCoords) == "table" then
-							control:SetImage(image, unpack(imageCoords))
-						else
-							control:SetImage(image)
-						end
-						if type(width) ~= "number" then
-							width = 32
-						end
-						if type(height) ~= "number" then
-							height = 32
-						end
-						control:SetImageSize(width, height)
-						control:SetLabel(name)
-					else
-						control = gui:Create("Button")
-						control:SetText(name)
-					end
-					control:SetCallback("OnClick",ActivateControl)
-
-				elseif v.type == "input" then
-					local controlType = v.dialogControl or v.control or (v.multiline and "MultiLineEditBox") or "EditBox"
-					control = gui:Create(controlType)
-					if not control then
-						geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(controlType)))
-						control = gui:Create(v.multiline and "MultiLineEditBox" or "EditBox")
-					end
-
-					if v.multiline and control.SetNumLines then
-						control:SetNumLines(tonumber(v.multiline) or 4)
-					end
-					control:SetLabel(name)
-					control:SetCallback("OnEnterPressed",ActivateControl)
-					local text = GetOptionsMemberValue("get",v, options, path, appName)
-					if type(text) ~= "string" then
-						text = ""
-					end
-					control:SetText(text)
-
-				elseif v.type == "toggle" then
-					control = gui:Create("CheckBox")
-					control:SetLabel(name)
-					control:SetTriState(v.tristate)
-					local value = GetOptionsMemberValue("get",v, options, path, appName)
-					control:SetValue(value)
-					control:SetCallback("OnValueChanged",ActivateControl)
-
-					if v.descStyle == "inline" then
-						local desc = GetOptionsMemberValue("desc", v, options, path, appName)
-						control:SetDescription(desc)
-					end
-
-					local image = GetOptionsMemberValue("image", v, options, path, appName)
-					local imageCoords = GetOptionsMemberValue("imageCoords", v, options, path, appName)
-
-					if type(image) == "string" then
-						if type(imageCoords) == "table" then
-							control:SetImage(image, unpack(imageCoords))
-						else
-							control:SetImage(image)
-						end
-					end
-				elseif v.type == "range" then
-					control = gui:Create("Slider")
-					control:SetLabel(name)
-					control:SetSliderValues(v.softMin or v.min or 0, v.softMax or v.max or 100, v.bigStep or v.step or 0)
-					control:SetIsPercent(v.isPercent)
-					local value = GetOptionsMemberValue("get",v, options, path, appName)
-					if type(value) ~= "number" then
-						value = 0
-					end
-					control:SetValue(value)
-					control:SetCallback("OnValueChanged",ActivateSlider)
-					control:SetCallback("OnMouseUp",ActivateSlider)
-
-				elseif v.type == "select" then
-					local values = GetOptionsMemberValue("values", v, options, path, appName)
-					if v.style == "radio" then
-						local disabled = CheckOptionDisabled(v, options, path, appName)
-						local width = GetOptionsMemberValue("width",v,options,path,appName)
-						control = gui:Create("InlineGroup")
-						control:SetLayout("Flow")
-						control:SetTitle(name)
-						control.width = "fill"
-
-						control:PauseLayout()
-						local optionValue = GetOptionsMemberValue("get",v, options, path, appName)
-						local t = {}
-						for value, text in pairs(values) do
-							t[#t+1]=value
-						end
-						tsort(t)
-						for k, value in ipairs(t) do
-							local text = values[value]
-							local radio = gui:Create("CheckBox")
-							radio:SetLabel(text)
-							radio:SetUserData("value", value)
-							radio:SetUserData("text", text)
-							radio:SetDisabled(disabled)
-							radio:SetType("radio")
-							radio:SetValue(optionValue == value)
-							radio:SetCallback("OnValueChanged", ActivateMultiControl)
-							InjectInfo(radio, options, v, path, rootframe, appName)
-							control:AddChild(radio)
-							if width == "double" then
-								radio:SetWidth(width_multiplier * 2)
-							elseif width == "half" then
-								radio:SetWidth(width_multiplier / 2)
-							elseif width == "full" then
-								radio.width = "fill"
-							else
-								radio:SetWidth(width_multiplier)
-							end
-						end
-						control:ResumeLayout()
-						control:DoLayout()
-					else
-						local controlType = v.dialogControl or v.control or "Dropdown"
-						control = gui:Create(controlType)
-						if not control then
-							geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(controlType)))
-							control = gui:Create("Dropdown")
-						end
-						local itemType = v.itemControl
-						if itemType and not gui:GetWidgetVersion(itemType) then
-							geterrorhandler()(("Invalid Custom Item Type - %s"):format(tostring(itemType)))
-							itemType = nil
-						end
-						control:SetLabel(name)
-						control:SetList(values, nil, itemType)
-						local value = GetOptionsMemberValue("get",v, options, path, appName)
-						if not values[value] then
-							value = nil
-						end
-						control:SetValue(value)
-						control:SetCallback("OnValueChanged", ActivateControl)
-					end
-
-				elseif v.type == "multiselect" then
-					local values = GetOptionsMemberValue("values", v, options, path, appName)
-					local disabled = CheckOptionDisabled(v, options, path, appName)
-
-					local controlType = v.dialogControl or v.control
-
-					local valuesort = new()
-					if values then
-						for value, text in pairs(values) do
-							tinsert(valuesort, value)
-						end
-					end
-					tsort(valuesort)
-
-					if controlType then
-						control = gui:Create(controlType)
-						if not control then
-							geterrorhandler()(("Invalid Custom Control Type - %s"):format(tostring(controlType)))
-						end
-					end
-					if control then
-						control:SetMultiselect(true)
-						control:SetLabel(name)
-						control:SetList(values)
-						control:SetDisabled(disabled)
-						control:SetCallback("OnValueChanged",ActivateControl)
-						control:SetCallback("OnClosed", MultiControlOnClosed)
-						local width = GetOptionsMemberValue("width",v,options,path,appName)
-						if width == "double" then
-							control:SetWidth(width_multiplier * 2)
-						elseif width == "half" then
-							control:SetWidth(width_multiplier / 2)
-						elseif width == "full" then
-							control.width = "fill"
-						else
-							control:SetWidth(width_multiplier)
-						end
-						--check:SetTriState(v.tristate)
-						for i = 1, #valuesort do
-							local key = valuesort[i]
-							local value = GetOptionsMemberValue("get",v, options, path, appName, key)
-							control:SetItemValue(key,value)
-						end
-					else
-						control = gui:Create("InlineGroup")
-						control:SetLayout("Flow")
-						control:SetTitle(name)
-						control.width = "fill"
-
-						control:PauseLayout()
-						local width = GetOptionsMemberValue("width",v,options,path,appName)
-						for i = 1, #valuesort do
-							local value = valuesort[i]
-							local text = values[value]
-							local check = gui:Create("CheckBox")
-							check:SetLabel(text)
-							check:SetUserData("value", value)
-							check:SetUserData("text", text)
-							check:SetDisabled(disabled)
-							check:SetTriState(v.tristate)
-							check:SetValue(GetOptionsMemberValue("get",v, options, path, appName, value))
-							check:SetCallback("OnValueChanged",ActivateMultiControl)
-							InjectInfo(check, options, v, path, rootframe, appName)
-							control:AddChild(check)
-							if width == "double" then
-								check:SetWidth(width_multiplier * 2)
-							elseif width == "half" then
-								check:SetWidth(width_multiplier / 2)
-							elseif width == "full" then
-								check.width = "fill"
-							else
-								check:SetWidth(width_multiplier)
-							end
-						end
-						control:ResumeLayout()
-						control:DoLayout()
-
-
-					end
-
-					del(valuesort)
-
-				elseif v.type == "color" then
-					control = gui:Create("ColorPicker-ElvUI")
-					control:SetLabel(name)
-					control:SetHasAlpha(GetOptionsMemberValue("hasAlpha",v, options, path, appName))
-					control:SetColor(GetOptionsMemberValue("get",v, options, path, appName))
-					control:SetCallback("OnValueChanged",ActivateControl)
-					control:SetCallback("OnValueConfirmed",ActivateControl)
-
-				elseif v.type == "keybinding" then
-					control = gui:Create("Keybinding")
-					control:SetLabel(name)
-					control:SetKey(GetOptionsMemberValue("get",v, options, path, appName))
-					control:SetCallback("OnKeyChanged",ActivateControl)
-
-				elseif v.type == "header" then
-					control = gui:Create("Heading")
-					control:SetText(name)
-					control.width = "fill"
-
-				elseif v.type == "description" then
-					control = gui:Create("Label")
-					control:SetText(name)
-
-					local fontSize = GetOptionsMemberValue("fontSize",v, options, path, appName)
-					if fontSize == "medium" then
-						control:SetFontObject(GameFontHighlight)
-					elseif fontSize == "large" then
-						control:SetFontObject(GameFontHighlightLarge)
-					else -- small or invalid
-						control:SetFontObject(GameFontHighlightSmall)
-					end
-
-					local imageCoords = GetOptionsMemberValue("imageCoords",v, options, path, appName)
-					local image, width, height = GetOptionsMemberValue("image",v, options, path, appName)
-
-					if type(image) == "string" then
-						if not width then
-							width = GetOptionsMemberValue("imageWidth",v, options, path, appName)
-						end
-						if not height then
-							height = GetOptionsMemberValue("imageHeight",v, options, path, appName)
-						end
-						if type(imageCoords) == "table" then
-							control:SetImage(image, unpack(imageCoords))
-						else
-							control:SetImage(image)
-						end
-						if type(width) ~= "number" then
-							width = 32
-						end
-						if type(height) ~= "number" then
-							height = 32
-						end
-						control:SetImageSize(width, height)
-					end
-					local width = GetOptionsMemberValue("width",v,options,path,appName)
-					control.width = not width and "fill"
-				end
-
-				--Common Init
-				if control then
-					if control.width ~= "fill" then
-						local width = GetOptionsMemberValue("width",v,options,path,appName)
-						if width == "double" then
-							control:SetWidth(width_multiplier * 2)
-						elseif width == "half" then
-							control:SetWidth(width_multiplier / 2)
-						elseif width == "full" then
-							control.width = "fill"
-						else
-							control:SetWidth(width_multiplier)
-						end
-					end
-					if control.SetDisabled then
-						local disabled = CheckOptionDisabled(v, options, path, appName)
-						control:SetDisabled(disabled)
-					end
-
-					InjectInfo(control, options, v, path, rootframe, appName)
-					container:AddChild(control)
-				end
-
-			end
-		end
-		tremove(path)
-	end
-	container:ResumeLayout()
-	container:DoLayout()
-	del(keySort)
-	del(opts)
-end
-
-local function BuildPath(path, ...)
-	for i = 1, select("#",...)  do
-		tinsert(path, (select(i,...)))
-	end
-end
-
-
-local function TreeOnButtonEnter(widget, event, uniquevalue, button)
-	local user = widget:GetUserDataTable()
-	if not user then return end
-	local options = user.options
-	local option = user.option
-	local path = user.path
-	local appName = user.appName
-
-	local feedpath = new()
-	for i = 1, #path do
-		feedpath[i] = path[i]
-	end
-
-	BuildPath(feedpath, ("\001"):split(uniquevalue))
-	local group = options
-	for i = 1, #feedpath do
-		if not group then return end
-		group = GetSubOption(group, feedpath[i])
-	end
-
-	local name = GetOptionsMemberValue("name", group, options, feedpath, appName)
-	local desc = GetOptionsMemberValue("desc", group, options, feedpath, appName)
-
-	GameTooltip:SetOwner(button, "ANCHOR_CURSOR")
-	if widget.type == "TabGroup" then
-		GameTooltip:SetPoint("BOTTOM",button,"TOP")
-	else
-		GameTooltip:SetPoint("LEFT",button,"RIGHT")
-	end
-
-	GameTooltip:SetText(name, 1, .82, 0, true)
-
-	if type(desc) == "string" then
-		GameTooltip:AddLine(desc, 1, 1, 1, true)
-	end
-
-	GameTooltip:Show()
-end
-
-local function TreeOnButtonLeave(widget, event, value, button)
-	GameTooltip:Hide()
-end
-
-
-local function GroupExists(appName, options, path, uniquevalue)
-	if not uniquevalue then return false end
-
-	local feedpath = new()
-	local temppath = new()
-	for i = 1, #path do
-		feedpath[i] = path[i]
-	end
-
-	BuildPath(feedpath, ("\001"):split(uniquevalue))
-
-	local group = options
-	for i = 1, #feedpath do
-		local v = feedpath[i]
-		temppath[i] = v
-		group = GetSubOption(group, v)
-
-		if not group or group.type ~= "group" or CheckOptionHidden(group, options, temppath, appName) then
-			del(feedpath)
-			del(temppath)
-			return false
-		end
-	end
-	del(feedpath)
-	del(temppath)
-	return true
-end
-
-local function GroupSelected(widget, event, uniquevalue)
-
-	local user = widget:GetUserDataTable()
-
-	local options = user.options
-	local option = user.option
-	local path = user.path
-	local rootframe = user.rootframe
-
-	local feedpath = new()
-	for i = 1, #path do
-		feedpath[i] = path[i]
-	end
-
-	BuildPath(feedpath, ("\001"):split(uniquevalue))
-	local group = options
-	for i = 1, #feedpath do
-		group = GetSubOption(group, feedpath[i])
-	end
-	widget:ReleaseChildren()
-	AceConfigDialog:FeedGroup(user.appName,options,widget,rootframe,feedpath)
-
-	del(feedpath)
-end
-
-
-
---[[
--- INTERNAL --
-This function will feed one group, and any inline child groups into the given container
-Select Groups will only have the selection control (tree, tabs, dropdown) fed in
-and have a group selected, this event will trigger the feeding of child groups
-
-Rules:
-	If the group is Inline, FeedOptions
-	If the group has no child groups, FeedOptions
-
-	If the group is a tab or select group, FeedOptions then add the Group Control
-	If the group is a tree group FeedOptions then
-		its parent isnt a tree group:  then add the tree control containing this and all child tree groups
-		if its parent is a tree group, its already a node on a tree
---]]
-
-function AceConfigDialog:FeedGroup(appName,options,container,rootframe,path, isRoot)
-	local group = options
-	--follow the path to get to the curent group
-	local inline
-	local grouptype, parenttype = options.childGroups, "none"
-
-
-	for i = 1, #path do
-		local v = path[i]
-		group = GetSubOption(group, v)
-		inline = inline or pickfirstset(v.dialogInline,v.guiInline,v.inline, false)
-		parenttype = grouptype
-		grouptype = group.childGroups
-	end
-
-	if not parenttype then
-		parenttype = "tree"
-	end
-
-	--check if the group has child groups
-	local hasChildGroups
-	for k, v in pairs(group.args) do
-		if v.type == "group" and not pickfirstset(v.dialogInline,v.guiInline,v.inline, false) and not CheckOptionHidden(v, options, path, appName) then
-			hasChildGroups = true
-		end
-	end
-	if group.plugins then
-		for plugin, t in pairs(group.plugins) do
-			for k, v in pairs(t) do
-				if v.type == "group" and not pickfirstset(v.dialogInline,v.guiInline,v.inline, false) and not CheckOptionHidden(v, options, path, appName) then
-					hasChildGroups = true
-				end
-			end
-		end
-	end
-
-	container:SetLayout("flow")
-	local scroll
-
-	--Add a scrollframe if we are not going to add a group control, this is the inverse of the conditions for that later on
-	if (not (hasChildGroups and not inline)) or (grouptype ~= "tab" and grouptype ~= "select" and (parenttype == "tree" and not isRoot)) then
-		if container.type ~= "InlineGroup" and container.type ~= "SimpleGroup" then
-			scroll = gui:Create("ScrollFrame")
-			scroll:SetLayout("flow")
-			scroll.width = "fill"
-			scroll.height = "fill"
-			container:SetLayout("fill")
-			container:AddChild(scroll)
-			container = scroll
-		end
-	end
-
-	FeedOptions(appName,options,container,rootframe,path,group,nil)
-
-	if scroll then
-		container:PerformLayout()
-		local status = self:GetStatusTable(appName, path)
-		if not status.scroll then
-			status.scroll = {}
-		end
-		scroll:SetStatusTable(status.scroll)
-	end
-
-	if hasChildGroups and not inline then
-		local name = GetOptionsMemberValue("name", group, options, path, appName)
-		if grouptype == "tab" then
-
-			local tab = gui:Create("TabGroup")
-			InjectInfo(tab, options, group, path, rootframe, appName)
-			tab:SetCallback("OnGroupSelected", GroupSelected)
-			tab:SetCallback("OnTabEnter", TreeOnButtonEnter)
-			tab:SetCallback("OnTabLeave", TreeOnButtonLeave)
-
-			local status = AceConfigDialog:GetStatusTable(appName, path)
-			if not status.groups then
-				status.groups = {}
-			end
-			tab:SetStatusTable(status.groups)
-			tab.width = "fill"
-			tab.height = "fill"
-
-			local tabs = BuildGroups(group, options, path, appName)
-			tab:SetTabs(tabs)
-			tab:SetUserData("tablist", tabs)
-
-			for i = 1, #tabs do
-				local entry = tabs[i]
-				if not entry.disabled then
-					tab:SelectTab((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or entry.value)
-					break
-				end
-			end
-
-			container:AddChild(tab)
-
-		elseif grouptype == "select" then
-
-			local select = gui:Create("DropdownGroup")
-			select:SetTitle(name)
-			InjectInfo(select, options, group, path, rootframe, appName)
-			select:SetCallback("OnGroupSelected", GroupSelected)
-			local status = AceConfigDialog:GetStatusTable(appName, path)
-			if not status.groups then
-				status.groups = {}
-			end
-			select:SetStatusTable(status.groups)
-			local grouplist, orderlist = BuildSelect(group, options, path, appName)
-			select:SetGroupList(grouplist, orderlist)
-			select:SetUserData("grouplist", grouplist)
-			select:SetUserData("orderlist", orderlist)
-
-			local firstgroup = orderlist[1]
-			if firstgroup then
-				select:SetGroup((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or firstgroup)
-			end
-
-			select.width = "fill"
-			select.height = "fill"
-
-			container:AddChild(select)
-
-		--assume tree group by default
-		--if parenttype is tree then this group is already a node on that tree
-		elseif (parenttype ~= "tree") or isRoot then
-			local tree = gui:Create("TreeGroup")
-			InjectInfo(tree, options, group, path, rootframe, appName)
-			tree:EnableButtonTooltips(false)
-
-			tree.width = "fill"
-			tree.height = "fill"
-
-			tree:SetCallback("OnGroupSelected", GroupSelected)
-			tree:SetCallback("OnButtonEnter", TreeOnButtonEnter)
-			tree:SetCallback("OnButtonLeave", TreeOnButtonLeave)
-
-			local status = AceConfigDialog:GetStatusTable(appName, path)
-			if not status.groups then
-				status.groups = {}
-			end
-			local treedefinition = BuildGroups(group, options, path, appName, true)
-			tree:SetStatusTable(status.groups)
-
-			tree:SetTree(treedefinition)
-			tree:SetUserData("tree",treedefinition)
-
-			for i = 1, #treedefinition do
-				local entry = treedefinition[i]
-				if not entry.disabled then
-					tree:SelectByValue((GroupExists(appName, options, path,status.groups.selected) and status.groups.selected) or entry.value)
-					break
-				end
-			end
-
-			container:AddChild(tree)
-		end
-	end
-end
-
-local old_CloseSpecialWindows
-
-
-local function RefreshOnUpdate(this)
-	for appName in pairs(this.closing) do
-		if AceConfigDialog.OpenFrames[appName] then
-			AceConfigDialog.OpenFrames[appName]:Hide()
-		end
-		if AceConfigDialog.BlizOptions and AceConfigDialog.BlizOptions[appName] then
-			for key, widget in pairs(AceConfigDialog.BlizOptions[appName]) do
-				if not widget:IsVisible() then
-					widget:ReleaseChildren()
-				end
-			end
-		end
-		this.closing[appName] = nil
-	end
-
-	if this.closeAll then
-		for k, v in pairs(AceConfigDialog.OpenFrames) do
-			if not this.closeAllOverride[k] then
-				v:Hide()
-			end
-		end
-		this.closeAll = nil
-		wipe(this.closeAllOverride)
-	end
-
-	for appName in pairs(this.apps) do
-		if AceConfigDialog.OpenFrames[appName] then
-			local user = AceConfigDialog.OpenFrames[appName]:GetUserDataTable()
-			AceConfigDialog:Open(appName, unpack(user.basepath or emptyTbl))
-		end
-		if AceConfigDialog.BlizOptions and AceConfigDialog.BlizOptions[appName] then
-			for key, widget in pairs(AceConfigDialog.BlizOptions[appName]) do
-				local user = widget:GetUserDataTable()
-				if widget:IsVisible() then
-					AceConfigDialog:Open(widget:GetUserData("appName"), widget, unpack(user.basepath or emptyTbl))
-				end
-			end
-		end
-		this.apps[appName] = nil
-	end
-	this:SetScript("OnUpdate", nil)
-end
-
--- Upgrade the OnUpdate script as well, if needed.
-if AceConfigDialog.frame:GetScript("OnUpdate") then
-	AceConfigDialog.frame:SetScript("OnUpdate", RefreshOnUpdate)
-end
-
---- Close all open options windows
-function AceConfigDialog:CloseAll()
-	AceConfigDialog.frame.closeAll = true
-	AceConfigDialog.frame:SetScript("OnUpdate", RefreshOnUpdate)
-	if next(self.OpenFrames) then
-		return true
-	end
-end
-
---- Close a specific options window.
--- @param appName The application name as given to `:RegisterOptionsTable()`
-function AceConfigDialog:Close(appName)
-	if self.OpenFrames[appName] then
-		AceConfigDialog.frame.closing[appName] = true
-		AceConfigDialog.frame:SetScript("OnUpdate", RefreshOnUpdate)
-		return true
-	end
-end
-
--- Internal -- Called by AceConfigRegistry
-function AceConfigDialog:ConfigTableChanged(event, appName)
-	AceConfigDialog.frame.apps[appName] = true
-	AceConfigDialog.frame:SetScript("OnUpdate", RefreshOnUpdate)
-end
-
-reg.RegisterCallback(AceConfigDialog, "ConfigTableChange", "ConfigTableChanged")
-
---- Sets the default size of the options window for a specific application.
--- @param appName The application name as given to `:RegisterOptionsTable()`
--- @param width The default width
--- @param height The default height
-function AceConfigDialog:SetDefaultSize(appName, width, height)
-	local status = AceConfigDialog:GetStatusTable(appName)
-	if type(width) == "number" and type(height) == "number" then
-		status.width = width
-		status.height = height
-	end
-end
-
---- Open an option window at the specified path (if any).
--- This function can optionally feed the group into a pre-created container
--- instead of creating a new container frame.
--- @paramsig appName [, container][, ...]
--- @param appName The application name as given to `:RegisterOptionsTable()`
--- @param container An optional container frame to feed the options into
--- @param ... The path to open after creating the options window (see `:SelectGroup` for details)
-function AceConfigDialog:Open(appName, container, ...)
-	if not old_CloseSpecialWindows then
-		old_CloseSpecialWindows = CloseSpecialWindows
-		CloseSpecialWindows = function()
-			local found = old_CloseSpecialWindows()
-			return self:CloseAll() or found
-		end
-	end
-	local app = reg:GetOptionsTable(appName)
-	if not app then
-		error(("%s isn't registed with AceConfigRegistry, unable to open config"):format(appName), 2)
-	end
-	local options = app("dialog", MAJOR)
-
-	local f
-
-	local path = new()
-	local name = GetOptionsMemberValue("name", options, options, path, appName)
-
-	--If an optional path is specified add it to the path table before feeding the options
-	--as container is optional as well it may contain the first element of the path
-	if type(container) == "string" then
-		tinsert(path, container)
-		container = nil
-	end
-	for n = 1, select("#",...) do
-		tinsert(path, (select(n, ...)))
-	end
-
-	local option = options
-	if type(container) == "table" and container.type == "BlizOptionsGroup" and #path > 0 then
-		for i = 1, #path do
-			option = options.args[path[i]]
-		end
-		name = format("%s - %s", name, GetOptionsMemberValue("name", option, options, path, appName))
-	end
-	--if a container is given feed into that
-	if container then
-		f = container
-		f:ReleaseChildren()
-		f:SetUserData("appName", appName)
-		f:SetUserData("iscustom", true)
-		if #path > 0 then
-			f:SetUserData("basepath", copy(path))
-		end
-		local status = AceConfigDialog:GetStatusTable(appName)
-		if not status.width then
-			status.width =  700
-		end
-		if not status.height then
-			status.height = 500
-		end
-		if f.SetStatusTable then
-			f:SetStatusTable(status)
-		end
-		if f.SetTitle then
-			f:SetTitle(name or "")
-		end
-	else
-		if not self.OpenFrames[appName] then
-			f = gui:Create("Frame")
-			self.OpenFrames[appName] = f
-		else
-			f = self.OpenFrames[appName]
-		end
-		f:ReleaseChildren()
-		f:SetCallback("OnClose", FrameOnClose)
-		f:SetUserData("appName", appName)
-		if #path > 0 then
-			f:SetUserData("basepath", copy(path))
-		end
-		f:SetTitle(name or "")
-		local status = AceConfigDialog:GetStatusTable(appName)
-		f:SetStatusTable(status)
-	end
-
-	self:FeedGroup(appName,options,f,f,path,true)
-	if f.Show then
-		f:Show()
-	end
-	del(path)
-
-	if AceConfigDialog.frame.closeAll then
-		-- close all is set, but thats not good, since we're just opening here, so force it
-		AceConfigDialog.frame.closeAllOverride[appName] = true
-	end
-end
-
--- convert pre-39 BlizOptions structure to the new format
-if oldminor and oldminor < 39 and AceConfigDialog.BlizOptions then
-	local old = AceConfigDialog.BlizOptions
-	local new = {}
-	for key, widget in pairs(old) do
-		local appName = widget:GetUserData("appName")
-		if not new[appName] then new[appName] = {} end
-		new[appName][key] = widget
-	end
-	AceConfigDialog.BlizOptions = new
-else
-	AceConfigDialog.BlizOptions = AceConfigDialog.BlizOptions or {}
-end
-
-local function FeedToBlizPanel(widget, event)
-	local path = widget:GetUserData("path")
-	AceConfigDialog:Open(widget:GetUserData("appName"), widget, unpack(path or emptyTbl))
-end
-
-local function ClearBlizPanel(widget, event)
-	local appName = widget:GetUserData("appName")
-	AceConfigDialog.frame.closing[appName] = true
-	AceConfigDialog.frame:SetScript("OnUpdate", RefreshOnUpdate)
-end
-
---- Add an option table into the Blizzard Interface Options panel.
--- You can optionally supply a descriptive name to use and a parent frame to use,
--- as well as a path in the options table.\\
--- If no name is specified, the appName will be used instead.
---
--- If you specify a proper `parent` (by name), the interface options will generate a
--- tree layout. Note that only one level of children is supported, so the parent always
--- has to be a head-level note.
---
--- This function returns a reference to the container frame registered with the Interface
--- Options. You can use this reference to open the options with the API function
--- `InterfaceOptionsFrame_OpenToCategory`.
--- @param appName The application name as given to `:RegisterOptionsTable()`
--- @param name A descriptive name to display in the options tree (defaults to appName)
--- @param parent The parent to use in the interface options tree.
--- @param ... The path in the options table to feed into the interface options panel.
--- @return The reference to the frame registered into the Interface Options.
-function AceConfigDialog:AddToBlizOptions(appName, name, parent, ...)
-	local BlizOptions = AceConfigDialog.BlizOptions
-
-	local key = appName
-	for n = 1, select("#", ...) do
-		key = key.."\001"..select(n, ...)
-	end
-
-	if not BlizOptions[appName] then
-		BlizOptions[appName] = {}
-	end
-
-	if not BlizOptions[appName][key] then
-		local group = gui:Create("BlizOptionsGroup")
-		BlizOptions[appName][key] = group
-		group:SetName(name or appName, parent)
-
-		group:SetTitle(name or appName)
-		group:SetUserData("appName", appName)
-		if select("#", ...) > 0 then
-			local path = {}
-			for n = 1, select("#",...) do
-				tinsert(path, (select(n, ...)))
-			end
-			group:SetUserData("path", path)
-		end
-		group:SetCallback("OnShow", FeedToBlizPanel)
-		group:SetCallback("OnHide", ClearBlizPanel)
-		InterfaceOptions_AddCategory(group.frame)
-		return group.frame
-	else
-		error(("%s has already been added to the Blizzard Options Window with the given path"):format(appName), 2)
-	end
-end
diff --git a/ElvUI_SLE/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml b/ElvUI_SLE/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml
deleted file mode 100644
index 86ce057..0000000
--- a/ElvUI_SLE/libs/AceConfig-3.0/AceConfigDialog-3.0/AceConfigDialog-3.0.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<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
diff --git a/ElvUI_SLE/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua b/ElvUI_SLE/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
deleted file mode 100644
index eea5365..0000000
--- a/ElvUI_SLE/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.lua
+++ /dev/null
@@ -1,349 +0,0 @@
---- AceConfigRegistry-3.0 handles central registration of options tables in use by addons and modules.\\
--- Options tables can be registered as raw tables, OR as function refs that return a table.\\
--- Such functions receive three arguments: "uiType", "uiName", "appName". \\
--- * Valid **uiTypes**: "cmd", "dropdown", "dialog". This is verified by the library at call time. \\
--- * The **uiName** field is expected to contain the full name of the calling addon, including version, e.g. "FooBar-1.0". This is verified by the library at call time.\\
--- * The **appName** field is the options table name as given at registration time \\
---
--- :IterateOptionsTables() (and :GetOptionsTable() if only given one argument) return a function reference that the requesting config handling addon must call with valid "uiType", "uiName".
--- @class file
--- @name AceConfigRegistry-3.0
--- @release $Id: AceConfigRegistry-3.0.lua 1105 2013-12-08 22:11:58Z nevcairiel $
-local MAJOR, MINOR = "AceConfigRegistry-3.0-ElvUI", 1
-local AceConfigRegistry = LibStub:NewLibrary(MAJOR, MINOR)
-
-if not AceConfigRegistry then return end
-
-AceConfigRegistry.tables = AceConfigRegistry.tables or {}
-
-local CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0")
-
-if not AceConfigRegistry.callbacks then
-	AceConfigRegistry.callbacks = CallbackHandler:New(AceConfigRegistry)
-end
-
--- Lua APIs
-local tinsert, tconcat = table.insert, table.concat
-local strfind, strmatch = string.find, string.match
-local type, tostring, select, pairs = type, tostring, select, pairs
-local error, assert = error, assert
-
------------------------------------------------------------------------
--- Validating options table consistency:
-
-
-AceConfigRegistry.validated = {
-	-- list of options table names ran through :ValidateOptionsTable automatically.
-	-- CLEARED ON PURPOSE, since newer versions may have newer validators
-	cmd = {},
-	dropdown = {},
-	dialog = {},
-}
-
-
-
-local function err(msg, errlvl, ...)
-	local t = {}
-	for i=select("#",...),1,-1 do
-		tinsert(t, (select(i, ...)))
-	end
-	error(MAJOR..":ValidateOptionsTable(): "..tconcat(t,".")..msg, errlvl+2)
-end
-
-
-local isstring={["string"]=true, _="string"}
-local isstringfunc={["string"]=true,["function"]=true, _="string or funcref"}
-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 optnumber={["nil"]=true,["number"]=true, _="number"}
-local optmethod={["nil"]=true,["string"]=true,["function"]=true, _="methodname or funcref"}
-local optmethodfalse={["nil"]=true,["string"]=true,["function"]=true,["boolean"]={[false]=true},  _="methodname, funcref or false"}
-local optmethodnumber={["nil"]=true,["string"]=true,["function"]=true,["number"]=true,  _="methodname, funcref or number"}
-local optmethodtable={["nil"]=true,["string"]=true,["function"]=true,["table"]=true,  _="methodname, funcref or table"}
-local optmethodbool={["nil"]=true,["string"]=true,["function"]=true,["boolean"]=true,  _="methodname, funcref or boolean"}
-local opttable={["nil"]=true,["table"]=true,  _="table"}
-local optbool={["nil"]=true,["boolean"]=true,  _="boolean"}
-local optboolnumber={["nil"]=true,["boolean"]=true,["number"]=true,  _="boolean or number"}
-
-local basekeys={
-	type=isstring,
-	name=isstringfunc,
-	desc=optstringfunc,
-	descStyle=optstring,
-	order=optmethodnumber,
-	validate=optmethodfalse,
-	confirm=optmethodbool,
-	confirmText=optstring,
-	disabled=optmethodbool,
-	hidden=optmethodbool,
-		guiHidden=optmethodbool,
-		dialogHidden=optmethodbool,
-		dropdownHidden=optmethodbool,
-	cmdHidden=optmethodbool,
-	icon=optstringfunc,
-	iconCoords=optmethodtable,
-	handler=opttable,
-	get=optmethodfalse,
-	set=optmethodfalse,
-	func=optmethodfalse,
-	arg={["*"]=true},
-	width=optstring,
-}
-
-local typedkeys={
-	header={},
-	description={
-		image=optstringfunc,
-		imageCoords=optmethodtable,
-		imageHeight=optnumber,
-		imageWidth=optnumber,
-		fontSize=optstringfunc,
-	},
-	group={
-		args=istable,
-		plugins=opttable,
-		inline=optbool,
-			cmdInline=optbool,
-			guiInline=optbool,
-			dropdownInline=optbool,
-			dialogInline=optbool,
-		childGroups=optstring,
-	},
-	execute={
-		image=optstringfunc,
-		imageCoords=optmethodtable,
-		imageHeight=optnumber,
-		imageWidth=optnumber,
-	},
-	input={
-		pattern=optstring,
-		usage=optstring,
-		control=optstring,
-		dialogControl=optstring,
-		dropdownControl=optstring,
-		multiline=optboolnumber,
-	},
-	toggle={
-		tristate=optbool,
-		image=optstringfunc,
-		imageCoords=optmethodtable,
-	},
-	tristate={
-	},
-	range={
-		min=optnumber,
-		softMin=optnumber,
-		max=optnumber,
-		softMax=optnumber,
-		step=optnumber,
-		bigStep=optnumber,
-		isPercent=optbool,
-	},
-	select={
-		values=ismethodtable,
-		style={
-			["nil"]=true,
-			["string"]={dropdown=true,radio=true},
-			_="string: 'dropdown' or 'radio'"
-		},
-		control=optstring,
-		dialogControl=optstring,
-		dropdownControl=optstring,
-		itemControl=optstring,
-	},
-	multiselect={
-		values=ismethodtable,
-		style=optstring,
-		tristate=optbool,
-		control=optstring,
-		dialogControl=optstring,
-		dropdownControl=optstring,
-	},
-	color={
-		hasAlpha=optmethodbool,
-		reset=opttable,
-	},
-	keybinding={
-		-- TODO
-	},
-}
-
-local function validateKey(k,errlvl,...)
-	errlvl=(errlvl or 0)+1
-	if type(k)~="string" then
-		err("["..tostring(k).."] - key is not a string", errlvl,...)
-	end
-	if strfind(k, "[%c\127]") then
-		err("["..tostring(k).."] - key name contained control characters", errlvl,...)
-	end
-end
-
-local function validateVal(v, oktypes, errlvl,...)
-	errlvl=(errlvl or 0)+1
-	local isok=oktypes[type(v)] or oktypes["*"]
-
-	if not isok then
-		err(": expected a "..oktypes._..", got '"..tostring(v).."'", errlvl,...)
-	end
-	if type(isok)=="table" then		-- isok was a table containing specific values to be tested for!
-		if not isok[v] then
-			err(": did not expect "..type(v).." value '"..tostring(v).."'", errlvl,...)
-		end
-	end
-end
-
-local function validate(options,errlvl,...)
-	errlvl=(errlvl or 0)+1
-	-- basic consistency
-	if type(options)~="table" then
-		err(": expected a table, got a "..type(options), errlvl,...)
-	end
-	if type(options.type)~="string" then
-		err(".type: expected a string, got a "..type(options.type), errlvl,...)
-	end
-
-	-- get type and 'typedkeys' member
-	local tk = typedkeys[options.type]
-	if not tk then
-		err(".type: unknown type '"..options.type.."'", errlvl,...)
-	end
-
-	-- make sure that all options[] are known parameters
-	for k,v in pairs(options) do
-		if not (tk[k] or basekeys[k]) then
-			err(": unknown parameter", errlvl,tostring(k),...)
-		end
-	end
-
-	-- verify that required params are there, and that everything is the right type
-	for k,oktypes in pairs(basekeys) do
-		validateVal(options[k], oktypes, errlvl,k,...)
-	end
-	for k,oktypes in pairs(tk) do
-		validateVal(options[k], oktypes, errlvl,k,...)
-	end
-
-	-- extra logic for groups
-	if options.type=="group" then
-		for k,v in pairs(options.args) do
-			validateKey(k,errlvl,"args",...)
-			validate(v, errlvl,k,"args",...)
-		end
-		if options.plugins then
-			for plugname,plugin in pairs(options.plugins) do
-				if type(plugin)~="table" then
-					err(": expected a table, got '"..tostring(plugin).."'", errlvl,tostring(plugname),"plugins",...)
-				end
-				for k,v in pairs(plugin) do
-					validateKey(k,errlvl,tostring(plugname),"plugins",...)
-					validate(v, errlvl,k,tostring(plugname),"plugins",...)
-				end
-			end
-		end
-	end
-end
-
-
---- Validates basic structure and integrity of an options table \\
--- Does NOT verify that get/set etc actually exist, since they can be defined at any depth
--- @param options The table to be validated
--- @param name The name of the table to be validated (shown in any error message)
--- @param errlvl (optional number) error level offset, default 0 (=errors point to the function calling :ValidateOptionsTable)
-function AceConfigRegistry:ValidateOptionsTable(options,name,errlvl)
-	errlvl=(errlvl or 0)+1
-	name = name or "Optionstable"
-	if not options.name then
-		options.name=name	-- bit of a hack, the root level doesn't really need a .name :-/
-	end
-	validate(options,errlvl,name)
-end
-
---- Fires a "ConfigTableChange" callback for those listening in on it, allowing config GUIs to refresh.
--- You should call this function if your options table changed from any outside event, like a game event
--- or a timer.
--- @param appName The application name as given to `:RegisterOptionsTable()`
-function AceConfigRegistry:NotifyChange(appName)
-	if not AceConfigRegistry.tables[appName] then return end
-	AceConfigRegistry.callbacks:Fire("ConfigTableChange", appName)
-end
-
--- -------------------------------------------------------------------
--- Registering and retreiving options tables:
-
-
--- validateGetterArgs: helper function for :GetOptionsTable (or, rather, the getter functions returned by it)
-
-local function validateGetterArgs(uiType, uiName, errlvl)
-	errlvl=(errlvl or 0)+2
-	if uiType~="cmd" and uiType~="dropdown" and uiType~="dialog" then
-		error(MAJOR..": Requesting options table: 'uiType' - invalid configuration UI type, expected 'cmd', 'dropdown' or 'dialog'", errlvl)
-	end
-	if not strmatch(uiName, "[A-Za-z]%-[0-9]") then	-- Expecting e.g. "MyLib-1.2"
-		error(MAJOR..": Requesting options table: 'uiName' - badly formatted or missing version number. Expected e.g. 'MyLib-1.2'", errlvl)
-	end
-end
-
---- Register an options table with the config registry.
--- @param appName The application name as given to `:RegisterOptionsTable()`
--- @param options The options table, OR a function reference that generates it on demand. \\
--- See the top of the page for info on arguments passed to such functions.
--- @param skipValidation Skip options table validation (primarily useful for extremely huge options, with a noticeable slowdown)
-function AceConfigRegistry:RegisterOptionsTable(appName, options, skipValidation)
-	if type(options)=="table" then
-		if options.type~="group" then	-- quick sanity checker
-			error(MAJOR..": RegisterOptionsTable(appName, options): 'options' - missing type='group' member in root group", 2)
-		end
-		AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl)
-			errlvl=(errlvl or 0)+1
-			validateGetterArgs(uiType, uiName, errlvl)
-			if not AceConfigRegistry.validated[uiType][appName] and not skipValidation then
-				AceConfigRegistry:ValidateOptionsTable(options, appName, errlvl)	-- upgradable
-				AceConfigRegistry.validated[uiType][appName] = true
-			end
-			return options
-		end
-	elseif type(options)=="function" then
-		AceConfigRegistry.tables[appName] = function(uiType, uiName, errlvl)
-			errlvl=(errlvl or 0)+1
-			validateGetterArgs(uiType, uiName, errlvl)
-			local tab = assert(options(uiType, uiName, appName))
-			if not AceConfigRegistry.validated[uiType][appName] and not skipValidation then
-				AceConfigRegistry:ValidateOptionsTable(tab, appName, errlvl)	-- upgradable
-				AceConfigRegistry.validated[uiType][appName] = true
-			end
-			return tab
-		end
-	else
-		error(MAJOR..": RegisterOptionsTable(appName, options): 'options' - expected table or function reference", 2)
-	end
-end
-
---- Returns an iterator of ["appName"]=funcref pairs
-function AceConfigRegistry:IterateOptionsTables()
-	return pairs(AceConfigRegistry.tables)
-end
-
-
-
-
---- Query the registry for a specific options table.
--- If only appName is given, a function is returned which you
--- can call with (uiType,uiName) to get the table.\\
--- If uiType&uiName are given, the table is returned.
--- @param appName The application name as given to `:RegisterOptionsTable()`
--- @param uiType The type of UI to get the table for, one of "cmd", "dropdown", "dialog"
--- @param uiName The name of the library/addon querying for the table, e.g. "MyLib-1.0"
-function AceConfigRegistry:GetOptionsTable(appName, uiType, uiName)
-	local f = AceConfigRegistry.tables[appName]
-	if not f then
-		return nil
-	end
-
-	if uiType then
-		return f(uiType,uiName,1)	-- get the table for us
-	else
-		return f	-- return the function
-	end
-end
diff --git a/ElvUI_SLE/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml b/ElvUI_SLE/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml
deleted file mode 100644
index 101bfda..0000000
--- a/ElvUI_SLE/libs/AceConfig-3.0/AceConfigRegistry-3.0/AceConfigRegistry-3.0.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<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
diff --git a/ElvUI_SLE/libs/AceConsole-3.0/AceConsole-3.0.lua b/ElvUI_SLE/libs/AceConsole-3.0/AceConsole-3.0.lua
new file mode 100644
index 0000000..c001123
--- /dev/null
+++ b/ElvUI_SLE/libs/AceConsole-3.0/AceConsole-3.0.lua
@@ -0,0 +1,250 @@
+--- **AceConsole-3.0** provides registration facilities for slash commands.
+-- You can register slash commands to your custom functions and use the `GetArgs` function to parse them
+-- to your addons individual needs.
+--
+-- **AceConsole-3.0** can be embeded into your addon, either explicitly by calling AceConsole:Embed(MyAddon) or by
+-- specifying it as an embeded library in your AceAddon. All functions will be available on your addon object
+-- and can be accessed directly, without having to explicitly call AceConsole itself.\\
+-- It is recommended to embed AceConsole, otherwise you'll have to specify a custom `self` on all calls you
+-- make into AceConsole.
+-- @class file
+-- @name AceConsole-3.0
+-- @release $Id: AceConsole-3.0.lua 878 2009-11-02 18:51:58Z nevcairiel $
+local MAJOR,MINOR = "AceConsole-3.0", 7
+
+local AceConsole, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+
+if not AceConsole then return end -- No upgrade needed
+
+AceConsole.embeds = AceConsole.embeds or {} -- table containing objects AceConsole is embedded in.
+AceConsole.commands = AceConsole.commands or {} -- table containing commands registered
+AceConsole.weakcommands = AceConsole.weakcommands or {} -- table containing self, command => func references for weak commands that don't persist through enable/disable
+
+-- Lua APIs
+local tconcat, tostring, select = table.concat, tostring, select
+local type, pairs, error = type, pairs, error
+local format, strfind, strsub = string.format, string.find, string.sub
+local max = math.max
+
+-- WoW APIs
+local _G = _G
+
+-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
+-- List them here for Mikk's FindGlobals script
+-- GLOBALS: DEFAULT_CHAT_FRAME, SlashCmdList, hash_SlashCmdList
+
+local tmp={}
+local function Print(self,frame,...)
+	local n=0
+	if self ~= AceConsole then
+		n=n+1
+		tmp[n] = "|cff33ff99"..tostring( self ).."|r:"
+	end
+	for i=1, select("#", ...) do
+		n=n+1
+		tmp[n] = tostring(select(i, ...))
+	end
+	frame:AddMessage( tconcat(tmp," ",1,n) )
+end
+
+--- Print to DEFAULT_CHAT_FRAME or given ChatFrame (anything with an .AddMessage function)
+-- @paramsig [chatframe ,] ...
+-- @param chatframe Custom ChatFrame to print to (or any frame with an .AddMessage function)
+-- @param ... List of any values to be printed
+function AceConsole:Print(...)
+	local frame = ...
+	if type(frame) == "table" and frame.AddMessage then	-- Is first argument something with an .AddMessage member?
+		return Print(self, frame, select(2,...))
+	else
+		return Print(self, DEFAULT_CHAT_FRAME, ...)
+	end
+end
+
+
+--- Formatted (using format()) print to DEFAULT_CHAT_FRAME or given ChatFrame (anything with an .AddMessage function)
+-- @paramsig [chatframe ,] "format"[, ...]
+-- @param chatframe Custom ChatFrame to print to (or any frame with an .AddMessage function)
+-- @param format Format string - same syntax as standard Lua format()
+-- @param ... Arguments to the format string
+function AceConsole:Printf(...)
+	local frame = ...
+	if type(frame) == "table" and frame.AddMessage then	-- Is first argument something with an .AddMessage member?
+		return Print(self, frame, format(select(2,...)))
+	else
+		return Print(self, DEFAULT_CHAT_FRAME, format(...))
+	end
+end
+
+
+
+
+--- Register a simple chat command
+-- @param command Chat command to be registered WITHOUT leading "/"
+-- @param func Function to call when the slash command is being used (funcref or methodname)
+-- @param persist if false, the command will be soft disabled/enabled when aceconsole is used as a mixin (default: true)
+function AceConsole:RegisterChatCommand( command, func, persist )
+	if type(command)~="string" then error([[Usage: AceConsole:RegisterChatCommand( "command", func[, persist ]): 'command' - expected a string]], 2) end
+
+	if persist==nil then persist=true end	-- I'd rather have my addon's "/addon enable" around if the author screws up. Having some extra slash regged when it shouldnt be isn't as destructive. True is a better default. /Mikk
+
+	local name = "ACECONSOLE_"..command:upper()
+
+	if type( func ) == "string" then
+		SlashCmdList[name] = function(input, editBox)
+			self[func](self, input, editBox)
+		end
+	else
+		SlashCmdList[name] = func
+	end
+	_G["SLASH_"..name.."1"] = "/"..command:lower()
+	AceConsole.commands[command] = name
+	-- non-persisting commands are registered for enabling disabling
+	if not persist then
+		if not AceConsole.weakcommands[self] then AceConsole.weakcommands[self] = {} end
+		AceConsole.weakcommands[self][command] = func
+	end
+	return true
+end
+
+--- Unregister a chatcommand
+-- @param command Chat command to be unregistered WITHOUT leading "/"
+function AceConsole:UnregisterChatCommand( command )
+	local name = AceConsole.commands[command]
+	if name then
+		SlashCmdList[name] = nil
+		_G["SLASH_" .. name .. "1"] = nil
+		hash_SlashCmdList["/" .. command:upper()] = nil
+		AceConsole.commands[command] = nil
+	end
+end
+
+--- Get an iterator over all Chat Commands registered with AceConsole
+-- @return Iterator (pairs) over all commands
+function AceConsole:IterateChatCommands() return pairs(AceConsole.commands) end
+
+
+local function nils(n, ...)
+	if n>1 then
+		return nil, nils(n-1, ...)
+	elseif n==1 then
+		return nil, ...
+	else
+		return ...
+	end
+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 numargs How many arguments to get (default 1)
+-- @param startpos Where in the string to start scanning (default  1)
+-- @return Returns arg1, arg2, ..., nextposition\\
+-- Missing arguments will be returned as nils. 'nextposition' is returned as 1e9 at the end of the string.
+function AceConsole:GetArgs(str, numargs, startpos)
+	numargs = numargs or 1
+	startpos = max(startpos or 1, 1)
+
+	local pos=startpos
+
+	-- find start of new arg
+	pos = strfind(str, "[^ ]", pos)
+	if not pos then	-- whoops, end of string
+		return nils(numargs, 1e9)
+	end
+
+	if numargs<1 then
+		return pos
+	end
+
+	-- quoted or space separated? find out which pattern to use
+	local delim_or_pipe
+	local ch = strsub(str, pos, pos)
+	if ch=='"' then
+		pos = pos + 1
+		delim_or_pipe='([|"])'
+	elseif ch=="'" then
+		pos = pos + 1
+		delim_or_pipe="([|'])"
+	else
+		delim_or_pipe="([| ])"
+	end
+
+	startpos = pos
+
+	while true do
+		-- find delimiter or hyperlink
+		local ch,_
+		pos,_,ch = strfind(str, delim_or_pipe, pos)
+
+		if not pos then break end
+
+		if ch=="|" then
+			-- some kind of escape
+
+			if strsub(str,pos,pos+1)=="|H" then
+				-- It's a |H....|hhyper link!|h
+				pos=strfind(str, "|h", pos+2)	-- first |h
+				if not pos then break end
+
+				pos=strfind(str, "|h", pos+2)	-- second |h
+				if not pos then break end
+			elseif strsub(str,pos, pos+1) == "|T" then
+				-- It's a |T....|t  texture
+				pos=strfind(str, "|t", pos+2)
+				if not pos then break end
+			end
+
+			pos=pos+2 -- skip past this escape (last |h if it was a hyperlink)
+
+		else
+			-- found delimiter, done with this arg
+			return strsub(str, startpos, pos-1), AceConsole:GetArgs(str, numargs-1, pos+1)
+		end
+
+	end
+
+	-- search aborted, we hit end of string. return it all as one argument. (yes, even if it's an unterminated quote or hyperlink)
+	return strsub(str, startpos), nils(numargs-1, 1e9)
+end
+
+
+--- embedding and embed handling
+
+local mixins = {
+	"Print",
+	"Printf",
+	"RegisterChatCommand",
+	"UnregisterChatCommand",
+	"GetArgs",
+}
+
+-- Embeds AceConsole into the target object making the functions from the mixins list available on target:..
+-- @param target target object to embed AceBucket in
+function AceConsole:Embed( target )
+	for k, v in pairs( mixins ) do
+		target[v] = self[v]
+	end
+	self.embeds[target] = true
+	return target
+end
+
+function AceConsole:OnEmbedEnable( target )
+	if AceConsole.weakcommands[target] then
+		for command, func in pairs( AceConsole.weakcommands[target] ) do
+			target:RegisterChatCommand( command, func, false, true ) -- nonpersisting and silent registry
+		end
+	end
+end
+
+function AceConsole:OnEmbedDisable( target )
+	if AceConsole.weakcommands[target] then
+		for command, func in pairs( AceConsole.weakcommands[target] ) do
+			target:UnregisterChatCommand( command ) -- TODO: this could potentially unregister a command from another application in case of command conflicts. Do we care?
+		end
+	end
+end
+
+for addon in pairs(AceConsole.embeds) do
+	AceConsole:Embed(addon)
+end
diff --git a/ElvUI_SLE/libs/AceConsole-3.0/AceConsole-3.0.xml b/ElvUI_SLE/libs/AceConsole-3.0/AceConsole-3.0.xml
new file mode 100644
index 0000000..be9f47c
--- /dev/null
+++ b/ElvUI_SLE/libs/AceConsole-3.0/AceConsole-3.0.xml
@@ -0,0 +1,4 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
+..\FrameXML\UI.xsd">
+	<Script file="AceConsole-3.0.lua"/>
+</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/AceDB-3.0/AceDB-3.0.lua b/ElvUI_SLE/libs/AceDB-3.0/AceDB-3.0.lua
new file mode 100644
index 0000000..a17c6f1
--- /dev/null
+++ b/ElvUI_SLE/libs/AceDB-3.0/AceDB-3.0.lua
@@ -0,0 +1,745 @@
+--- **AceDB-3.0** manages the SavedVariables of your addon.
+-- It offers profile management, smart defaults and namespaces for modules.\\
+-- Data can be saved in different data-types, depending on its intended usage.
+-- The most common data-type is the `profile` type, which allows the user to choose
+-- the active profile, and manage the profiles of all of his characters.\\
+-- The following data types are available:
+-- * **char** Character-specific data. Every character has its own database.
+-- * **realm** Realm-specific data. All of the players characters on the same realm share this database.
+-- * **class** Class-specific data. All of the players characters of the same class share this database.
+-- * **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.
+-- * **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.
+--
+-- Creating a new Database using the `:New` function will return a new DBObject. A database will inherit all functions
+-- of the DBObjectLib listed here. \\
+-- If you create a new namespaced child-database (`:RegisterNamespace`), you'll get a DBObject as well, but note
+-- that the child-databases cannot individually change their profile, and are linked to their parents profile - and because of that,
+-- the profile related APIs are not available. Only `:RegisterDefaults` and `:ResetProfile` are available on child-databases.
+--
+-- For more details on how to use AceDB-3.0, see the [[AceDB-3.0 Tutorial]].
+--
+-- You may also be interested in [[libdualspec-1-0|LibDualSpec-1.0]] to do profile switching automatically when switching specs.
+--
+-- @usage
+-- MyAddon = LibStub("AceAddon-3.0"):NewAddon("DBExample")
+--
+-- -- declare defaults to be used in the DB
+-- local defaults = {
+--   profile = {
+--     setting = true,
+--   }
+-- }
+--
+-- function MyAddon:OnInitialize()
+--   -- Assuming the .toc says ## SavedVariables: MyAddonDB
+--   self.db = LibStub("AceDB-3.0"):New("MyAddonDB", defaults, true)
+-- end
+-- @class file
+-- @name AceDB-3.0.lua
+-- @release $Id: AceDB-3.0.lua 1124 2014-10-27 21:00:07Z funkydude $
+local ACEDB_MAJOR, ACEDB_MINOR = "AceDB-3.0", 26
+local AceDB, oldminor = LibStub:NewLibrary(ACEDB_MAJOR, ACEDB_MINOR)
+
+if not AceDB then return end -- No upgrade needed
+
+-- Lua APIs
+local type, pairs, next, error = type, pairs, next, error
+local setmetatable, getmetatable, rawset, rawget = setmetatable, getmetatable, rawset, rawget
+
+-- WoW APIs
+local _G = _G
+
+-- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
+-- List them here for Mikk's FindGlobals script
+-- GLOBALS: LibStub
+
+AceDB.db_registry = AceDB.db_registry or {}
+AceDB.frame = AceDB.frame or CreateFrame("Frame")
+
+local CallbackHandler
+local CallbackDummy = { Fire = function() end }
+
+local DBObjectLib = {}
+
+--[[-------------------------------------------------------------------------
+	AceDB Utility Functions
+---------------------------------------------------------------------------]]
+
+-- Simple shallow copy for copying defaults
+local function copyTable(src, dest)
+	if type(dest) ~= "table" then dest = {} end
+	if type(src) == "table" then
+		for k,v in pairs(src) do
+			if type(v) == "table" then
+				-- try to index the key first so that the metatable creates the defaults, if set, and use that table
+				v = copyTable(v, dest[k])
+			end
+			dest[k] = v
+		end
+	end
+	return dest
+end
+
+-- Called to add defaults to a section of the database
+--
+-- When a ["*"] default section is indexed with a new key, a table is returned
+-- and set in the host table.  These tables must be cleaned up by removeDefaults
+-- in order to ensure we don't write empty default tables.
+local function copyDefaults(dest, src)
+	-- this happens if some value in the SV overwrites our default value with a non-table
+	--if type(dest) ~= "table" then return end
+	for k, v in pairs(src) do
+		if k == "*" or k == "**" then
+			if type(v) == "table" then
+				-- This is a metatable used for table defaults
+				local mt = {
+					-- This handles the lookup and creation of new subtables
+					__index = function(t,k)
+							if k == nil then return nil end
+							local tbl = {}
+							copyDefaults(tbl, v)
+							rawset(t, k, tbl)
+							return tbl
+						end,
+				}
+				setmetatable(dest, mt)
+				-- handle already existing tables in the SV
+				for dk, dv in pairs(dest) do
+					if not rawget(src, dk) and type(dv) == "table" then
+						copyDefaults(dv, v)
+					end
+				end
+			else
+				-- Values are not tables, so this is just a simple return
+				local mt = {__index = function(t,k) return k~=nil and v or nil end}
+				setmetatable(dest, mt)
+			end
+		elseif type(v) == "table" then
+			if not rawget(dest, k) then rawset(dest, k, {}) end
+			if type(dest[k]) == "table" then
+				copyDefaults(dest[k], v)
+				if src['**'] then
+					copyDefaults(dest[k], src['**'])
+				end
+			end
+		else
+			if rawget(dest, k) == nil then
+				rawset(dest, k, v)
+			end
+		end
+	end
+end
+
+-- Called to remove all defaults in the default table from the database
+local function removeDefaults(db, defaults, blocker)
+	-- remove all metatables from the db, so we don't accidentally create new sub-tables through them
+	setmetatable(db, nil)
+	-- loop through the defaults and remove their content
+	for k,v in pairs(defaults) do
+		if k == "*" or k == "**" then
+			if type(v) == "table" then
+				-- Loop through all the actual k,v pairs and remove
+				for key, value in pairs(db) do
+					if type(value) == "table" then
+						-- if the key was not explicitly specified in the defaults table, just strip everything from * and ** tables
+						if defaults[key] == nil and (not blocker or blocker[key] == nil) then
+							removeDefaults(value, v)
+							-- if the table is empty afterwards, remove it
+							if next(value) == nil then
+								db[key] = nil
+							end
+						-- if it was specified, only strip ** content, but block values which were set in the key table
+						elseif k == "**" then
+							removeDefaults(value, v, defaults[key])
+						end
+					end
+				end
+			elseif k == "*" then
+				-- check for non-table default
+				for key, value in pairs(db) do
+					if defaults[key] == nil and v == value then
+						db[key] = nil
+					end
+				end
+			end
+		elseif type(v) == "table" and type(db[k]) == "table" then
+			-- if a blocker was set, dive into it, to allow multi-level defaults
+			removeDefaults(db[k], v, blocker and blocker[k])
+			if next(db[k]) == nil then
+				db[k] = nil
+			end
+		else
+			-- check if the current value matches the default, and that its not blocked by another defaults table
+			if db[k] == defaults[k] and (not blocker or blocker[k] == nil) then
+				db[k] = nil
+			end
+		end
+	end
+end
+
+-- This is called when a table section is first accessed, to set up the defaults
+local function initSection(db, section, svstore, key, defaults)
+	local sv = rawget(db, "sv")
+
+	local tableCreated
+	if not sv[svstore] then sv[svstore] = {} end
+	if not sv[svstore][key] then
+		sv[svstore][key] = {}
+		tableCreated = true
+	end
+
+	local tbl = sv[svstore][key]
+
+	if defaults then
+		copyDefaults(tbl, defaults)
+	end
+	rawset(db, section, tbl)
+
+	return tableCreated, tbl
+end
+
+-- Metatable to handle the dynamic creation of sections and copying of sections.
+local dbmt = {
+	__index = function(t, section)
+			local keys = rawget(t, "keys")
+			local key = keys[section]
+			if key then
+				local defaultTbl = rawget(t, "defaults")
+				local defaults = defaultTbl and defaultTbl[section]
+
+				if section == "profile" then
+					local new = initSection(t, section, "profiles", key, defaults)
+					if new then
+						-- Callback: OnNewProfile, database, newProfileKey
+						t.callbacks:Fire("OnNewProfile", t, key)
+					end
+				elseif section == "profiles" then
+					local sv = rawget(t, "sv")
+					if not sv.profiles then sv.profiles = {} end
+					rawset(t, "profiles", sv.profiles)
+				elseif section == "global" then
+					local sv = rawget(t, "sv")
+					if not sv.global then sv.global = {} end
+					if defaults then
+						copyDefaults(sv.global, defaults)
+					end
+					rawset(t, section, sv.global)
+				else
+					initSection(t, section, section, key, defaults)
+				end
+			end
+
+			return rawget(t, section)
+		end
+}
+
+local function validateDefaults(defaults, keyTbl, offset)
+	if not defaults then return end
+	offset = offset or 0
+	for k in pairs(defaults) do
+		if not keyTbl[k] or k == "profiles" then
+			error(("Usage: AceDBObject:RegisterDefaults(defaults): '%s' is not a valid datatype."):format(k), 3 + offset)
+		end
+	end
+end
+
+local preserve_keys = {
+	["callbacks"] = true,
+	["RegisterCallback"] = true,
+	["UnregisterCallback"] = true,
+	["UnregisterAllCallbacks"] = true,
+	["children"] = true,
+}
+
+local realmKey = GetRealmName()
+local charKey = UnitName("player") .. " - " .. realmKey
+local _, classKey = UnitClass("player")
+local _, raceKey = UnitRace("player")
+local factionKey = UnitFactionGroup("player")
+local factionrealmKey = factionKey .. " - " .. realmKey
+local localeKey = GetLocale():lower()
+
+local regionTable = { "US", "KR", "EU", "TW", "CN" }
+local regionKey = regionTable[GetCurrentRegion()]
+local factionrealmregionKey = factionrealmKey .. " - " .. regionKey
+
+-- Actual database initialization function
+local function initdb(sv, defaults, defaultProfile, olddb, parent)
+	-- Generate the database keys for each section
+
+	-- map "true" to our "Default" profile
+	if defaultProfile == true then defaultProfile = "Default" end
+
+	local profileKey
+	if not parent then
+		-- Make a container for profile keys
+		if not sv.profileKeys then sv.profileKeys = {} end
+
+		-- Try to get the profile selected from the char db
+		profileKey = sv.profileKeys[charKey] or defaultProfile or charKey
+
+		-- save the selected profile for later
+		sv.profileKeys[charKey] = profileKey
+	else
+		-- Use the profile of the parents DB
+		profileKey = parent.keys.profile or defaultProfile or charKey
+
+		-- clear the profileKeys in the DB, namespaces don't need to store them
+		sv.profileKeys = nil
+	end
+
+	-- This table contains keys that enable the dynamic creation
+	-- of each section of the table.  The 'global' and 'profiles'
+	-- have a key of true, since they are handled in a special case
+	local keyTbl= {
+		["char"] = charKey,
+		["realm"] = realmKey,
+		["class"] = classKey,
+		["race"] = raceKey,
+		["faction"] = factionKey,
+		["factionrealm"] = factionrealmKey,
+		["factionrealmregion"] = factionrealmregionKey,
+		["profile"] = profileKey,
+		["locale"] = localeKey,
+		["global"] = true,
+		["profiles"] = true,
+	}
+
+	validateDefaults(defaults, keyTbl, 1)
+
+	-- This allows us to use this function to reset an entire database
+	-- Clear out the old database
+	if olddb then
+		for k,v in pairs(olddb) do if not preserve_keys[k] then olddb[k] = nil end end
+	end
+
+	-- Give this database the metatable so it initializes dynamically
+	local db = setmetatable(olddb or {}, dbmt)
+
+	if not rawget(db, "callbacks") then
+		-- try to load CallbackHandler-1.0 if it loaded after our library
+		if not CallbackHandler then CallbackHandler = LibStub:GetLibrary("CallbackHandler-1.0", true) end
+		db.callbacks = CallbackHandler and CallbackHandler:New(db) or CallbackDummy
+	end
+
+	-- Copy methods locally into the database object, to avoid hitting
+	-- the metatable when calling methods
+
+	if not parent then
+		for name, func in pairs(DBObjectLib) do
+			db[name] = func
+		end
+	else
+		-- hack this one in
+		db.RegisterDefaults = DBObjectLib.RegisterDefaults
+		db.ResetProfile = DBObjectLib.ResetProfile
+	end
+
+	-- Set some properties in the database object
+	db.profiles = sv.profiles
+	db.keys = keyTbl
+	db.sv = sv
+	--db.sv_name = name
+	db.defaults = defaults
+	db.parent = parent
+
+	-- store the DB in the registry
+	AceDB.db_registry[db] = true
+
+	return db
+end
+
+-- handle PLAYER_LOGOUT
+-- strip all defaults from all databases
+-- and cleans up empty sections
+local function logoutHandler(frame, event)
+	if event == "PLAYER_LOGOUT" then
+		for db in pairs(AceDB.db_registry) do
+			db.callbacks:Fire("OnDatabaseShutdown", db)
+			db:RegisterDefaults(nil)
+
+			-- cleanup sections that are empty without defaults
+			local sv = rawget(db, "sv")
+			for section in pairs(db.keys) do
+				if rawget(sv, section) then
+					-- global is special, all other sections have sub-entrys
+					-- also don't delete empty profiles on main dbs, only on namespaces
+					if section ~= "global" and (section ~= "profiles" or rawget(db, "parent")) then
+						for key in pairs(sv[section]) do
+							if not next(sv[section][key]) then
+								sv[section][key] = nil
+							end
+						end
+					end
+					if not next(sv[section]) then
+						sv[section] = nil
+					end
+				end
+			end
+		end
+	end
+end
+
+AceDB.frame:RegisterEvent("PLAYER_LOGOUT")
+AceDB.frame:SetScript("OnEvent", logoutHandler)
+
+
+--[[-------------------------------------------------------------------------
+	AceDB Object Method Definitions
+---------------------------------------------------------------------------]]
+
+--- Sets the defaults table for the given database object by clearing any
+-- that are currently set, and then setting the new defaults.
+-- @param defaults A table of defaults for this database
+function DBObjectLib:RegisterDefaults(defaults)
+	if defaults and type(defaults) ~= "table" then
+		error("Usage: AceDBObject:RegisterDefaults(defaults): 'defaults' - table or nil expected.", 2)
+	end
+
+	validateDefaults(defaults, self.keys)
+
+	-- Remove any currently set defaults
+	if self.defaults then
+		for section,key in pairs(self.keys) do
+			if self.defaults[section] and rawget(self, section) then
+				removeDefaults(self[section], self.defaults[section])
+			end
+		end
+	end
+
+	-- Set the DBObject.defaults table
+	self.defaults = defaults
+
+	-- Copy in any defaults, only touching those sections already created
+	if defaults then
+		for section,key in pairs(self.keys) do
+			if defaults[section] and rawget(self, section) then
+				copyDefaults(self[section], defaults[section])
+			end
+		end
+	end
+end
+
+--- Changes the profile of the database and all of it's namespaces to the
+-- supplied named profile
+-- @param name The name of the profile to set as the current profile
+function DBObjectLib:SetProfile(name)
+	if type(name) ~= "string" then
+		error("Usage: AceDBObject:SetProfile(name): 'name' - string expected.", 2)
+	end
+
+	-- changing to the same profile, dont do anything
+	if name == self.keys.profile then return end
+
+	local oldProfile = self.profile
+	local defaults = self.defaults and self.defaults.profile
+
+	-- Callback: OnProfileShutdown, database
+	self.callbacks:Fire("OnProfileShutdown", self)
+
+	if oldProfile and defaults then
+		-- Remove the defaults from the old profile
+		removeDefaults(oldProfile, defaults)
+	end
+
+	self.profile = nil
+	self.keys["profile"] = name
+
+	-- if the storage exists, save the new profile
+	-- this won't exist on namespaces.
+	if self.sv.profileKeys then
+		self.sv.profileKeys[charKey] = name
+	end
+
+	-- populate to child namespaces
+	if self.children then
+		for _, db in pairs(self.children) do
+			DBObjectLib.SetProfile(db, name)
+		end
+	end
+
+	-- Callback: OnProfileChanged, database, newProfileKey
+	self.callbacks:Fire("OnProfileChanged", self, name)
+end
+
+--- Returns a table with the names of the existing profiles in the database.
+-- You can optionally supply a table to re-use for this purpose.
+-- @param tbl A table to store the profile names in (optional)
+function DBObjectLib:GetProfiles(tbl)
+	if tbl and type(tbl) ~= "table" then
+		error("Usage: AceDBObject:GetProfiles(tbl): 'tbl' - table or nil expected.", 2)
+	end
+
+	-- Clear the container table
+	if tbl then
+		for k,v in pairs(tbl) do tbl[k] = nil end
+	else
+		tbl = {}
+	end
+
+	local curProfile = self.keys.profile
+
+	local i = 0
+	for profileKey in pairs(self.profiles) do
+		i = i + 1
+		tbl[i] = profileKey
+		if curProfile and profileKey == curProfile then curProfile = nil end
+	end
+
+	-- Add the current profile, if it hasn't been created yet
+	if curProfile then
+		i = i + 1
+		tbl[i] = curProfile
+	end
+
+	return tbl, i
+end
+
+--- Returns the current profile name used by the database
+function DBObjectLib:GetCurrentProfile()
+	return self.keys.profile
+end
+
+--- Deletes a named profile.  This profile must not be the active profile.
+-- @param name The name of the profile to be deleted
+-- @param silent If true, do not raise an error when the profile does not exist
+function DBObjectLib:DeleteProfile(name, silent)
+	if type(name) ~= "string" then
+		error("Usage: AceDBObject:DeleteProfile(name): 'name' - string expected.", 2)
+	end
+
+	if self.keys.profile == name then
+		error("Cannot delete the active profile in an AceDBObject.", 2)
+	end
+
+	if not rawget(self.profiles, name) and not silent then
+		error("Cannot delete profile '" .. name .. "'. It does not exist.", 2)
+	end
+
+	self.profiles[name] = nil
+
+	-- populate to child namespaces
+	if self.children then
+		for _, db in pairs(self.children) do
+			DBObjectLib.DeleteProfile(db, name, true)
+		end
+	end
+
+	-- switch all characters that use this profile back to the default
+	if self.sv.profileKeys then
+		for key, profile in pairs(self.sv.profileKeys) do
+			if profile == name then
+				self.sv.profileKeys[key] = nil
+			end
+		end
+	end
+
+	-- Callback: OnProfileDeleted, database, profileKey
+	self.callbacks:Fire("OnProfileDeleted", self, name)
+end
+
+--- Copies a named profile into the current profile, overwriting any conflicting
+-- settings.
+-- @param name The name of the profile to be copied into the current profile
+-- @param silent If true, do not raise an error when the profile does not exist
+function DBObjectLib:CopyProfile(name, silent)
+	if type(name) ~= "string" then
+		error("Usage: AceDBObject:CopyProfile(name): 'name' - string expected.", 2)
+	end
+
+	if name == self.keys.profile then
+		error("Cannot have the same source and destination profiles.", 2)
+	end
+
+	if not rawget(self.profiles, name) and not silent then
+		error("Cannot copy profile '" .. name .. "'. It does not exist.", 2)
+	end
+
+	-- Reset the profile before copying
+	DBObjectLib.ResetProfile(self, nil, true)
+
+	local profile = self.profile
+	local source = self.profiles[name]
+
+	copyTable(source, profile)
+
+	-- populate to child namespaces
+	if self.children then
+		for _, db in pairs(self.children) do
+			DBObjectLib.CopyProfile(db, name, true)
+		end
+	end
+
+	-- Callback: OnProfileCopied, database, sourceProfileKey
+	self.callbacks:Fire("OnProfileCopied", self, name)
+end
+
+--- Resets the current profile to the default values (if specified).
+-- @param noChildren if set to true, the reset will not be populated to the child namespaces of this DB object
+-- @param noCallbacks if set to true, won't fire the OnProfileReset callback
+function DBObjectLib:ResetProfile(noChildren, noCallbacks)
+	local profile = self.profile
+
+	for k,v in pairs(profile) do
+		profile[k] = nil
+	end
+
+	local defaults = self.defaults and self.defaults.profile
+	if defaults then
+		copyDefaults(profile, defaults)
+	end
+
+	-- populate to child namespaces
+	if self.children and not noChildren then
+		for _, db in pairs(self.children) do
+			DBObjectLib.ResetProfile(db, nil, noCallbacks)
+		end
+	end
+
+	-- Callback: OnProfileReset, database
+	if not noCallbacks then
+		self.callbacks:Fire("OnProfileReset", self)
+	end
+end
+
+--- Resets the entire database, using the string defaultProfile as the new default
+-- profile.
+-- @param defaultProfile The profile name to use as the default
+function DBObjectLib:ResetDB(defaultProfile)
+	if defaultProfile and type(defaultProfile) ~= "string" then
+		error("Usage: AceDBObject:ResetDB(defaultProfile): 'defaultProfile' - string or nil expected.", 2)
+	end
+
+	local sv = self.sv
+	for k,v in pairs(sv) do
+		sv[k] = nil
+	end
+
+	local parent = self.parent
+
+	initdb(sv, self.defaults, defaultProfile, self)
+
+	-- fix the child namespaces
+	if self.children then
+		if not sv.namespaces then sv.namespaces = {} end
+		for name, db in pairs(self.children) do
+			if not sv.namespaces[name] then sv.namespaces[name] = {} end
+			initdb(sv.namespaces[name], db.defaults, self.keys.profile, db, self)
+		end
+	end
+
+	-- Callback: OnDatabaseReset, database
+	self.callbacks:Fire("OnDatabaseReset", self)
+	-- Callback: OnProfileChanged, database, profileKey
+	self.callbacks:Fire("OnProfileChanged", self, self.keys["profile"])
+
+	return self
+end
+
+--- Creates a new database namespace, directly tied to the database.  This
+-- is a full scale database in it's own rights other than the fact that
+-- it cannot control its profile individually
+-- @param name The name of the new namespace
+-- @param defaults A table of values to use as defaults
+function DBObjectLib:RegisterNamespace(name, defaults)
+	if type(name) ~= "string" then
+		error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - string expected.", 2)
+	end
+	if defaults and type(defaults) ~= "table" then
+		error("Usage: AceDBObject:RegisterNamespace(name, defaults): 'defaults' - table or nil expected.", 2)
+	end
+	if self.children and self.children[name] then
+		error ("Usage: AceDBObject:RegisterNamespace(name, defaults): 'name' - a namespace with that name already exists.", 2)
+	end
+
+	local sv = self.sv
+	if not sv.namespaces then sv.namespaces = {} end
+	if not sv.namespaces[name] then
+		sv.namespaces[name] = {}
+	end
+
+	local newDB = initdb(sv.namespaces[name], defaults, self.keys.profile, nil, self)
+
+	if not self.children then self.children = {} end
+	self.children[name] = newDB
+	return newDB
+end
+
+--- Returns an already existing namespace from the database object.
+-- @param name The name of the new namespace
+-- @param silent if true, the addon is optional, silently return nil if its not found
+-- @usage
+-- local namespace = self.db:GetNamespace('namespace')
+-- @return the namespace object if found
+function DBObjectLib:GetNamespace(name, silent)
+	if type(name) ~= "string" then
+		error("Usage: AceDBObject:GetNamespace(name): 'name' - string expected.", 2)
+	end
+	if not silent and not (self.children and self.children[name]) then
+		error ("Usage: AceDBObject:GetNamespace(name): 'name' - namespace does not exist.", 2)
+	end
+	if not self.children then self.children = {} end
+	return self.children[name]
+end
+
+--[[-------------------------------------------------------------------------
+	AceDB Exposed Methods
+---------------------------------------------------------------------------]]
+
+--- Creates a new database object that can be used to handle database settings and profiles.
+-- By default, an empty DB is created, using a character specific profile.
+--
+-- You can override the default profile used by passing any profile name as the third argument,
+-- or by passing //true// as the third argument to use a globally shared profile called "Default".
+--
+-- Note that there is no token replacement in the default profile name, passing a defaultProfile as "char"
+-- will use a profile named "char", and not a character-specific profile.
+-- @param tbl The name of variable, or table to use for the database
+-- @param defaults A table of database defaults
+-- @param defaultProfile The name of the default profile. If not set, a character specific profile will be used as the default.
+-- You can also pass //true// to use a shared global profile called "Default".
+-- @usage
+-- -- Create an empty DB using a character-specific default profile.
+-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB")
+-- @usage
+-- -- Create a DB using defaults and using a shared default profile
+-- self.db = LibStub("AceDB-3.0"):New("MyAddonDB", defaults, true)
+function AceDB:New(tbl, defaults, defaultProfile)
+	if type(tbl) == "string" then
+		local name = tbl
+		tbl = _G[name]
+		if not tbl then
+			tbl = {}
+			_G[name] = tbl
+		end
+	end
+
+	if type(tbl) ~= "table" then
+		error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'tbl' - table expected.", 2)
+	end
+
+	if defaults and type(defaults) ~= "table" then
+		error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaults' - table expected.", 2)
+	end
+
+	if defaultProfile and type(defaultProfile) ~= "string" and defaultProfile ~= true then
+		error("Usage: AceDB:New(tbl, defaults, defaultProfile): 'defaultProfile' - string or true expected.", 2)
+	end
+
+	return initdb(tbl, defaults, defaultProfile)
+end
+
+-- upgrade existing databases
+for db in pairs(AceDB.db_registry) do
+	if not db.parent then
+		for name,func in pairs(DBObjectLib) do
+			db[name] = func
+		end
+	else
+		db.RegisterDefaults = DBObjectLib.RegisterDefaults
+		db.ResetProfile = DBObjectLib.ResetProfile
+	end
+end
diff --git a/ElvUI_SLE/libs/AceDB-3.0/AceDB-3.0.xml b/ElvUI_SLE/libs/AceDB-3.0/AceDB-3.0.xml
new file mode 100644
index 0000000..46b20ba
--- /dev/null
+++ b/ElvUI_SLE/libs/AceDB-3.0/AceDB-3.0.xml
@@ -0,0 +1,4 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
+..\FrameXML\UI.xsd">
+	<Script file="AceDB-3.0.lua"/>
+</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/AceDBOptions-3.0/AceDBOptions-3.0.lua b/ElvUI_SLE/libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
deleted file mode 100644
index 616f35e..0000000
--- a/ElvUI_SLE/libs/AceDBOptions-3.0/AceDBOptions-3.0.lua
+++ /dev/null
@@ -1,440 +0,0 @@
---- 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
-local AceDBOptions, oldminor = LibStub:NewLibrary(ACEDBO_MAJOR, ACEDBO_MINOR)
-
-if not AceDBOptions then return end -- No upgrade needed
-
--- Lua APIs
-local pairs, next = pairs, next
-
--- WoW APIs
-local UnitClass = UnitClass
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: NORMAL_FONT_COLOR_CODE, FONT_COLOR_CODE_CLOSE
-
-AceDBOptions.optionTables = AceDBOptions.optionTables or {}
-AceDBOptions.handlers = AceDBOptions.handlers or {}
-
---[[
-	Localization of AceDBOptions-3.0
-]]
-
-local L = {
-	choose = "Existing Profiles",
-	choose_desc = "You can either create a new profile by entering a name in the editbox, or choose one of the already existing profiles.",
-	choose_sub = "Select one of your currently available profiles.",
-	copy = "Copy From",
-	copy_desc = "Copy the settings from one existing profile into the currently active profile.",
-	current = "Current Profile:",
-	default = "Default",
-	delete = "Delete a Profile",
-	delete_confirm = "Are you sure you want to delete the selected profile?",
-	delete_desc = "Delete existing and unused profiles from the database to save space, and cleanup the SavedVariables file.",
-	delete_sub = "Deletes a profile from the database.",
-	intro = "You can change the active database profile, so you can have different settings for every character.",
-	new = "New",
-	new_sub = "Create a new empty profile.",
-	profiles = "Profiles",
-	profiles_sub = "Manage Profiles",
-	reset = "Reset Profile",
-	reset_desc = "Reset the current profile back to its default values, in case your configuration is broken, or you simply want to start over.",
-	reset_sub = "Reset the current profile to the default",
-}
-
-local LOCALE = GetLocale()
-if LOCALE == "deDE" then
-	L["choose"] = "Vorhandene Profile"
-	L["choose_desc"] = "Du kannst ein neues Profil erstellen, indem du einen neuen Namen in der Eingabebox 'Neu' eingibst, oder wähle eines der vorhandenen Profile aus."
-	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["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_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["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_sub"] = "Das aktuelle Profil auf Standard zurücksetzen."
-elseif LOCALE == "frFR" then
-	L["choose"] = "Profils existants"
-	L["choose_desc"] = "Vous pouvez créer un nouveau profil en entrant un nouveau nom dans la boîte de saisie, ou en choississant un des profils déjà existants."
-	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["default"] = "Défaut"
-	L["delete"] = "Supprimer un profil"
-	L["delete_confirm"] = "Etes-vous sûr de vouloir supprimer le profil sélectionné ?"
-	L["delete_desc"] = "Supprime les profils existants inutilisés de la base de données afin de gagner de la place et de nettoyer le fichier SavedVariables."
-	L["delete_sub"] = "Supprime un profil de la base de données."
-	L["intro"] = "Vous pouvez changer le profil actuel afin d'avoir des paramètres différents pour chaque personnage, permettant ainsi d'avoir une configuration très flexible."
-	L["new"] = "Nouveau"
-	L["new_sub"] = "Créée un nouveau profil vierge."
-	L["profiles"] = "Profils"
-	L["profiles_sub"] = "Gestion des profils"
-	L["reset"] = "Réinitialiser le profil"
-	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["default"] = "기본값"
-	L["delete"] = "프로필 삭제"
-	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"] = "현재의 프로필을 기본값으로 초기화 합니다"
-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["default"] = "Por defecto"
-	L["delete"] = "Borrar un Perfil"
-	L["delete_confirm"] = "¿Estas seguro que quieres borrar el perfil seleccionado?"
-	L["delete_desc"] = "Borra los perfiles existentes y sin uso de la base de datos para ganar espacio y limpiar el archivo SavedVariables."
-	L["delete_sub"] = "Borra un perfil de la base de datos."
-	L["intro"] = "Puedes cambiar el perfil activo de tal manera que cada personaje tenga diferentes configuraciones."
-	L["new"] = "Nuevo"
-	L["new_sub"] = "Crear un nuevo perfil vacio."
-	L["profiles"] = "Perfiles"
-	L["profiles_sub"] = "Manejar Perfiles"
-	L["reset"] = "Reiniciar Perfil"
-	L["reset_desc"] = "Reinicia el perfil actual a los valores por defectos, en caso de que se haya estropeado la configuración o quieras volver a empezar de nuevo."
-	L["reset_sub"] = "Reinicar el perfil actual al de por defecto"
-elseif LOCALE == "zhTW" then
-	L["choose"] = "現有的設定檔"
-	L["choose_desc"] = "你可以通過在文本框內輸入一個名字創立一個新的設定檔,也可以選擇一個已經存在的設定檔。"
-	L["choose_sub"] = "從當前可用的設定檔裏面選擇一個。"
-	L["copy"] = "複製自"
-	L["copy_desc"] = "從當前某個已保存的設定檔複製到當前正使用的設定檔。"
-	-- L["current"] = "Current Profile:"
-	L["default"] = "預設"
-	L["delete"] = "刪除一個設定檔"
-	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"] = "將當前的設定檔恢復為預設值"
-elseif LOCALE == "zhCN" then
-	L["choose"] = "现有的配置文件"
-	L["choose_desc"] = "你可以通过在文本框内输入一个名字创立一个新的配置文件,也可以选择一个已经存在的配置文件。"
-	L["choose_sub"] = "从当前可用的配置文件里面选择一个。"
-	L["copy"] = "复制自"
-	L["copy_desc"] = "从当前某个已保存的配置文件复制到当前正使用的配置文件。"
-	-- L["current"] = "Current Profile:"
-	L["default"] = "默认"
-	L["delete"] = "删除一个配置文件"
-	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"] = "将当前的配置文件恢复为默认值"
-elseif LOCALE == "ruRU" then
-	L["choose"] = "Существующие профили"
-	L["choose_desc"] = "Вы можете создать новый профиль, введя название в поле ввода, или выбрать один из уже существующих профилей."
-	L["choose_sub"] = "Выбор одиного из уже доступных профилей"
-	L["copy"] = "Скопировать из"
-	L["copy_desc"] = "Скопировать настройки из выбранного профиля в активный."
-	-- L["current"] = "Current Profile:"
-	L["default"] = "По умолчанию"
-	L["delete"] = "Удалить профиль"
-	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"] = "Сброс текущего профиля на стандартный"
-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["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_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."
-	L["intro"] = "Puoi cambiare il profilo attivo, in modo da usare impostazioni diverse per ogni personaggio."
-	L["new"] = "Nuovo"
-	L["new_sub"] = "Crea un nuovo profilo vuoto."
-	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."
-end
-
-local defaultProfiles
-local tmpprofiles = {}
-
--- Get a list of available profiles for the specified database.
--- You can specify which profiles to include/exclude in the list using the two boolean parameters listed below.
--- @param db The db object to retrieve the profiles from
--- @param common If true, getProfileList will add the default profiles to the return list, even if they have not been created yet
--- @param nocurrent If true, then getProfileList will not display the current profile in the list
--- @return Hashtable of all profiles with the internal name as keys and the display name as value.
-local function getProfileList(db, common, nocurrent)
-	local profiles = {}
-
-	-- copy existing profiles into the table
-	local currentProfile = db:GetCurrentProfile()
-	for i,v in pairs(db:GetProfiles(tmpprofiles)) do
-		if not (nocurrent and v == currentProfile) then
-			profiles[v] = v
-		end
-	end
-
-	-- add our default profiles to choose from ( or rename existing profiles)
-	for k,v in pairs(defaultProfiles) do
-		if (common or profiles[k]) and not (nocurrent and k == currentProfile) then
-			profiles[k] = v
-		end
-	end
-
-	return profiles
-end
-
---[[
-	OptionsHandlerPrototype
-	prototype class for handling the options in a sane way
-]]
-local OptionsHandlerPrototype = {}
-
---[[ Reset the profile ]]
-function OptionsHandlerPrototype:Reset()
-	self.db:ResetProfile()
-end
-
---[[ Set the profile to value ]]
-function OptionsHandlerPrototype:SetProfile(info, value)
-	self.db:SetProfile(value)
-end
-
---[[ returns the currently active profile ]]
-function OptionsHandlerPrototype:GetCurrentProfile()
-	return self.db:GetCurrentProfile()
-end
-
---[[
-	List all active profiles
-	you can control the output with the .arg variable
-	currently four modes are supported
-
-	(empty) - return all available profiles
-	"nocurrent" - returns all available profiles except the currently active profile
-	"common" - returns all avaialble profiles + some commonly used profiles ("char - realm", "realm", "class", "Default")
-	"both" - common except the active profile
-]]
-function OptionsHandlerPrototype:ListProfiles(info)
-	local arg = info.arg
-	local profiles
-	if arg == "common" and not self.noDefaultProfiles then
-		profiles = getProfileList(self.db, true, nil)
-	elseif arg == "nocurrent" then
-		profiles = getProfileList(self.db, nil, true)
-	elseif arg == "both" then -- currently not used
-		profiles = getProfileList(self.db, (not self.noDefaultProfiles) and true, true)
-	else
-		profiles = getProfileList(self.db)
-	end
-
-	return profiles
-end
-
-function OptionsHandlerPrototype:HasNoProfiles(info)
-	local profiles = self:ListProfiles(info)
-	return ((not next(profiles)) and true or false)
-end
-
---[[ Copy a profile ]]
-function OptionsHandlerPrototype:CopyProfile(info, value)
-	self.db:CopyProfile(value)
-end
-
---[[ Delete a profile from the db ]]
-function OptionsHandlerPrototype:DeleteProfile(info, value)
-	self.db:DeleteProfile(value)
-end
-
---[[ fill defaultProfiles with some generic values ]]
-local function generateDefaultProfiles(db)
-	defaultProfiles = {
-		["Default"] = L["default"],
-		[db.keys.char] = db.keys.char,
-		[db.keys.realm] = db.keys.realm,
-		[db.keys.class] = UnitClass("player")
-	}
-end
-
---[[ create and return a handler object for the db, or upgrade it if it already existed ]]
-local function getOptionsHandler(db, noDefaultProfiles)
-	if not defaultProfiles then
-		generateDefaultProfiles(db)
-	end
-
-	local handler = AceDBOptions.handlers[db] or { db = db, noDefaultProfiles = noDefaultProfiles }
-
-	for k,v in pairs(OptionsHandlerPrototype) do
-		handler[k] = v
-	end
-
-	AceDBOptions.handlers[db] = handler
-	return handler
-end
-
---[[
-	the real options table
-]]
-local optionsTable = {
-	desc = {
-		order = 1,
-		type = "description",
-		name = L["intro"] .. "\n",
-	},
-	descreset = {
-		order = 9,
-		type = "description",
-		name = L["reset_desc"],
-	},
-	reset = {
-		order = 10,
-		type = "execute",
-		name = L["reset"],
-		desc = L["reset_sub"],
-		func = "Reset",
-	},
-	current = {
-		order = 11,
-		type = "description",
-		name = function(info) return L["current"] .. " " .. NORMAL_FONT_COLOR_CODE .. info.handler:GetCurrentProfile() .. FONT_COLOR_CODE_CLOSE end,
-		width = "default",
-	},
-	choosedesc = {
-		order = 20,
-		type = "description",
-		name = "\n" .. L["choose_desc"],
-	},
-	new = {
-		name = L["new"],
-		desc = L["new_sub"],
-		type = "input",
-		order = 30,
-		get = false,
-		set = "SetProfile",
-	},
-	choose = {
-		name = L["choose"],
-		desc = L["choose_sub"],
-		type = "select",
-		order = 40,
-		get = "GetCurrentProfile",
-		set = "SetProfile",
-		values = "ListProfiles",
-		arg = "common",
-	},
-	copydesc = {
-		order = 50,
-		type = "description",
-		name = "\n" .. L["copy_desc"],
-	},
-	copyfrom = {
-		order = 60,
-		type = "select",
-		name = L["copy"],
-		desc = L["copy_desc"],
-		get = false,
-		set = "CopyProfile",
-		values = "ListProfiles",
-		disabled = "HasNoProfiles",
-		arg = "nocurrent",
-	},
-	deldesc = {
-		order = 70,
-		type = "description",
-		name = "\n" .. L["delete_desc"],
-	},
-	delete = {
-		order = 80,
-		type = "select",
-		name = L["delete"],
-		desc = L["delete_sub"],
-		get = false,
-		set = "DeleteProfile",
-		values = "ListProfiles",
-		disabled = "HasNoProfiles",
-		arg = "nocurrent",
-		confirm = true,
-		confirmText = L["delete_confirm"],
-	},
-}
-
---- Get/Create a option table that you can use in your addon to control the profiles of AceDB-3.0.
--- @param db The database object to create the options table for.
--- @return The options table to be used in AceConfig-3.0
--- @usage
--- -- Assuming `options` is your top-level options table and `self.db` is your database:
--- options.args.profiles = LibStub("AceDBOptions-3.0"):GetOptionsTable(self.db)
-function AceDBOptions:GetOptionsTable(db, noDefaultProfiles)
-	local tbl = AceDBOptions.optionTables[db] or {
-			type = "group",
-			name = L["profiles"],
-			desc = L["profiles_sub"],
-		}
-
-	tbl.handler = getOptionsHandler(db, noDefaultProfiles)
-	tbl.args = optionsTable
-
-	AceDBOptions.optionTables[db] = tbl
-	return tbl
-end
-
--- upgrade existing tables
-for db,tbl in pairs(AceDBOptions.optionTables) do
-	tbl.handler = getOptionsHandler(db)
-	tbl.args = optionsTable
-end
diff --git a/ElvUI_SLE/libs/AceDBOptions-3.0/AceDBOptions-3.0.xml b/ElvUI_SLE/libs/AceDBOptions-3.0/AceDBOptions-3.0.xml
deleted file mode 100644
index 2668fb0..0000000
--- a/ElvUI_SLE/libs/AceDBOptions-3.0/AceDBOptions-3.0.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<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
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets.toc b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets.toc
deleted file mode 100644
index 49e6398..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/AceGUI-3.0-SharedMediaWidgets.toc
+++ /dev/null
@@ -1,19 +0,0 @@
-## Interface: 60200
-## X-Curse-Packaged-Version: r52-release
-## X-Curse-Project-Name: AceGUI-3.0-SharedMediaWidgets
-## X-Curse-Project-ID: ace-gui-3-0-shared-media-widgets
-## X-Curse-Repository-ID: wow/ace-gui-3-0-shared-media-widgets/mainline
-
-## Title: Lib: AceGUI-3.0-SharedMediaWidgets
-## Notes: Enables AceGUI-3.0 widgets for the 5 basic SharedMedia-3.0 types
-## Author: Yssaril
-## OptionalDeps: Ace3, LibSharedMedia-3.0, Libstub, CallbackHandler-1.0
-## X-Category: Library
-
-#@no-lib-strip@
-Libs\Libstub\Libstub.lua
-Libs\CallbackHandler-1.0\CallbackHandler-1.0.xml
-Libs\AceGUI-3.0\AceGUI-3.0.xml
-#@end-no-lib-strip@
-
-widget.xml
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua
deleted file mode 100644
index 0b75952..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua
+++ /dev/null
@@ -1,235 +0,0 @@
--- Widget is based on the AceGUIWidget-DropDown.lua supplied with AceGUI-3.0
--- Widget created by Yssaril
-
-local AceGUI = LibStub("AceGUI-3.0")
-local Media = LibStub("LibSharedMedia-3.0")
-
-local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")
-
-do
-	local widgetType = "LSM30_Background"
-	local widgetVersion = 11
-
-	local contentFrameCache = {}
-	local function ReturnSelf(self)
-		self:ClearAllPoints()
-		self:Hide()
-		self.check:Hide()
-		table.insert(contentFrameCache, self)
-	end
-
-	local function ContentOnClick(this, button)
-		local self = this.obj
-		self:Fire("OnValueChanged", this.text:GetText())
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-		end
-	end
-
-	local function ContentOnEnter(this, button)
-		local self = this.obj
-		local text = this.text:GetText()
-		local background = self.list[text] ~= text and self.list[text] or Media:Fetch('background',text)
-		self.dropdown.bgTex:SetTexture(background)
-	end
-
-	local function GetContentLine()
-		local frame
-		if next(contentFrameCache) then
-			frame = table.remove(contentFrameCache)
-		else
-			frame = CreateFrame("Button", nil, UIParent)
-				--frame:SetWidth(200)
-				frame:SetHeight(18)
-				frame:SetHighlightTexture([[Interface\QuestFrame\UI-QuestTitleHighlight]], "ADD")
-				frame:SetScript("OnClick", ContentOnClick)
-				frame:SetScript("OnEnter", ContentOnEnter)
-
-			local check = frame:CreateTexture("OVERLAY")
-				check:SetWidth(16)
-				check:SetHeight(16)
-				check:SetPoint("LEFT",frame,"LEFT",1,-1)
-				check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
-				check:Hide()
-			frame.check = check
-
-			local text = frame:CreateFontString(nil,"OVERLAY","GameFontWhite")
-				local font, size = text:GetFont()
-				text:SetFont(font,size,"OUTLINE")
-
-				text:SetPoint("TOPLEFT", check, "TOPRIGHT", 1, 0)
-				text:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -2, 0)
-				text:SetJustifyH("LEFT")
-				text:SetText("Test Test Test Test Test Test Test")
-			frame.text = text
-
-			frame.ReturnSelf = ReturnSelf
-		end
-		frame:Show()
-		return frame
-	end
-
-	local function OnAcquire(self)
-		self:SetHeight(44)
-		self:SetWidth(200)
-	end
-
-	local function OnRelease(self)
-		self:SetText("")
-		self:SetLabel("")
-		self:SetDisabled(false)
-
-		self.value = nil
-		self.list = nil
-		self.open = nil
-		self.hasClose = nil
-
-		self.frame:ClearAllPoints()
-		self.frame:Hide()
-	end
-
-	local function SetValue(self, value) -- Set the value to an item in the List.
-		if self.list then
-			self:SetText(value or "")
-		end
-		self.value = value
-	end
-
-	local function GetValue(self)
-		return self.value
-	end
-
-	local function SetList(self, list) -- Set the list of values for the dropdown (key => value pairs)
-		self.list = list or Media:HashTable("background")
-	end
-
-
-	local function SetText(self, text) -- Set the text displayed in the box.
-		self.frame.text:SetText(text or "")
-		local background = self.list[text] ~= text and self.list[text] or Media:Fetch('background',text)
-
-		self.frame.displayButton:SetBackdrop({bgFile = background,
-			edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
-			edgeSize = 16,
-			insets = { left = 4, right = 4, top = 4, bottom = 4 }})
-	end
-
-	local function SetLabel(self, text) -- Set the text for the label.
-		self.frame.label:SetText(text or "")
-	end
-
-	local function AddItem(self, key, value) -- Add an item to the list.
-		self.list = self.list or {}
-		self.list[key] = value
-	end
-	local SetItemValue = AddItem -- Set the value of a item in the list. <<same as adding a new item>>
-
-	local function SetMultiselect(self, flag) end -- Toggle multi-selecting. <<Dummy function to stay inline with the dropdown API>>
-	local function GetMultiselect() return false end-- Query the multi-select flag. <<Dummy function to stay inline with the dropdown API>>
-	local function SetItemDisabled(self, key) end-- Disable one item in the list. <<Dummy function to stay inline with the dropdown API>>
-
-	local function SetDisabled(self, disabled) -- Disable the widget.
-		self.disabled = disabled
-		if disabled then
-			self.frame:Disable()
-			self.frame.displayButton:SetBackdropColor(.2,.2,.2,1)
-		else
-			self.frame:Enable()
-			self.frame.displayButton:SetBackdropColor(1,1,1,1)
-		end
-	end
-
-	local function textSort(a,b)
-		return string.upper(a) < string.upper(b)
-	end
-
-	local sortedlist = {}
-	local function ToggleDrop(this)
-		local self = this.obj
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-			AceGUI:ClearFocus()
-		else
-			AceGUI:SetFocus(self)
-			self.dropdown = AGSMW:GetDropDownFrame()
-			local width = self.frame:GetWidth()
-			self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
-			self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0)
-			for k, v in pairs(self.list) do
-				sortedlist[#sortedlist+1] = k
-			end
-			table.sort(sortedlist, textSort)
-			for i, k in ipairs(sortedlist) do
-				local f = GetContentLine()
-				f.text:SetText(k)
-				--print(k)
-				if k == self.value then
-					f.check:Show()
-				end
-				f.obj = self
-				f.dropdown = self.dropdown
-				self.dropdown:AddFrame(f)
-			end
-			wipe(sortedlist)
-		end
-	end
-
-	local function ClearFocus(self)
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-		end
-	end
-
-	local function OnHide(this)
-		local self = this.obj
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-		end
-	end
-
-	local function Drop_OnEnter(this)
-		this.obj:Fire("OnEnter")
-	end
-
-	local function Drop_OnLeave(this)
-		this.obj:Fire("OnLeave")
-	end
-
-	local function Constructor()
-		local frame = AGSMW:GetBaseFrameWithWindow()
-		local self = {}
-
-		self.type = widgetType
-		self.frame = frame
-		frame.obj = self
-		frame.dropButton.obj = self
-		frame.dropButton:SetScript("OnEnter", Drop_OnEnter)
-		frame.dropButton:SetScript("OnLeave", Drop_OnLeave)
-		frame.dropButton:SetScript("OnClick",ToggleDrop)
-		frame:SetScript("OnHide", OnHide)
-
-		self.alignoffset = 31
-
-		self.OnRelease = OnRelease
-		self.OnAcquire = OnAcquire
-		self.ClearFocus = ClearFocus
-		self.SetText = SetText
-		self.SetValue = SetValue
-		self.GetValue = GetValue
-		self.SetList = SetList
-		self.SetLabel = SetLabel
-		self.SetDisabled = SetDisabled
-		self.AddItem = AddItem
-		self.SetMultiselect = SetMultiselect
-		self.GetMultiselect = GetMultiselect
-		self.SetItemValue = SetItemValue
-		self.SetItemDisabled = SetItemDisabled
-		self.ToggleDrop = ToggleDrop
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
-
-end
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua
deleted file mode 100644
index 0cd2959..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua
+++ /dev/null
@@ -1,230 +0,0 @@
--- Widget is based on the AceGUIWidget-DropDown.lua supplied with AceGUI-3.0
--- Widget created by Yssaril
-
-local AceGUI = LibStub("AceGUI-3.0")
-local Media = LibStub("LibSharedMedia-3.0")
-
-local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")
-
-do
-	local widgetType = "LSM30_Border"
-	local widgetVersion = 11
-
-	local contentFrameCache = {}
-	local function ReturnSelf(self)
-		self:ClearAllPoints()
-		self:Hide()
-		self.check:Hide()
-		table.insert(contentFrameCache, self)
-	end
-
-	local function ContentOnClick(this, button)
-		local self = this.obj
-		self:Fire("OnValueChanged", this.text:GetText())
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-		end
-	end
-
-	local function ContentOnEnter(this, button)
-		local self = this.obj
-		local text = this.text:GetText()
-		local border = self.list[text] ~= text and self.list[text] or Media:Fetch('border',text)
-		this.dropdown:SetBackdrop({edgeFile = border,
-			bgFile=[[Interface\DialogFrame\UI-DialogBox-Background-Dark]],
-			tile = true, tileSize = 16, edgeSize = 16,
-			insets = { left = 4, right = 4, top = 4, bottom = 4 }})
-	end
-
-	local function GetContentLine()
-		local frame
-		if next(contentFrameCache) then
-			frame = table.remove(contentFrameCache)
-		else
-			frame = CreateFrame("Button", nil, UIParent)
-				--frame:SetWidth(200)
-				frame:SetHeight(18)
-				frame:SetHighlightTexture([[Interface\QuestFrame\UI-QuestTitleHighlight]], "ADD")
-				frame:SetScript("OnClick", ContentOnClick)
-				frame:SetScript("OnEnter", ContentOnEnter)
-			local check = frame:CreateTexture("OVERLAY")
-				check:SetWidth(16)
-				check:SetHeight(16)
-				check:SetPoint("LEFT",frame,"LEFT",1,-1)
-				check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
-				check:Hide()
-			frame.check = check
-			local text = frame:CreateFontString(nil,"OVERLAY","GameFontWhite")
-				text:SetPoint("TOPLEFT", check, "TOPRIGHT", 1, 0)
-				text:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -2, 0)
-				text:SetJustifyH("LEFT")
-				text:SetText("Test Test Test Test Test Test Test")
-			frame.text = text
-			frame.ReturnSelf = ReturnSelf
-		end
-		frame:Show()
-		return frame
-	end
-
-	local function OnAcquire(self)
-		self:SetHeight(44)
-		self:SetWidth(200)
-	end
-
-	local function OnRelease(self)
-		self:SetText("")
-		self:SetLabel("")
-		self:SetDisabled(false)
-
-		self.value = nil
-		self.list = nil
-		self.open = nil
-		self.hasClose = nil
-
-		self.frame:ClearAllPoints()
-		self.frame:Hide()
-	end
-
-	local function SetValue(self, value) -- Set the value to an item in the List.
-		if self.list then
-			self:SetText(value or "")
-		end
-		self.value = value
-	end
-
-	local function GetValue(self)
-		return self.value
-	end
-
-	local function SetList(self, list) -- Set the list of values for the dropdown (key => value pairs)
-		self.list = list or Media:HashTable("border")
-	end
-
-
-	local function SetText(self, text) -- Set the text displayed in the box.
-		self.frame.text:SetText(text or "")
-		local border = self.list[text] ~= text and self.list[text] or Media:Fetch('border',text)
-
-		self.frame.displayButton:SetBackdrop({edgeFile = border,
-			bgFile=[[Interface\DialogFrame\UI-DialogBox-Background-Dark]],
-			tile = true, tileSize = 16, edgeSize = 16,
-			insets = { left = 4, right = 4, top = 4, bottom = 4 }})
-	end
-
-	local function SetLabel(self, text) -- Set the text for the label.
-		self.frame.label:SetText(text or "")
-	end
-
-	local function AddItem(self, key, value) -- Add an item to the list.
-		self.list = self.list or {}
-		self.list[key] = value
-	end
-	local SetItemValue = AddItem -- Set the value of a item in the list. <<same as adding a new item>>
-
-	local function SetMultiselect(self, flag) end -- Toggle multi-selecting. <<Dummy function to stay inline with the dropdown API>>
-	local function GetMultiselect() return false end-- Query the multi-select flag. <<Dummy function to stay inline with the dropdown API>>
-	local function SetItemDisabled(self, key) end-- Disable one item in the list. <<Dummy function to stay inline with the dropdown API>>
-
-	local function SetDisabled(self, disabled) -- Disable the widget.
-		self.disabled = disabled
-		if disabled then
-			self.frame:Disable()
-		else
-			self.frame:Enable()
-		end
-	end
-
-	local function textSort(a,b)
-		return string.upper(a) < string.upper(b)
-	end
-
-	local sortedlist = {}
-	local function ToggleDrop(this)
-		local self = this.obj
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-			AceGUI:ClearFocus()
-		else
-			AceGUI:SetFocus(self)
-			self.dropdown = AGSMW:GetDropDownFrame()
-			local width = self.frame:GetWidth()
-			self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
-			self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0)
-			for k, v in pairs(self.list) do
-				sortedlist[#sortedlist+1] = k
-			end
-			table.sort(sortedlist, textSort)
-			for i, k in ipairs(sortedlist) do
-				local f = GetContentLine()
-				f.text:SetText(k)
-				--print(k)
-				if k == self.value then
-					f.check:Show()
-				end
-				f.obj = self
-				f.dropdown = self.dropdown
-				self.dropdown:AddFrame(f)
-			end
-			wipe(sortedlist)
-		end
-	end
-
-	local function ClearFocus(self)
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-		end
-	end
-
-	local function OnHide(this)
-		local self = this.obj
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-		end
-	end
-
-	local function Drop_OnEnter(this)
-		this.obj:Fire("OnEnter")
-	end
-
-	local function Drop_OnLeave(this)
-		this.obj:Fire("OnLeave")
-	end
-
-	local function Constructor()
-		local frame = AGSMW:GetBaseFrameWithWindow()
-		local self = {}
-
-		self.type = widgetType
-		self.frame = frame
-		frame.obj = self
-		frame.dropButton.obj = self
-		frame.dropButton:SetScript("OnEnter", Drop_OnEnter)
-		frame.dropButton:SetScript("OnLeave", Drop_OnLeave)
-		frame.dropButton:SetScript("OnClick",ToggleDrop)
-		frame:SetScript("OnHide", OnHide)
-
-		self.alignoffset = 31
-
-		self.OnRelease = OnRelease
-		self.OnAcquire = OnAcquire
-		self.ClearFocus = ClearFocus
-		self.SetText = SetText
-		self.SetValue = SetValue
-		self.GetValue = GetValue
-		self.SetList = SetList
-		self.SetLabel = SetLabel
-		self.SetDisabled = SetDisabled
-		self.AddItem = AddItem
-		self.SetMultiselect = SetMultiselect
-		self.GetMultiselect = GetMultiselect
-		self.SetItemValue = SetItemValue
-		self.SetItemDisabled = SetItemDisabled
-		self.ToggleDrop = ToggleDrop
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
-
-end
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Changelog-AceGUI-3.0-SharedMediaWidgets-r52-release.txt b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Changelog-AceGUI-3.0-SharedMediaWidgets-r52-release.txt
deleted file mode 100644
index 3da384a..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Changelog-AceGUI-3.0-SharedMediaWidgets-r52-release.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-------------------------------------------------------------------------
-r52 | nevcairiel | 2015-07-22 14:19:41 +0000 (Wed, 22 Jul 2015) | 1 line
-Changed paths:
-   A /tags/r52-release (from /trunk:51)
-
-Tagging as r52-release
-------------------------------------------------------------------------
-r51 | nevcairiel | 2015-07-22 14:19:21 +0000 (Wed, 22 Jul 2015) | 1 line
-Changed paths:
-   M /trunk/AceGUI-3.0-SharedMediaWidgets.toc
-
-Update TOC for 6.2
-------------------------------------------------------------------------
-r50 | nevcairiel | 2015-07-22 14:18:01 +0000 (Wed, 22 Jul 2015) | 1 line
-Changed paths:
-   M /trunk/AceGUI-3.0-SharedMediaWidgets/BackgroundWidget.lua
-   M /trunk/AceGUI-3.0-SharedMediaWidgets/BorderWidget.lua
-   M /trunk/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua
-   M /trunk/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua
-   M /trunk/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua
-
-Fix font anchoring to avoid word-wraps in the dropdown
-------------------------------------------------------------------------
-r49 | funkydude | 2014-10-14 20:00:37 +0000 (Tue, 14 Oct 2014) | 1 line
-Changed paths:
-   M /trunk/AceGUI-3.0-SharedMediaWidgets.toc
-
-bump toc
-------------------------------------------------------------------------
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua
deleted file mode 100644
index eadf35f..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/FontWidget.lua
+++ /dev/null
@@ -1,216 +0,0 @@
--- Widget is based on the AceGUIWidget-DropDown.lua supplied with AceGUI-3.0
--- Widget created by Yssaril
-
-local AceGUI = LibStub("AceGUI-3.0")
-local Media = LibStub("LibSharedMedia-3.0")
-
-local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")
-
-do
-	local widgetType = "LSM30_Font"
-	local widgetVersion = 11
-
-	local contentFrameCache = {}
-	local function ReturnSelf(self)
-		self:ClearAllPoints()
-		self:Hide()
-		self.check:Hide()
-		table.insert(contentFrameCache, self)
-	end
-
-	local function ContentOnClick(this, button)
-		local self = this.obj
-		self:Fire("OnValueChanged", this.text:GetText())
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-		end
-	end
-
-	local function GetContentLine()
-		local frame
-		if next(contentFrameCache) then
-			frame = table.remove(contentFrameCache)
-		else
-			frame = CreateFrame("Button", nil, UIParent)
-				--frame:SetWidth(200)
-				frame:SetHeight(18)
-				frame:SetHighlightTexture([[Interface\QuestFrame\UI-QuestTitleHighlight]], "ADD")
-				frame:SetScript("OnClick", ContentOnClick)
-			local check = frame:CreateTexture("OVERLAY")
-				check:SetWidth(16)
-				check:SetHeight(16)
-				check:SetPoint("LEFT",frame,"LEFT",1,-1)
-				check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
-				check:Hide()
-			frame.check = check
-			local text = frame:CreateFontString(nil,"OVERLAY","GameFontWhite")
-				text:SetPoint("TOPLEFT", check, "TOPRIGHT", 1, 0)
-				text:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -2, 0)
-				text:SetJustifyH("LEFT")
-				text:SetText("Test Test Test Test Test Test Test")
-			frame.text = text
-			frame.ReturnSelf = ReturnSelf
-		end
-		frame:Show()
-		return frame
-	end
-
-	local function OnAcquire(self)
-		self:SetHeight(44)
-		self:SetWidth(200)
-	end
-
-	local function OnRelease(self)
-		self:SetText("")
-		self:SetLabel("")
-		self:SetDisabled(false)
-
-		self.value = nil
-		self.list = nil
-		self.open = nil
-		self.hasClose = nil
-
-		self.frame:ClearAllPoints()
-		self.frame:Hide()
-	end
-
-	local function SetValue(self, value) -- Set the value to an item in the List.
-		if self.list then
-			self:SetText(value or "")
-		end
-		self.value = value
-	end
-
-	local function GetValue(self)
-		return self.value
-	end
-
-	local function SetList(self, list) -- Set the list of values for the dropdown (key => value pairs)
-		self.list = list or Media:HashTable("font")
-	end
-
-	local function SetText(self, text) -- Set the text displayed in the box.
-		self.frame.text:SetText(text or "")
-		local font = self.list[text] ~= text and self.list[text] or Media:Fetch('font',text)
-		local _, size, outline= self.frame.text:GetFont()
-		self.frame.text:SetFont(font,size,outline)
-	end
-
-	local function SetLabel(self, text) -- Set the text for the label.
-		self.frame.label:SetText(text or "")
-	end
-
-	local function AddItem(self, key, value) -- Add an item to the list.
-		self.list = self.list or {}
-		self.list[key] = value
-	end
-	local SetItemValue = AddItem -- Set the value of a item in the list. <<same as adding a new item>>
-
-	local function SetMultiselect(self, flag) end -- Toggle multi-selecting. <<Dummy function to stay inline with the dropdown API>>
-	local function GetMultiselect() return false end-- Query the multi-select flag. <<Dummy function to stay inline with the dropdown API>>
-	local function SetItemDisabled(self, key) end-- Disable one item in the list. <<Dummy function to stay inline with the dropdown API>>
-
-	local function SetDisabled(self, disabled) -- Disable the widget.
-		self.disabled = disabled
-		if disabled then
-			self.frame:Disable()
-		else
-			self.frame:Enable()
-		end
-	end
-
-	local function textSort(a,b)
-		return string.upper(a) < string.upper(b)
-	end
-
-	local sortedlist = {}
-	local function ToggleDrop(this)
-		local self = this.obj
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-			AceGUI:ClearFocus()
-		else
-			AceGUI:SetFocus(self)
-			self.dropdown = AGSMW:GetDropDownFrame()
-			local width = self.frame:GetWidth()
-			self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
-			self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0)
-			for k, v in pairs(self.list) do
-				sortedlist[#sortedlist+1] = k
-			end
-			table.sort(sortedlist, textSort)
-			for i, k in ipairs(sortedlist) do
-				local f = GetContentLine()
-				local _, size, outline= f.text:GetFont()
-				local font = self.list[k] ~= k and self.list[k] or Media:Fetch('font',k)
-				f.text:SetFont(font,size,outline)
-				f.text:SetText(k)
-				if k == self.value then
-					f.check:Show()
-				end
-				f.obj = self
-				self.dropdown:AddFrame(f)
-			end
-			wipe(sortedlist)
-		end
-	end
-
-	local function ClearFocus(self)
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-		end
-	end
-
-	local function OnHide(this)
-		local self = this.obj
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-		end
-	end
-
-	local function Drop_OnEnter(this)
-		this.obj:Fire("OnEnter")
-	end
-
-	local function Drop_OnLeave(this)
-		this.obj:Fire("OnLeave")
-	end
-
-	local function Constructor()
-		local frame = AGSMW:GetBaseFrame()
-		local self = {}
-
-		self.type = widgetType
-		self.frame = frame
-		frame.obj = self
-		frame.dropButton.obj = self
-		frame.dropButton:SetScript("OnEnter", Drop_OnEnter)
-		frame.dropButton:SetScript("OnLeave", Drop_OnLeave)
-		frame.dropButton:SetScript("OnClick",ToggleDrop)
-		frame:SetScript("OnHide", OnHide)
-
-		self.alignoffset = 31
-
-		self.OnRelease = OnRelease
-		self.OnAcquire = OnAcquire
-		self.ClearFocus = ClearFocus
-		self.SetText = SetText
-		self.SetValue = SetValue
-		self.GetValue = GetValue
-		self.SetList = SetList
-		self.SetLabel = SetLabel
-		self.SetDisabled = SetDisabled
-		self.AddItem = AddItem
-		self.SetMultiselect = SetMultiselect
-		self.GetMultiselect = GetMultiselect
-		self.SetItemValue = SetItemValue
-		self.SetItemDisabled = SetItemDisabled
-		self.ToggleDrop = ToggleDrop
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
-
-end
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/AceGUI-3.0.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/AceGUI-3.0.lua
deleted file mode 100644
index 9853644..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/AceGUI-3.0.lua
+++ /dev/null
@@ -1,813 +0,0 @@
---- **AceGUI-3.0** provides access to numerous widgets which can be used to create GUIs.
--- AceGUI is used by AceConfigDialog to create the option GUIs, but you can use it by itself
--- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
--- stand-alone distribution.
---
--- **Note**: When using AceGUI-3.0 directly, please do not modify the frames of the widgets directly,
--- as any "unknown" change to the widgets will cause addons that get your widget out of the widget pool
--- to misbehave. If you think some part of a widget should be modifiable, please open a ticket, and we"ll
--- implement a proper API to modify it.
--- @usage
--- local AceGUI = LibStub("AceGUI-3.0")
--- -- Create a container frame
--- local f = AceGUI:Create("Frame")
--- f:SetCallback("OnClose",function(widget) AceGUI:Release(widget) end)
--- f:SetTitle("AceGUI-3.0 Example")
--- f:SetStatusText("Status Bar")
--- f:SetLayout("Flow")
--- -- Create a button
--- local btn = AceGUI:Create("Button")
--- btn:SetWidth(170)
--- btn:SetText("Button !")
--- btn:SetCallback("OnClick", function() print("Click!") end)
--- -- Add the button to the container
--- f:AddChild(btn)
--- @class file
--- @name AceGUI-3.0
--- @release $Id: AceGUI-3.0.lua 1102 2013-10-25 14:15:23Z nevcairiel $
-local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 34
-local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)
-
-if not AceGUI then return end -- No upgrade needed
-
--- Lua APIs
-local tconcat, tremove, tinsert = table.concat, table.remove, table.insert
-local select, pairs, next, type = select, pairs, next, type
-local error, assert, loadstring = error, assert, loadstring
-local setmetatable, rawget, rawset = setmetatable, rawget, rawset
-local math_max = math.max
-
--- WoW APIs
-local UIParent = UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: geterrorhandler, LibStub
-
---local con = LibStub("AceConsole-3.0",true)
-
-AceGUI.WidgetRegistry = AceGUI.WidgetRegistry or {}
-AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {}
-AceGUI.WidgetBase = AceGUI.WidgetBase or {}
-AceGUI.WidgetContainerBase = AceGUI.WidgetContainerBase or {}
-AceGUI.WidgetVersions = AceGUI.WidgetVersions or {}
-
--- local upvalues
-local WidgetRegistry = AceGUI.WidgetRegistry
-local LayoutRegistry = AceGUI.LayoutRegistry
-local WidgetVersions = AceGUI.WidgetVersions
-
---[[
-	 xpcall safecall implementation
-]]
-local xpcall = xpcall
-
-local function errorhandler(err)
-	return geterrorhandler()(err)
-end
-
-local function CreateDispatcher(argCount)
-	local code = [[
-		local xpcall, eh = ...
-		local method, ARGS
-		local function call() return method(ARGS) end
-
-		local function dispatch(func, ...)
-			method = func
-			if not method then return end
-			ARGS = ...
-			return xpcall(call, eh)
-		end
-
-		return dispatch
-	]]
-
-	local ARGS = {}
-	for i = 1, argCount do ARGS[i] = "arg"..i end
-	code = code:gsub("ARGS", tconcat(ARGS, ", "))
-	return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
-end
-
-local Dispatchers = setmetatable({}, {__index=function(self, argCount)
-	local dispatcher = CreateDispatcher(argCount)
-	rawset(self, argCount, dispatcher)
-	return dispatcher
-end})
-Dispatchers[0] = function(func)
-	return xpcall(func, errorhandler)
-end
-
-local function safecall(func, ...)
-	return Dispatchers[select("#", ...)](func, ...)
-end
-
--- Recycling functions
-local newWidget, delWidget
-do
-	-- Version Upgrade in Minor 29
-	-- Internal Storage of the objects changed, from an array table
-	-- to a hash table, and additionally we introduced versioning on
-	-- the widgets which would discard all widgets from a pre-29 version
-	-- anyway, so we just clear the storage now, and don't try to
-	-- convert the storage tables to the new format.
-	-- This should generally not cause *many* widgets to end up in trash,
-	-- since once dialogs are opened, all addons should be loaded already
-	-- and AceGUI should be on the latest version available on the users
-	-- setup.
-	-- -- nevcairiel - Nov 2nd, 2009
-	if oldminor and oldminor < 29 and AceGUI.objPools then
-		AceGUI.objPools = nil
-	end
-
-	AceGUI.objPools = AceGUI.objPools or {}
-	local objPools = AceGUI.objPools
-	--Returns a new instance, if none are available either returns a new table or calls the given contructor
-	function newWidget(type)
-		if not WidgetRegistry[type] then
-			error("Attempt to instantiate unknown widget type", 2)
-		end
-
-		if not objPools[type] then
-			objPools[type] = {}
-		end
-
-		local newObj = next(objPools[type])
-		if not newObj then
-			newObj = WidgetRegistry[type]()
-			newObj.AceGUIWidgetVersion = WidgetVersions[type]
-		else
-			objPools[type][newObj] = nil
-			-- if the widget is older then the latest, don't even try to reuse it
-			-- just forget about it, and grab a new one.
-			if not newObj.AceGUIWidgetVersion or newObj.AceGUIWidgetVersion < WidgetVersions[type] then
-				return newWidget(type)
-			end
-		end
-		return newObj
-	end
-	-- Releases an instance to the Pool
-	function delWidget(obj,type)
-		if not objPools[type] then
-			objPools[type] = {}
-		end
-		if objPools[type][obj] then
-			error("Attempt to Release Widget that is already released", 2)
-		end
-		objPools[type][obj] = true
-	end
-end
-
-
--------------------
--- API Functions --
--------------------
-
--- Gets a widget Object
-
---- Create a new Widget of the given type.
--- This function will instantiate a new widget (or use one from the widget pool), and call the
--- OnAcquire function on it, before returning.
--- @param type The type of the widget.
--- @return The newly created widget.
-function AceGUI:Create(type)
-	if WidgetRegistry[type] then
-		local widget = newWidget(type)
-
-		if rawget(widget, "Acquire") then
-			widget.OnAcquire = widget.Acquire
-			widget.Acquire = nil
-		elseif rawget(widget, "Aquire") then
-			widget.OnAcquire = widget.Aquire
-			widget.Aquire = nil
-		end
-
-		if rawget(widget, "Release") then
-			widget.OnRelease = rawget(widget, "Release")
-			widget.Release = nil
-		end
-
-		if widget.OnAcquire then
-			widget:OnAcquire()
-		else
-			error(("Widget type %s doesn't supply an OnAcquire Function"):format(type))
-		end
-		-- Set the default Layout ("List")
-		safecall(widget.SetLayout, widget, "List")
-		safecall(widget.ResumeLayout, widget)
-		return widget
-	end
-end
-
---- Releases a widget Object.
--- This function calls OnRelease on the widget and places it back in the widget pool.
--- Any data on the widget is being erased, and the widget will be hidden.\\
--- If this widget is a Container-Widget, all of its Child-Widgets will be releases as well.
--- @param widget The widget to release
-function AceGUI:Release(widget)
-	safecall(widget.PauseLayout, widget)
-	widget:Fire("OnRelease")
-	safecall(widget.ReleaseChildren, widget)
-
-	if widget.OnRelease then
-		widget:OnRelease()
---	else
---		error(("Widget type %s doesn't supply an OnRelease Function"):format(widget.type))
-	end
-	for k in pairs(widget.userdata) do
-		widget.userdata[k] = nil
-	end
-	for k in pairs(widget.events) do
-		widget.events[k] = nil
-	end
-	widget.width = nil
-	widget.relWidth = nil
-	widget.height = nil
-	widget.relHeight = nil
-	widget.noAutoHeight = nil
-	widget.frame:ClearAllPoints()
-	widget.frame:Hide()
-	widget.frame:SetParent(UIParent)
-	widget.frame.width = nil
-	widget.frame.height = nil
-	if widget.content then
-		widget.content.width = nil
-		widget.content.height = nil
-	end
-	delWidget(widget, widget.type)
-end
-
------------
--- Focus --
------------
-
-
---- Called when a widget has taken focus.
--- e.g. Dropdowns opening, Editboxes gaining kb focus
--- @param widget The widget that should be focused
-function AceGUI:SetFocus(widget)
-	if self.FocusedWidget and self.FocusedWidget ~= widget then
-		safecall(self.FocusedWidget.ClearFocus, self.FocusedWidget)
-	end
-	self.FocusedWidget = widget
-end
-
-
---- Called when something has happened that could cause widgets with focus to drop it
--- e.g. titlebar of a frame being clicked
-function AceGUI:ClearFocus()
-	if self.FocusedWidget then
-		safecall(self.FocusedWidget.ClearFocus, self.FocusedWidget)
-		self.FocusedWidget = nil
-	end
-end
-
--------------
--- Widgets --
--------------
---[[
-	Widgets must provide the following functions
-		OnAcquire() - Called when the object is acquired, should set everything to a default hidden state
-
-	And the following members
-		frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
-		type - the type of the object, same as the name given to :RegisterWidget()
-
-	Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
-	It will be cleared automatically when a widget is released
-	Placing values directly into a widget object should be avoided
-
-	If the Widget can act as a container for other Widgets the following
-		content - frame or derivitive that children will be anchored to
-
-	The Widget can supply the following Optional Members
-		:OnRelease() - Called when the object is Released, should remove any additional anchors and clear any data
-		:OnWidthSet(width) - Called when the width of the widget is changed
-		:OnHeightSet(height) - Called when the height of the widget is changed
-			Widgets should not use the OnSizeChanged events of thier frame or content members, use these methods instead
-			AceGUI already sets a handler to the event
-		:LayoutFinished(width, height) - called after a layout has finished, the width and height will be the width and height of the
-			area used for controls. These can be nil if the layout used the existing size to layout the controls.
-
-]]
-
---------------------------
--- Widget Base Template --
---------------------------
-do
-	local WidgetBase = AceGUI.WidgetBase
-
-	WidgetBase.SetParent = function(self, parent)
-		local frame = self.frame
-		frame:SetParent(nil)
-		frame:SetParent(parent.content)
-		self.parent = parent
-	end
-
-	WidgetBase.SetCallback = function(self, name, func)
-		if type(func) == "function" then
-			self.events[name] = func
-		end
-	end
-
-	WidgetBase.Fire = function(self, name, ...)
-		if self.events[name] then
-			local success, ret = safecall(self.events[name], self, name, ...)
-			if success then
-				return ret
-			end
-		end
-	end
-
-	WidgetBase.SetWidth = function(self, width)
-		self.frame:SetWidth(width)
-		self.frame.width = width
-		if self.OnWidthSet then
-			self:OnWidthSet(width)
-		end
-	end
-
-	WidgetBase.SetRelativeWidth = function(self, width)
-		if width <= 0 or width > 1 then
-			error(":SetRelativeWidth(width): Invalid relative width.", 2)
-		end
-		self.relWidth = width
-		self.width = "relative"
-	end
-
-	WidgetBase.SetHeight = function(self, height)
-		self.frame:SetHeight(height)
-		self.frame.height = height
-		if self.OnHeightSet then
-			self:OnHeightSet(height)
-		end
-	end
-
-	--[[ WidgetBase.SetRelativeHeight = function(self, height)
-		if height <= 0 or height > 1 then
-			error(":SetRelativeHeight(height): Invalid relative height.", 2)
-		end
-		self.relHeight = height
-		self.height = "relative"
-	end ]]
-
-	WidgetBase.IsVisible = function(self)
-		return self.frame:IsVisible()
-	end
-
-	WidgetBase.IsShown= function(self)
-		return self.frame:IsShown()
-	end
-
-	WidgetBase.Release = function(self)
-		AceGUI:Release(self)
-	end
-
-	WidgetBase.SetPoint = function(self, ...)
-		return self.frame:SetPoint(...)
-	end
-
-	WidgetBase.ClearAllPoints = function(self)
-		return self.frame:ClearAllPoints()
-	end
-
-	WidgetBase.GetNumPoints = function(self)
-		return self.frame:GetNumPoints()
-	end
-
-	WidgetBase.GetPoint = function(self, ...)
-		return self.frame:GetPoint(...)
-	end
-
-	WidgetBase.GetUserDataTable = function(self)
-		return self.userdata
-	end
-
-	WidgetBase.SetUserData = function(self, key, value)
-		self.userdata[key] = value
-	end
-
-	WidgetBase.GetUserData = function(self, key)
-		return self.userdata[key]
-	end
-
-	WidgetBase.IsFullHeight = function(self)
-		return self.height == "fill"
-	end
-
-	WidgetBase.SetFullHeight = function(self, isFull)
-		if isFull then
-			self.height = "fill"
-		else
-			self.height = nil
-		end
-	end
-
-	WidgetBase.IsFullWidth = function(self)
-		return self.width == "fill"
-	end
-
-	WidgetBase.SetFullWidth = function(self, isFull)
-		if isFull then
-			self.width = "fill"
-		else
-			self.width = nil
-		end
-	end
-
---	local function LayoutOnUpdate(this)
---		this:SetScript("OnUpdate",nil)
---		this.obj:PerformLayout()
---	end
-
-	local WidgetContainerBase = AceGUI.WidgetContainerBase
-
-	WidgetContainerBase.PauseLayout = function(self)
-		self.LayoutPaused = true
-	end
-
-	WidgetContainerBase.ResumeLayout = function(self)
-		self.LayoutPaused = nil
-	end
-
-	WidgetContainerBase.PerformLayout = function(self)
-		if self.LayoutPaused then
-			return
-		end
-		safecall(self.LayoutFunc, self.content, self.children)
-	end
-
-	--call this function to layout, makes sure layed out objects get a frame to get sizes etc
-	WidgetContainerBase.DoLayout = function(self)
-		self:PerformLayout()
---		if not self.parent then
---			self.frame:SetScript("OnUpdate", LayoutOnUpdate)
---		end
-	end
-
-	WidgetContainerBase.AddChild = function(self, child, beforeWidget)
-		if beforeWidget then
-			local siblingIndex = 1
-			for _, widget in pairs(self.children) do
-				if widget == beforeWidget then
-					break
-				end
-				siblingIndex = siblingIndex + 1
-			end
-			tinsert(self.children, siblingIndex, child)
-		else
-			tinsert(self.children, child)
-		end
-		child:SetParent(self)
-		child.frame:Show()
-		self:DoLayout()
-	end
-
-	WidgetContainerBase.AddChildren = function(self, ...)
-		for i = 1, select("#", ...) do
-			local child = select(i, ...)
-			tinsert(self.children, child)
-			child:SetParent(self)
-			child.frame:Show()
-		end
-		self:DoLayout()
-	end
-
-	WidgetContainerBase.ReleaseChildren = function(self)
-		local children = self.children
-		for i = 1,#children do
-			AceGUI:Release(children[i])
-			children[i] = nil
-		end
-	end
-
-	WidgetContainerBase.SetLayout = function(self, Layout)
-		self.LayoutFunc = AceGUI:GetLayout(Layout)
-	end
-
-	WidgetContainerBase.SetAutoAdjustHeight = function(self, adjust)
-		if adjust then
-			self.noAutoHeight = nil
-		else
-			self.noAutoHeight = true
-		end
-	end
-
-	local function FrameResize(this)
-		local self = this.obj
-		if this:GetWidth() and this:GetHeight() then
-			if self.OnWidthSet then
-				self:OnWidthSet(this:GetWidth())
-			end
-			if self.OnHeightSet then
-				self:OnHeightSet(this:GetHeight())
-			end
-		end
-	end
-
-	local function ContentResize(this)
-		if this:GetWidth() and this:GetHeight() then
-			this.width = this:GetWidth()
-			this.height = this:GetHeight()
-			this.obj:DoLayout()
-		end
-	end
-
-	setmetatable(WidgetContainerBase, {__index=WidgetBase})
-
-	--One of these function should be called on each Widget Instance as part of its creation process
-
-	--- Register a widget-class as a container for newly created widgets.
-	-- @param widget The widget class
-	function AceGUI:RegisterAsContainer(widget)
-		widget.children = {}
-		widget.userdata = {}
-		widget.events = {}
-		widget.base = WidgetContainerBase
-		widget.content.obj = widget
-		widget.frame.obj = widget
-		widget.content:SetScript("OnSizeChanged", ContentResize)
-		widget.frame:SetScript("OnSizeChanged", FrameResize)
-		setmetatable(widget, {__index = WidgetContainerBase})
-		widget:SetLayout("List")
-		return widget
-	end
-
-	--- Register a widget-class as a widget.
-	-- @param widget The widget class
-	function AceGUI:RegisterAsWidget(widget)
-		widget.userdata = {}
-		widget.events = {}
-		widget.base = WidgetBase
-		widget.frame.obj = widget
-		widget.frame:SetScript("OnSizeChanged", FrameResize)
-		setmetatable(widget, {__index = WidgetBase})
-		return widget
-	end
-end
-
-
-
-
-------------------
--- Widget API   --
-------------------
-
---- Registers a widget Constructor, this function returns a new instance of the Widget
--- @param Name The name of the widget
--- @param Constructor The widget constructor function
--- @param Version The version of the widget
-function AceGUI:RegisterWidgetType(Name, Constructor, Version)
-	assert(type(Constructor) == "function")
-	assert(type(Version) == "number")
-
-	local oldVersion = WidgetVersions[Name]
-	if oldVersion and oldVersion >= Version then return end
-
-	WidgetVersions[Name] = Version
-	WidgetRegistry[Name] = Constructor
-end
-
---- Registers a Layout Function
--- @param Name The name of the layout
--- @param LayoutFunc Reference to the layout function
-function AceGUI:RegisterLayout(Name, LayoutFunc)
-	assert(type(LayoutFunc) == "function")
-	if type(Name) == "string" then
-		Name = Name:upper()
-	end
-	LayoutRegistry[Name] = LayoutFunc
-end
-
---- Get a Layout Function from the registry
--- @param Name The name of the layout
-function AceGUI:GetLayout(Name)
-	if type(Name) == "string" then
-		Name = Name:upper()
-	end
-	return LayoutRegistry[Name]
-end
-
-AceGUI.counts = AceGUI.counts or {}
-
---- A type-based counter to count the number of widgets created.
--- This is used by widgets that require a named frame, e.g. when a Blizzard
--- Template requires it.
--- @param type The widget type
-function AceGUI:GetNextWidgetNum(type)
-	if not self.counts[type] then
-		self.counts[type] = 0
-	end
-	self.counts[type] = self.counts[type] + 1
-	return self.counts[type]
-end
-
---- Return the number of created widgets for this type.
--- In contrast to GetNextWidgetNum, the number is not incremented.
--- @param type The widget type
-function AceGUI:GetWidgetCount(type)
-	return self.counts[type] or 0
-end
-
---- Return the version of the currently registered widget type.
--- @param type The widget type
-function AceGUI:GetWidgetVersion(type)
-	return WidgetVersions[type]
-end
-
--------------
--- Layouts --
--------------
-
---[[
-	A Layout is a func that takes 2 parameters
-		content - the frame that widgets will be placed inside
-		children - a table containing the widgets to layout
-]]
-
--- Very simple Layout, Children are stacked on top of each other down the left side
-AceGUI:RegisterLayout("List",
-	function(content, children)
-		local height = 0
-		local width = content.width or content:GetWidth() or 0
-		for i = 1, #children do
-			local child = children[i]
-
-			local frame = child.frame
-			frame:ClearAllPoints()
-			frame:Show()
-			if i == 1 then
-				frame:SetPoint("TOPLEFT", content)
-			else
-				frame:SetPoint("TOPLEFT", children[i-1].frame, "BOTTOMLEFT")
-			end
-
-			if child.width == "fill" then
-				child:SetWidth(width)
-				frame:SetPoint("RIGHT", content)
-
-				if child.DoLayout then
-					child:DoLayout()
-				end
-			elseif child.width == "relative" then
-				child:SetWidth(width * child.relWidth)
-
-				if child.DoLayout then
-					child:DoLayout()
-				end
-			end
-
-			height = height + (frame.height or frame:GetHeight() or 0)
-		end
-		safecall(content.obj.LayoutFinished, content.obj, nil, height)
-	end)
-
--- A single control fills the whole content area
-AceGUI:RegisterLayout("Fill",
-	function(content, children)
-		if children[1] then
-			children[1]:SetWidth(content:GetWidth() or 0)
-			children[1]:SetHeight(content:GetHeight() or 0)
-			children[1].frame:SetAllPoints(content)
-			children[1].frame:Show()
-			safecall(content.obj.LayoutFinished, content.obj, nil, children[1].frame:GetHeight())
-		end
-	end)
-
-local layoutrecursionblock = nil
-local function safelayoutcall(object, func, ...)
-	layoutrecursionblock = true
-	object[func](object, ...)
-	layoutrecursionblock = nil
-end
-
-AceGUI:RegisterLayout("Flow",
-	function(content, children)
-		if layoutrecursionblock then return end
-		--used height so far
-		local height = 0
-		--width used in the current row
-		local usedwidth = 0
-		--height of the current row
-		local rowheight = 0
-		local rowoffset = 0
-		local lastrowoffset
-
-		local width = content.width or content:GetWidth() or 0
-
-		--control at the start of the row
-		local rowstart
-		local rowstartoffset
-		local lastrowstart
-		local isfullheight
-
-		local frameoffset
-		local lastframeoffset
-		local oversize
-		for i = 1, #children do
-			local child = children[i]
-			oversize = nil
-			local frame = child.frame
-			local frameheight = frame.height or frame:GetHeight() or 0
-			local framewidth = frame.width or frame:GetWidth() or 0
-			lastframeoffset = frameoffset
-			-- HACK: Why did we set a frameoffset of (frameheight / 2) ?
-			-- That was moving all widgets half the widgets size down, is that intended?
-			-- Actually, it seems to be neccessary for many cases, we'll leave it in for now.
-			-- If widgets seem to anchor weirdly with this, provide a valid alignoffset for them.
-			-- TODO: Investigate moar!
-			frameoffset = child.alignoffset or (frameheight / 2)
-
-			if child.width == "relative" then
-				framewidth = width * child.relWidth
-			end
-
-			frame:Show()
-			frame:ClearAllPoints()
-			if i == 1 then
-				-- anchor the first control to the top left
-				frame:SetPoint("TOPLEFT", content)
-				rowheight = frameheight
-				rowoffset = frameoffset
-				rowstart = frame
-				rowstartoffset = frameoffset
-				usedwidth = framewidth
-				if usedwidth > width then
-					oversize = true
-				end
-			else
-				-- if there isn't available width for the control start a new row
-				-- if a control is "fill" it will be on a row of its own full width
-				if usedwidth == 0 or ((framewidth) + usedwidth > width) or child.width == "fill" then
-					if isfullheight then
-						-- a previous row has already filled the entire height, there's nothing we can usefully do anymore
-						-- (maybe error/warn about this?)
-						break
-					end
-					--anchor the previous row, we will now know its height and offset
-					rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
-					height = height + rowheight + 3
-					--save this as the rowstart so we can anchor it after the row is complete and we have the max height and offset of controls in it
-					rowstart = frame
-					rowstartoffset = frameoffset
-					rowheight = frameheight
-					rowoffset = frameoffset
-					usedwidth = framewidth
-					if usedwidth > width then
-						oversize = true
-					end
-				-- put the control on the current row, adding it to the width and checking if the height needs to be increased
-				else
-					--handles cases where the new height is higher than either control because of the offsets
-					--math.max(rowheight-rowoffset+frameoffset, frameheight-frameoffset+rowoffset)
-
-					--offset is always the larger of the two offsets
-					rowoffset = math_max(rowoffset, frameoffset)
-					rowheight = math_max(rowheight, rowoffset + (frameheight / 2))
-
-					frame:SetPoint("TOPLEFT", children[i-1].frame, "TOPRIGHT", 0, frameoffset - lastframeoffset)
-					usedwidth = framewidth + usedwidth
-				end
-			end
-
-			if child.width == "fill" then
-				safelayoutcall(child, "SetWidth", width)
-				frame:SetPoint("RIGHT", content)
-
-				usedwidth = 0
-				rowstart = frame
-				rowstartoffset = frameoffset
-
-				if child.DoLayout then
-					child:DoLayout()
-				end
-				rowheight = frame.height or frame:GetHeight() or 0
-				rowoffset = child.alignoffset or (rowheight / 2)
-				rowstartoffset = rowoffset
-			elseif child.width == "relative" then
-				safelayoutcall(child, "SetWidth", width * child.relWidth)
-
-				if child.DoLayout then
-					child:DoLayout()
-				end
-			elseif oversize then
-				if width > 1 then
-					frame:SetPoint("RIGHT", content)
-				end
-			end
-
-			if child.height == "fill" then
-				frame:SetPoint("BOTTOM", content)
-				isfullheight = true
-			end
-		end
-
-		--anchor the last row, if its full height needs a special case since  its height has just been changed by the anchor
-		if isfullheight then
-			rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -height)
-		elseif rowstart then
-			rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
-		end
-
-		height = height + rowheight + 3
-		safecall(content.obj.LayoutFinished, content.obj, nil, height)
-	end)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/AceGUI-3.0.xml b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/AceGUI-3.0.xml
deleted file mode 100644
index b515077..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/AceGUI-3.0.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<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="AceGUI-3.0.lua"/>
-	<!-- Container -->
-	<Script file="widgets\AceGUIContainer-BlizOptionsGroup.lua"/>
-	<Script file="widgets\AceGUIContainer-DropDownGroup.lua"/>
-	<Script file="widgets\AceGUIContainer-Frame.lua"/>
-	<Script file="widgets\AceGUIContainer-InlineGroup.lua"/>
-	<Script file="widgets\AceGUIContainer-ScrollFrame.lua"/>
-	<Script file="widgets\AceGUIContainer-SimpleGroup.lua"/>
-	<Script file="widgets\AceGUIContainer-TabGroup.lua"/>
-	<Script file="widgets\AceGUIContainer-TreeGroup.lua"/>
-	<Script file="widgets\AceGUIContainer-Window.lua"/>
-	<!-- Widgets -->
-	<Script file="widgets\AceGUIWidget-Button.lua"/>
-	<Script file="widgets\AceGUIWidget-CheckBox.lua"/>
-	<Script file="widgets\AceGUIWidget-ColorPicker.lua"/>
-	<Script file="widgets\AceGUIWidget-DropDown.lua"/>
-	<Script file="widgets\AceGUIWidget-DropDown-Items.lua"/>
-	<Script file="widgets\AceGUIWidget-EditBox.lua"/>
-	<Script file="widgets\AceGUIWidget-Heading.lua"/>
-	<Script file="widgets\AceGUIWidget-Icon.lua"/>
-	<Script file="widgets\AceGUIWidget-InteractiveLabel.lua"/>
-	<Script file="widgets\AceGUIWidget-Keybinding.lua"/>
-	<Script file="widgets\AceGUIWidget-Label.lua"/>
-	<Script file="widgets\AceGUIWidget-MultiLineEditBox.lua"/>
-	<Script file="widgets\AceGUIWidget-Slider.lua"/>
-</Ui>
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
deleted file mode 100644
index 9a48f8b..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
+++ /dev/null
@@ -1,138 +0,0 @@
---[[-----------------------------------------------------------------------------
-BlizOptionsGroup Container
-Simple container widget for the integration of AceGUI into the Blizzard Interface Options
--------------------------------------------------------------------------------]]
-local Type, Version = "BlizOptionsGroup", 21
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local CreateFrame = CreateFrame
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-
-local function OnShow(frame)
-	frame.obj:Fire("OnShow")
-end
-
-local function OnHide(frame)
-	frame.obj:Fire("OnHide")
-end
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-
-local function okay(frame)
-	frame.obj:Fire("okay")
-end
-
-local function cancel(frame)
-	frame.obj:Fire("cancel")
-end
-
-local function default(frame)
-	frame.obj:Fire("default")
-end
-
-local function refresh(frame)
-	frame.obj:Fire("refresh")
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetName()
-		self:SetTitle()
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		local contentwidth = width - 63
-		if contentwidth < 0 then
-			contentwidth = 0
-		end
-		content:SetWidth(contentwidth)
-		content.width = contentwidth
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		local contentheight = height - 26
-		if contentheight < 0 then
-			contentheight = 0
-		end
-		content:SetHeight(contentheight)
-		content.height = contentheight
-	end,
-
-	["SetName"] = function(self, name, parent)
-		self.frame.name = name
-		self.frame.parent = parent
-	end,
-
-	["SetTitle"] = function(self, title)
-		local content = self.content
-		content:ClearAllPoints()
-		if not title or title == "" then
-			content:SetPoint("TOPLEFT", 10, -10)
-			self.label:SetText("")
-		else
-			content:SetPoint("TOPLEFT", 10, -40)
-			self.label:SetText(title)
-		end
-		content:SetPoint("BOTTOMRIGHT", -10, 10)
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Frame")
-	frame:Hide()
-
-	-- support functions for the Blizzard Interface Options
-	frame.okay = okay
-	frame.cancel = cancel
-	frame.default = default
-	frame.refresh = refresh
-
-	frame:SetScript("OnHide", OnHide)
-	frame:SetScript("OnShow", OnShow)
-
-	local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge")
-	label:SetPoint("TOPLEFT", 10, -15)
-	label:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", 10, -45)
-	label:SetJustifyH("LEFT")
-	label:SetJustifyV("TOP")
-
-	--Container Support
-	local content = CreateFrame("Frame", nil, frame)
-	content:SetPoint("TOPLEFT", 10, -10)
-	content:SetPoint("BOTTOMRIGHT", -10, 10)
-
-	local widget = {
-		label   = label,
-		frame   = frame,
-		content = content,
-		type    = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
deleted file mode 100644
index b0f81b7..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
+++ /dev/null
@@ -1,157 +0,0 @@
---[[-----------------------------------------------------------------------------
-DropdownGroup Container
-Container controlled by a dropdown on the top.
--------------------------------------------------------------------------------]]
-local Type, Version = "DropdownGroup", 21
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local assert, pairs, type = assert, pairs, type
-
--- WoW APIs
-local CreateFrame = CreateFrame
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function SelectedGroup(self, event, value)
-	local group = self.parentgroup
-	local status = group.status or group.localstatus
-	status.selected = value
-	self.parentgroup:Fire("OnGroupSelected", value)
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self.dropdown:SetText("")
-		self:SetDropdownWidth(200)
-		self:SetTitle("")
-	end,
-
-	["OnRelease"] = function(self)
-		self.dropdown.list = nil
-		self.status = nil
-		for k in pairs(self.localstatus) do
-			self.localstatus[k] = nil
-		end
-	end,
-
-	["SetTitle"] = function(self, title)
-		self.titletext:SetText(title)
-		self.dropdown.frame:ClearAllPoints()
-		if title and title ~= "" then
-			self.dropdown.frame:SetPoint("TOPRIGHT", -2, 0)
-		else
-			self.dropdown.frame:SetPoint("TOPLEFT", -1, 0)
-		end
-	end,
-
-	["SetGroupList"] = function(self,list,order)
-		self.dropdown:SetList(list,order)
-	end,
-
-	["SetStatusTable"] = function(self, status)
-		assert(type(status) == "table")
-		self.status = status
-	end,
-
-	["SetGroup"] = function(self,group)
-		self.dropdown:SetValue(group)
-		local status = self.status or self.localstatus
-		status.selected = group
-		self:Fire("OnGroupSelected", group)
-	end,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		local contentwidth = width - 26
-		if contentwidth < 0 then
-			contentwidth = 0
-		end
-		content:SetWidth(contentwidth)
-		content.width = contentwidth
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		local contentheight = height - 63
-		if contentheight < 0 then
-			contentheight = 0
-		end
-		content:SetHeight(contentheight)
-		content.height = contentheight
-	end,
-
-	["LayoutFinished"] = function(self, width, height)
-		self:SetHeight((height or 0) + 63)
-	end,
-
-	["SetDropdownWidth"] = function(self, width)
-		self.dropdown:SetWidth(width)
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local PaneBackdrop  = {
-	bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
-	edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
-	tile = true, tileSize = 16, edgeSize = 16,
-	insets = { left = 3, right = 3, top = 5, bottom = 3 }
-}
-
-local function Constructor()
-	local frame = CreateFrame("Frame")
-	frame:SetHeight(100)
-	frame:SetWidth(100)
-	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-
-	local titletext = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
-	titletext:SetPoint("TOPLEFT", 4, -5)
-	titletext:SetPoint("TOPRIGHT", -4, -5)
-	titletext:SetJustifyH("LEFT")
-	titletext:SetHeight(18)
-
-	local dropdown = AceGUI:Create("Dropdown")
-	dropdown.frame:SetParent(frame)
-	dropdown.frame:SetFrameLevel(dropdown.frame:GetFrameLevel() + 2)
-	dropdown:SetCallback("OnValueChanged", SelectedGroup)
-	dropdown.frame:SetPoint("TOPLEFT", -1, 0)
-	dropdown.frame:Show()
-	dropdown:SetLabel("")
-
-	local border = CreateFrame("Frame", nil, frame)
-	border:SetPoint("TOPLEFT", 0, -26)
-	border:SetPoint("BOTTOMRIGHT", 0, 3)
-	border:SetBackdrop(PaneBackdrop)
-	border:SetBackdropColor(0.1,0.1,0.1,0.5)
-	border:SetBackdropBorderColor(0.4,0.4,0.4)
-
-	--Container Support
-	local content = CreateFrame("Frame", nil, border)
-	content:SetPoint("TOPLEFT", 10, -10)
-	content:SetPoint("BOTTOMRIGHT", -10, 10)
-
-	local widget = {
-		frame       = frame,
-		localstatus = {},
-		titletext   = titletext,
-		dropdown    = dropdown,
-		border      = border,
-		content     = content,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	dropdown.parentgroup = widget
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
deleted file mode 100644
index 0dae68c..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
+++ /dev/null
@@ -1,311 +0,0 @@
---[[-----------------------------------------------------------------------------
-Frame Container
--------------------------------------------------------------------------------]]
-local Type, Version = "Frame", 24
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs, assert, type = pairs, assert, type
-local wipe = table.wipe
-
--- WoW APIs
-local PlaySound = PlaySound
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: CLOSE
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Button_OnClick(frame)
-	PlaySound("gsTitleOptionExit")
-	frame.obj:Hide()
-end
-
-local function Frame_OnClose(frame)
-	frame.obj:Fire("OnClose")
-end
-
-local function Frame_OnMouseDown(frame)
-	AceGUI:ClearFocus()
-end
-
-local function Title_OnMouseDown(frame)
-	frame:GetParent():StartMoving()
-	AceGUI:ClearFocus()
-end
-
-local function MoverSizer_OnMouseUp(mover)
-	local frame = mover:GetParent()
-	frame:StopMovingOrSizing()
-	local self = frame.obj
-	local status = self.status or self.localstatus
-	status.width = frame:GetWidth()
-	status.height = frame:GetHeight()
-	status.top = frame:GetTop()
-	status.left = frame:GetLeft()
-end
-
-local function SizerSE_OnMouseDown(frame)
-	frame:GetParent():StartSizing("BOTTOMRIGHT")
-	AceGUI:ClearFocus()
-end
-
-local function SizerS_OnMouseDown(frame)
-	frame:GetParent():StartSizing("BOTTOM")
-	AceGUI:ClearFocus()
-end
-
-local function SizerE_OnMouseDown(frame)
-	frame:GetParent():StartSizing("RIGHT")
-	AceGUI:ClearFocus()
-end
-
-local function StatusBar_OnEnter(frame)
-	frame.obj:Fire("OnEnterStatusBar")
-end
-
-local function StatusBar_OnLeave(frame)
-	frame.obj:Fire("OnLeaveStatusBar")
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self.frame:SetParent(UIParent)
-		self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
-		self:SetTitle()
-		self:SetStatusText()
-		self:ApplyStatus()
-		self:Show()
-        self:EnableResize(true)
-	end,
-
-	["OnRelease"] = function(self)
-		self.status = nil
-		wipe(self.localstatus)
-	end,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		local contentwidth = width - 34
-		if contentwidth < 0 then
-			contentwidth = 0
-		end
-		content:SetWidth(contentwidth)
-		content.width = contentwidth
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		local contentheight = height - 57
-		if contentheight < 0 then
-			contentheight = 0
-		end
-		content:SetHeight(contentheight)
-		content.height = contentheight
-	end,
-
-	["SetTitle"] = function(self, title)
-		self.titletext:SetText(title)
-		self.titlebg:SetWidth((self.titletext:GetWidth() or 0) + 10)
-	end,
-
-	["SetStatusText"] = function(self, text)
-		self.statustext:SetText(text)
-	end,
-
-	["Hide"] = function(self)
-		self.frame:Hide()
-	end,
-
-	["Show"] = function(self)
-		self.frame:Show()
-	end,
-
-	["EnableResize"] = function(self, state)
-		local func = state and "Show" or "Hide"
-		self.sizer_se[func](self.sizer_se)
-		self.sizer_s[func](self.sizer_s)
-		self.sizer_e[func](self.sizer_e)
-	end,
-
-	-- called to set an external table to store status in
-	["SetStatusTable"] = function(self, status)
-		assert(type(status) == "table")
-		self.status = status
-		self:ApplyStatus()
-	end,
-
-	["ApplyStatus"] = function(self)
-		local status = self.status or self.localstatus
-		local frame = self.frame
-		self:SetWidth(status.width or 700)
-		self:SetHeight(status.height or 500)
-		frame:ClearAllPoints()
-		if status.top and status.left then
-			frame:SetPoint("TOP", UIParent, "BOTTOM", 0, status.top)
-			frame:SetPoint("LEFT", UIParent, "LEFT", status.left, 0)
-		else
-			frame:SetPoint("CENTER")
-		end
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local FrameBackdrop = {
-	bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
-	edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
-	tile = true, tileSize = 32, edgeSize = 32,
-	insets = { left = 8, right = 8, top = 8, bottom = 8 }
-}
-
-local PaneBackdrop  = {
-	bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
-	edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
-	tile = true, tileSize = 16, edgeSize = 16,
-	insets = { left = 3, right = 3, top = 5, bottom = 3 }
-}
-
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-	frame:Hide()
-
-	frame:EnableMouse(true)
-	frame:SetMovable(true)
-	frame:SetResizable(true)
-	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-	frame:SetBackdrop(FrameBackdrop)
-	frame:SetBackdropColor(0, 0, 0, 1)
-	frame:SetMinResize(400, 200)
-	frame:SetToplevel(true)
-	frame:SetScript("OnHide", Frame_OnClose)
-	frame:SetScript("OnMouseDown", Frame_OnMouseDown)
-
-	local closebutton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
-	closebutton:SetScript("OnClick", Button_OnClick)
-	closebutton:SetPoint("BOTTOMRIGHT", -27, 17)
-	closebutton:SetHeight(20)
-	closebutton:SetWidth(100)
-	closebutton:SetText(CLOSE)
-
-	local statusbg = CreateFrame("Button", nil, frame)
-	statusbg:SetPoint("BOTTOMLEFT", 15, 15)
-	statusbg:SetPoint("BOTTOMRIGHT", -132, 15)
-	statusbg:SetHeight(24)
-	statusbg:SetBackdrop(PaneBackdrop)
-	statusbg:SetBackdropColor(0.1,0.1,0.1)
-	statusbg:SetBackdropBorderColor(0.4,0.4,0.4)
-	statusbg:SetScript("OnEnter", StatusBar_OnEnter)
-	statusbg:SetScript("OnLeave", StatusBar_OnLeave)
-
-	local statustext = statusbg:CreateFontString(nil, "OVERLAY", "GameFontNormal")
-	statustext:SetPoint("TOPLEFT", 7, -2)
-	statustext:SetPoint("BOTTOMRIGHT", -7, 2)
-	statustext:SetHeight(20)
-	statustext:SetJustifyH("LEFT")
-	statustext:SetText("")
-
-	local titlebg = frame:CreateTexture(nil, "OVERLAY")
-	titlebg:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
-	titlebg:SetTexCoord(0.31, 0.67, 0, 0.63)
-	titlebg:SetPoint("TOP", 0, 12)
-	titlebg:SetWidth(100)
-	titlebg:SetHeight(40)
-
-	local title = CreateFrame("Frame", nil, frame)
-	title:EnableMouse(true)
-	title:SetScript("OnMouseDown", Title_OnMouseDown)
-	title:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
-	title:SetAllPoints(titlebg)
-
-	local titletext = title:CreateFontString(nil, "OVERLAY", "GameFontNormal")
-	titletext:SetPoint("TOP", titlebg, "TOP", 0, -14)
-
-	local titlebg_l = frame:CreateTexture(nil, "OVERLAY")
-	titlebg_l:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
-	titlebg_l:SetTexCoord(0.21, 0.31, 0, 0.63)
-	titlebg_l:SetPoint("RIGHT", titlebg, "LEFT")
-	titlebg_l:SetWidth(30)
-	titlebg_l:SetHeight(40)
-
-	local titlebg_r = frame:CreateTexture(nil, "OVERLAY")
-	titlebg_r:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
-	titlebg_r:SetTexCoord(0.67, 0.77, 0, 0.63)
-	titlebg_r:SetPoint("LEFT", titlebg, "RIGHT")
-	titlebg_r:SetWidth(30)
-	titlebg_r:SetHeight(40)
-
-	local sizer_se = CreateFrame("Frame", nil, frame)
-	sizer_se:SetPoint("BOTTOMRIGHT")
-	sizer_se:SetWidth(25)
-	sizer_se:SetHeight(25)
-	sizer_se:EnableMouse()
-	sizer_se:SetScript("OnMouseDown",SizerSE_OnMouseDown)
-	sizer_se:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
-
-	local line1 = sizer_se:CreateTexture(nil, "BACKGROUND")
-	line1:SetWidth(14)
-	line1:SetHeight(14)
-	line1:SetPoint("BOTTOMRIGHT", -8, 8)
-	line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
-	local x = 0.1 * 14/17
-	line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
-
-	local line2 = sizer_se:CreateTexture(nil, "BACKGROUND")
-	line2:SetWidth(8)
-	line2:SetHeight(8)
-	line2:SetPoint("BOTTOMRIGHT", -8, 8)
-	line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
-	local x = 0.1 * 8/17
-	line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
-
-	local sizer_s = CreateFrame("Frame", nil, frame)
-	sizer_s:SetPoint("BOTTOMRIGHT", -25, 0)
-	sizer_s:SetPoint("BOTTOMLEFT")
-	sizer_s:SetHeight(25)
-	sizer_s:EnableMouse(true)
-	sizer_s:SetScript("OnMouseDown", SizerS_OnMouseDown)
-	sizer_s:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
-
-	local sizer_e = CreateFrame("Frame", nil, frame)
-	sizer_e:SetPoint("BOTTOMRIGHT", 0, 25)
-	sizer_e:SetPoint("TOPRIGHT")
-	sizer_e:SetWidth(25)
-	sizer_e:EnableMouse(true)
-	sizer_e:SetScript("OnMouseDown", SizerE_OnMouseDown)
-	sizer_e:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
-
-	--Container Support
-	local content = CreateFrame("Frame", nil, frame)
-	content:SetPoint("TOPLEFT", 17, -27)
-	content:SetPoint("BOTTOMRIGHT", -17, 40)
-
-	local widget = {
-		localstatus = {},
-		titletext   = titletext,
-		statustext  = statustext,
-		titlebg     = titlebg,
-		sizer_se    = sizer_se,
-		sizer_s     = sizer_s,
-		sizer_e     = sizer_e,
-		content     = content,
-		frame       = frame,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	closebutton.obj, statusbg.obj = widget, widget
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
deleted file mode 100644
index f3db7d6..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
+++ /dev/null
@@ -1,103 +0,0 @@
---[[-----------------------------------------------------------------------------
-InlineGroup Container
-Simple container widget that creates a visible "box" with an optional title.
--------------------------------------------------------------------------------]]
-local Type, Version = "InlineGroup", 21
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetWidth(300)
-		self:SetHeight(100)
-		self:SetTitle("")
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetTitle"] = function(self,title)
-		self.titletext:SetText(title)
-	end,
-
-
-	["LayoutFinished"] = function(self, width, height)
-		if self.noAutoHeight then return end
-		self:SetHeight((height or 0) + 40)
-	end,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		local contentwidth = width - 20
-		if contentwidth < 0 then
-			contentwidth = 0
-		end
-		content:SetWidth(contentwidth)
-		content.width = contentwidth
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		local contentheight = height - 20
-		if contentheight < 0 then
-			contentheight = 0
-		end
-		content:SetHeight(contentheight)
-		content.height = contentheight
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local PaneBackdrop  = {
-	bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
-	edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
-	tile = true, tileSize = 16, edgeSize = 16,
-	insets = { left = 3, right = 3, top = 5, bottom = 3 }
-}
-
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-
-	local titletext = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
-	titletext:SetPoint("TOPLEFT", 14, 0)
-	titletext:SetPoint("TOPRIGHT", -14, 0)
-	titletext:SetJustifyH("LEFT")
-	titletext:SetHeight(18)
-
-	local border = CreateFrame("Frame", nil, frame)
-	border:SetPoint("TOPLEFT", 0, -17)
-	border:SetPoint("BOTTOMRIGHT", -1, 3)
-	border:SetBackdrop(PaneBackdrop)
-	border:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
-	border:SetBackdropBorderColor(0.4, 0.4, 0.4)
-
-	--Container Support
-	local content = CreateFrame("Frame", nil, border)
-	content:SetPoint("TOPLEFT", 10, -10)
-	content:SetPoint("BOTTOMRIGHT", -10, 10)
-
-	local widget = {
-		frame     = frame,
-		content   = content,
-		titletext = titletext,
-		type      = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
deleted file mode 100644
index a56e7cd..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
+++ /dev/null
@@ -1,204 +0,0 @@
---[[-----------------------------------------------------------------------------
-ScrollFrame Container
-Plain container that scrolls its content and doesn't grow in height.
--------------------------------------------------------------------------------]]
-local Type, Version = "ScrollFrame", 23
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs, assert, type = pairs, assert, type
-local min, max, floor, abs = math.min, math.max, math.floor, math.abs
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-local function FixScrollOnUpdate(frame)
-	frame:SetScript("OnUpdate", nil)
-	frame.obj:FixScroll()
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function ScrollFrame_OnMouseWheel(frame, value)
-	frame.obj:MoveScroll(value)
-end
-
-local function ScrollFrame_OnSizeChanged(frame)
-	frame:SetScript("OnUpdate", FixScrollOnUpdate)
-end
-
-local function ScrollBar_OnScrollValueChanged(frame, value)
-	frame.obj:SetScroll(value)
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetScroll(0)
-		self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
-	end,
-
-	["OnRelease"] = function(self)
-		self.status = nil
-		for k in pairs(self.localstatus) do
-			self.localstatus[k] = nil
-		end
-		self.scrollframe:SetPoint("BOTTOMRIGHT")
-		self.scrollbar:Hide()
-		self.scrollBarShown = nil
-		self.content.height, self.content.width = nil, nil
-	end,
-
-	["SetScroll"] = function(self, value)
-		local status = self.status or self.localstatus
-		local viewheight = self.scrollframe:GetHeight()
-		local height = self.content:GetHeight()
-		local offset
-
-		if viewheight > height then
-			offset = 0
-		else
-			offset = floor((height - viewheight) / 1000.0 * value)
-		end
-		self.content:ClearAllPoints()
-		self.content:SetPoint("TOPLEFT", 0, offset)
-		self.content:SetPoint("TOPRIGHT", 0, offset)
-		status.offset = offset
-		status.scrollvalue = value
-	end,
-
-	["MoveScroll"] = function(self, value)
-		local status = self.status or self.localstatus
-		local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
-
-		if self.scrollBarShown then
-			local diff = height - viewheight
-			local delta = 1
-			if value < 0 then
-				delta = -1
-			end
-			self.scrollbar:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
-		end
-	end,
-
-	["FixScroll"] = function(self)
-		if self.updateLock then return end
-		self.updateLock = true
-		local status = self.status or self.localstatus
-		local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
-		local offset = status.offset or 0
-		local curvalue = self.scrollbar:GetValue()
-		-- Give us a margin of error of 2 pixels to stop some conditions that i would blame on floating point inaccuracys
-		-- No-one is going to miss 2 pixels at the bottom of the frame, anyhow!
-		if viewheight < height + 2 then
-			if self.scrollBarShown then
-				self.scrollBarShown = nil
-				self.scrollbar:Hide()
-				self.scrollbar:SetValue(0)
-				self.scrollframe:SetPoint("BOTTOMRIGHT")
-				self:DoLayout()
-			end
-		else
-			if not self.scrollBarShown then
-				self.scrollBarShown = true
-				self.scrollbar:Show()
-				self.scrollframe:SetPoint("BOTTOMRIGHT", -20, 0)
-				self:DoLayout()
-			end
-			local value = (offset / (viewheight - height) * 1000)
-			if value > 1000 then value = 1000 end
-			self.scrollbar:SetValue(value)
-			self:SetScroll(value)
-			if value < 1000 then
-				self.content:ClearAllPoints()
-				self.content:SetPoint("TOPLEFT", 0, offset)
-				self.content:SetPoint("TOPRIGHT", 0, offset)
-				status.offset = offset
-			end
-		end
-		self.updateLock = nil
-	end,
-
-	["LayoutFinished"] = function(self, width, height)
-		self.content:SetHeight(height or 0 + 20)
-		self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
-	end,
-
-	["SetStatusTable"] = function(self, status)
-		assert(type(status) == "table")
-		self.status = status
-		if not status.scrollvalue then
-			status.scrollvalue = 0
-		end
-	end,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		content.width = width
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		content.height = height
-	end
-}
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-	local num = AceGUI:GetNextWidgetNum(Type)
-
-	local scrollframe = CreateFrame("ScrollFrame", nil, frame)
-	scrollframe:SetPoint("TOPLEFT")
-	scrollframe:SetPoint("BOTTOMRIGHT")
-	scrollframe:EnableMouseWheel(true)
-	scrollframe:SetScript("OnMouseWheel", ScrollFrame_OnMouseWheel)
-	scrollframe:SetScript("OnSizeChanged", ScrollFrame_OnSizeChanged)
-
-	local scrollbar = CreateFrame("Slider", ("AceConfigDialogScrollFrame%dScrollBar"):format(num), scrollframe, "UIPanelScrollBarTemplate")
-	scrollbar:SetPoint("TOPLEFT", scrollframe, "TOPRIGHT", 4, -16)
-	scrollbar:SetPoint("BOTTOMLEFT", scrollframe, "BOTTOMRIGHT", 4, 16)
-	scrollbar:SetMinMaxValues(0, 1000)
-	scrollbar:SetValueStep(1)
-	scrollbar:SetValue(0)
-	scrollbar:SetWidth(16)
-	scrollbar:Hide()
-	-- set the script as the last step, so it doesn't fire yet
-	scrollbar:SetScript("OnValueChanged", ScrollBar_OnScrollValueChanged)
-
-	local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND")
-	scrollbg:SetAllPoints(scrollbar)
-	scrollbg:SetTexture(0, 0, 0, 0.4)
-
-	--Container Support
-	local content = CreateFrame("Frame", nil, scrollframe)
-	content:SetPoint("TOPLEFT")
-	content:SetPoint("TOPRIGHT")
-	content:SetHeight(400)
-	scrollframe:SetScrollChild(content)
-
-	local widget = {
-		localstatus = { scrollvalue = 0 },
-		scrollframe = scrollframe,
-		scrollbar   = scrollbar,
-		content     = content,
-		frame       = frame,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	scrollframe.obj, scrollbar.obj = widget, widget
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-SimpleGroup.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-SimpleGroup.lua
deleted file mode 100644
index 57512c3..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-SimpleGroup.lua
+++ /dev/null
@@ -1,69 +0,0 @@
---[[-----------------------------------------------------------------------------
-SimpleGroup Container
-Simple container widget that just groups widgets.
--------------------------------------------------------------------------------]]
-local Type, Version = "SimpleGroup", 20
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetWidth(300)
-		self:SetHeight(100)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["LayoutFinished"] = function(self, width, height)
-		if self.noAutoHeight then return end
-		self:SetHeight(height or 0)
-	end,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		content:SetWidth(width)
-		content.width = width
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		content:SetHeight(height)
-		content.height = height
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-
-	--Container Support
-	local content = CreateFrame("Frame", nil, frame)
-	content:SetPoint("TOPLEFT")
-	content:SetPoint("BOTTOMRIGHT")
-
-	local widget = {
-		frame     = frame,
-		content   = content,
-		type      = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
deleted file mode 100644
index 00be129..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
+++ /dev/null
@@ -1,350 +0,0 @@
---[[-----------------------------------------------------------------------------
-TabGroup Container
-Container that uses tabs on top to switch between groups.
--------------------------------------------------------------------------------]]
-local Type, Version = "TabGroup", 35
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, wipe
-
--- WoW APIs
-local PlaySound = PlaySound
-local CreateFrame, UIParent = CreateFrame, UIParent
-local _G = _G
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: PanelTemplates_TabResize, PanelTemplates_SetDisabledTabState, PanelTemplates_SelectTab, PanelTemplates_DeselectTab
-
--- local upvalue storage used by BuildTabs
-local widths = {}
-local rowwidths = {}
-local rowends = {}
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-local function UpdateTabLook(frame)
-	if frame.disabled then
-		PanelTemplates_SetDisabledTabState(frame)
-	elseif frame.selected then
-		PanelTemplates_SelectTab(frame)
-	else
-		PanelTemplates_DeselectTab(frame)
-	end
-end
-
-local function Tab_SetText(frame, text)
-	frame:_SetText(text)
-	local width = frame.obj.frame.width or frame.obj.frame:GetWidth() or 0
-	PanelTemplates_TabResize(frame, 0, nil, nil, width, frame:GetFontString():GetStringWidth())
-end
-
-local function Tab_SetSelected(frame, selected)
-	frame.selected = selected
-	UpdateTabLook(frame)
-end
-
-local function Tab_SetDisabled(frame, disabled)
-	frame.disabled = disabled
-	UpdateTabLook(frame)
-end
-
-local function BuildTabsOnUpdate(frame)
-	local self = frame.obj
-	self:BuildTabs()
-	frame:SetScript("OnUpdate", nil)
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Tab_OnClick(frame)
-	if not (frame.selected or frame.disabled) then
-		PlaySound("igCharacterInfoTab")
-		frame.obj:SelectTab(frame.value)
-	end
-end
-
-local function Tab_OnEnter(frame)
-	local self = frame.obj
-	self:Fire("OnTabEnter", self.tabs[frame.id].value, frame)
-end
-
-local function Tab_OnLeave(frame)
-	local self = frame.obj
-	self:Fire("OnTabLeave", self.tabs[frame.id].value, frame)
-end
-
-local function Tab_OnShow(frame)
-	_G[frame:GetName().."HighlightTexture"]:SetWidth(frame:GetTextWidth() + 30)
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetTitle()
-	end,
-
-	["OnRelease"] = function(self)
-		self.status = nil
-		for k in pairs(self.localstatus) do
-			self.localstatus[k] = nil
-		end
-		self.tablist = nil
-		for _, tab in pairs(self.tabs) do
-			tab:Hide()
-		end
-	end,
-
-	["CreateTab"] = function(self, id)
-		local tabname = ("AceGUITabGroup%dTab%d"):format(self.num, id)
-		local tab = CreateFrame("Button", tabname, self.border, "OptionsFrameTabButtonTemplate")
-		tab.obj = self
-		tab.id = id
-
-		tab.text = _G[tabname .. "Text"]
-		tab.text:ClearAllPoints()
-		tab.text:SetPoint("LEFT", 14, -3)
-		tab.text:SetPoint("RIGHT", -12, -3)
-
-		tab:SetScript("OnClick", Tab_OnClick)
-		tab:SetScript("OnEnter", Tab_OnEnter)
-		tab:SetScript("OnLeave", Tab_OnLeave)
-		tab:SetScript("OnShow", Tab_OnShow)
-
-		tab._SetText = tab.SetText
-		tab.SetText = Tab_SetText
-		tab.SetSelected = Tab_SetSelected
-		tab.SetDisabled = Tab_SetDisabled
-
-		return tab
-	end,
-
-	["SetTitle"] = function(self, text)
-		self.titletext:SetText(text or "")
-		if text and text ~= "" then
-			self.alignoffset = 25
-		else
-			self.alignoffset = 18
-		end
-		self:BuildTabs()
-	end,
-
-	["SetStatusTable"] = function(self, status)
-		assert(type(status) == "table")
-		self.status = status
-	end,
-
-	["SelectTab"] = function(self, value)
-		local status = self.status or self.localstatus
-		local found
-		for i, v in ipairs(self.tabs) do
-			if v.value == value then
-				v:SetSelected(true)
-				found = true
-			else
-				v:SetSelected(false)
-			end
-		end
-		status.selected = value
-		if found then
-			self:Fire("OnGroupSelected",value)
-		end
-	end,
-
-	["SetTabs"] = function(self, tabs)
-		self.tablist = tabs
-		self:BuildTabs()
-	end,
-
-
-	["BuildTabs"] = function(self)
-		local hastitle = (self.titletext:GetText() and self.titletext:GetText() ~= "")
-		local status = self.status or self.localstatus
-		local tablist = self.tablist
-		local tabs = self.tabs
-
-		if not tablist then return end
-
-		local width = self.frame.width or self.frame:GetWidth() or 0
-
-		wipe(widths)
-		wipe(rowwidths)
-		wipe(rowends)
-
-		--Place Text into tabs and get thier initial width
-		for i, v in ipairs(tablist) do
-			local tab = tabs[i]
-			if not tab then
-				tab = self:CreateTab(i)
-				tabs[i] = tab
-			end
-
-			tab:Show()
-			tab:SetText(v.text)
-			tab:SetDisabled(v.disabled)
-			tab.value = v.value
-
-			widths[i] = tab:GetWidth() - 6 --tabs are anchored 10 pixels from the right side of the previous one to reduce spacing, but add a fixed 4px padding for the text
-		end
-
-		for i = (#tablist)+1, #tabs, 1 do
-			tabs[i]:Hide()
-		end
-
-		--First pass, find the minimum number of rows needed to hold all tabs and the initial tab layout
-		local numtabs = #tablist
-		local numrows = 1
-		local usedwidth = 0
-
-		for i = 1, #tablist do
-			--If this is not the first tab of a row and there isn't room for it
-			if usedwidth ~= 0 and (width - usedwidth - widths[i]) < 0 then
-				rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
-				rowends[numrows] = i - 1
-				numrows = numrows + 1
-				usedwidth = 0
-			end
-			usedwidth = usedwidth + widths[i]
-		end
-		rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
-		rowends[numrows] = #tablist
-
-		--Fix for single tabs being left on the last row, move a tab from the row above if applicable
-		if numrows > 1 then
-			--if the last row has only one tab
-			if rowends[numrows-1] == numtabs-1 then
-				--if there are more than 2 tabs in the 2nd last row
-				if (numrows == 2 and rowends[numrows-1] > 2) or (rowends[numrows] - rowends[numrows-1] > 2) then
-					--move 1 tab from the second last row to the last, if there is enough space
-					if (rowwidths[numrows] + widths[numtabs-1]) <= width then
-						rowends[numrows-1] = rowends[numrows-1] - 1
-						rowwidths[numrows] = rowwidths[numrows] + widths[numtabs-1]
-						rowwidths[numrows-1] = rowwidths[numrows-1] - widths[numtabs-1]
-					end
-				end
-			end
-		end
-
-		--anchor the rows as defined and resize tabs to fill thier row
-		local starttab = 1
-		for row, endtab in ipairs(rowends) do
-			local first = true
-			for tabno = starttab, endtab do
-				local tab = tabs[tabno]
-				tab:ClearAllPoints()
-				if first then
-					tab:SetPoint("TOPLEFT", self.frame, "TOPLEFT", 0, -(hastitle and 14 or 7)-(row-1)*20 )
-					first = false
-				else
-					tab:SetPoint("LEFT", tabs[tabno-1], "RIGHT", -10, 0)
-				end
-			end
-
-			-- equal padding for each tab to fill the available width,
-			-- if the used space is above 75% already
-			-- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
-			-- and not have the tabs jump around funny when switching between tabs that need scrolling and those that don't
-			local padding = 0
-			if not (numrows == 1 and rowwidths[1] < width*0.75 - 18) then
-				padding = (width - rowwidths[row]) / (endtab - starttab+1)
-			end
-
-			for i = starttab, endtab do
-				PanelTemplates_TabResize(tabs[i], padding + 4, nil, nil, width, tabs[i]:GetFontString():GetStringWidth())
-			end
-			starttab = endtab + 1
-		end
-
-		self.borderoffset = (hastitle and 17 or 10)+((numrows)*20)
-		self.border:SetPoint("TOPLEFT", 1, -self.borderoffset)
-	end,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		local contentwidth = width - 60
-		if contentwidth < 0 then
-			contentwidth = 0
-		end
-		content:SetWidth(contentwidth)
-		content.width = contentwidth
-		self:BuildTabs(self)
-		self.frame:SetScript("OnUpdate", BuildTabsOnUpdate)
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		local contentheight = height - (self.borderoffset + 23)
-		if contentheight < 0 then
-			contentheight = 0
-		end
-		content:SetHeight(contentheight)
-		content.height = contentheight
-	end,
-
-	["LayoutFinished"] = function(self, width, height)
-		if self.noAutoHeight then return end
-		self:SetHeight((height or 0) + (self.borderoffset + 23))
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local PaneBackdrop  = {
-	bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
-	edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
-	tile = true, tileSize = 16, edgeSize = 16,
-	insets = { left = 3, right = 3, top = 5, bottom = 3 }
-}
-
-local function Constructor()
-	local num = AceGUI:GetNextWidgetNum(Type)
-	local frame = CreateFrame("Frame",nil,UIParent)
-	frame:SetHeight(100)
-	frame:SetWidth(100)
-	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-
-	local titletext = frame:CreateFontString(nil,"OVERLAY","GameFontNormal")
-	titletext:SetPoint("TOPLEFT", 14, 0)
-	titletext:SetPoint("TOPRIGHT", -14, 0)
-	titletext:SetJustifyH("LEFT")
-	titletext:SetHeight(18)
-	titletext:SetText("")
-
-	local border = CreateFrame("Frame", nil, frame)
-	border:SetPoint("TOPLEFT", 1, -27)
-	border:SetPoint("BOTTOMRIGHT", -1, 3)
-	border:SetBackdrop(PaneBackdrop)
-	border:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
-	border:SetBackdropBorderColor(0.4, 0.4, 0.4)
-
-	local content = CreateFrame("Frame", nil, border)
-	content:SetPoint("TOPLEFT", 10, -7)
-	content:SetPoint("BOTTOMRIGHT", -10, 7)
-
-	local widget = {
-		num          = num,
-		frame        = frame,
-		localstatus  = {},
-		alignoffset  = 18,
-		titletext    = titletext,
-		border       = border,
-		borderoffset = 27,
-		tabs         = {},
-		content      = content,
-		type         = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
deleted file mode 100644
index 085449b..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+++ /dev/null
@@ -1,709 +0,0 @@
---[[-----------------------------------------------------------------------------
-TreeGroup Container
-Container that uses a tree control to switch between groups.
--------------------------------------------------------------------------------]]
-local Type, Version = "TreeGroup", 38
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
-local math_min, math_max, floor = math.min, math.max, floor
-local select, tremove, unpack, tconcat = select, table.remove, unpack, table.concat
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameTooltip, FONT_COLOR_CODE_CLOSE
-
--- Recycling functions
-local new, del
-do
-	local pool = setmetatable({},{__mode='k'})
-	function new()
-		local t = next(pool)
-		if t then
-			pool[t] = nil
-			return t
-		else
-			return {}
-		end
-	end
-	function del(t)
-		for k in pairs(t) do
-			t[k] = nil
-		end
-		pool[t] = true
-	end
-end
-
-local DEFAULT_TREE_WIDTH = 175
-local DEFAULT_TREE_SIZABLE = true
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-local function GetButtonUniqueValue(line)
-	local parent = line.parent
-	if parent and parent.value then
-		return GetButtonUniqueValue(parent).."\001"..line.value
-	else
-		return line.value
-	end
-end
-
-local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
-	local self = button.obj
-	local toggle = button.toggle
-	local frame = self.frame
-	local text = treeline.text or ""
-	local icon = treeline.icon
-	local iconCoords = treeline.iconCoords
-	local level = treeline.level
-	local value = treeline.value
-	local uniquevalue = treeline.uniquevalue
-	local disabled = treeline.disabled
-
-	button.treeline = treeline
-	button.value = value
-	button.uniquevalue = uniquevalue
-	if selected then
-		button:LockHighlight()
-		button.selected = true
-	else
-		button:UnlockHighlight()
-		button.selected = false
-	end
-	local normalTexture = button:GetNormalTexture()
-	local line = button.line
-	button.level = level
-	if ( level == 1 ) then
-		button:SetNormalFontObject("GameFontNormal")
-		button:SetHighlightFontObject("GameFontHighlight")
-		button.text:SetPoint("LEFT", (icon and 16 or 0) + 8, 2)
-	else
-		button:SetNormalFontObject("GameFontHighlightSmall")
-		button:SetHighlightFontObject("GameFontHighlightSmall")
-		button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2)
-	end
-
-	if disabled then
-		button:EnableMouse(false)
-		button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE)
-	else
-		button.text:SetText(text)
-		button:EnableMouse(true)
-	end
-
-	if icon then
-		button.icon:SetTexture(icon)
-		button.icon:SetPoint("LEFT", 8 * level, (level == 1) and 0 or 1)
-	else
-		button.icon:SetTexture(nil)
-	end
-
-	if iconCoords then
-		button.icon:SetTexCoord(unpack(iconCoords))
-	else
-		button.icon:SetTexCoord(0, 1, 0, 1)
-	end
-
-	if canExpand then
-		if not isExpanded then
-			toggle:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-UP")
-			toggle:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-DOWN")
-		else
-			toggle:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-UP")
-			toggle:SetPushedTexture("Interface\\Buttons\\UI-MinusButton-DOWN")
-		end
-		toggle:Show()
-	else
-		toggle:Hide()
-	end
-end
-
-local function ShouldDisplayLevel(tree)
-	local result = false
-	for k, v in ipairs(tree) do
-		if v.children == nil and v.visible ~= false then
-			result = true
-		elseif v.children then
-			result = result or ShouldDisplayLevel(v.children)
-		end
-		if result then return result end
-	end
-	return false
-end
-
-local function addLine(self, v, tree, level, parent)
-	local line = new()
-	line.value = v.value
-	line.text = v.text
-	line.icon = v.icon
-	line.iconCoords = v.iconCoords
-	line.disabled = v.disabled
-	line.tree = tree
-	line.level = level
-	line.parent = parent
-	line.visible = v.visible
-	line.uniquevalue = GetButtonUniqueValue(line)
-	if v.children then
-		line.hasChildren = true
-	else
-		line.hasChildren = nil
-	end
-	self.lines[#self.lines+1] = line
-	return line
-end
-
---fire an update after one frame to catch the treeframes height
-local function FirstFrameUpdate(frame)
-	local self = frame.obj
-	frame:SetScript("OnUpdate", nil)
-	self:RefreshTree()
-end
-
-local function BuildUniqueValue(...)
-	local n = select('#', ...)
-	if n == 1 then
-		return ...
-	else
-		return (...).."\001"..BuildUniqueValue(select(2,...))
-	end
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Expand_OnClick(frame)
-	local button = frame.button
-	local self = button.obj
-	local status = (self.status or self.localstatus).groups
-	status[button.uniquevalue] = not status[button.uniquevalue]
-	self:RefreshTree()
-end
-
-local function Button_OnClick(frame)
-	local self = frame.obj
-	self:Fire("OnClick", frame.uniquevalue, frame.selected)
-	if not frame.selected then
-		self:SetSelected(frame.uniquevalue)
-		frame.selected = true
-		frame:LockHighlight()
-		self:RefreshTree()
-	end
-	AceGUI:ClearFocus()
-end
-
-local function Button_OnDoubleClick(button)
-	local self = button.obj
-	local status = self.status or self.localstatus
-	local status = (self.status or self.localstatus).groups
-	status[button.uniquevalue] = not status[button.uniquevalue]
-	self:RefreshTree()
-end
-
-local function Button_OnEnter(frame)
-	local self = frame.obj
-	self:Fire("OnButtonEnter", frame.uniquevalue, frame)
-
-	if self.enabletooltips then
-		GameTooltip:SetOwner(frame, "ANCHOR_NONE")
-		GameTooltip:SetPoint("LEFT",frame,"RIGHT")
-		GameTooltip:SetText(frame.text:GetText() or "", 1, .82, 0, true)
-
-		GameTooltip:Show()
-	end
-end
-
-local function Button_OnLeave(frame)
-	local self = frame.obj
-	self:Fire("OnButtonLeave", frame.uniquevalue, frame)
-
-	if self.enabletooltips then
-		GameTooltip:Hide()
-	end
-end
-
-local function OnScrollValueChanged(frame, value)
-	if frame.obj.noupdate then return end
-	local self = frame.obj
-	local status = self.status or self.localstatus
-	status.scrollvalue = floor(value + 0.5)
-	self:RefreshTree()
-	AceGUI:ClearFocus()
-end
-
-local function Tree_OnSizeChanged(frame)
-	frame.obj:RefreshTree()
-end
-
-local function Tree_OnMouseWheel(frame, delta)
-	local self = frame.obj
-	if self.showscroll then
-		local scrollbar = self.scrollbar
-		local min, max = scrollbar:GetMinMaxValues()
-		local value = scrollbar:GetValue()
-		local newvalue = math_min(max,math_max(min,value - delta))
-		if value ~= newvalue then
-			scrollbar:SetValue(newvalue)
-		end
-	end
-end
-
-local function Dragger_OnLeave(frame)
-	frame:SetBackdropColor(1, 1, 1, 0)
-end
-
-local function Dragger_OnEnter(frame)
-	frame:SetBackdropColor(1, 1, 1, 0.8)
-end
-
-local function Dragger_OnMouseDown(frame)
-	local treeframe = frame:GetParent()
-	treeframe:StartSizing("RIGHT")
-end
-
-local function Dragger_OnMouseUp(frame)
-	local treeframe = frame:GetParent()
-	local self = treeframe.obj
-	local frame = treeframe:GetParent()
-	treeframe:StopMovingOrSizing()
-	--treeframe:SetScript("OnUpdate", nil)
-	treeframe:SetUserPlaced(false)
-	--Without this :GetHeight will get stuck on the current height, causing the tree contents to not resize
-	treeframe:SetHeight(0)
-	treeframe:SetPoint("TOPLEFT", frame, "TOPLEFT",0,0)
-	treeframe:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT",0,0)
-
-	local status = self.status or self.localstatus
-	status.treewidth = treeframe:GetWidth()
-
-	treeframe.obj:Fire("OnTreeResize",treeframe:GetWidth())
-	-- recalculate the content width
-	treeframe.obj:OnWidthSet(status.fullwidth)
-	-- update the layout of the content
-	treeframe.obj:DoLayout()
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetTreeWidth(DEFAULT_TREE_WIDTH, DEFAULT_TREE_SIZABLE)
-		self:EnableButtonTooltips(true)
-	end,
-
-	["OnRelease"] = function(self)
-		self.status = nil
-		for k, v in pairs(self.localstatus) do
-			if k == "groups" then
-				for k2 in pairs(v) do
-					v[k2] = nil
-				end
-			else
-				self.localstatus[k] = nil
-			end
-		end
-		self.localstatus.scrollvalue = 0
-		self.localstatus.treewidth = DEFAULT_TREE_WIDTH
-		self.localstatus.treesizable = DEFAULT_TREE_SIZABLE
-	end,
-
-	["EnableButtonTooltips"] = function(self, enable)
-		self.enabletooltips = enable
-	end,
-
-	["CreateButton"] = function(self)
-		local num = AceGUI:GetNextWidgetNum("TreeGroupButton")
-		local button = CreateFrame("Button", ("AceGUI30TreeButton%d"):format(num), self.treeframe, "OptionsListButtonTemplate")
-		button.obj = self
-
-		local icon = button:CreateTexture(nil, "OVERLAY")
-		icon:SetWidth(14)
-		icon:SetHeight(14)
-		button.icon = icon
-
-		button:SetScript("OnClick",Button_OnClick)
-		button:SetScript("OnDoubleClick", Button_OnDoubleClick)
-		button:SetScript("OnEnter",Button_OnEnter)
-		button:SetScript("OnLeave",Button_OnLeave)
-
-		button.toggle.button = button
-		button.toggle:SetScript("OnClick",Expand_OnClick)
-
-		button.text:SetHeight(14) -- Prevents text wrapping
-
-		return button
-	end,
-
-	["SetStatusTable"] = function(self, status)
-		assert(type(status) == "table")
-		self.status = status
-		if not status.groups then
-			status.groups = {}
-		end
-		if not status.scrollvalue then
-			status.scrollvalue = 0
-		end
-		if not status.treewidth then
-			status.treewidth = DEFAULT_TREE_WIDTH
-		end
-		if status.treesizable == nil then
-			status.treesizable = DEFAULT_TREE_SIZABLE
-		end
-		self:SetTreeWidth(status.treewidth,status.treesizable)
-		self:RefreshTree()
-	end,
-
-	--sets the tree to be displayed
-	["SetTree"] = function(self, tree, filter)
-		self.filter = filter
-		if tree then
-			assert(type(tree) == "table")
-		end
-		self.tree = tree
-		self:RefreshTree()
-	end,
-
-	["BuildLevel"] = function(self, tree, level, parent)
-		local groups = (self.status or self.localstatus).groups
-		local hasChildren = self.hasChildren
-
-		for i, v in ipairs(tree) do
-			if v.children then
-				if not self.filter or ShouldDisplayLevel(v.children) then
-					local line = addLine(self, v, tree, level, parent)
-					if groups[line.uniquevalue] then
-						self:BuildLevel(v.children, level+1, line)
-					end
-				end
-			elseif v.visible ~= false or not self.filter then
-				addLine(self, v, tree, level, parent)
-			end
-		end
-	end,
-
-	["RefreshTree"] = function(self,scrollToSelection)
-		local buttons = self.buttons
-		local lines = self.lines
-
-		for i, v in ipairs(buttons) do
-			v:Hide()
-		end
-		while lines[1] do
-			local t = tremove(lines)
-			for k in pairs(t) do
-				t[k] = nil
-			end
-			del(t)
-		end
-
-		if not self.tree then return end
-		--Build the list of visible entries from the tree and status tables
-		local status = self.status or self.localstatus
-		local groupstatus = status.groups
-		local tree = self.tree
-
-		local treeframe = self.treeframe
-
-		status.scrollToSelection = status.scrollToSelection or scrollToSelection	-- needs to be cached in case the control hasn't been drawn yet (code bails out below)
-
-		self:BuildLevel(tree, 1)
-
-		local numlines = #lines
-
-		local maxlines = (floor(((self.treeframe:GetHeight()or 0) - 20 ) / 18))
-		if maxlines <= 0 then return end
-
-		local first, last
-
-		scrollToSelection = status.scrollToSelection
-		status.scrollToSelection = nil
-
-		if numlines <= maxlines then
-			--the whole tree fits in the frame
-			status.scrollvalue = 0
-			self:ShowScroll(false)
-			first, last = 1, numlines
-		else
-			self:ShowScroll(true)
-			--scrolling will be needed
-			self.noupdate = true
-			self.scrollbar:SetMinMaxValues(0, numlines - maxlines)
-			--check if we are scrolled down too far
-			if numlines - status.scrollvalue < maxlines then
-				status.scrollvalue = numlines - maxlines
-			end
-			self.noupdate = nil
-			first, last = status.scrollvalue+1, status.scrollvalue + maxlines
-			--show selection?
-			if scrollToSelection and status.selected then
-				local show
-				for i,line in ipairs(lines) do	-- find the line number
-					if line.uniquevalue==status.selected then
-						show=i
-					end
-				end
-				if not show then
-					-- selection was deleted or something?
-				elseif show>=first and show<=last then
-					-- all good
-				else
-					-- scrolling needed!
-					if show<first then
-						status.scrollvalue = show-1
-					else
-						status.scrollvalue = show-maxlines
-					end
-					first, last = status.scrollvalue+1, status.scrollvalue + maxlines
-				end
-			end
-			if self.scrollbar:GetValue() ~= status.scrollvalue then
-				self.scrollbar:SetValue(status.scrollvalue)
-			end
-		end
-
-		local buttonnum = 1
-		for i = first, last do
-			local line = lines[i]
-			local button = buttons[buttonnum]
-			if not button then
-				button = self:CreateButton()
-
-				buttons[buttonnum] = button
-				button:SetParent(treeframe)
-				button:SetFrameLevel(treeframe:GetFrameLevel()+1)
-				button:ClearAllPoints()
-				if buttonnum == 1 then
-					if self.showscroll then
-						button:SetPoint("TOPRIGHT", -22, -10)
-						button:SetPoint("TOPLEFT", 0, -10)
-					else
-						button:SetPoint("TOPRIGHT", 0, -10)
-						button:SetPoint("TOPLEFT", 0, -10)
-					end
-				else
-					button:SetPoint("TOPRIGHT", buttons[buttonnum-1], "BOTTOMRIGHT",0,0)
-					button:SetPoint("TOPLEFT", buttons[buttonnum-1], "BOTTOMLEFT",0,0)
-				end
-			end
-
-			UpdateButton(button, line, status.selected == line.uniquevalue, line.hasChildren, groupstatus[line.uniquevalue] )
-			button:Show()
-			buttonnum = buttonnum + 1
-		end
-
-	end,
-
-	["SetSelected"] = function(self, value)
-		local status = self.status or self.localstatus
-		if status.selected ~= value then
-			status.selected = value
-			self:Fire("OnGroupSelected", value)
-		end
-	end,
-
-	["Select"] = function(self, uniquevalue, ...)
-		self.filter = false
-		local status = self.status or self.localstatus
-		local groups = status.groups
-		local path = {...}
-		for i = 1, #path do
-			groups[tconcat(path, "\001", 1, i)] = true
-		end
-		status.selected = uniquevalue
-		self:RefreshTree(true)
-		self:Fire("OnGroupSelected", uniquevalue)
-	end,
-
-	["SelectByPath"] = function(self, ...)
-		self:Select(BuildUniqueValue(...), ...)
-	end,
-
-	["SelectByValue"] = function(self, uniquevalue)
-		self:Select(uniquevalue, ("\001"):split(uniquevalue))
-	end,
-
-	["ShowScroll"] = function(self, show)
-		self.showscroll = show
-		if show then
-			self.scrollbar:Show()
-			if self.buttons[1] then
-				self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",-22,-10)
-			end
-		else
-			self.scrollbar:Hide()
-			if self.buttons[1] then
-				self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",0,-10)
-			end
-		end
-	end,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		local treeframe = self.treeframe
-		local status = self.status or self.localstatus
-		status.fullwidth = width
-
-		local contentwidth = width - status.treewidth - 20
-		if contentwidth < 0 then
-			contentwidth = 0
-		end
-		content:SetWidth(contentwidth)
-		content.width = contentwidth
-
-		local maxtreewidth = math_min(400, width - 50)
-
-		if maxtreewidth > 100 and status.treewidth > maxtreewidth then
-			self:SetTreeWidth(maxtreewidth, status.treesizable)
-		end
-		treeframe:SetMaxResize(maxtreewidth, 1600)
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		local contentheight = height - 20
-		if contentheight < 0 then
-			contentheight = 0
-		end
-		content:SetHeight(contentheight)
-		content.height = contentheight
-	end,
-
-	["SetTreeWidth"] = function(self, treewidth, resizable)
-		if not resizable then
-			if type(treewidth) == 'number' then
-				resizable = false
-			elseif type(treewidth) == 'boolean' then
-				resizable = treewidth
-				treewidth = DEFAULT_TREE_WIDTH
-			else
-				resizable = false
-				treewidth = DEFAULT_TREE_WIDTH
-			end
-		end
-		self.treeframe:SetWidth(treewidth)
-		self.dragger:EnableMouse(resizable)
-
-		local status = self.status or self.localstatus
-		status.treewidth = treewidth
-		status.treesizable = resizable
-
-		-- recalculate the content width
-		if status.fullwidth then
-			self:OnWidthSet(status.fullwidth)
-		end
-	end,
-
-	["GetTreeWidth"] = function(self)
-		local status = self.status or self.localstatus
-		return status.treewidth or DEFAULT_TREE_WIDTH
-	end,
-
-	["LayoutFinished"] = function(self, width, height)
-		if self.noAutoHeight then return end
-		self:SetHeight((height or 0) + 20)
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local PaneBackdrop  = {
-	bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
-	edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
-	tile = true, tileSize = 16, edgeSize = 16,
-	insets = { left = 3, right = 3, top = 5, bottom = 3 }
-}
-
-local DraggerBackdrop  = {
-	bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
-	edgeFile = nil,
-	tile = true, tileSize = 16, edgeSize = 0,
-	insets = { left = 3, right = 3, top = 7, bottom = 7 }
-}
-
-local function Constructor()
-	local num = AceGUI:GetNextWidgetNum(Type)
-	local frame = CreateFrame("Frame", nil, UIParent)
-
-	local treeframe = CreateFrame("Frame", nil, frame)
-	treeframe:SetPoint("TOPLEFT")
-	treeframe:SetPoint("BOTTOMLEFT")
-	treeframe:SetWidth(DEFAULT_TREE_WIDTH)
-	treeframe:EnableMouseWheel(true)
-	treeframe:SetBackdrop(PaneBackdrop)
-	treeframe:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
-	treeframe:SetBackdropBorderColor(0.4, 0.4, 0.4)
-	treeframe:SetResizable(true)
-	treeframe:SetMinResize(100, 1)
-	treeframe:SetMaxResize(400, 1600)
-	treeframe:SetScript("OnUpdate", FirstFrameUpdate)
-	treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged)
-	treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel)
-
-	local dragger = CreateFrame("Frame", nil, treeframe)
-	dragger:SetWidth(8)
-	dragger:SetPoint("TOP", treeframe, "TOPRIGHT")
-	dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT")
-	dragger:SetBackdrop(DraggerBackdrop)
-	dragger:SetBackdropColor(1, 1, 1, 0)
-	dragger:SetScript("OnEnter", Dragger_OnEnter)
-	dragger:SetScript("OnLeave", Dragger_OnLeave)
-	dragger:SetScript("OnMouseDown", Dragger_OnMouseDown)
-	dragger:SetScript("OnMouseUp", Dragger_OnMouseUp)
-
-	local scrollbar = CreateFrame("Slider", ("AceConfigDialogTreeGroup%dScrollBar"):format(num), treeframe, "UIPanelScrollBarTemplate")
-	scrollbar:SetScript("OnValueChanged", nil)
-	scrollbar:SetPoint("TOPRIGHT", -10, -26)
-	scrollbar:SetPoint("BOTTOMRIGHT", -10, 26)
-	scrollbar:SetMinMaxValues(0,0)
-	scrollbar:SetValueStep(1)
-	scrollbar:SetValue(0)
-	scrollbar:SetWidth(16)
-	scrollbar:SetScript("OnValueChanged", OnScrollValueChanged)
-
-	local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND")
-	scrollbg:SetAllPoints(scrollbar)
-	scrollbg:SetTexture(0,0,0,0.4)
-
-	local border = CreateFrame("Frame",nil,frame)
-	border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT")
-	border:SetPoint("BOTTOMRIGHT")
-	border:SetBackdrop(PaneBackdrop)
-	border:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
-	border:SetBackdropBorderColor(0.4, 0.4, 0.4)
-
-	--Container Support
-	local content = CreateFrame("Frame", nil, border)
-	content:SetPoint("TOPLEFT", 10, -10)
-	content:SetPoint("BOTTOMRIGHT", -10, 10)
-
-	local widget = {
-		frame        = frame,
-		lines        = {},
-		levels       = {},
-		buttons      = {},
-		hasChildren  = {},
-		localstatus  = { groups = {}, scrollvalue = 0 },
-		filter       = false,
-		treeframe    = treeframe,
-		dragger      = dragger,
-		scrollbar    = scrollbar,
-		border       = border,
-		content      = content,
-		type         = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	treeframe.obj, dragger.obj, scrollbar.obj = widget, widget, widget
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
deleted file mode 100644
index bb0a2a2..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
+++ /dev/null
@@ -1,331 +0,0 @@
-local AceGUI = LibStub("AceGUI-3.0")
-
--- Lua APIs
-local pairs, assert, type = pairs, assert, type
-
--- WoW APIs
-local PlaySound = PlaySound
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontNormal
-
-----------------
--- Main Frame --
-----------------
---[[
-	Events :
-		OnClose
-
-]]
-do
-	local Type = "Window"
-	local Version = 4
-
-	local function frameOnClose(this)
-		this.obj:Fire("OnClose")
-	end
-
-	local function closeOnClick(this)
-		PlaySound("gsTitleOptionExit")
-		this.obj:Hide()
-	end
-
-	local function frameOnMouseDown(this)
-		AceGUI:ClearFocus()
-	end
-
-	local function titleOnMouseDown(this)
-		this:GetParent():StartMoving()
-		AceGUI:ClearFocus()
-	end
-
-	local function frameOnMouseUp(this)
-		local frame = this:GetParent()
-		frame:StopMovingOrSizing()
-		local self = frame.obj
-		local status = self.status or self.localstatus
-		status.width = frame:GetWidth()
-		status.height = frame:GetHeight()
-		status.top = frame:GetTop()
-		status.left = frame:GetLeft()
-	end
-
-	local function sizerseOnMouseDown(this)
-		this:GetParent():StartSizing("BOTTOMRIGHT")
-		AceGUI:ClearFocus()
-	end
-
-	local function sizersOnMouseDown(this)
-		this:GetParent():StartSizing("BOTTOM")
-		AceGUI:ClearFocus()
-	end
-
-	local function sizereOnMouseDown(this)
-		this:GetParent():StartSizing("RIGHT")
-		AceGUI:ClearFocus()
-	end
-
-	local function sizerOnMouseUp(this)
-		this:GetParent():StopMovingOrSizing()
-	end
-
-	local function SetTitle(self,title)
-		self.titletext:SetText(title)
-	end
-
-	local function SetStatusText(self,text)
-		-- self.statustext:SetText(text)
-	end
-
-	local function Hide(self)
-		self.frame:Hide()
-	end
-
-	local function Show(self)
-		self.frame:Show()
-	end
-
-	local function OnAcquire(self)
-		self.frame:SetParent(UIParent)
-		self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
-		self:ApplyStatus()
-		self:EnableResize(true)
-		self:Show()
-	end
-
-	local function OnRelease(self)
-		self.status = nil
-		for k in pairs(self.localstatus) do
-			self.localstatus[k] = nil
-		end
-	end
-
-	-- called to set an external table to store status in
-	local function SetStatusTable(self, status)
-		assert(type(status) == "table")
-		self.status = status
-		self:ApplyStatus()
-	end
-
-	local function ApplyStatus(self)
-		local status = self.status or self.localstatus
-		local frame = self.frame
-		self:SetWidth(status.width or 700)
-		self:SetHeight(status.height or 500)
-		if status.top and status.left then
-			frame:SetPoint("TOP",UIParent,"BOTTOM",0,status.top)
-			frame:SetPoint("LEFT",UIParent,"LEFT",status.left,0)
-		else
-			frame:SetPoint("CENTER",UIParent,"CENTER")
-		end
-	end
-
-	local function OnWidthSet(self, width)
-		local content = self.content
-		local contentwidth = width - 34
-		if contentwidth < 0 then
-			contentwidth = 0
-		end
-		content:SetWidth(contentwidth)
-		content.width = contentwidth
-	end
-
-
-	local function OnHeightSet(self, height)
-		local content = self.content
-		local contentheight = height - 57
-		if contentheight < 0 then
-			contentheight = 0
-		end
-		content:SetHeight(contentheight)
-		content.height = contentheight
-	end
-
-	local function EnableResize(self, state)
-		local func = state and "Show" or "Hide"
-		self.sizer_se[func](self.sizer_se)
-		self.sizer_s[func](self.sizer_s)
-		self.sizer_e[func](self.sizer_e)
-	end
-
-	local function Constructor()
-		local frame = CreateFrame("Frame",nil,UIParent)
-		local self = {}
-		self.type = "Window"
-
-		self.Hide = Hide
-		self.Show = Show
-		self.SetTitle =  SetTitle
-		self.OnRelease = OnRelease
-		self.OnAcquire = OnAcquire
-		self.SetStatusText = SetStatusText
-		self.SetStatusTable = SetStatusTable
-		self.ApplyStatus = ApplyStatus
-		self.OnWidthSet = OnWidthSet
-		self.OnHeightSet = OnHeightSet
-		self.EnableResize = EnableResize
-
-		self.localstatus = {}
-
-		self.frame = frame
-		frame.obj = self
-		frame:SetWidth(700)
-		frame:SetHeight(500)
-		frame:SetPoint("CENTER",UIParent,"CENTER",0,0)
-		frame:EnableMouse()
-		frame:SetMovable(true)
-		frame:SetResizable(true)
-		frame:SetFrameStrata("FULLSCREEN_DIALOG")
-		frame:SetScript("OnMouseDown", frameOnMouseDown)
-
-		frame:SetScript("OnHide",frameOnClose)
-		frame:SetMinResize(240,240)
-		frame:SetToplevel(true)
-
-		local titlebg = frame:CreateTexture(nil, "BACKGROUND")
-		titlebg:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Title-Background]])
-		titlebg:SetPoint("TOPLEFT", 9, -6)
-		titlebg:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", -28, -24)
-
-		local dialogbg = frame:CreateTexture(nil, "BACKGROUND")
-		dialogbg:SetTexture([[Interface\Tooltips\UI-Tooltip-Background]])
-		dialogbg:SetPoint("TOPLEFT", 8, -24)
-		dialogbg:SetPoint("BOTTOMRIGHT", -6, 8)
-		dialogbg:SetVertexColor(0, 0, 0, .75)
-
-		local topleft = frame:CreateTexture(nil, "BORDER")
-		topleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		topleft:SetWidth(64)
-		topleft:SetHeight(64)
-		topleft:SetPoint("TOPLEFT")
-		topleft:SetTexCoord(0.501953125, 0.625, 0, 1)
-
-		local topright = frame:CreateTexture(nil, "BORDER")
-		topright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		topright:SetWidth(64)
-		topright:SetHeight(64)
-		topright:SetPoint("TOPRIGHT")
-		topright:SetTexCoord(0.625, 0.75, 0, 1)
-
-		local top = frame:CreateTexture(nil, "BORDER")
-		top:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		top:SetHeight(64)
-		top:SetPoint("TOPLEFT", topleft, "TOPRIGHT")
-		top:SetPoint("TOPRIGHT", topright, "TOPLEFT")
-		top:SetTexCoord(0.25, 0.369140625, 0, 1)
-
-		local bottomleft = frame:CreateTexture(nil, "BORDER")
-		bottomleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		bottomleft:SetWidth(64)
-		bottomleft:SetHeight(64)
-		bottomleft:SetPoint("BOTTOMLEFT")
-		bottomleft:SetTexCoord(0.751953125, 0.875, 0, 1)
-
-		local bottomright = frame:CreateTexture(nil, "BORDER")
-		bottomright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		bottomright:SetWidth(64)
-		bottomright:SetHeight(64)
-		bottomright:SetPoint("BOTTOMRIGHT")
-		bottomright:SetTexCoord(0.875, 1, 0, 1)
-
-		local bottom = frame:CreateTexture(nil, "BORDER")
-		bottom:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		bottom:SetHeight(64)
-		bottom:SetPoint("BOTTOMLEFT", bottomleft, "BOTTOMRIGHT")
-		bottom:SetPoint("BOTTOMRIGHT", bottomright, "BOTTOMLEFT")
-		bottom:SetTexCoord(0.376953125, 0.498046875, 0, 1)
-
-		local left = frame:CreateTexture(nil, "BORDER")
-		left:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		left:SetWidth(64)
-		left:SetPoint("TOPLEFT", topleft, "BOTTOMLEFT")
-		left:SetPoint("BOTTOMLEFT", bottomleft, "TOPLEFT")
-		left:SetTexCoord(0.001953125, 0.125, 0, 1)
-
-		local right = frame:CreateTexture(nil, "BORDER")
-		right:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		right:SetWidth(64)
-		right:SetPoint("TOPRIGHT", topright, "BOTTOMRIGHT")
-		right:SetPoint("BOTTOMRIGHT", bottomright, "TOPRIGHT")
-		right:SetTexCoord(0.1171875, 0.2421875, 0, 1)
-
-		local close = CreateFrame("Button", nil, frame, "UIPanelCloseButton")
-		close:SetPoint("TOPRIGHT", 2, 1)
-		close:SetScript("OnClick", closeOnClick)
-		self.closebutton = close
-		close.obj = self
-
-		local titletext = frame:CreateFontString(nil, "ARTWORK")
-		titletext:SetFontObject(GameFontNormal)
-		titletext:SetPoint("TOPLEFT", 12, -8)
-		titletext:SetPoint("TOPRIGHT", -32, -8)
-		self.titletext = titletext
-
-		local title = CreateFrame("Button", nil, frame)
-		title:SetPoint("TOPLEFT", titlebg)
-		title:SetPoint("BOTTOMRIGHT", titlebg)
-		title:EnableMouse()
-		title:SetScript("OnMouseDown",titleOnMouseDown)
-		title:SetScript("OnMouseUp", frameOnMouseUp)
-		self.title = title
-
-		local sizer_se = CreateFrame("Frame",nil,frame)
-		sizer_se:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
-		sizer_se:SetWidth(25)
-		sizer_se:SetHeight(25)
-		sizer_se:EnableMouse()
-		sizer_se:SetScript("OnMouseDown",sizerseOnMouseDown)
-		sizer_se:SetScript("OnMouseUp", sizerOnMouseUp)
-		self.sizer_se = sizer_se
-
-		local line1 = sizer_se:CreateTexture(nil, "BACKGROUND")
-		self.line1 = line1
-		line1:SetWidth(14)
-		line1:SetHeight(14)
-		line1:SetPoint("BOTTOMRIGHT", -8, 8)
-		line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
-		local x = 0.1 * 14/17
-		line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
-
-		local line2 = sizer_se:CreateTexture(nil, "BACKGROUND")
-		self.line2 = line2
-		line2:SetWidth(8)
-		line2:SetHeight(8)
-		line2:SetPoint("BOTTOMRIGHT", -8, 8)
-		line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
-		local x = 0.1 * 8/17
-		line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
-
-		local sizer_s = CreateFrame("Frame",nil,frame)
-		sizer_s:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-25,0)
-		sizer_s:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,0)
-		sizer_s:SetHeight(25)
-		sizer_s:EnableMouse()
-		sizer_s:SetScript("OnMouseDown",sizersOnMouseDown)
-		sizer_s:SetScript("OnMouseUp", sizerOnMouseUp)
-		self.sizer_s = sizer_s
-
-		local sizer_e = CreateFrame("Frame",nil,frame)
-		sizer_e:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,25)
-		sizer_e:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
-		sizer_e:SetWidth(25)
-		sizer_e:EnableMouse()
-		sizer_e:SetScript("OnMouseDown",sizereOnMouseDown)
-		sizer_e:SetScript("OnMouseUp", sizerOnMouseUp)
-		self.sizer_e = sizer_e
-
-		--Container Support
-		local content = CreateFrame("Frame",nil,frame)
-		self.content = content
-		content.obj = self
-		content:SetPoint("TOPLEFT",frame,"TOPLEFT",12,-32)
-		content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-12,13)
-
-		AceGUI:RegisterAsContainer(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(Type,Constructor,Version)
-end
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
deleted file mode 100644
index 028e524..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
+++ /dev/null
@@ -1,109 +0,0 @@
---[[-----------------------------------------------------------------------------
-Button Widget
-Graphical Button.
--------------------------------------------------------------------------------]]
-local Type, Version = "Button", 23
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local _G = _G
-local PlaySound, CreateFrame, UIParent = PlaySound, CreateFrame, UIParent
-
-local wowMoP
-do
-	local _, _, _, interface = GetBuildInfo()
-	wowMoP = (interface >= 50000)
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Button_OnClick(frame, ...)
-	AceGUI:ClearFocus()
-	PlaySound("igMainMenuOption")
-	frame.obj:Fire("OnClick", ...)
-end
-
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		-- restore default values
-		self:SetHeight(24)
-		self:SetWidth(200)
-		self:SetDisabled(false)
-		self:SetAutoWidth(false)
-		self:SetText()
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetText"] = function(self, text)
-		self.text:SetText(text)
-		if self.autoWidth then
-			self:SetWidth(self.text:GetStringWidth() + 30)
-		end
-	end,
-
-	["SetAutoWidth"] = function(self, autoWidth)
-		self.autoWidth = autoWidth
-		if self.autoWidth then
-			self:SetWidth(self.text:GetStringWidth() + 30)
-		end
-	end,
-
-	["SetDisabled"] = function(self, disabled)
-		self.disabled = disabled
-		if disabled then
-			self.frame:Disable()
-		else
-			self.frame:Enable()
-		end
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local name = "AceGUI30Button" .. AceGUI:GetNextWidgetNum(Type)
-	local frame = CreateFrame("Button", name, UIParent, wowMoP and "UIPanelButtonTemplate" or "UIPanelButtonTemplate2")
-	frame:Hide()
-
-	frame:EnableMouse(true)
-	frame:SetScript("OnClick", Button_OnClick)
-	frame:SetScript("OnEnter", Control_OnEnter)
-	frame:SetScript("OnLeave", Control_OnLeave)
-
-	local text = frame:GetFontString()
-	text:ClearAllPoints()
-	text:SetPoint("TOPLEFT", 15, -1)
-	text:SetPoint("BOTTOMRIGHT", -15, 1)
-	text:SetJustifyV("MIDDLE")
-
-	local widget = {
-		text  = text,
-		frame = frame,
-		type  = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
deleted file mode 100644
index 8847ebc..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
+++ /dev/null
@@ -1,295 +0,0 @@
---[[-----------------------------------------------------------------------------
-Checkbox Widget
--------------------------------------------------------------------------------]]
-local Type, Version = "CheckBox", 22
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local select, pairs = select, pairs
-
--- WoW APIs
-local PlaySound = PlaySound
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: SetDesaturation, GameFontHighlight
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-local function AlignImage(self)
-	local img = self.image:GetTexture()
-	self.text:ClearAllPoints()
-	if not img then
-		self.text:SetPoint("LEFT", self.checkbg, "RIGHT")
-		self.text:SetPoint("RIGHT")
-	else
-		self.text:SetPoint("LEFT", self.image,"RIGHT", 1, 0)
-		self.text:SetPoint("RIGHT")
-	end
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
-local function CheckBox_OnMouseDown(frame)
-	local self = frame.obj
-	if not self.disabled then
-		if self.image:GetTexture() then
-			self.text:SetPoint("LEFT", self.image,"RIGHT", 2, -1)
-		else
-			self.text:SetPoint("LEFT", self.checkbg, "RIGHT", 1, -1)
-		end
-	end
-	AceGUI:ClearFocus()
-end
-
-local function CheckBox_OnMouseUp(frame)
-	local self = frame.obj
-	if not self.disabled then
-		self:ToggleChecked()
-
-		if self.checked then
-			PlaySound("igMainMenuOptionCheckBoxOn")
-		else -- for both nil and false (tristate)
-			PlaySound("igMainMenuOptionCheckBoxOff")
-		end
-
-		self:Fire("OnValueChanged", self.checked)
-		AlignImage(self)
-	end
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetType()
-		self:SetValue(false)
-		self:SetTriState(nil)
-		-- height is calculated from the width and required space for the description
-		self:SetWidth(200)
-		self:SetImage()
-		self:SetDisabled(nil)
-		self:SetDescription(nil)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["OnWidthSet"] = function(self, width)
-		if self.desc then
-			self.desc:SetWidth(width - 30)
-			if self.desc:GetText() and self.desc:GetText() ~= "" then
-				self:SetHeight(28 + self.desc:GetHeight())
-			end
-		end
-	end,
-
-	["SetDisabled"] = function(self, disabled)
-		self.disabled = disabled
-		if disabled then
-			self.frame:Disable()
-			self.text:SetTextColor(0.5, 0.5, 0.5)
-			SetDesaturation(self.check, true)
-			if self.desc then
-				self.desc:SetTextColor(0.5, 0.5, 0.5)
-			end
-		else
-			self.frame:Enable()
-			self.text:SetTextColor(1, 1, 1)
-			if self.tristate and self.checked == nil then
-				SetDesaturation(self.check, true)
-			else
-				SetDesaturation(self.check, false)
-			end
-			if self.desc then
-				self.desc:SetTextColor(1, 1, 1)
-			end
-		end
-	end,
-
-	["SetValue"] = function(self,value)
-		local check = self.check
-		self.checked = value
-		if value then
-			SetDesaturation(self.check, false)
-			self.check:Show()
-		else
-			--Nil is the unknown tristate value
-			if self.tristate and value == nil then
-				SetDesaturation(self.check, true)
-				self.check:Show()
-			else
-				SetDesaturation(self.check, false)
-				self.check:Hide()
-			end
-		end
-		self:SetDisabled(self.disabled)
-	end,
-
-	["GetValue"] = function(self)
-		return self.checked
-	end,
-
-	["SetTriState"] = function(self, enabled)
-		self.tristate = enabled
-		self:SetValue(self:GetValue())
-	end,
-
-	["SetType"] = function(self, type)
-		local checkbg = self.checkbg
-		local check = self.check
-		local highlight = self.highlight
-
-		local size
-		if type == "radio" then
-			size = 16
-			checkbg:SetTexture("Interface\\Buttons\\UI-RadioButton")
-			checkbg:SetTexCoord(0, 0.25, 0, 1)
-			check:SetTexture("Interface\\Buttons\\UI-RadioButton")
-			check:SetTexCoord(0.25, 0.5, 0, 1)
-			check:SetBlendMode("ADD")
-			highlight:SetTexture("Interface\\Buttons\\UI-RadioButton")
-			highlight:SetTexCoord(0.5, 0.75, 0, 1)
-		else
-			size = 24
-			checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
-			checkbg:SetTexCoord(0, 1, 0, 1)
-			check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
-			check:SetTexCoord(0, 1, 0, 1)
-			check:SetBlendMode("BLEND")
-			highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
-			highlight:SetTexCoord(0, 1, 0, 1)
-		end
-		checkbg:SetHeight(size)
-		checkbg:SetWidth(size)
-	end,
-
-	["ToggleChecked"] = function(self)
-		local value = self:GetValue()
-		if self.tristate then
-			--cycle in true, nil, false order
-			if value then
-				self:SetValue(nil)
-			elseif value == nil then
-				self:SetValue(false)
-			else
-				self:SetValue(true)
-			end
-		else
-			self:SetValue(not self:GetValue())
-		end
-	end,
-
-	["SetLabel"] = function(self, label)
-		self.text:SetText(label)
-	end,
-
-	["SetDescription"] = function(self, desc)
-		if desc then
-			if not self.desc then
-				local desc = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
-				desc:ClearAllPoints()
-				desc:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
-				desc:SetWidth(self.frame.width - 30)
-				desc:SetJustifyH("LEFT")
-				desc:SetJustifyV("TOP")
-				self.desc = desc
-			end
-			self.desc:Show()
-			--self.text:SetFontObject(GameFontNormal)
-			self.desc:SetText(desc)
-			self:SetHeight(28 + self.desc:GetHeight())
-		else
-			if self.desc then
-				self.desc:SetText("")
-				self.desc:Hide()
-			end
-			--self.text:SetFontObject(GameFontHighlight)
-			self:SetHeight(24)
-		end
-	end,
-
-	["SetImage"] = function(self, path, ...)
-		local image = self.image
-		image:SetTexture(path)
-
-		if image:GetTexture() then
-			local n = select("#", ...)
-			if n == 4 or n == 8 then
-				image:SetTexCoord(...)
-			else
-				image:SetTexCoord(0, 1, 0, 1)
-			end
-		end
-		AlignImage(self)
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Button", nil, UIParent)
-	frame:Hide()
-
-	frame:EnableMouse(true)
-	frame:SetScript("OnEnter", Control_OnEnter)
-	frame:SetScript("OnLeave", Control_OnLeave)
-	frame:SetScript("OnMouseDown", CheckBox_OnMouseDown)
-	frame:SetScript("OnMouseUp", CheckBox_OnMouseUp)
-
-	local checkbg = frame:CreateTexture(nil, "ARTWORK")
-	checkbg:SetWidth(24)
-	checkbg:SetHeight(24)
-	checkbg:SetPoint("TOPLEFT")
-	checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
-
-	local check = frame:CreateTexture(nil, "OVERLAY")
-	check:SetAllPoints(checkbg)
-	check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
-
-	local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
-	text:SetJustifyH("LEFT")
-	text:SetHeight(18)
-	text:SetPoint("LEFT", checkbg, "RIGHT")
-	text:SetPoint("RIGHT")
-
-	local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
-	highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
-	highlight:SetBlendMode("ADD")
-	highlight:SetAllPoints(checkbg)
-
-	local image = frame:CreateTexture(nil, "OVERLAY")
-	image:SetHeight(16)
-	image:SetWidth(16)
-	image:SetPoint("LEFT", checkbg, "RIGHT", 1, 0)
-
-	local widget = {
-		checkbg   = checkbg,
-		check     = check,
-		text      = text,
-		highlight = highlight,
-		image     = image,
-		frame     = frame,
-		type      = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
deleted file mode 100644
index f25d46c..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
+++ /dev/null
@@ -1,188 +0,0 @@
---[[-----------------------------------------------------------------------------
-ColorPicker Widget
--------------------------------------------------------------------------------]]
-local Type, Version = "ColorPicker", 22
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: ShowUIPanel, HideUIPanel, ColorPickerFrame, OpacitySliderFrame
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-local function ColorCallback(self, r, g, b, a, isAlpha)
-	if not self.HasAlpha then
-		a = 1
-	end
-	self:SetColor(r, g, b, a)
-	if ColorPickerFrame:IsVisible() then
-		--colorpicker is still open
-		self:Fire("OnValueChanged", r, g, b, a)
-	else
-		--colorpicker is closed, color callback is first, ignore it,
-		--alpha callback is the final call after it closes so confirm now
-		if isAlpha then
-			self:Fire("OnValueConfirmed", r, g, b, a)
-		end
-	end
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
-local function ColorSwatch_OnClick(frame)
-	HideUIPanel(ColorPickerFrame)
-	local self = frame.obj
-	if not self.disabled then
-		ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-		ColorPickerFrame:SetFrameLevel(frame:GetFrameLevel() + 10)
-		ColorPickerFrame:SetClampedToScreen(true)
-
-		ColorPickerFrame.func = function()
-			local r, g, b = ColorPickerFrame:GetColorRGB()
-			local a = 1 - OpacitySliderFrame:GetValue()
-			ColorCallback(self, r, g, b, a)
-		end
-
-		ColorPickerFrame.hasOpacity = self.HasAlpha
-		ColorPickerFrame.opacityFunc = function()
-			local r, g, b = ColorPickerFrame:GetColorRGB()
-			local a = 1 - OpacitySliderFrame:GetValue()
-			ColorCallback(self, r, g, b, a, true)
-		end
-
-		local r, g, b, a = self.r, self.g, self.b, self.a
-		if self.HasAlpha then
-			ColorPickerFrame.opacity = 1 - (a or 0)
-		end
-		ColorPickerFrame:SetColorRGB(r, g, b)
-
-		ColorPickerFrame.cancelFunc = function()
-			ColorCallback(self, r, g, b, a, true)
-		end
-
-		ShowUIPanel(ColorPickerFrame)
-	end
-	AceGUI:ClearFocus()
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetHeight(24)
-		self:SetWidth(200)
-		self:SetHasAlpha(false)
-		self:SetColor(0, 0, 0, 1)
-		self:SetDisabled(nil)
-		self:SetLabel(nil)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetLabel"] = function(self, text)
-		self.text:SetText(text)
-	end,
-
-	["SetColor"] = function(self, r, g, b, a)
-		self.r = r
-		self.g = g
-		self.b = b
-		self.a = a or 1
-		self.colorSwatch:SetVertexColor(r, g, b, a)
-	end,
-
-	["SetHasAlpha"] = function(self, HasAlpha)
-		self.HasAlpha = HasAlpha
-	end,
-
-	["SetDisabled"] = function(self, disabled)
-		self.disabled = disabled
-		if self.disabled then
-			self.frame:Disable()
-			self.text:SetTextColor(0.5, 0.5, 0.5)
-		else
-			self.frame:Enable()
-			self.text:SetTextColor(1, 1, 1)
-		end
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Button", nil, UIParent)
-	frame:Hide()
-
-	frame:EnableMouse(true)
-	frame:SetScript("OnEnter", Control_OnEnter)
-	frame:SetScript("OnLeave", Control_OnLeave)
-	frame:SetScript("OnClick", ColorSwatch_OnClick)
-
-	local colorSwatch = frame:CreateTexture(nil, "OVERLAY")
-	colorSwatch:SetWidth(19)
-	colorSwatch:SetHeight(19)
-	colorSwatch:SetTexture("Interface\\ChatFrame\\ChatFrameColorSwatch")
-	colorSwatch:SetPoint("LEFT")
-
-	local texture = frame:CreateTexture(nil, "BACKGROUND")
-	texture:SetWidth(16)
-	texture:SetHeight(16)
-	texture:SetTexture(1, 1, 1)
-	texture:SetPoint("CENTER", colorSwatch)
-	texture:Show()
-
-	local checkers = frame:CreateTexture(nil, "BACKGROUND")
-	checkers:SetWidth(14)
-	checkers:SetHeight(14)
-	checkers:SetTexture("Tileset\\Generic\\Checkers")
-	checkers:SetTexCoord(.25, 0, 0.5, .25)
-	checkers:SetDesaturated(true)
-	checkers:SetVertexColor(1, 1, 1, 0.75)
-	checkers:SetPoint("CENTER", colorSwatch)
-	checkers:Show()
-
-	local text = frame:CreateFontString(nil,"OVERLAY","GameFontHighlight")
-	text:SetHeight(24)
-	text:SetJustifyH("LEFT")
-	text:SetTextColor(1, 1, 1)
-	text:SetPoint("LEFT", colorSwatch, "RIGHT", 2, 0)
-	text:SetPoint("RIGHT")
-
-	--local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
-	--highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
-	--highlight:SetBlendMode("ADD")
-	--highlight:SetAllPoints(frame)
-
-	local widget = {
-		colorSwatch = colorSwatch,
-		text        = text,
-		frame       = frame,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
deleted file mode 100644
index 1f28cb5..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
+++ /dev/null
@@ -1,471 +0,0 @@
---[[ $Id: AceGUIWidget-DropDown-Items.lua 996 2010-12-01 18:34:17Z nevcairiel $ ]]--
-
-local AceGUI = LibStub("AceGUI-3.0")
-
--- Lua APIs
-local select, assert = select, assert
-
--- WoW APIs
-local PlaySound = PlaySound
-local CreateFrame = CreateFrame
-
-local function fixlevels(parent,...)
-	local i = 1
-	local child = select(i, ...)
-	while child do
-		child:SetFrameLevel(parent:GetFrameLevel()+1)
-		fixlevels(child, child:GetChildren())
-		i = i + 1
-		child = select(i, ...)
-	end
-end
-
-local function fixstrata(strata, parent, ...)
-	local i = 1
-	local child = select(i, ...)
-	parent:SetFrameStrata(strata)
-	while child do
-		fixstrata(strata, child, child:GetChildren())
-		i = i + 1
-		child = select(i, ...)
-	end
-end
-
--- ItemBase is the base "class" for all dropdown items.
--- Each item has to use ItemBase.Create(widgetType) to
--- create an initial 'self' value.
--- ItemBase will add common functions and ui event handlers.
--- Be sure to keep basic usage when you override functions.
-
-local ItemBase = {
-	-- NOTE: The ItemBase version is added to each item's version number
-	--       to ensure proper updates on ItemBase changes.
-	--       Use at least 1000er steps.
-	version = 1000,
-	counter = 0,
-}
-
-function ItemBase.Frame_OnEnter(this)
-	local self = this.obj
-
-	if self.useHighlight then
-		self.highlight:Show()
-	end
-	self:Fire("OnEnter")
-
-	if self.specialOnEnter then
-		self.specialOnEnter(self)
-	end
-end
-
-function ItemBase.Frame_OnLeave(this)
-	local self = this.obj
-
-	self.highlight:Hide()
-	self:Fire("OnLeave")
-
-	if self.specialOnLeave then
-		self.specialOnLeave(self)
-	end
-end
-
--- exported, AceGUI callback
-function ItemBase.OnAcquire(self)
-	self.frame:SetToplevel(true)
-	self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
-end
-
--- exported, AceGUI callback
-function ItemBase.OnRelease(self)
-	self:SetDisabled(false)
-	self.pullout = nil
-	self.frame:SetParent(nil)
-	self.frame:ClearAllPoints()
-	self.frame:Hide()
-end
-
--- exported
--- NOTE: this is called by a Dropdown-Pullout.
---       Do not call this method directly
-function ItemBase.SetPullout(self, pullout)
-	self.pullout = pullout
-
-	self.frame:SetParent(nil)
-	self.frame:SetParent(pullout.itemFrame)
-	self.parent = pullout.itemFrame
-	fixlevels(pullout.itemFrame, pullout.itemFrame:GetChildren())
-end
-
--- exported
-function ItemBase.SetText(self, text)
-	self.text:SetText(text or "")
-end
-
--- exported
-function ItemBase.GetText(self)
-	return self.text:GetText()
-end
-
--- exported
-function ItemBase.SetPoint(self, ...)
-	self.frame:SetPoint(...)
-end
-
--- exported
-function ItemBase.Show(self)
-	self.frame:Show()
-end
-
--- exported
-function ItemBase.Hide(self)
-	self.frame:Hide()
-end
-
--- exported
-function ItemBase.SetDisabled(self, disabled)
-	self.disabled = disabled
-	if disabled then
-		self.useHighlight = false
-		self.text:SetTextColor(.5, .5, .5)
-	else
-		self.useHighlight = true
-		self.text:SetTextColor(1, 1, 1)
-	end
-end
-
--- exported
--- NOTE: this is called by a Dropdown-Pullout.
---       Do not call this method directly
-function ItemBase.SetOnLeave(self, func)
-	self.specialOnLeave = func
-end
-
--- exported
--- NOTE: this is called by a Dropdown-Pullout.
---       Do not call this method directly
-function ItemBase.SetOnEnter(self, func)
-	self.specialOnEnter = func
-end
-
-function ItemBase.Create(type)
-	-- NOTE: Most of the following code is copied from AceGUI-3.0/Dropdown widget
-	local count = AceGUI:GetNextWidgetNum(type)
-	local frame = CreateFrame("Button", "AceGUI30DropDownItem"..count)
-	local self = {}
-	self.frame = frame
-	frame.obj = self
-	self.type = type
-
-	self.useHighlight = true
-
-	frame:SetHeight(17)
-	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-
-	local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
-	text:SetTextColor(1,1,1)
-	text:SetJustifyH("LEFT")
-	text:SetPoint("TOPLEFT",frame,"TOPLEFT",18,0)
-	text:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-8,0)
-	self.text = text
-
-	local highlight = frame:CreateTexture(nil, "OVERLAY")
-	highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
-	highlight:SetBlendMode("ADD")
-	highlight:SetHeight(14)
-	highlight:ClearAllPoints()
-	highlight:SetPoint("RIGHT",frame,"RIGHT",-3,0)
-	highlight:SetPoint("LEFT",frame,"LEFT",5,0)
-	highlight:Hide()
-	self.highlight = highlight
-
-	local check = frame:CreateTexture("OVERLAY")
-	check:SetWidth(16)
-	check:SetHeight(16)
-	check:SetPoint("LEFT",frame,"LEFT",3,-1)
-	check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
-	check:Hide()
-	self.check = check
-
-	local sub = frame:CreateTexture("OVERLAY")
-	sub:SetWidth(16)
-	sub:SetHeight(16)
-	sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
-	sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow")
-	sub:Hide()
-	self.sub = sub
-
-	frame:SetScript("OnEnter", ItemBase.Frame_OnEnter)
-	frame:SetScript("OnLeave", ItemBase.Frame_OnLeave)
-
-	self.OnAcquire = ItemBase.OnAcquire
-	self.OnRelease = ItemBase.OnRelease
-
-	self.SetPullout = ItemBase.SetPullout
-	self.GetText    = ItemBase.GetText
-	self.SetText    = ItemBase.SetText
-	self.SetDisabled = ItemBase.SetDisabled
-
-	self.SetPoint   = ItemBase.SetPoint
-	self.Show       = ItemBase.Show
-	self.Hide       = ItemBase.Hide
-
-	self.SetOnLeave = ItemBase.SetOnLeave
-	self.SetOnEnter = ItemBase.SetOnEnter
-
-	return self
-end
-
--- Register a dummy LibStub library to retrieve the ItemBase, so other addons can use it.
-local IBLib = LibStub:NewLibrary("AceGUI-3.0-DropDown-ItemBase", ItemBase.version)
-if IBLib then
-	IBLib.GetItemBase = function() return ItemBase end
-end
-
---[[
-	Template for items:
-
--- Item:
---
-do
-	local widgetType = "Dropdown-Item-"
-	local widgetVersion = 1
-
-	local function Constructor()
-		local self = ItemBase.Create(widgetType)
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
-end
---]]
-
--- Item: Header
--- A single text entry.
--- Special: Different text color and no highlight
-do
-	local widgetType = "Dropdown-Item-Header"
-	local widgetVersion = 1
-
-	local function OnEnter(this)
-		local self = this.obj
-		self:Fire("OnEnter")
-
-		if self.specialOnEnter then
-			self.specialOnEnter(self)
-		end
-	end
-
-	local function OnLeave(this)
-		local self = this.obj
-		self:Fire("OnLeave")
-
-		if self.specialOnLeave then
-			self.specialOnLeave(self)
-		end
-	end
-
-	-- exported, override
-	local function SetDisabled(self, disabled)
-		ItemBase.SetDisabled(self, disabled)
-		if not disabled then
-			self.text:SetTextColor(1, 1, 0)
-		end
-	end
-
-	local function Constructor()
-		local self = ItemBase.Create(widgetType)
-
-		self.SetDisabled = SetDisabled
-
-		self.frame:SetScript("OnEnter", OnEnter)
-		self.frame:SetScript("OnLeave", OnLeave)
-
-		self.text:SetTextColor(1, 1, 0)
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
-end
-
--- Item: Execute
--- A simple button
-do
-	local widgetType = "Dropdown-Item-Execute"
-	local widgetVersion = 1
-
-	local function Frame_OnClick(this, button)
-		local self = this.obj
-		if self.disabled then return end
-		self:Fire("OnClick")
-		if self.pullout then
-			self.pullout:Close()
-		end
-	end
-
-	local function Constructor()
-		local self = ItemBase.Create(widgetType)
-
-		self.frame:SetScript("OnClick", Frame_OnClick)
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
-end
-
--- Item: Toggle
--- Some sort of checkbox for dropdown menus.
--- Does not close the pullout on click.
-do
-	local widgetType = "Dropdown-Item-Toggle"
-	local widgetVersion = 3
-
-	local function UpdateToggle(self)
-		if self.value then
-			self.check:Show()
-		else
-			self.check:Hide()
-		end
-	end
-
-	local function OnRelease(self)
-		ItemBase.OnRelease(self)
-		self:SetValue(nil)
-	end
-
-	local function Frame_OnClick(this, button)
-		local self = this.obj
-		if self.disabled then return end
-		self.value = not self.value
-		if self.value then
-			PlaySound("igMainMenuOptionCheckBoxOn")
-		else
-			PlaySound("igMainMenuOptionCheckBoxOff")
-		end
-		UpdateToggle(self)
-		self:Fire("OnValueChanged", self.value)
-	end
-
-	-- exported
-	local function SetValue(self, value)
-		self.value = value
-		UpdateToggle(self)
-	end
-
-	-- exported
-	local function GetValue(self)
-		return self.value
-	end
-
-	local function Constructor()
-		local self = ItemBase.Create(widgetType)
-
-		self.frame:SetScript("OnClick", Frame_OnClick)
-
-		self.SetValue = SetValue
-		self.GetValue = GetValue
-		self.OnRelease = OnRelease
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
-end
-
--- Item: Menu
--- Shows a submenu on mouse over
--- Does not close the pullout on click
-do
-	local widgetType = "Dropdown-Item-Menu"
-	local widgetVersion = 2
-
-	local function OnEnter(this)
-		local self = this.obj
-		self:Fire("OnEnter")
-
-		if self.specialOnEnter then
-			self.specialOnEnter(self)
-		end
-
-		self.highlight:Show()
-
-		if not self.disabled and self.submenu then
-			self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100)
-		end
-	end
-
-	local function OnHide(this)
-		local self = this.obj
-		if self.submenu then
-			self.submenu:Close()
-		end
-	end
-
-	-- exported
-	local function SetMenu(self, menu)
-		assert(menu.type == "Dropdown-Pullout")
-		self.submenu = menu
-	end
-
-	-- exported
-	local function CloseMenu(self)
-		self.submenu:Close()
-	end
-
-	local function Constructor()
-		local self = ItemBase.Create(widgetType)
-
-		self.sub:Show()
-
-		self.frame:SetScript("OnEnter", OnEnter)
-		self.frame:SetScript("OnHide", OnHide)
-
-		self.SetMenu   = SetMenu
-		self.CloseMenu = CloseMenu
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
-end
-
--- Item: Separator
--- A single line to separate items
-do
-	local widgetType = "Dropdown-Item-Separator"
-	local widgetVersion = 1
-
-	-- exported, override
-	local function SetDisabled(self, disabled)
-		ItemBase.SetDisabled(self, disabled)
-		self.useHighlight = false
-	end
-
-	local function Constructor()
-		local self = ItemBase.Create(widgetType)
-
-		self.SetDisabled = SetDisabled
-
-		local line = self.frame:CreateTexture(nil, "OVERLAY")
-		line:SetHeight(1)
-		line:SetTexture(.5, .5, .5)
-		line:SetPoint("LEFT", self.frame, "LEFT", 10, 0)
-		line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0)
-
-		self.text:Hide()
-
-		self.useHighlight = false
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
-end
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
deleted file mode 100644
index 0dd3bff..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
+++ /dev/null
@@ -1,737 +0,0 @@
---[[ $Id: AceGUIWidget-DropDown.lua 1116 2014-10-12 08:15:46Z nevcairiel $ ]]--
-local AceGUI = LibStub("AceGUI-3.0")
-
--- Lua APIs
-local min, max, floor = math.min, math.max, math.floor
-local select, pairs, ipairs, type = select, pairs, ipairs, type
-local tsort = table.sort
-
--- WoW APIs
-local PlaySound = PlaySound
-local UIParent, CreateFrame = UIParent, CreateFrame
-local _G = _G
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: CLOSE
-
-local function fixlevels(parent,...)
-	local i = 1
-	local child = select(i, ...)
-	while child do
-		child:SetFrameLevel(parent:GetFrameLevel()+1)
-		fixlevels(child, child:GetChildren())
-		i = i + 1
-		child = select(i, ...)
-	end
-end
-
-local function fixstrata(strata, parent, ...)
-	local i = 1
-	local child = select(i, ...)
-	parent:SetFrameStrata(strata)
-	while child do
-		fixstrata(strata, child, child:GetChildren())
-		i = i + 1
-		child = select(i, ...)
-	end
-end
-
-do
-	local widgetType = "Dropdown-Pullout"
-	local widgetVersion = 3
-
-	--[[ Static data ]]--
-
-	local backdrop = {
-		bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
-		edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
-		edgeSize = 32,
-		tileSize = 32,
-		tile = true,
-		insets = { left = 11, right = 12, top = 12, bottom = 11 },
-	}
-	local sliderBackdrop  = {
-		bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
-		edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
-		tile = true, tileSize = 8, edgeSize = 8,
-		insets = { left = 3, right = 3, top = 3, bottom = 3 }
-	}
-
-	local defaultWidth = 200
-	local defaultMaxHeight = 600
-
-	--[[ UI Event Handlers ]]--
-
-	-- HACK: This should be no part of the pullout, but there
-	--       is no other 'clean' way to response to any item-OnEnter
-	--       Used to close Submenus when an other item is entered
-	local function OnEnter(item)
-		local self = item.pullout
-		for k, v in ipairs(self.items) do
-			if v.CloseMenu and v ~= item then
-				v:CloseMenu()
-			end
-		end
-	end
-
-	-- See the note in Constructor() for each scroll related function
-	local function OnMouseWheel(this, value)
-		this.obj:MoveScroll(value)
-	end
-
-	local function OnScrollValueChanged(this, value)
-		this.obj:SetScroll(value)
-	end
-
-	local function OnSizeChanged(this)
-		this.obj:FixScroll()
-	end
-
-	--[[ Exported methods ]]--
-
-	-- exported
-	local function SetScroll(self, value)
-		local status = self.scrollStatus
-		local frame, child = self.scrollFrame, self.itemFrame
-		local height, viewheight = frame:GetHeight(), child:GetHeight()
-
-		local offset
-		if height > viewheight then
-			offset = 0
-		else
-			offset = floor((viewheight - height) / 1000 * value)
-		end
-		child:ClearAllPoints()
-		child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
-		child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset)
-		status.offset = offset
-		status.scrollvalue = value
-	end
-
-	-- exported
-	local function MoveScroll(self, value)
-		local status = self.scrollStatus
-		local frame, child = self.scrollFrame, self.itemFrame
-		local height, viewheight = frame:GetHeight(), child:GetHeight()
-
-		if height > viewheight then
-			self.slider:Hide()
-		else
-			self.slider:Show()
-			local diff = height - viewheight
-			local delta = 1
-			if value < 0 then
-				delta = -1
-			end
-			self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
-		end
-	end
-
-	-- exported
-	local function FixScroll(self)
-		local status = self.scrollStatus
-		local frame, child = self.scrollFrame, self.itemFrame
-		local height, viewheight = frame:GetHeight(), child:GetHeight()
-		local offset = status.offset or 0
-
-		if viewheight < height then
-			self.slider:Hide()
-			child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset)
-			self.slider:SetValue(0)
-		else
-			self.slider:Show()
-			local value = (offset / (viewheight - height) * 1000)
-			if value > 1000 then value = 1000 end
-			self.slider:SetValue(value)
-			self:SetScroll(value)
-			if value < 1000 then
-				child:ClearAllPoints()
-				child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
-				child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -12, offset)
-				status.offset = offset
-			end
-		end
-	end
-
-	-- exported, AceGUI callback
-	local function OnAcquire(self)
-		self.frame:SetParent(UIParent)
-		--self.itemFrame:SetToplevel(true)
-	end
-
-	-- exported, AceGUI callback
-	local function OnRelease(self)
-		self:Clear()
-		self.frame:ClearAllPoints()
-		self.frame:Hide()
-	end
-
-	-- exported
-	local function AddItem(self, item)
-		self.items[#self.items + 1] = item
-
-		local h = #self.items * 16
-		self.itemFrame:SetHeight(h)
-		self.frame:SetHeight(min(h + 34, self.maxHeight)) -- +34: 20 for scrollFrame placement (10 offset) and +14 for item placement
-
-		item.frame:SetPoint("LEFT", self.itemFrame, "LEFT")
-		item.frame:SetPoint("RIGHT", self.itemFrame, "RIGHT")
-
-		item:SetPullout(self)
-		item:SetOnEnter(OnEnter)
-	end
-
-	-- exported
-	local function Open(self, point, relFrame, relPoint, x, y)
-		local items = self.items
-		local frame = self.frame
-		local itemFrame = self.itemFrame
-
-		frame:SetPoint(point, relFrame, relPoint, x, y)
-
-
-		local height = 8
-		for i, item in pairs(items) do
-			if i == 1 then
-				item:SetPoint("TOP", itemFrame, "TOP", 0, -2)
-			else
-				item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
-			end
-
-			item:Show()
-
-			height = height + 16
-		end
-		itemFrame:SetHeight(height)
-		fixstrata("TOOLTIP", frame, frame:GetChildren())
-		frame:Show()
-		self:Fire("OnOpen")
-	end
-
-	-- exported
-	local function Close(self)
-		self.frame:Hide()
-		self:Fire("OnClose")
-	end
-
-	-- exported
-	local function Clear(self)
-		local items = self.items
-		for i, item in pairs(items) do
-			AceGUI:Release(item)
-			items[i] = nil
-		end
-	end
-
-	-- exported
-	local function IterateItems(self)
-		return ipairs(self.items)
-	end
-
-	-- exported
-	local function SetHideOnLeave(self, val)
-		self.hideOnLeave = val
-	end
-
-	-- exported
-	local function SetMaxHeight(self, height)
-		self.maxHeight = height or defaultMaxHeight
-		if self.frame:GetHeight() > height then
-			self.frame:SetHeight(height)
-		elseif (self.itemFrame:GetHeight() + 34) < height then
-			self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem
-		end
-	end
-
-	-- exported
-	local function GetRightBorderWidth(self)
-		return 6 + (self.slider:IsShown() and 12 or 0)
-	end
-
-	-- exported
-	local function GetLeftBorderWidth(self)
-		return 6
-	end
-
-	--[[ Constructor ]]--
-
-	local function Constructor()
-		local count = AceGUI:GetNextWidgetNum(widgetType)
-		local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
-		local self = {}
-		self.count = count
-		self.type = widgetType
-		self.frame = frame
-		frame.obj = self
-
-		self.OnAcquire = OnAcquire
-		self.OnRelease = OnRelease
-
-		self.AddItem = AddItem
-		self.Open    = Open
-		self.Close   = Close
-		self.Clear   = Clear
-		self.IterateItems = IterateItems
-		self.SetHideOnLeave = SetHideOnLeave
-
-		self.SetScroll  = SetScroll
-		self.MoveScroll = MoveScroll
-		self.FixScroll  = FixScroll
-
-		self.SetMaxHeight = SetMaxHeight
-		self.GetRightBorderWidth = GetRightBorderWidth
-		self.GetLeftBorderWidth = GetLeftBorderWidth
-
-		self.items = {}
-
-		self.scrollStatus = {
-			scrollvalue = 0,
-		}
-
-		self.maxHeight = defaultMaxHeight
-
-		frame:SetBackdrop(backdrop)
-		frame:SetBackdropColor(0, 0, 0)
-		frame:SetFrameStrata("FULLSCREEN_DIALOG")
-		frame:SetClampedToScreen(true)
-		frame:SetWidth(defaultWidth)
-		frame:SetHeight(self.maxHeight)
-		--frame:SetToplevel(true)
-
-		-- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame
-		local scrollFrame = CreateFrame("ScrollFrame", nil, frame)
-		local itemFrame = CreateFrame("Frame", nil, scrollFrame)
-
-		self.scrollFrame = scrollFrame
-		self.itemFrame = itemFrame
-
-		scrollFrame.obj = self
-		itemFrame.obj = self
-
-		local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
-		slider:SetOrientation("VERTICAL")
-		slider:SetHitRectInsets(0, 0, -10, 0)
-		slider:SetBackdrop(sliderBackdrop)
-		slider:SetWidth(8)
-		slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Vertical")
-		slider:SetFrameStrata("FULLSCREEN_DIALOG")
-		self.slider = slider
-		slider.obj = self
-
-		scrollFrame:SetScrollChild(itemFrame)
-		scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
-		scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12)
-		scrollFrame:EnableMouseWheel(true)
-		scrollFrame:SetScript("OnMouseWheel", OnMouseWheel)
-		scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
-		scrollFrame:SetToplevel(true)
-		scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-
-		itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
-		itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0)
-		itemFrame:SetHeight(400)
-		itemFrame:SetToplevel(true)
-		itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-
-		slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0)
-		slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0)
-		slider:SetScript("OnValueChanged", OnScrollValueChanged)
-		slider:SetMinMaxValues(0, 1000)
-		slider:SetValueStep(1)
-		slider:SetValue(0)
-
-		scrollFrame:Show()
-		itemFrame:Show()
-		slider:Hide()
-
-		self:FixScroll()
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
-end
-
-do
-	local widgetType = "Dropdown"
-	local widgetVersion = 30
-
-	--[[ Static data ]]--
-
-	--[[ UI event handler ]]--
-
-	local function Control_OnEnter(this)
-		this.obj.button:LockHighlight()
-		this.obj:Fire("OnEnter")
-	end
-
-	local function Control_OnLeave(this)
-		this.obj.button:UnlockHighlight()
-		this.obj:Fire("OnLeave")
-	end
-
-	local function Dropdown_OnHide(this)
-		local self = this.obj
-		if self.open then
-			self.pullout:Close()
-		end
-	end
-
-	local function Dropdown_TogglePullout(this)
-		local self = this.obj
-		PlaySound("igMainMenuOptionCheckBoxOn") -- missleading name, but the Blizzard code uses this sound
-		if self.open then
-			self.open = nil
-			self.pullout:Close()
-			AceGUI:ClearFocus()
-		else
-			self.open = true
-			self.pullout:SetWidth(self.pulloutWidth or self.frame:GetWidth())
-			self.pullout:Open("TOPLEFT", self.frame, "BOTTOMLEFT", 0, self.label:IsShown() and -2 or 0)
-			AceGUI:SetFocus(self)
-		end
-	end
-
-	local function OnPulloutOpen(this)
-		local self = this.userdata.obj
-		local value = self.value
-
-		if not self.multiselect then
-			for i, item in this:IterateItems() do
-				item:SetValue(item.userdata.value == value)
-			end
-		end
-
-		self.open = true
-		self:Fire("OnOpened")
-	end
-
-	local function OnPulloutClose(this)
-		local self = this.userdata.obj
-		self.open = nil
-		self:Fire("OnClosed")
-	end
-
-	local function ShowMultiText(self)
-		local text
-		for i, widget in self.pullout:IterateItems() do
-			if widget.type == "Dropdown-Item-Toggle" then
-				if widget:GetValue() then
-					if text then
-						text = text..", "..widget:GetText()
-					else
-						text = widget:GetText()
-					end
-				end
-			end
-		end
-		self:SetText(text)
-	end
-
-	local function OnItemValueChanged(this, event, checked)
-		local self = this.userdata.obj
-
-		if self.multiselect then
-			self:Fire("OnValueChanged", this.userdata.value, checked)
-			ShowMultiText(self)
-		else
-			if checked then
-				self:SetValue(this.userdata.value)
-				self:Fire("OnValueChanged", this.userdata.value)
-			else
-				this:SetValue(true)
-			end
-			if self.open then
-				self.pullout:Close()
-			end
-		end
-	end
-
-	--[[ Exported methods ]]--
-
-	-- exported, AceGUI callback
-	local function OnAcquire(self)
-		local pullout = AceGUI:Create("Dropdown-Pullout")
-		self.pullout = pullout
-		pullout.userdata.obj = self
-		pullout:SetCallback("OnClose", OnPulloutClose)
-		pullout:SetCallback("OnOpen", OnPulloutOpen)
-		self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1)
-		fixlevels(self.pullout.frame, self.pullout.frame:GetChildren())
-
-		self:SetHeight(44)
-		self:SetWidth(200)
-		self:SetLabel()
-		self:SetPulloutWidth(nil)
-	end
-
-	-- exported, AceGUI callback
-	local function OnRelease(self)
-		if self.open then
-			self.pullout:Close()
-		end
-		AceGUI:Release(self.pullout)
-		self.pullout = nil
-
-		self:SetText("")
-		self:SetDisabled(false)
-		self:SetMultiselect(false)
-
-		self.value = nil
-		self.list = nil
-		self.open = nil
-		self.hasClose = nil
-
-		self.frame:ClearAllPoints()
-		self.frame:Hide()
-	end
-
-	-- exported
-	local function SetDisabled(self, disabled)
-		self.disabled = disabled
-		if disabled then
-			self.text:SetTextColor(0.5,0.5,0.5)
-			self.button:Disable()
-			self.button_cover:Disable()
-			self.label:SetTextColor(0.5,0.5,0.5)
-		else
-			self.button:Enable()
-			self.button_cover:Enable()
-			self.label:SetTextColor(1,.82,0)
-			self.text:SetTextColor(1,1,1)
-		end
-	end
-
-	-- exported
-	local function ClearFocus(self)
-		if self.open then
-			self.pullout:Close()
-		end
-	end
-
-	-- exported
-	local function SetText(self, text)
-		self.text:SetText(text or "")
-	end
-
-	-- exported
-	local function SetLabel(self, text)
-		if text and text ~= "" then
-			self.label:SetText(text)
-			self.label:Show()
-			self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,-14)
-			self:SetHeight(40)
-			self.alignoffset = 26
-		else
-			self.label:SetText("")
-			self.label:Hide()
-			self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,0)
-			self:SetHeight(26)
-			self.alignoffset = 12
-		end
-	end
-
-	-- exported
-	local function SetValue(self, value)
-		if self.list then
-			self:SetText(self.list[value] or "")
-		end
-		self.value = value
-	end
-
-	-- exported
-	local function GetValue(self)
-		return self.value
-	end
-
-	-- exported
-	local function SetItemValue(self, item, value)
-		if not self.multiselect then return end
-		for i, widget in self.pullout:IterateItems() do
-			if widget.userdata.value == item then
-				if widget.SetValue then
-					widget:SetValue(value)
-				end
-			end
-		end
-		ShowMultiText(self)
-	end
-
-	-- exported
-	local function SetItemDisabled(self, item, disabled)
-		for i, widget in self.pullout:IterateItems() do
-			if widget.userdata.value == item then
-				widget:SetDisabled(disabled)
-			end
-		end
-	end
-
-	local function AddListItem(self, value, text, itemType)
-		if not itemType then itemType = "Dropdown-Item-Toggle" end
-		local exists = AceGUI:GetWidgetVersion(itemType)
-		if not exists then error(("The given item type, %q, does not exist within AceGUI-3.0"):format(tostring(itemType)), 2) end
-
-		local item = AceGUI:Create(itemType)
-		item:SetText(text)
-		item.userdata.obj = self
-		item.userdata.value = value
-		item:SetCallback("OnValueChanged", OnItemValueChanged)
-		self.pullout:AddItem(item)
-	end
-
-	local function AddCloseButton(self)
-		if not self.hasClose then
-			local close = AceGUI:Create("Dropdown-Item-Execute")
-			close:SetText(CLOSE)
-			self.pullout:AddItem(close)
-			self.hasClose = true
-		end
-	end
-
-	-- exported
-	local sortlist = {}
-	local function SetList(self, list, order, itemType)
-		self.list = list
-		self.pullout:Clear()
-		self.hasClose = nil
-		if not list then return end
-
-		if type(order) ~= "table" then
-			for v in pairs(list) do
-				sortlist[#sortlist + 1] = v
-			end
-			tsort(sortlist)
-
-			for i, key in ipairs(sortlist) do
-				AddListItem(self, key, list[key], itemType)
-				sortlist[i] = nil
-			end
-		else
-			for i, key in ipairs(order) do
-				AddListItem(self, key, list[key], itemType)
-			end
-		end
-		if self.multiselect then
-			ShowMultiText(self)
-			AddCloseButton(self)
-		end
-	end
-
-	-- exported
-	local function AddItem(self, value, text, itemType)
-		if self.list then
-			self.list[value] = text
-			AddListItem(self, value, text, itemType)
-		end
-	end
-
-	-- exported
-	local function SetMultiselect(self, multi)
-		self.multiselect = multi
-		if multi then
-			ShowMultiText(self)
-			AddCloseButton(self)
-		end
-	end
-
-	-- exported
-	local function GetMultiselect(self)
-		return self.multiselect
-	end
-
-	local function SetPulloutWidth(self, width)
-		self.pulloutWidth = width
-	end
-
-	--[[ Constructor ]]--
-
-	local function Constructor()
-		local count = AceGUI:GetNextWidgetNum(widgetType)
-		local frame = CreateFrame("Frame", nil, UIParent)
-		local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate")
-
-		local self = {}
-		self.type = widgetType
-		self.frame = frame
-		self.dropdown = dropdown
-		self.count = count
-		frame.obj = self
-		dropdown.obj = self
-
-		self.OnRelease   = OnRelease
-		self.OnAcquire   = OnAcquire
-
-		self.ClearFocus  = ClearFocus
-
-		self.SetText     = SetText
-		self.SetValue    = SetValue
-		self.GetValue    = GetValue
-		self.SetList     = SetList
-		self.SetLabel    = SetLabel
-		self.SetDisabled = SetDisabled
-		self.AddItem     = AddItem
-		self.SetMultiselect = SetMultiselect
-		self.GetMultiselect = GetMultiselect
-		self.SetItemValue = SetItemValue
-		self.SetItemDisabled = SetItemDisabled
-		self.SetPulloutWidth = SetPulloutWidth
-
-		self.alignoffset = 26
-
-		frame:SetScript("OnHide",Dropdown_OnHide)
-
-		dropdown:ClearAllPoints()
-		dropdown:SetPoint("TOPLEFT",frame,"TOPLEFT",-15,0)
-		dropdown:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",17,0)
-		dropdown:SetScript("OnHide", nil)
-
-		local left = _G[dropdown:GetName() .. "Left"]
-		local middle = _G[dropdown:GetName() .. "Middle"]
-		local right = _G[dropdown:GetName() .. "Right"]
-
-		middle:ClearAllPoints()
-		right:ClearAllPoints()
-
-		middle:SetPoint("LEFT", left, "RIGHT", 0, 0)
-		middle:SetPoint("RIGHT", right, "LEFT", 0, 0)
-		right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17)
-
-		local button = _G[dropdown:GetName() .. "Button"]
-		self.button = button
-		button.obj = self
-		button:SetScript("OnEnter",Control_OnEnter)
-		button:SetScript("OnLeave",Control_OnLeave)
-		button:SetScript("OnClick",Dropdown_TogglePullout)
-
-		local button_cover = CreateFrame("BUTTON",nil,self.frame)
-		self.button_cover = button_cover
-		button_cover.obj = self
-		button_cover:SetPoint("TOPLEFT",self.frame,"BOTTOMLEFT",0,25)
-		button_cover:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT")
-		button_cover:SetScript("OnEnter",Control_OnEnter)
-		button_cover:SetScript("OnLeave",Control_OnLeave)
-		button_cover:SetScript("OnClick",Dropdown_TogglePullout)
-
-		local text = _G[dropdown:GetName() .. "Text"]
-		self.text = text
-		text.obj = self
-		text:ClearAllPoints()
-		text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2)
-		text:SetPoint("LEFT", left, "LEFT", 25, 2)
-
-		local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
-		label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
-		label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
-		label:SetJustifyH("LEFT")
-		label:SetHeight(18)
-		label:Hide()
-		self.label = label
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
-end
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
deleted file mode 100644
index c67902c..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
+++ /dev/null
@@ -1,261 +0,0 @@
---[[-----------------------------------------------------------------------------
-EditBox Widget
--------------------------------------------------------------------------------]]
-local Type, Version = "EditBox", 25
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local tostring, pairs = tostring, pairs
-
--- WoW APIs
-local PlaySound = PlaySound
-local GetCursorInfo, ClearCursor, GetSpellInfo = GetCursorInfo, ClearCursor, GetSpellInfo
-local CreateFrame, UIParent = CreateFrame, UIParent
-local _G = _G
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: AceGUIEditBoxInsertLink, ChatFontNormal, OKAY
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-if not AceGUIEditBoxInsertLink then
-	-- upgradeable hook
-	hooksecurefunc("ChatEdit_InsertLink", function(...) return _G.AceGUIEditBoxInsertLink(...) end)
-end
-
-function _G.AceGUIEditBoxInsertLink(text)
-	for i = 1, AceGUI:GetWidgetCount(Type) do
-		local editbox = _G["AceGUI-3.0EditBox"..i]
-		if editbox and editbox:IsVisible() and editbox:HasFocus() then
-			editbox:Insert(text)
-			return true
-		end
-	end
-end
-
-local function ShowButton(self)
-	if not self.disablebutton then
-		self.button:Show()
-		self.editbox:SetTextInsets(0, 20, 3, 3)
-	end
-end
-
-local function HideButton(self)
-	self.button:Hide()
-	self.editbox:SetTextInsets(0, 0, 3, 3)
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
-local function Frame_OnShowFocus(frame)
-	frame.obj.editbox:SetFocus()
-	frame:SetScript("OnShow", nil)
-end
-
-local function EditBox_OnEscapePressed(frame)
-	AceGUI:ClearFocus()
-end
-
-local function EditBox_OnEnterPressed(frame)
-	local self = frame.obj
-	local value = frame:GetText()
-	local cancel = self:Fire("OnEnterPressed", value)
-	if not cancel then
-		PlaySound("igMainMenuOptionCheckBoxOn")
-		HideButton(self)
-	end
-end
-
-local function EditBox_OnReceiveDrag(frame)
-	local self = frame.obj
-	local type, id, info = GetCursorInfo()
-	if type == "item" then
-		self:SetText(info)
-		self:Fire("OnEnterPressed", info)
-		ClearCursor()
-	elseif type == "spell" then
-		local name = GetSpellInfo(id, info)
-		self:SetText(name)
-		self:Fire("OnEnterPressed", name)
-		ClearCursor()
-	elseif type == "macro" then
-		local name = GetMacroInfo(id)
-		self:SetText(name)
-		self:Fire("OnEnterPressed", name)
-		ClearCursor()
-	end
-	HideButton(self)
-	AceGUI:ClearFocus()
-end
-
-local function EditBox_OnTextChanged(frame)
-	local self = frame.obj
-	local value = frame:GetText()
-	if tostring(value) ~= tostring(self.lasttext) then
-		self:Fire("OnTextChanged", value)
-		self.lasttext = value
-		ShowButton(self)
-	end
-end
-
-local function EditBox_OnFocusGained(frame)
-	AceGUI:SetFocus(frame.obj)
-end
-
-local function Button_OnClick(frame)
-	local editbox = frame.obj.editbox
-	editbox:ClearFocus()
-	EditBox_OnEnterPressed(editbox)
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		-- height is controlled by SetLabel
-		self:SetWidth(200)
-		self:SetDisabled(false)
-		self:SetLabel()
-		self:SetText()
-		self:DisableButton(false)
-		self:SetMaxLetters(0)
-	end,
-
-	["OnRelease"] = function(self)
-		self:ClearFocus()
-	end,
-
-	["SetDisabled"] = function(self, disabled)
-		self.disabled = disabled
-		if disabled then
-			self.editbox:EnableMouse(false)
-			self.editbox:ClearFocus()
-			self.editbox:SetTextColor(0.5,0.5,0.5)
-			self.label:SetTextColor(0.5,0.5,0.5)
-		else
-			self.editbox:EnableMouse(true)
-			self.editbox:SetTextColor(1,1,1)
-			self.label:SetTextColor(1,.82,0)
-		end
-	end,
-
-	["SetText"] = function(self, text)
-		self.lasttext = text or ""
-		self.editbox:SetText(text or "")
-		self.editbox:SetCursorPosition(0)
-		HideButton(self)
-	end,
-
-	["GetText"] = function(self, text)
-		return self.editbox:GetText()
-	end,
-
-	["SetLabel"] = function(self, text)
-		if text and text ~= "" then
-			self.label:SetText(text)
-			self.label:Show()
-			self.editbox:SetPoint("TOPLEFT",self.frame,"TOPLEFT",7,-18)
-			self:SetHeight(44)
-			self.alignoffset = 30
-		else
-			self.label:SetText("")
-			self.label:Hide()
-			self.editbox:SetPoint("TOPLEFT",self.frame,"TOPLEFT",7,0)
-			self:SetHeight(26)
-			self.alignoffset = 12
-		end
-	end,
-
-	["DisableButton"] = function(self, disabled)
-		self.disablebutton = disabled
-		if disabled then
-			HideButton(self)
-		end
-	end,
-
-	["SetMaxLetters"] = function (self, num)
-		self.editbox:SetMaxLetters(num or 0)
-	end,
-
-	["ClearFocus"] = function(self)
-		self.editbox:ClearFocus()
-		self.frame:SetScript("OnShow", nil)
-	end,
-
-	["SetFocus"] = function(self)
-		self.editbox:SetFocus()
-		if not self.frame:IsShown() then
-			self.frame:SetScript("OnShow", Frame_OnShowFocus)
-		end
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local num  = AceGUI:GetNextWidgetNum(Type)
-	local frame = CreateFrame("Frame", nil, UIParent)
-	frame:Hide()
-
-	local editbox = CreateFrame("EditBox", "AceGUI-3.0EditBox"..num, frame, "InputBoxTemplate")
-	editbox:SetAutoFocus(false)
-	editbox:SetFontObject(ChatFontNormal)
-	editbox:SetScript("OnEnter", Control_OnEnter)
-	editbox:SetScript("OnLeave", Control_OnLeave)
-	editbox:SetScript("OnEscapePressed", EditBox_OnEscapePressed)
-	editbox:SetScript("OnEnterPressed", EditBox_OnEnterPressed)
-	editbox:SetScript("OnTextChanged", EditBox_OnTextChanged)
-	editbox:SetScript("OnReceiveDrag", EditBox_OnReceiveDrag)
-	editbox:SetScript("OnMouseDown", EditBox_OnReceiveDrag)
-	editbox:SetScript("OnEditFocusGained", EditBox_OnFocusGained)
-	editbox:SetTextInsets(0, 0, 3, 3)
-	editbox:SetMaxLetters(256)
-	editbox:SetPoint("BOTTOMLEFT", 6, 0)
-	editbox:SetPoint("BOTTOMRIGHT")
-	editbox:SetHeight(19)
-
-	local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
-	label:SetPoint("TOPLEFT", 0, -2)
-	label:SetPoint("TOPRIGHT", 0, -2)
-	label:SetJustifyH("LEFT")
-	label:SetHeight(18)
-
-	local button = CreateFrame("Button", nil, editbox, "UIPanelButtonTemplate")
-	button:SetWidth(40)
-	button:SetHeight(20)
-	button:SetPoint("RIGHT", -2, 0)
-	button:SetText(OKAY)
-	button:SetScript("OnClick", Button_OnClick)
-	button:Hide()
-
-	local widget = {
-		alignoffset = 30,
-		editbox     = editbox,
-		label       = label,
-		button      = button,
-		frame       = frame,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	editbox.obj, button.obj = widget, widget
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
deleted file mode 100644
index 1aaf3f5..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
+++ /dev/null
@@ -1,78 +0,0 @@
---[[-----------------------------------------------------------------------------
-Heading Widget
--------------------------------------------------------------------------------]]
-local Type, Version = "Heading", 20
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetText()
-		self:SetFullWidth()
-		self:SetHeight(18)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetText"] = function(self, text)
-		self.label:SetText(text or "")
-		if text and text ~= "" then
-			self.left:SetPoint("RIGHT", self.label, "LEFT", -5, 0)
-			self.right:Show()
-		else
-			self.left:SetPoint("RIGHT", -3, 0)
-			self.right:Hide()
-		end
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-	frame:Hide()
-
-	local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontNormal")
-	label:SetPoint("TOP")
-	label:SetPoint("BOTTOM")
-	label:SetJustifyH("CENTER")
-
-	local left = frame:CreateTexture(nil, "BACKGROUND")
-	left:SetHeight(8)
-	left:SetPoint("LEFT", 3, 0)
-	left:SetPoint("RIGHT", label, "LEFT", -5, 0)
-	left:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
-	left:SetTexCoord(0.81, 0.94, 0.5, 1)
-
-	local right = frame:CreateTexture(nil, "BACKGROUND")
-	right:SetHeight(8)
-	right:SetPoint("RIGHT", -3, 0)
-	right:SetPoint("LEFT", label, "RIGHT", 5, 0)
-	right:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
-	right:SetTexCoord(0.81, 0.94, 0.5, 1)
-
-	local widget = {
-		label = label,
-		left  = left,
-		right = right,
-		frame = frame,
-		type  = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
deleted file mode 100644
index 8d01b54..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
+++ /dev/null
@@ -1,144 +0,0 @@
---[[-----------------------------------------------------------------------------
-Icon Widget
--------------------------------------------------------------------------------]]
-local Type, Version = "Icon", 21
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local select, pairs, print = select, pairs, print
-
--- WoW APIs
-local CreateFrame, UIParent, GetBuildInfo = CreateFrame, UIParent, GetBuildInfo
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
-local function Button_OnClick(frame, button)
-	frame.obj:Fire("OnClick", button)
-	AceGUI:ClearFocus()
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetHeight(110)
-		self:SetWidth(110)
-		self:SetLabel()
-		self:SetImage(nil)
-		self:SetImageSize(64, 64)
-		self:SetDisabled(false)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetLabel"] = function(self, text)
-		if text and text ~= "" then
-			self.label:Show()
-			self.label:SetText(text)
-			self:SetHeight(self.image:GetHeight() + 25)
-		else
-			self.label:Hide()
-			self:SetHeight(self.image:GetHeight() + 10)
-		end
-	end,
-
-	["SetImage"] = function(self, path, ...)
-		local image = self.image
-		image:SetTexture(path)
-
-		if image:GetTexture() then
-			local n = select("#", ...)
-			if n == 4 or n == 8 then
-				image:SetTexCoord(...)
-			else
-				image:SetTexCoord(0, 1, 0, 1)
-			end
-		end
-	end,
-
-	["SetImageSize"] = function(self, width, height)
-		self.image:SetWidth(width)
-		self.image:SetHeight(height)
-		--self.frame:SetWidth(width + 30)
-		if self.label:IsShown() then
-			self:SetHeight(height + 25)
-		else
-			self:SetHeight(height + 10)
-		end
-	end,
-
-	["SetDisabled"] = function(self, disabled)
-		self.disabled = disabled
-		if disabled then
-			self.frame:Disable()
-			self.label:SetTextColor(0.5, 0.5, 0.5)
-			self.image:SetVertexColor(0.5, 0.5, 0.5, 0.5)
-		else
-			self.frame:Enable()
-			self.label:SetTextColor(1, 1, 1)
-			self.image:SetVertexColor(1, 1, 1, 1)
-		end
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Button", nil, UIParent)
-	frame:Hide()
-
-	frame:EnableMouse(true)
-	frame:SetScript("OnEnter", Control_OnEnter)
-	frame:SetScript("OnLeave", Control_OnLeave)
-	frame:SetScript("OnClick", Button_OnClick)
-
-	local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontHighlight")
-	label:SetPoint("BOTTOMLEFT")
-	label:SetPoint("BOTTOMRIGHT")
-	label:SetJustifyH("CENTER")
-	label:SetJustifyV("TOP")
-	label:SetHeight(18)
-
-	local image = frame:CreateTexture(nil, "BACKGROUND")
-	image:SetWidth(64)
-	image:SetHeight(64)
-	image:SetPoint("TOP", 0, -5)
-
-	local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
-	highlight:SetAllPoints(image)
-	highlight:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight")
-	highlight:SetTexCoord(0, 1, 0.23, 0.77)
-	highlight:SetBlendMode("ADD")
-
-	local widget = {
-		label = label,
-		image = image,
-		frame = frame,
-		type  = Type
-	}
-	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
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
deleted file mode 100644
index 9e06049..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
+++ /dev/null
@@ -1,101 +0,0 @@
---[[-----------------------------------------------------------------------------
-InteractiveLabel Widget
--------------------------------------------------------------------------------]]
-local Type, Version = "InteractiveLabel", 20
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local select, pairs = select, pairs
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontHighlightSmall
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
-local function Label_OnClick(frame, button)
-	frame.obj:Fire("OnClick", button)
-	AceGUI:ClearFocus()
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:LabelOnAcquire()
-		self:SetHighlight()
-		self:SetHighlightTexCoord()
-		self:SetDisabled(false)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetHighlight"] = function(self, ...)
-		self.highlight:SetTexture(...)
-	end,
-
-	["SetHighlightTexCoord"] = function(self, ...)
-		local c = select("#", ...)
-		if c == 4 or c == 8 then
-			self.highlight:SetTexCoord(...)
-		else
-			self.highlight:SetTexCoord(0, 1, 0, 1)
-		end
-	end,
-
-	["SetDisabled"] = function(self,disabled)
-		self.disabled = disabled
-		if disabled then
-			self.frame:EnableMouse(false)
-			self.label:SetTextColor(0.5, 0.5, 0.5)
-		else
-			self.frame:EnableMouse(true)
-			self.label:SetTextColor(1, 1, 1)
-		end
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	-- create a Label type that we will hijack
-	local label = AceGUI:Create("Label")
-
-	local frame = label.frame
-	frame:EnableMouse(true)
-	frame:SetScript("OnEnter", Control_OnEnter)
-	frame:SetScript("OnLeave", Control_OnLeave)
-	frame:SetScript("OnMouseDown", Label_OnClick)
-
-	local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
-	highlight:SetTexture(nil)
-	highlight:SetAllPoints()
-	highlight:SetBlendMode("ADD")
-
-	label.highlight = highlight
-	label.type = Type
-	label.LabelOnAcquire = label.OnAcquire
-	for method, func in pairs(methods) do
-		label[method] = func
-	end
-
-	return label
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
-
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
deleted file mode 100644
index 7dccc64..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
+++ /dev/null
@@ -1,239 +0,0 @@
---[[-----------------------------------------------------------------------------
-Keybinding Widget
-Set Keybindings in the Config UI.
--------------------------------------------------------------------------------]]
-local Type, Version = "Keybinding", 24
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: NOT_BOUND
-
-local wowMoP
-do
-	local _, _, _, interface = GetBuildInfo()
-	wowMoP = (interface >= 50000)
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
-local function Keybinding_OnClick(frame, button)
-	if button == "LeftButton" or button == "RightButton" then
-		local self = frame.obj
-		if self.waitingForKey then
-			frame:EnableKeyboard(false)
-			self.msgframe:Hide()
-			frame:UnlockHighlight()
-			self.waitingForKey = nil
-		else
-			frame:EnableKeyboard(true)
-			self.msgframe:Show()
-			frame:LockHighlight()
-			self.waitingForKey = true
-		end
-	end
-	AceGUI:ClearFocus()
-end
-
-local ignoreKeys = {
-	["BUTTON1"] = true, ["BUTTON2"] = true,
-	["UNKNOWN"] = true,
-	["LSHIFT"] = true, ["LCTRL"] = true, ["LALT"] = true,
-	["RSHIFT"] = true, ["RCTRL"] = true, ["RALT"] = true,
-}
-local function Keybinding_OnKeyDown(frame, key)
-	local self = frame.obj
-	if self.waitingForKey then
-		local keyPressed = key
-		if keyPressed == "ESCAPE" then
-			keyPressed = ""
-		else
-			if ignoreKeys[keyPressed] then return end
-			if IsShiftKeyDown() then
-				keyPressed = "SHIFT-"..keyPressed
-			end
-			if IsControlKeyDown() then
-				keyPressed = "CTRL-"..keyPressed
-			end
-			if IsAltKeyDown() then
-				keyPressed = "ALT-"..keyPressed
-			end
-		end
-
-		frame:EnableKeyboard(false)
-		self.msgframe:Hide()
-		frame:UnlockHighlight()
-		self.waitingForKey = nil
-
-		if not self.disabled then
-			self:SetKey(keyPressed)
-			self:Fire("OnKeyChanged", keyPressed)
-		end
-	end
-end
-
-local function Keybinding_OnMouseDown(frame, button)
-	if button == "LeftButton" or button == "RightButton" then
-		return
-	elseif button == "MiddleButton" then
-		button = "BUTTON3"
-	elseif button == "Button4" then
-		button = "BUTTON4"
-	elseif button == "Button5" then
-		button = "BUTTON5"
-	end
-	Keybinding_OnKeyDown(frame, button)
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetWidth(200)
-		self:SetLabel("")
-		self:SetKey("")
-		self.waitingForKey = nil
-		self.msgframe:Hide()
-		self:SetDisabled(false)
-		self.button:EnableKeyboard(false)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetDisabled"] = function(self, disabled)
-		self.disabled = disabled
-		if disabled then
-			self.button:Disable()
-			self.label:SetTextColor(0.5,0.5,0.5)
-		else
-			self.button:Enable()
-			self.label:SetTextColor(1,1,1)
-		end
-	end,
-
-	["SetKey"] = function(self, key)
-		if (key or "") == "" then
-			self.button:SetText(NOT_BOUND)
-			self.button:SetNormalFontObject("GameFontNormal")
-		else
-			self.button:SetText(key)
-			self.button:SetNormalFontObject("GameFontHighlight")
-		end
-	end,
-
-	["GetKey"] = function(self)
-		local key = self.button:GetText()
-		if key == NOT_BOUND then
-			key = nil
-		end
-		return key
-	end,
-
-	["SetLabel"] = function(self, label)
-		self.label:SetText(label or "")
-		if (label or "") == "" then
-			self.alignoffset = nil
-			self:SetHeight(24)
-		else
-			self.alignoffset = 30
-			self:SetHeight(44)
-		end
-	end,
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-
-local ControlBackdrop  = {
-	bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
-	edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
-	tile = true, tileSize = 16, edgeSize = 16,
-	insets = { left = 3, right = 3, top = 3, bottom = 3 }
-}
-
-local function keybindingMsgFixWidth(frame)
-	frame:SetWidth(frame.msg:GetWidth() + 10)
-	frame:SetScript("OnUpdate", nil)
-end
-
-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")
-
-	button:EnableMouse(true)
-	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:SetPoint("BOTTOMLEFT")
-	button:SetPoint("BOTTOMRIGHT")
-	button:SetHeight(24)
-	button:EnableKeyboard(false)
-
-	local text = button:GetFontString()
-	text:SetPoint("LEFT", 7, 0)
-	text:SetPoint("RIGHT", -7, 0)
-
-	local label = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
-	label:SetPoint("TOPLEFT")
-	label:SetPoint("TOPRIGHT")
-	label:SetJustifyH("CENTER")
-	label:SetHeight(18)
-
-	local msgframe = CreateFrame("Frame", nil, UIParent)
-	msgframe:SetHeight(30)
-	msgframe:SetBackdrop(ControlBackdrop)
-	msgframe:SetBackdropColor(0,0,0)
-	msgframe:SetFrameStrata("FULLSCREEN_DIALOG")
-	msgframe:SetFrameLevel(1000)
-	msgframe:SetToplevel(true)
-
-	local msg = msgframe:CreateFontString(nil, "OVERLAY", "GameFontNormal")
-	msg:SetText("Press a key to bind, ESC to clear the binding or click the button again to cancel.")
-	msgframe.msg = msg
-	msg:SetPoint("TOPLEFT", 5, -5)
-	msgframe:SetScript("OnUpdate", keybindingMsgFixWidth)
-	msgframe:SetPoint("BOTTOM", button, "TOP")
-	msgframe:Hide()
-
-	local widget = {
-		button      = button,
-		label       = label,
-		msgframe    = msgframe,
-		frame       = frame,
-		alignoffset = 30,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	button.obj = widget
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
deleted file mode 100644
index 23897d5..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
+++ /dev/null
@@ -1,166 +0,0 @@
---[[-----------------------------------------------------------------------------
-Label Widget
-Displays text and optionally an icon.
--------------------------------------------------------------------------------]]
-local Type, Version = "Label", 23
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local max, select, pairs = math.max, select, pairs
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontHighlightSmall
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-
-local function UpdateImageAnchor(self)
-	if self.resizing then return end
-	local frame = self.frame
-	local width = frame.width or frame:GetWidth() or 0
-	local image = self.image
-	local label = self.label
-	local height
-
-	label:ClearAllPoints()
-	image:ClearAllPoints()
-
-	if self.imageshown then
-		local imagewidth = image:GetWidth()
-		if (width - imagewidth) < 200 or (label:GetText() or "") == "" then
-			-- image goes on top centered when less than 200 width for the text, or if there is no text
-			image:SetPoint("TOP")
-			label:SetPoint("TOP", image, "BOTTOM")
-			label:SetPoint("LEFT")
-			label:SetWidth(width)
-			height = image:GetHeight() + label:GetHeight()
-		else
-			-- image on the left
-			image:SetPoint("TOPLEFT")
-			if image:GetHeight() > label:GetHeight() then
-				label:SetPoint("LEFT", image, "RIGHT", 4, 0)
-			else
-				label:SetPoint("TOPLEFT", image, "TOPRIGHT", 4, 0)
-			end
-			label:SetWidth(width - imagewidth - 4)
-			height = max(image:GetHeight(), label:GetHeight())
-		end
-	else
-		-- no image shown
-		label:SetPoint("TOPLEFT")
-		label:SetWidth(width)
-		height = label:GetHeight()
-	end
-
-	self.resizing = true
-	frame:SetHeight(height)
-	frame.height = height
-	self.resizing = nil
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		-- set the flag to stop constant size updates
-		self.resizing = true
-		-- height is set dynamically by the text and image size
-		self:SetWidth(200)
-		self:SetText()
-		self:SetImage(nil)
-		self:SetImageSize(16, 16)
-		self:SetColor()
-		self:SetFontObject()
-
-		-- reset the flag
-		self.resizing = nil
-		-- run the update explicitly
-		UpdateImageAnchor(self)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["OnWidthSet"] = function(self, width)
-		UpdateImageAnchor(self)
-	end,
-
-	["SetText"] = function(self, text)
-		self.label:SetText(text)
-		UpdateImageAnchor(self)
-	end,
-
-	["SetColor"] = function(self, r, g, b)
-		if not (r and g and b) then
-			r, g, b = 1, 1, 1
-		end
-		self.label:SetVertexColor(r, g, b)
-	end,
-
-	["SetImage"] = function(self, path, ...)
-		local image = self.image
-		image:SetTexture(path)
-
-		if image:GetTexture() then
-			self.imageshown = true
-			local n = select("#", ...)
-			if n == 4 or n == 8 then
-				image:SetTexCoord(...)
-			else
-				image:SetTexCoord(0, 1, 0, 1)
-			end
-		else
-			self.imageshown = nil
-		end
-		UpdateImageAnchor(self)
-	end,
-
-	["SetFont"] = function(self, font, height, flags)
-		self.label:SetFont(font, height, flags)
-	end,
-
-	["SetFontObject"] = function(self, font)
-		self:SetFont((font or GameFontHighlightSmall):GetFont())
-	end,
-
-	["SetImageSize"] = function(self, width, height)
-		self.image:SetWidth(width)
-		self.image:SetHeight(height)
-		UpdateImageAnchor(self)
-	end,
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-	frame:Hide()
-
-	local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontHighlightSmall")
-	label:SetJustifyH("LEFT")
-	label:SetJustifyV("TOP")
-
-	local image = frame:CreateTexture(nil, "BACKGROUND")
-
-	-- create widget
-	local widget = {
-		label = label,
-		image = image,
-		frame = frame,
-		type  = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
deleted file mode 100644
index a27a2fc..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+++ /dev/null
@@ -1,368 +0,0 @@
-local Type, Version = "MultiLineEditBox", 27
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local GetCursorInfo, GetSpellInfo, ClearCursor = GetCursorInfo, GetSpellInfo, ClearCursor
-local CreateFrame, UIParent = CreateFrame, UIParent
-local _G = _G
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: ACCEPT, ChatFontNormal
-
-local wowMoP
-do
-	local _, _, _, interface = GetBuildInfo()
-	wowMoP = (interface >= 50000)
-end
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-
-if not AceGUIMultiLineEditBoxInsertLink then
-	-- upgradeable hook
-	hooksecurefunc("ChatEdit_InsertLink", function(...) return _G.AceGUIMultiLineEditBoxInsertLink(...) end)
-end
-
-function _G.AceGUIMultiLineEditBoxInsertLink(text)
-	for i = 1, AceGUI:GetWidgetCount(Type) do
-		local editbox = _G[("MultiLineEditBox%uEdit"):format(i)]
-		if editbox and editbox:IsVisible() and editbox:HasFocus() then
-			editbox:Insert(text)
-			return true
-		end
-	end
-end
-
-
-local function Layout(self)
-	self:SetHeight(self.numlines * 14 + (self.disablebutton and 19 or 41) + self.labelHeight)
-
-	if self.labelHeight == 0 then
-		self.scrollBar:SetPoint("TOP", self.frame, "TOP", 0, -23)
-	else
-		self.scrollBar:SetPoint("TOP", self.label, "BOTTOM", 0, -19)
-	end
-
-	if self.disablebutton then
-		self.scrollBar:SetPoint("BOTTOM", self.frame, "BOTTOM", 0, 21)
-		self.scrollBG:SetPoint("BOTTOMLEFT", 0, 4)
-	else
-		self.scrollBar:SetPoint("BOTTOM", self.button, "TOP", 0, 18)
-		self.scrollBG:SetPoint("BOTTOMLEFT", self.button, "TOPLEFT")
-	end
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function OnClick(self)                                                     -- Button
-	self = self.obj
-	self.editBox:ClearFocus()
-	if not self:Fire("OnEnterPressed", self.editBox:GetText()) then
-		self.button:Disable()
-	end
-end
-
-local function OnCursorChanged(self, _, y, _, cursorHeight)                      -- EditBox
-	self, y = self.obj.scrollFrame, -y
-	local offset = self:GetVerticalScroll()
-	if y < offset then
-		self:SetVerticalScroll(y)
-	else
-		y = y + cursorHeight - self:GetHeight()
-		if y > offset then
-			self:SetVerticalScroll(y)
-		end
-	end
-end
-
-local function OnEditFocusLost(self)                                             -- EditBox
-	self:HighlightText(0, 0)
-	self.obj:Fire("OnEditFocusLost")
-end
-
-local function OnEnter(self)                                                     -- EditBox / ScrollFrame
-	self = self.obj
-	if not self.entered then
-		self.entered = true
-		self:Fire("OnEnter")
-	end
-end
-
-local function OnLeave(self)                                                     -- EditBox / ScrollFrame
-	self = self.obj
-	if self.entered then
-		self.entered = nil
-		self:Fire("OnLeave")
-	end
-end
-
-local function OnMouseUp(self)                                                   -- ScrollFrame
-	self = self.obj.editBox
-	self:SetFocus()
-	self:SetCursorPosition(self:GetNumLetters())
-end
-
-local function OnReceiveDrag(self)                                               -- EditBox / ScrollFrame
-	local type, id, info = GetCursorInfo()
-	if type == "spell" then
-		info = GetSpellInfo(id, info)
-	elseif type ~= "item" then
-		return
-	end
-	ClearCursor()
-	self = self.obj
-	local editBox = self.editBox
-	if not editBox:HasFocus() then
-		editBox:SetFocus()
-		editBox:SetCursorPosition(editBox:GetNumLetters())
-	end
-	editBox:Insert(info)
-	self.button:Enable()
-end
-
-local function OnSizeChanged(self, width, height)                                -- ScrollFrame
-	self.obj.editBox:SetWidth(width)
-end
-
-local function OnTextChanged(self, userInput)                                    -- EditBox
-	if userInput then
-		self = self.obj
-		self:Fire("OnTextChanged", self.editBox:GetText())
-		self.button:Enable()
-	end
-end
-
-local function OnTextSet(self)                                                   -- EditBox
-	self:HighlightText(0, 0)
-	self:SetCursorPosition(self:GetNumLetters())
-	self:SetCursorPosition(0)
-	self.obj.button:Disable()
-end
-
-local function OnVerticalScroll(self, offset)                                    -- ScrollFrame
-	local editBox = self.obj.editBox
-	editBox:SetHitRectInsets(0, 0, offset, editBox:GetHeight() - offset - self:GetHeight())
-end
-
-local function OnShowFocus(frame)
-	frame.obj.editBox:SetFocus()
-	frame:SetScript("OnShow", nil)
-end
-
-local function OnEditFocusGained(frame)
-	AceGUI:SetFocus(frame.obj)
-	frame.obj:Fire("OnEditFocusGained")
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self.editBox:SetText("")
-		self:SetDisabled(false)
-		self:SetWidth(200)
-		self:DisableButton(false)
-		self:SetNumLines()
-		self.entered = nil
-		self:SetMaxLetters(0)
-	end,
-
-	["OnRelease"] = function(self)
-		self:ClearFocus()
-	end,
-
-	["SetDisabled"] = function(self, disabled)
-		local editBox = self.editBox
-		if disabled then
-			editBox:ClearFocus()
-			editBox:EnableMouse(false)
-			editBox:SetTextColor(0.5, 0.5, 0.5)
-			self.label:SetTextColor(0.5, 0.5, 0.5)
-			self.scrollFrame:EnableMouse(false)
-			self.button:Disable()
-		else
-			editBox:EnableMouse(true)
-			editBox:SetTextColor(1, 1, 1)
-			self.label:SetTextColor(1, 0.82, 0)
-			self.scrollFrame:EnableMouse(true)
-		end
-	end,
-
-	["SetLabel"] = function(self, text)
-		if text and text ~= "" then
-			self.label:SetText(text)
-			if self.labelHeight ~= 10 then
-				self.labelHeight = 10
-				self.label:Show()
-			end
-		elseif self.labelHeight ~= 0 then
-			self.labelHeight = 0
-			self.label:Hide()
-		end
-		Layout(self)
-	end,
-
-	["SetNumLines"] = function(self, value)
-		if not value or value < 4 then
-			value = 4
-		end
-		self.numlines = value
-		Layout(self)
-	end,
-
-	["SetText"] = function(self, text)
-		self.editBox:SetText(text)
-	end,
-
-	["GetText"] = function(self)
-		return self.editBox:GetText()
-	end,
-
-	["SetMaxLetters"] = function (self, num)
-		self.editBox:SetMaxLetters(num or 0)
-	end,
-
-	["DisableButton"] = function(self, disabled)
-		self.disablebutton = disabled
-		if disabled then
-			self.button:Hide()
-		else
-			self.button:Show()
-		end
-		Layout(self)
-	end,
-
-	["ClearFocus"] = function(self)
-		self.editBox:ClearFocus()
-		self.frame:SetScript("OnShow", nil)
-	end,
-
-	["SetFocus"] = function(self)
-		self.editBox:SetFocus()
-		if not self.frame:IsShown() then
-			self.frame:SetScript("OnShow", OnShowFocus)
-		end
-	end,
-
-	["GetCursorPosition"] = function(self)
-		return self.editBox:GetCursorPosition()
-	end,
-
-	["SetCursorPosition"] = function(self, ...)
-		return self.editBox:SetCursorPosition(...)
-	end,
-
-
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local backdrop = {
-	bgFile = [[Interface\Tooltips\UI-Tooltip-Background]],
-	edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], edgeSize = 16,
-	insets = { left = 4, right = 3, top = 4, bottom = 3 }
-}
-
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-	frame:Hide()
-
-	local widgetNum = AceGUI:GetNextWidgetNum(Type)
-
-	local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
-	label:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, -4)
-	label:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, -4)
-	label:SetJustifyH("LEFT")
-	label:SetText(ACCEPT)
-	label:SetHeight(10)
-
-	local button = CreateFrame("Button", ("%s%dButton"):format(Type, widgetNum), frame, wowMoP and "UIPanelButtonTemplate" or "UIPanelButtonTemplate2")
-	button:SetPoint("BOTTOMLEFT", 0, 4)
-	button:SetHeight(22)
-	button:SetWidth(label:GetStringWidth() + 24)
-	button:SetText(ACCEPT)
-	button:SetScript("OnClick", OnClick)
-	button:Disable()
-
-	local text = button:GetFontString()
-	text:ClearAllPoints()
-	text:SetPoint("TOPLEFT", button, "TOPLEFT", 5, -5)
-	text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1)
-	text:SetJustifyV("MIDDLE")
-
-	local scrollBG = CreateFrame("Frame", nil, frame)
-	scrollBG:SetBackdrop(backdrop)
-	scrollBG:SetBackdropColor(0, 0, 0)
-	scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4)
-
-	local scrollFrame = CreateFrame("ScrollFrame", ("%s%dScrollFrame"):format(Type, widgetNum), frame, "UIPanelScrollFrameTemplate")
-
-	local scrollBar = _G[scrollFrame:GetName() .. "ScrollBar"]
-	scrollBar:ClearAllPoints()
-	scrollBar:SetPoint("TOP", label, "BOTTOM", 0, -19)
-	scrollBar:SetPoint("BOTTOM", button, "TOP", 0, 18)
-	scrollBar:SetPoint("RIGHT", frame, "RIGHT")
-
-	scrollBG:SetPoint("TOPRIGHT", scrollBar, "TOPLEFT", 0, 19)
-	scrollBG:SetPoint("BOTTOMLEFT", button, "TOPLEFT")
-
-	scrollFrame:SetPoint("TOPLEFT", scrollBG, "TOPLEFT", 5, -6)
-	scrollFrame:SetPoint("BOTTOMRIGHT", scrollBG, "BOTTOMRIGHT", -4, 4)
-	scrollFrame:SetScript("OnEnter", OnEnter)
-	scrollFrame:SetScript("OnLeave", OnLeave)
-	scrollFrame:SetScript("OnMouseUp", OnMouseUp)
-	scrollFrame:SetScript("OnReceiveDrag", OnReceiveDrag)
-	scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
-	scrollFrame:HookScript("OnVerticalScroll", OnVerticalScroll)
-
-	local editBox = CreateFrame("EditBox", ("%s%dEdit"):format(Type, widgetNum), scrollFrame)
-	editBox:SetAllPoints()
-	editBox:SetFontObject(ChatFontNormal)
-	editBox:SetMultiLine(true)
-	editBox:EnableMouse(true)
-	editBox:SetAutoFocus(false)
-	editBox:SetCountInvisibleLetters(false)
-	editBox:SetScript("OnCursorChanged", OnCursorChanged)
-	editBox:SetScript("OnEditFocusLost", OnEditFocusLost)
-	editBox:SetScript("OnEnter", OnEnter)
-	editBox:SetScript("OnEscapePressed", editBox.ClearFocus)
-	editBox:SetScript("OnLeave", OnLeave)
-	editBox:SetScript("OnMouseDown", OnReceiveDrag)
-	editBox:SetScript("OnReceiveDrag", OnReceiveDrag)
-	editBox:SetScript("OnTextChanged", OnTextChanged)
-	editBox:SetScript("OnTextSet", OnTextSet)
-	editBox:SetScript("OnEditFocusGained", OnEditFocusGained)
-
-
-	scrollFrame:SetScrollChild(editBox)
-
-	local widget = {
-		button      = button,
-		editBox     = editBox,
-		frame       = frame,
-		label       = label,
-		labelHeight = 10,
-		numlines    = 4,
-		scrollBar   = scrollBar,
-		scrollBG    = scrollBG,
-		scrollFrame = scrollFrame,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	button.obj, editBox.obj, scrollFrame.obj = widget, widget, widget
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
deleted file mode 100644
index 583f29d..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
+++ /dev/null
@@ -1,285 +0,0 @@
---[[-----------------------------------------------------------------------------
-Slider Widget
-Graphical Slider, like, for Range values.
--------------------------------------------------------------------------------]]
-local Type, Version = "Slider", 21
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local min, max, floor = math.min, math.max, math.floor
-local tonumber, pairs = tonumber, pairs
-
--- WoW APIs
-local PlaySound = PlaySound
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontHighlightSmall
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-local function UpdateText(self)
-	local value = self.value or 0
-	if self.ispercent then
-		self.editbox:SetText(("%s%%"):format(floor(value * 1000 + 0.5) / 10))
-	else
-		self.editbox:SetText(floor(value * 100 + 0.5) / 100)
-	end
-end
-
-local function UpdateLabels(self)
-	local min, max = (self.min or 0), (self.max or 100)
-	if self.ispercent then
-		self.lowtext:SetFormattedText("%s%%", (min * 100))
-		self.hightext:SetFormattedText("%s%%", (max * 100))
-	else
-		self.lowtext:SetText(min)
-		self.hightext:SetText(max)
-	end
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
-local function Frame_OnMouseDown(frame)
-	frame.obj.slider:EnableMouseWheel(true)
-	AceGUI:ClearFocus()
-end
-
-local function Slider_OnValueChanged(frame)
-	local self = frame.obj
-	if not frame.setup then
-		local newvalue = frame:GetValue()
-		if self.step and self.step > 0 then
-			local min_value = self.min or 0
-			newvalue = floor((newvalue - min_value) / self.step + 0.5) * self.step + min_value
-		end
-		if newvalue ~= self.value and not self.disabled then
-			self.value = newvalue
-			self:Fire("OnValueChanged", newvalue)
-		end
-		if self.value then
-			UpdateText(self)
-		end
-	end
-end
-
-local function Slider_OnMouseUp(frame)
-	local self = frame.obj
-	self:Fire("OnMouseUp", self.value)
-end
-
-local function Slider_OnMouseWheel(frame, v)
-	local self = frame.obj
-	if not self.disabled then
-		local value = self.value
-		if v > 0 then
-			value = min(value + (self.step or 1), self.max)
-		else
-			value = max(value - (self.step or 1), self.min)
-		end
-		self.slider:SetValue(value)
-	end
-end
-
-local function EditBox_OnEscapePressed(frame)
-	frame:ClearFocus()
-end
-
-local function EditBox_OnEnterPressed(frame)
-	local self = frame.obj
-	local value = frame:GetText()
-	if self.ispercent then
-		value = value:gsub('%%', '')
-		value = tonumber(value) / 100
-	else
-		value = tonumber(value)
-	end
-
-	if value then
-		PlaySound("igMainMenuOptionCheckBoxOn")
-		self.slider:SetValue(value)
-		self:Fire("OnMouseUp", value)
-	end
-end
-
-local function EditBox_OnEnter(frame)
-	frame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1)
-end
-
-local function EditBox_OnLeave(frame)
-	frame:SetBackdropBorderColor(0.3, 0.3, 0.3, 0.8)
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetWidth(200)
-		self:SetHeight(44)
-		self:SetDisabled(false)
-		self:SetIsPercent(nil)
-		self:SetSliderValues(0,100,1)
-		self:SetValue(0)
-		self.slider:EnableMouseWheel(false)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetDisabled"] = function(self, disabled)
-		self.disabled = disabled
-		if disabled then
-			self.slider:EnableMouse(false)
-			self.label:SetTextColor(.5, .5, .5)
-			self.hightext:SetTextColor(.5, .5, .5)
-			self.lowtext:SetTextColor(.5, .5, .5)
-			--self.valuetext:SetTextColor(.5, .5, .5)
-			self.editbox:SetTextColor(.5, .5, .5)
-			self.editbox:EnableMouse(false)
-			self.editbox:ClearFocus()
-		else
-			self.slider:EnableMouse(true)
-			self.label:SetTextColor(1, .82, 0)
-			self.hightext:SetTextColor(1, 1, 1)
-			self.lowtext:SetTextColor(1, 1, 1)
-			--self.valuetext:SetTextColor(1, 1, 1)
-			self.editbox:SetTextColor(1, 1, 1)
-			self.editbox:EnableMouse(true)
-		end
-	end,
-
-	["SetValue"] = function(self, value)
-		self.slider.setup = true
-		self.slider:SetValue(value)
-		self.value = value
-		UpdateText(self)
-		self.slider.setup = nil
-	end,
-
-	["GetValue"] = function(self)
-		return self.value
-	end,
-
-	["SetLabel"] = function(self, text)
-		self.label:SetText(text)
-	end,
-
-	["SetSliderValues"] = function(self, min, max, step)
-		local frame = self.slider
-		frame.setup = true
-		self.min = min
-		self.max = max
-		self.step = step
-		frame:SetMinMaxValues(min or 0,max or 100)
-		UpdateLabels(self)
-		frame:SetValueStep(step or 1)
-		if self.value then
-			frame:SetValue(self.value)
-		end
-		frame.setup = nil
-	end,
-
-	["SetIsPercent"] = function(self, value)
-		self.ispercent = value
-		UpdateLabels(self)
-		UpdateText(self)
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local SliderBackdrop  = {
-	bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
-	edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
-	tile = true, tileSize = 8, edgeSize = 8,
-	insets = { left = 3, right = 3, top = 6, bottom = 6 }
-}
-
-local ManualBackdrop = {
-	bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
-	edgeFile = "Interface\\ChatFrame\\ChatFrameBackground",
-	tile = true, edgeSize = 1, tileSize = 5,
-}
-
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-
-	frame:EnableMouse(true)
-	frame:SetScript("OnMouseDown", Frame_OnMouseDown)
-
-	local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
-	label:SetPoint("TOPLEFT")
-	label:SetPoint("TOPRIGHT")
-	label:SetJustifyH("CENTER")
-	label:SetHeight(15)
-
-	local slider = CreateFrame("Slider", nil, frame)
-	slider:SetOrientation("HORIZONTAL")
-	slider:SetHeight(15)
-	slider:SetHitRectInsets(0, 0, -10, 0)
-	slider:SetBackdrop(SliderBackdrop)
-	slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Horizontal")
-	slider:SetPoint("TOP", label, "BOTTOM")
-	slider:SetPoint("LEFT", 3, 0)
-	slider:SetPoint("RIGHT", -3, 0)
-	slider:SetValue(0)
-	slider:SetScript("OnValueChanged",Slider_OnValueChanged)
-	slider:SetScript("OnEnter", Control_OnEnter)
-	slider:SetScript("OnLeave", Control_OnLeave)
-	slider:SetScript("OnMouseUp", Slider_OnMouseUp)
-	slider:SetScript("OnMouseWheel", Slider_OnMouseWheel)
-
-	local lowtext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
-	lowtext:SetPoint("TOPLEFT", slider, "BOTTOMLEFT", 2, 3)
-
-	local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
-	hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3)
-
-	local editbox = CreateFrame("EditBox", nil, frame)
-	editbox:SetAutoFocus(false)
-	editbox:SetFontObject(GameFontHighlightSmall)
-	editbox:SetPoint("TOP", slider, "BOTTOM")
-	editbox:SetHeight(14)
-	editbox:SetWidth(70)
-	editbox:SetJustifyH("CENTER")
-	editbox:EnableMouse(true)
-	editbox:SetBackdrop(ManualBackdrop)
-	editbox:SetBackdropColor(0, 0, 0, 0.5)
-	editbox:SetBackdropBorderColor(0.3, 0.3, 0.30, 0.80)
-	editbox:SetScript("OnEnter", EditBox_OnEnter)
-	editbox:SetScript("OnLeave", EditBox_OnLeave)
-	editbox:SetScript("OnEnterPressed", EditBox_OnEnterPressed)
-	editbox:SetScript("OnEscapePressed", EditBox_OnEscapePressed)
-
-	local widget = {
-		label       = label,
-		slider      = slider,
-		lowtext     = lowtext,
-		hightext    = hightext,
-		editbox     = editbox,
-		alignoffset = 25,
-		frame       = frame,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	slider.obj, editbox.obj = widget, widget
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type,Constructor,Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
deleted file mode 100644
index 9016d1e..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua
+++ /dev/null
@@ -1,239 +0,0 @@
---[[ $Id: CallbackHandler-1.0.lua 3 2008-09-29 16:54:20Z nevcairiel $ ]]
-local MAJOR, MINOR = "CallbackHandler-1.0", 3
-local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR)
-
-if not CallbackHandler then return end -- No upgrade needed
-
-local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end}
-
-local type = type
-local pcall = pcall
-local pairs = pairs
-local assert = assert
-local concat = table.concat
-local loadstring = loadstring
-local next = next
-local select = select
-local type = type
-local xpcall = xpcall
-
-local function errorhandler(err)
-	return geterrorhandler()(err)
-end
-
-local function CreateDispatcher(argCount)
-	local code = [[
-	local next, xpcall, eh = ...
-
-	local method, ARGS
-	local function call() method(ARGS) end
-
-	local function dispatch(handlers, ...)
-		local index
-		index, method = next(handlers)
-		if not method then return end
-		local OLD_ARGS = ARGS
-		ARGS = ...
-		repeat
-			xpcall(call, eh)
-			index, method = next(handlers, index)
-		until not method
-		ARGS = OLD_ARGS
-	end
-
-	return dispatch
-	]]
-
-	local ARGS, OLD_ARGS = {}, {}
-	for i = 1, argCount do ARGS[i], OLD_ARGS[i] = "arg"..i, "old_arg"..i end
-	code = code:gsub("OLD_ARGS", concat(OLD_ARGS, ", ")):gsub("ARGS", concat(ARGS, ", "))
-	return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(next, xpcall, errorhandler)
-end
-
-local Dispatchers = setmetatable({}, {__index=function(self, argCount)
-	local dispatcher = CreateDispatcher(argCount)
-	rawset(self, argCount, dispatcher)
-	return dispatcher
-end})
-
---------------------------------------------------------------------------
--- CallbackHandler:New
---
---   target            - target object to embed public APIs in
---   RegisterName      - name of the callback registration API, default "RegisterCallback"
---   UnregisterName    - name of the callback unregistration API, default "UnregisterCallback"
---   UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API.
-
-function CallbackHandler:New(target, RegisterName, UnregisterName, UnregisterAllName, 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")
-
-	RegisterName = RegisterName or "RegisterCallback"
-	UnregisterName = UnregisterName or "UnregisterCallback"
-	if UnregisterAllName==nil then	-- false is used to indicate "don't want this method"
-		UnregisterAllName = "UnregisterAllCallbacks"
-	end
-
-	-- we declare all objects and exported APIs inside this closure to quickly gain access
-	-- to e.g. function names, the "target" parameter, etc
-
-
-	-- Create the registry object
-	local events = setmetatable({}, meta)
-	local registry = { recurse=0, events=events }
-
-	-- registry:Fire() - fires the given event/message into the registry
-	function registry:Fire(eventname, ...)
-		if not rawget(events, eventname) or not next(events[eventname]) then return end
-		local oldrecurse = registry.recurse
-		registry.recurse = oldrecurse + 1
-
-		Dispatchers[select('#', ...) + 1](events[eventname], eventname, ...)
-
-		registry.recurse = oldrecurse
-
-		if registry.insertQueue and oldrecurse==0 then
-			-- Something in one of our callbacks wanted to register more callbacks; they got queued
-			for eventname,callbacks in pairs(registry.insertQueue) do
-				local first = not rawget(events, eventname) or not next(events[eventname])	-- test for empty before. not test for one member after. that one member may have been overwritten.
-				for self,func in pairs(callbacks) do
-					events[eventname][self] = func
-					-- fire OnUsed callback?
-					if first and registry.OnUsed then
-						registry.OnUsed(registry, target, eventname)
-						first = nil
-					end
-				end
-			end
-			registry.insertQueue = nil
-		end
-	end
-
-	-- Registration of a callback, handles:
-	--   self["method"], leads to self["method"](self, ...)
-	--   self with function ref, leads to functionref(...)
-	--   "addonId" (instead of self) with function ref, leads to functionref(...)
-	-- all with an optional arg, which, if present, gets passed as first argument (after self if present)
-	target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]])
-		if type(eventname) ~= "string" then
-			error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2)
-		end
-
-		method = method or eventname
-
-		local first = not rawget(events, eventname) or not next(events[eventname])	-- test for empty before. not test for one member after. that one member may have been overwritten.
-
-		if type(method) ~= "string" and type(method) ~= "function" then
-			error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2)
-		end
-
-		local regfunc
-
-		if type(method) == "string" then
-			-- self["method"] calling style
-			if type(self) ~= "table" then
-				error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2)
-			elseif self==target then
-				error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2)
-			elseif type(self[method]) ~= "function" then
-				error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2)
-			end
-
-			if select("#",...)>=1 then	-- this is not the same as testing for arg==nil!
-				local arg=select(1,...)
-				regfunc = function(...) self[method](self,arg,...) end
-			else
-				regfunc = function(...) self[method](self,...) end
-			end
-		else
-			-- function ref with self=object or self="addonId"
-			if type(self)~="table" and type(self)~="string" then
-				error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string expected.", 2)
-			end
-
-			if select("#",...)>=1 then	-- this is not the same as testing for arg==nil!
-				local arg=select(1,...)
-				regfunc = function(...) method(arg,...) end
-			else
-				regfunc = method
-			end
-		end
-
-
-		if events[eventname][self] or registry.recurse<1 then
-		-- if registry.recurse<1 then
-			-- we're overwriting an existing entry, or not currently recursing. just set it.
-			events[eventname][self] = regfunc
-			-- fire OnUsed callback?
-			if registry.OnUsed and first then
-				registry.OnUsed(registry, target, eventname)
-			end
-		else
-			-- we're currently processing a callback in this registry, so delay the registration of this new entry!
-			-- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency
-			registry.insertQueue = registry.insertQueue or setmetatable({},meta)
-			registry.insertQueue[eventname][self] = regfunc
-		end
-	end
-
-	-- Unregister a callback
-	target[UnregisterName] = function(self, eventname)
-		if not self or self==target then
-			error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2)
-		end
-		if type(eventname) ~= "string" then
-			error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2)
-		end
-		if rawget(events, eventname) and events[eventname][self] then
-			events[eventname][self] = nil
-			-- Fire OnUnused callback?
-			if registry.OnUnused and not next(events[eventname]) then
-				registry.OnUnused(registry, target, eventname)
-			end
-		end
-		if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then
-			registry.insertQueue[eventname][self] = nil
-		end
-	end
-
-	-- OPTIONAL: Unregister all callbacks for given selfs/addonIds
-	if UnregisterAllName then
-		target[UnregisterAllName] = function(...)
-			if select("#",...)<1 then
-				error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2)
-			end
-			if select("#",...)==1 and ...==target then
-				error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2)
-			end
-
-
-			for i=1,select("#",...) do
-				local self = select(i,...)
-				if registry.insertQueue then
-					for eventname, callbacks in pairs(registry.insertQueue) do
-						if callbacks[self] then
-							callbacks[self] = nil
-						end
-					end
-				end
-				for eventname, callbacks in pairs(events) do
-					if callbacks[self] then
-						callbacks[self] = nil
-						-- Fire OnUnused callback?
-						if registry.OnUnused and not next(callbacks) then
-							registry.OnUnused(registry, target, eventname)
-						end
-					end
-				end
-			end
-		end
-	end
-
-	return registry
-end
-
-
--- CallbackHandler purposefully does NOT do explicit embedding. Nor does it
--- try to upgrade old implicit embeds since the system is selfcontained and
--- relies on closures to work.
-
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
deleted file mode 100644
index 876df83..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<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
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/LibStub/LibStub.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/LibStub/LibStub.lua
deleted file mode 100644
index 0a41ac0..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/LibStub/LibStub.lua
+++ /dev/null
@@ -1,30 +0,0 @@
--- LibStub is a simple versioning stub meant for use in Libraries.  http://www.wowace.com/wiki/LibStub for more info
--- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
-local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2  -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS!
-local LibStub = _G[LIBSTUB_MAJOR]
-
-if not LibStub or LibStub.minor < LIBSTUB_MINOR then
-	LibStub = LibStub or {libs = {}, minors = {} }
-	_G[LIBSTUB_MAJOR] = LibStub
-	LibStub.minor = LIBSTUB_MINOR
-
-	function LibStub:NewLibrary(major, minor)
-		assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
-		minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.")
-
-		local oldminor = self.minors[major]
-		if oldminor and oldminor >= minor then return nil end
-		self.minors[major], self.libs[major] = minor, self.libs[major] or {}
-		return self.libs[major], oldminor
-	end
-
-	function LibStub:GetLibrary(major, silent)
-		if not self.libs[major] and not silent then
-			error(("Cannot find a library instance of %q."):format(tostring(major)), 2)
-		end
-		return self.libs[major], self.minors[major]
-	end
-
-	function LibStub:IterateLibraries() return pairs(self.libs) end
-	setmetatable(LibStub, { __call = LibStub.GetLibrary })
-end
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/LibStub/LibStub.toc b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/LibStub/LibStub.toc
deleted file mode 100644
index 17cf732..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/Libs/LibStub/LibStub.toc
+++ /dev/null
@@ -1,13 +0,0 @@
-## Interface: 20400
-## Title: Lib: LibStub
-## Notes: Universal Library Stub
-## Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel
-## X-Website: http://jira.wowace.com/browse/LS
-## X-Category: Library
-## X-License: Public Domain
-## X-Curse-Packaged-Version: 1.0
-## X-Curse-Project-Name: LibStub
-## X-Curse-Project-ID: libstub
-## X-Curse-Repository-ID: wow/libstub/mainline
-
-LibStub.lua
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua
deleted file mode 100644
index 1d39c28..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/SoundWidget.lua
+++ /dev/null
@@ -1,264 +0,0 @@
--- Widget is based on the AceGUIWidget-DropDown.lua supplied with AceGUI-3.0
--- Widget created by Yssaril
-
-local AceGUI = LibStub("AceGUI-3.0")
-local Media = LibStub("LibSharedMedia-3.0")
-
-local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")
-
-do
-	local widgetType = "LSM30_Sound"
-	local widgetVersion = 11
-
-	local contentFrameCache = {}
-	local function ReturnSelf(self)
-		self:ClearAllPoints()
-		self:Hide()
-		self.check:Hide()
-		table.insert(contentFrameCache, self)
-	end
-
-	local function ContentOnClick(this, button)
-		local self = this.obj
-		self:Fire("OnValueChanged", this.text:GetText())
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-		end
-	end
-
-	local function ContentSpeakerOnClick(this, button)
-		local self = this.frame.obj
-		local sound = this.frame.text:GetText()
-		PlaySoundFile(self.list[sound] ~= sound and self.list[sound] or Media:Fetch('sound',sound), "Master")
-	end
-
-	local function GetContentLine()
-		local frame
-		if next(contentFrameCache) then
-			frame = table.remove(contentFrameCache)
-		else
-			frame = CreateFrame("Button", nil, UIParent)
-				--frame:SetWidth(200)
-				frame:SetHeight(18)
-				frame:SetHighlightTexture([[Interface\QuestFrame\UI-QuestTitleHighlight]], "ADD")
-				frame:SetScript("OnClick", ContentOnClick)
-			local check = frame:CreateTexture("OVERLAY")
-				check:SetWidth(16)
-				check:SetHeight(16)
-				check:SetPoint("LEFT",frame,"LEFT",1,-1)
-				check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
-				check:Hide()
-			frame.check = check
-
-			local soundbutton = CreateFrame("Button", nil, frame)
-				soundbutton:SetWidth(16)
-				soundbutton:SetHeight(16)
-				soundbutton:SetPoint("RIGHT",frame,"RIGHT",-1,0)
-				soundbutton.frame = frame
-				soundbutton:SetScript("OnClick", ContentSpeakerOnClick)
-			frame.soundbutton = soundbutton
-
-			local speaker = soundbutton:CreateTexture(nil, "BACKGROUND")
-				speaker:SetTexture("Interface\\Common\\VoiceChat-Speaker")
-				speaker:SetAllPoints(soundbutton)
-			frame.speaker = speaker
-			local speakeron = soundbutton:CreateTexture(nil, "HIGHLIGHT")
-				speakeron:SetTexture("Interface\\Common\\VoiceChat-On")
-				speakeron:SetAllPoints(soundbutton)
-			frame.speakeron = speakeron
-
-			local text = frame:CreateFontString(nil,"OVERLAY","GameFontWhite")
-				text:SetPoint("TOPLEFT", check, "TOPRIGHT", 1, 0)
-				text:SetPoint("BOTTOMRIGHT", soundbutton, "BOTTOMLEFT", -2, 0)
-				text:SetJustifyH("LEFT")
-				text:SetText("Test Test Test Test Test Test Test")
-			frame.text = text
-			frame.ReturnSelf = ReturnSelf
-		end
-		frame:Show()
-		return frame
-	end
-
-	local function OnAcquire(self)
-		self:SetHeight(44)
-		self:SetWidth(200)
-	end
-
-	local function OnRelease(self)
-		self:SetText("")
-		self:SetLabel("")
-		self:SetDisabled(false)
-
-		self.value = nil
-		self.list = nil
-		self.open = nil
-		self.hasClose = nil
-
-		self.frame:ClearAllPoints()
-		self.frame:Hide()
-	end
-
-	local function SetValue(self, value) -- Set the value to an item in the List.
-		if self.list then
-			self:SetText(value or "")
-		end
-		self.value = value
-	end
-
-	local function GetValue(self)
-		return self.value
-	end
-
-	local function SetList(self, list) -- Set the list of values for the dropdown (key => value pairs)
-		self.list = list or Media:HashTable("sound")
-	end
-
-	local function SetText(self, text) -- Set the text displayed in the box.
-		self.frame.text:SetText(text or "")
-	end
-
-	local function SetLabel(self, text) -- Set the text for the label.
-		self.frame.label:SetText(text or "")
-	end
-
-	local function AddItem(self, key, value) -- Add an item to the list.
-		self.list = self.list or {}
-		self.list[key] = value
-	end
-	local SetItemValue = AddItem -- Set the value of a item in the list. <<same as adding a new item>>
-
-	local function SetMultiselect(self, flag) end -- Toggle multi-selecting. <<Dummy function to stay inline with the dropdown API>>
-	local function GetMultiselect() return false end-- Query the multi-select flag. <<Dummy function to stay inline with the dropdown API>>
-	local function SetItemDisabled(self, key) end-- Disable one item in the list. <<Dummy function to stay inline with the dropdown API>>
-
-	local function SetDisabled(self, disabled) -- Disable the widget.
-		self.disabled = disabled
-		if disabled then
-			self.frame:Disable()
-			self.speaker:SetDesaturated(true)
-			self.speakeron:SetDesaturated(true)
-		else
-			self.frame:Enable()
-			self.speaker:SetDesaturated(false)
-			self.speakeron:SetDesaturated(false)
-		end
-	end
-
-	local function textSort(a,b)
-		return string.upper(a) < string.upper(b)
-	end
-
-	local sortedlist = {}
-	local function ToggleDrop(this)
-		local self = this.obj
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-			AceGUI:ClearFocus()
-		else
-			AceGUI:SetFocus(self)
-			self.dropdown = AGSMW:GetDropDownFrame()
-			local width = self.frame:GetWidth()
-			self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
-			self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0)
-			for k, v in pairs(self.list) do
-				sortedlist[#sortedlist+1] = k
-			end
-			table.sort(sortedlist, textSort)
-			for i, k in ipairs(sortedlist) do
-				local f = GetContentLine()
-				f.text:SetText(k)
-				if k == self.value then
-					f.check:Show()
-				end
-				f.obj = self
-				self.dropdown:AddFrame(f)
-			end
-			wipe(sortedlist)
-		end
-	end
-
-	local function ClearFocus(self)
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-		end
-	end
-
-	local function OnHide(this)
-		local self = this.obj
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-		end
-	end
-
-	local function Drop_OnEnter(this)
-		this.obj:Fire("OnEnter")
-	end
-
-	local function Drop_OnLeave(this)
-		this.obj:Fire("OnLeave")
-	end
-
-	local function WidgetPlaySound(this)
-		local self = this.obj
-		local sound = self.frame.text:GetText()
-		PlaySoundFile(self.list[sound] ~= sound and self.list[sound] or Media:Fetch('sound',sound), "Master")
-	end
-
-	local function Constructor()
-		local frame = AGSMW:GetBaseFrame()
-		local self = {}
-
-		self.type = widgetType
-		self.frame = frame
-		frame.obj = self
-		frame.dropButton.obj = self
-		frame.dropButton:SetScript("OnEnter", Drop_OnEnter)
-		frame.dropButton:SetScript("OnLeave", Drop_OnLeave)
-		frame.dropButton:SetScript("OnClick",ToggleDrop)
-		frame:SetScript("OnHide", OnHide)
-
-
-		local soundbutton = CreateFrame("Button", nil, frame)
-			soundbutton:SetWidth(16)
-			soundbutton:SetHeight(16)
-			soundbutton:SetPoint("LEFT",frame.DLeft,"LEFT",26,1)
-			soundbutton:SetScript("OnClick", WidgetPlaySound)
-			soundbutton.obj = self
-		self.soundbutton = soundbutton
-		frame.text:SetPoint("LEFT",soundbutton,"RIGHT",2,0)
-
-
-		local speaker = soundbutton:CreateTexture(nil, "BACKGROUND")
-			speaker:SetTexture("Interface\\Common\\VoiceChat-Speaker")
-			speaker:SetAllPoints(soundbutton)
-		self.speaker = speaker
-		local speakeron = soundbutton:CreateTexture(nil, "HIGHLIGHT")
-			speakeron:SetTexture("Interface\\Common\\VoiceChat-On")
-			speakeron:SetAllPoints(soundbutton)
-		self.speakeron = speakeron
-
-		self.alignoffset = 31
-
-		self.OnRelease = OnRelease
-		self.OnAcquire = OnAcquire
-		self.ClearFocus = ClearFocus
-		self.SetText = SetText
-		self.SetValue = SetValue
-		self.GetValue = GetValue
-		self.SetList = SetList
-		self.SetLabel = SetLabel
-		self.SetDisabled = SetDisabled
-		self.AddItem = AddItem
-		self.SetMultiselect = SetMultiselect
-		self.GetMultiselect = GetMultiselect
-		self.SetItemValue = SetItemValue
-		self.SetItemDisabled = SetItemDisabled
-		self.ToggleDrop = ToggleDrop
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
-
-end
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua
deleted file mode 100644
index 2d0e32c..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/StatusbarWidget.lua
+++ /dev/null
@@ -1,233 +0,0 @@
--- Widget is based on the AceGUIWidget-DropDown.lua supplied with AceGUI-3.0
--- Widget created by Yssaril
-
-local AceGUI = LibStub("AceGUI-3.0")
-local Media = LibStub("LibSharedMedia-3.0")
-
-local AGSMW = LibStub("AceGUISharedMediaWidgets-1.0")
-
-do
-	local widgetType = "LSM30_Statusbar"
-	local widgetVersion = 11
-
-	local contentFrameCache = {}
-	local function ReturnSelf(self)
-		self:ClearAllPoints()
-		self:Hide()
-		self.check:Hide()
-		table.insert(contentFrameCache, self)
-	end
-
-	local function ContentOnClick(this, button)
-		local self = this.obj
-		self:Fire("OnValueChanged", this.text:GetText())
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-		end
-	end
-
-	local function GetContentLine()
-		local frame
-		if next(contentFrameCache) then
-			frame = table.remove(contentFrameCache)
-		else
-			frame = CreateFrame("Button", nil, UIParent)
-				--frame:SetWidth(200)
-				frame:SetHeight(18)
-				frame:SetHighlightTexture([[Interface\QuestFrame\UI-QuestTitleHighlight]], "ADD")
-				frame:SetScript("OnClick", ContentOnClick)
-			local check = frame:CreateTexture("OVERLAY")
-				check:SetWidth(16)
-				check:SetHeight(16)
-				check:SetPoint("LEFT",frame,"LEFT",1,-1)
-				check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
-				check:Hide()
-			frame.check = check
-			local bar = frame:CreateTexture("ARTWORK")
-				bar:SetHeight(16)
-				bar:SetPoint("LEFT",check,"RIGHT",1,0)
-				bar:SetPoint("RIGHT",frame,"RIGHT",-1,0)
-			frame.bar = bar
-			local text = frame:CreateFontString(nil,"OVERLAY","GameFontWhite")
-
-				local font, size = text:GetFont()
-				text:SetFont(font,size,"OUTLINE")
-
-				text:SetPoint("TOPLEFT", check, "TOPRIGHT", 3, 0)
-				text:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -2, 0)
-				text:SetJustifyH("LEFT")
-				text:SetText("Test Test Test Test Test Test Test")
-			frame.text = text
-			frame.ReturnSelf = ReturnSelf
-		end
-		frame:Show()
-		return frame
-	end
-
-	local function OnAcquire(self)
-		self:SetHeight(44)
-		self:SetWidth(200)
-	end
-
-	local function OnRelease(self)
-		self:SetText("")
-		self:SetLabel("")
-		self:SetDisabled(false)
-
-		self.value = nil
-		self.list = nil
-		self.open = nil
-		self.hasClose = nil
-
-		self.frame:ClearAllPoints()
-		self.frame:Hide()
-	end
-
-	local function SetValue(self, value) -- Set the value to an item in the List.
-		if self.list then
-			self:SetText(value or "")
-		end
-		self.value = value
-	end
-
-	local function GetValue(self)
-		return self.value
-	end
-
-	local function SetList(self, list) -- Set the list of values for the dropdown (key => value pairs)
-		self.list = list or Media:HashTable("statusbar")
-	end
-
-
-	local function SetText(self, text) -- Set the text displayed in the box.
-		self.frame.text:SetText(text or "")
-		local statusbar = self.list[text] ~= text and self.list[text] or Media:Fetch('statusbar',text)
-		self.bar:SetTexture(statusbar)
-	end
-
-	local function SetLabel(self, text) -- Set the text for the label.
-		self.frame.label:SetText(text or "")
-	end
-
-	local function AddItem(self, key, value) -- Add an item to the list.
-		self.list = self.list or {}
-		self.list[key] = value
-	end
-	local SetItemValue = AddItem -- Set the value of a item in the list. <<same as adding a new item>>
-
-	local function SetMultiselect(self, flag) end -- Toggle multi-selecting. <<Dummy function to stay inline with the dropdown API>>
-	local function GetMultiselect() return false end-- Query the multi-select flag. <<Dummy function to stay inline with the dropdown API>>
-	local function SetItemDisabled(self, key) end-- Disable one item in the list. <<Dummy function to stay inline with the dropdown API>>
-
-	local function SetDisabled(self, disabled) -- Disable the widget.
-		self.disabled = disabled
-		if disabled then
-			self.frame:Disable()
-		else
-			self.frame:Enable()
-		end
-	end
-
-	local function textSort(a,b)
-		return string.upper(a) < string.upper(b)
-	end
-
-	local sortedlist = {}
-	local function ToggleDrop(this)
-		local self = this.obj
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-			AceGUI:ClearFocus()
-		else
-			AceGUI:SetFocus(self)
-			self.dropdown = AGSMW:GetDropDownFrame()
-			local width = self.frame:GetWidth()
-			self.dropdown:SetPoint("TOPLEFT", self.frame, "BOTTOMLEFT")
-			self.dropdown:SetPoint("TOPRIGHT", self.frame, "BOTTOMRIGHT", width < 160 and (160 - width) or 0, 0)
-			for k, v in pairs(self.list) do
-				sortedlist[#sortedlist+1] = k
-			end
-			table.sort(sortedlist, textSort)
-			for i, k in ipairs(sortedlist) do
-				local f = GetContentLine()
-				f.text:SetText(k)
-				--print(k)
-				if k == self.value then
-					f.check:Show()
-				end
-
-				local statusbar = self.list[k] ~= k and self.list[k] or Media:Fetch('statusbar',k)
-				f.bar:SetTexture(statusbar)
-				f.obj = self
-				f.dropdown = self.dropdown
-				self.dropdown:AddFrame(f)
-			end
-			wipe(sortedlist)
-		end
-	end
-
-	local function ClearFocus(self)
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-		end
-	end
-
-	local function OnHide(this)
-		local self = this.obj
-		if self.dropdown then
-			self.dropdown = AGSMW:ReturnDropDownFrame(self.dropdown)
-		end
-	end
-
-	local function Drop_OnEnter(this)
-		this.obj:Fire("OnEnter")
-	end
-
-	local function Drop_OnLeave(this)
-		this.obj:Fire("OnLeave")
-	end
-
-	local function Constructor()
-		local frame = AGSMW:GetBaseFrame()
-		local self = {}
-
-		self.type = widgetType
-		self.frame = frame
-		frame.obj = self
-		frame.dropButton.obj = self
-		frame.dropButton:SetScript("OnEnter", Drop_OnEnter)
-		frame.dropButton:SetScript("OnLeave", Drop_OnLeave)
-		frame.dropButton:SetScript("OnClick",ToggleDrop)
-		frame:SetScript("OnHide", OnHide)
-
-		local bar = frame:CreateTexture(nil, "OVERLAY")
-			bar:SetPoint("TOPLEFT", frame,"TOPLEFT",6,-25)
-			bar:SetPoint("BOTTOMRIGHT", frame,"BOTTOMRIGHT", -21, 5)
-			bar:SetAlpha(0.5)
-		self.bar = bar
-
-		self.alignoffset = 31
-
-		self.OnRelease = OnRelease
-		self.OnAcquire = OnAcquire
-		self.ClearFocus = ClearFocus
-		self.SetText = SetText
-		self.SetValue = SetValue
-		self.GetValue = GetValue
-		self.SetList = SetList
-		self.SetLabel = SetLabel
-		self.SetDisabled = SetDisabled
-		self.AddItem = AddItem
-		self.SetMultiselect = SetMultiselect
-		self.GetMultiselect = GetMultiselect
-		self.SetItemValue = SetItemValue
-		self.SetItemDisabled = SetItemDisabled
-		self.ToggleDrop = ToggleDrop
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
-
-end
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/prototypes.lua b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
deleted file mode 100644
index 14ccd59..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/prototypes.lua
+++ /dev/null
@@ -1,275 +0,0 @@
--- Widget created by Yssaril
---[===[@debug@
-local DataVersion = 9001 -- dev version always overwrites everything else :)
---@end-debug@]===]
---@non-debug@
-local DataVersion = 51
---@end-non-debug@
-local AGSMW = LibStub:NewLibrary("AceGUISharedMediaWidgets-1.0", DataVersion)
-
-if not AGSMW then
-  return	-- already loaded and no upgrade necessary
-end
-
-LoadAddOn("LibSharedMedia-3.0")
-local AceGUI = LibStub("AceGUI-3.0")
-local Media = LibStub("LibSharedMedia-3.0")
-
-AGSMW = AGSMW or {}
-
-AceGUIWidgetLSMlists = {
-	['font'] = Media:HashTable("font"),
-	['sound'] = Media:HashTable("sound"),
-	['statusbar'] = Media:HashTable("statusbar"),
-	['border'] = Media:HashTable("border"),
-	['background'] = Media:HashTable("background"),
-}
-
-do
-	local function disable(frame)
-		frame.label:SetTextColor(.5,.5,.5)
-		frame.text:SetTextColor(.5,.5,.5)
-		frame.dropButton:Disable()
-		if frame.displayButtonFont then
-			frame.displayButtonFont:SetTextColor(.5,.5,.5)
-			frame.displayButton:Disable()
-		end
-	end
-
-	local function enable(frame)
-		frame.label:SetTextColor(1,.82,0)
-		frame.text:SetTextColor(1,1,1)
-		frame.dropButton:Enable()
-		if frame.displayButtonFont then
-			frame.displayButtonFont:SetTextColor(1,1,1)
-			frame.displayButton:Enable()
-		end
-	end
-
-	local displayButtonBackdrop = {
-		edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
-		tile = true, tileSize = 16, edgeSize = 16,
-		insets = { left = 4, right = 4, top = 4, bottom = 4 },
-	}
-
-	-- create or retrieve BaseFrame
-	function AGSMW:GetBaseFrame()
-		local frame = CreateFrame("Frame", nil, UIParent)
-		frame:SetHeight(44)
-		frame:SetWidth(200)
-		frame:SetPoint("CENTER", UIParent, "CENTER")
-
-		local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
-			label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
-			label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
-			label:SetJustifyH("LEFT")
-			label:SetHeight(18)
-			label:SetText("")
-		frame.label = label
-
-		local DLeft = frame:CreateTexture(nil, "ARTWORK")
-			DLeft:SetWidth(25)
-			DLeft:SetHeight(64)
-			DLeft:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT", -17, -21)
-			DLeft:SetTexture([[Interface\Glues\CharacterCreate\CharacterCreate-LabelFrame]])
-			DLeft:SetTexCoord(0, 0.1953125, 0, 1)
-		frame.DLeft = DLeft
-
-		local DRight = frame:CreateTexture(nil, "ARTWORK")
-			DRight:SetWidth(25)
-			DRight:SetHeight(64)
-			DRight:SetPoint("TOP", DLeft, "TOP")
-			DRight:SetPoint("RIGHT", frame, "RIGHT", 17, 0)
-			DRight:SetTexture([[Interface\Glues\CharacterCreate\CharacterCreate-LabelFrame]])
-			DRight:SetTexCoord(0.8046875, 1, 0, 1)
-		frame.DRight = DRight
-
-		local DMiddle = frame:CreateTexture(nil, "ARTWORK")
-			DMiddle:SetHeight(64)
-			DMiddle:SetPoint("TOP", DLeft, "TOP")
-			DMiddle:SetPoint("LEFT", DLeft, "RIGHT")
-			DMiddle:SetPoint("RIGHT", DRight, "LEFT")
-			DMiddle:SetTexture([[Interface\Glues\CharacterCreate\CharacterCreate-LabelFrame]])
-			DMiddle:SetTexCoord(0.1953125, 0.8046875, 0, 1)
-		frame.DMiddle = DMiddle
-
-		local text = frame:CreateFontString(nil,"OVERLAY","GameFontHighlightSmall")
-			text:SetPoint("RIGHT",DRight,"RIGHT",-43,1)
-			text:SetPoint("LEFT",DLeft,"LEFT",26,1)
-			text:SetJustifyH("RIGHT")
-			text:SetHeight(18)
-			text:SetText("")
-		frame.text = text
-
-		local dropButton = CreateFrame("Button", nil, frame)
-			dropButton:SetWidth(24)
-			dropButton:SetHeight(24)
-			dropButton:SetPoint("TOPRIGHT", DRight, "TOPRIGHT", -16, -18)
-			dropButton:SetNormalTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollDown-Up]])
-			dropButton:SetPushedTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollDown-Down]])
-			dropButton:SetDisabledTexture([[Interface\ChatFrame\UI-ChatIcon-ScrollDown-Disabled]])
-			dropButton:SetHighlightTexture([[Interface\Buttons\UI-Common-MouseHilight]], "ADD")
-		frame.dropButton = dropButton
-
-		frame.Disable = disable
-		frame.Enable = enable
-		return frame
-	end
-
-	function AGSMW:GetBaseFrameWithWindow()
-		local frame = self:GetBaseFrame()
-
-		local displayButton = CreateFrame("Button", nil, frame)
-			displayButton:SetHeight(42)
-			displayButton:SetWidth(42)
-			displayButton:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, -2)
-			displayButton:SetBackdrop(displayButtonBackdrop)
-			displayButton:SetBackdropBorderColor(.5, .5, .5)
-		frame.displayButton = displayButton
-
-		frame.label:SetPoint("TOPLEFT",displayButton,"TOPRIGHT",1,2)
-
-		frame.DLeft:SetPoint("BOTTOMLEFT", displayButton, "BOTTOMRIGHT", -17, -20)
-
-		return frame
-	end
-
-end
-
-do
-
-	local sliderBackdrop = {
-		["bgFile"] = [[Interface\Buttons\UI-SliderBar-Background]],
-		["edgeFile"] = [[Interface\Buttons\UI-SliderBar-Border]],
-		["tile"] = true,
-		["edgeSize"] = 8,
-		["tileSize"] = 8,
-		["insets"] = {
-			["left"] = 3,
-			["right"] = 3,
-			["top"] = 3,
-			["bottom"] = 3,
-		},
-	}
-	local frameBackdrop = {
-		bgFile=[[Interface\DialogFrame\UI-DialogBox-Background-Dark]],
-		edgeFile = [[Interface\DialogFrame\UI-DialogBox-Border]],
-		tile = true, tileSize = 32, edgeSize = 32,
-		insets = { left = 11, right = 12, top = 12, bottom = 9 },
-	}
-
-	local function OnMouseWheel(self, dir)
-		self.slider:SetValue(self.slider:GetValue()+(15*dir*-1))
-	end
-
-	local function AddFrame(self, frame)
-		frame:SetParent(self.contentframe)
-		frame:SetFrameStrata(self:GetFrameStrata())
-		frame:SetFrameLevel(self:GetFrameLevel() + 100)
-
-		if next(self.contentRepo) then
-			frame:SetPoint("TOPLEFT", self.contentRepo[#self.contentRepo], "BOTTOMLEFT", 0, 0)
-			frame:SetPoint("RIGHT", self.contentframe, "RIGHT", 0, 0)
-			self.contentframe:SetHeight(self.contentframe:GetHeight() + frame:GetHeight())
-			self.contentRepo[#self.contentRepo+1] = frame
-		else
-			self.contentframe:SetHeight(frame:GetHeight())
-			frame:SetPoint("TOPLEFT", self.contentframe, "TOPLEFT", 0, 0)
-			frame:SetPoint("RIGHT", self.contentframe, "RIGHT", 0, 0)
-			self.contentRepo[1] = frame
-		end
-
-		if self.contentframe:GetHeight() > UIParent:GetHeight()*2/5 - 20 then
-			self.scrollframe:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", -28, 12)
-			self:SetHeight(UIParent:GetHeight()*2/5)
-			self.slider:Show()
-			self:SetScript("OnMouseWheel", OnMouseWheel)
-			self.scrollframe:UpdateScrollChildRect()
-			self.slider:SetMinMaxValues(0, self.contentframe:GetHeight()-self.scrollframe:GetHeight())
-		else
-			self.scrollframe:SetPoint("BOTTOMRIGHT", self, "BOTTOMRIGHT", -14, 12)
-			self:SetHeight(self.contentframe:GetHeight()+25)
-			self.slider:Hide()
-			self:SetScript("OnMouseWheel", nil)
-			self.scrollframe:UpdateScrollChildRect()
-			self.slider:SetMinMaxValues(0, 0)
-		end
-		self.contentframe:SetWidth(self.scrollframe:GetWidth())
-	end
-
-	local function ClearFrames(self)
-		for i, frame in ipairs(self.contentRepo) do
-			frame:ReturnSelf()
-			self.contentRepo[i] = nil
-		end
-	end
-
-	local function slider_OnValueChanged(self, value)
-		self.frame.scrollframe:SetVerticalScroll(value)
-	end
-
-	local DropDownCache = {}
-	function AGSMW:GetDropDownFrame()
-		local frame
-		if next(DropDownCache) then
-			frame = table.remove(DropDownCache)
-		else
-			frame = CreateFrame("Frame", nil, UIParent)
-				frame:SetClampedToScreen(true)
-				frame:SetWidth(188)
-				frame:SetBackdrop(frameBackdrop)
-				frame:SetFrameStrata("TOOLTIP")
-				frame:EnableMouseWheel(true)
-
-			local contentframe = CreateFrame("Frame", nil, frame)
-				contentframe:SetWidth(160)
-				contentframe:SetHeight(0)
-			frame.contentframe = contentframe
-
-			local scrollframe = CreateFrame("ScrollFrame", nil, frame)
-				scrollframe:SetWidth(160)
-				scrollframe:SetPoint("TOPLEFT", frame, "TOPLEFT", 14, -13)
-				scrollframe:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -14, 12)
-				scrollframe:SetScrollChild(contentframe)
-			frame.scrollframe = scrollframe
-
-			contentframe:SetPoint("TOPLEFT", scrollframe)
-			contentframe:SetPoint("TOPRIGHT", scrollframe)
-
-			local bgTex = frame:CreateTexture(nil, "ARTWORK")
-				bgTex:SetAllPoints(scrollframe)
-			frame.bgTex = bgTex
-
-			frame.AddFrame = AddFrame
-			frame.ClearFrames = ClearFrames
-			frame.contentRepo = {} -- store all our frames in here so we can get rid of them later
-
-			local slider = CreateFrame("Slider", nil, scrollframe)
-				slider:SetOrientation("VERTICAL")
-				slider:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -14, -10)
-				slider:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -14, 10)
-				slider:SetBackdrop(sliderBackdrop)
-				slider:SetThumbTexture([[Interface\Buttons\UI-SliderBar-Button-Vertical]])
-				slider:SetMinMaxValues(0, 1)
-				--slider:SetValueStep(1)
-				slider:SetWidth(12)
-				slider.frame = frame
-				slider:SetScript("OnValueChanged", slider_OnValueChanged)
-			frame.slider = slider
-		end
-		frame:SetHeight(UIParent:GetHeight()*2/5)
-		frame.slider:SetValue(0)
-		frame:Show()
-		return frame
-	end
-
-	function AGSMW:ReturnDropDownFrame(frame)
-		ClearFrames(frame)
-		frame:ClearAllPoints()
-		frame:Hide()
-		frame:SetBackdrop(frameBackdrop)
-		frame.bgTex:SetTexture(nil)
-		table.insert(DropDownCache, frame)
-		return nil
-	end
-end
diff --git a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/widget.xml b/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/widget.xml
deleted file mode 100644
index 15cd102..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0-SharedMediaWidgets/widget.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<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="prototypes.lua" />
-	<Script file="FontWidget.lua" />
-	<Script file="SoundWidget.lua" />
-	<Script file="StatusbarWidget.lua" />
-	<Script file="BorderWidget.lua" />
-	<Script file="BackgroundWidget.lua" />
-</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/AceGUI-3.0.lua b/ElvUI_SLE/libs/AceGUI-3.0/AceGUI-3.0.lua
deleted file mode 100644
index 9853644..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/AceGUI-3.0.lua
+++ /dev/null
@@ -1,813 +0,0 @@
---- **AceGUI-3.0** provides access to numerous widgets which can be used to create GUIs.
--- AceGUI is used by AceConfigDialog to create the option GUIs, but you can use it by itself
--- to create any custom GUI. There are more extensive examples in the test suite in the Ace3
--- stand-alone distribution.
---
--- **Note**: When using AceGUI-3.0 directly, please do not modify the frames of the widgets directly,
--- as any "unknown" change to the widgets will cause addons that get your widget out of the widget pool
--- to misbehave. If you think some part of a widget should be modifiable, please open a ticket, and we"ll
--- implement a proper API to modify it.
--- @usage
--- local AceGUI = LibStub("AceGUI-3.0")
--- -- Create a container frame
--- local f = AceGUI:Create("Frame")
--- f:SetCallback("OnClose",function(widget) AceGUI:Release(widget) end)
--- f:SetTitle("AceGUI-3.0 Example")
--- f:SetStatusText("Status Bar")
--- f:SetLayout("Flow")
--- -- Create a button
--- local btn = AceGUI:Create("Button")
--- btn:SetWidth(170)
--- btn:SetText("Button !")
--- btn:SetCallback("OnClick", function() print("Click!") end)
--- -- Add the button to the container
--- f:AddChild(btn)
--- @class file
--- @name AceGUI-3.0
--- @release $Id: AceGUI-3.0.lua 1102 2013-10-25 14:15:23Z nevcairiel $
-local ACEGUI_MAJOR, ACEGUI_MINOR = "AceGUI-3.0", 34
-local AceGUI, oldminor = LibStub:NewLibrary(ACEGUI_MAJOR, ACEGUI_MINOR)
-
-if not AceGUI then return end -- No upgrade needed
-
--- Lua APIs
-local tconcat, tremove, tinsert = table.concat, table.remove, table.insert
-local select, pairs, next, type = select, pairs, next, type
-local error, assert, loadstring = error, assert, loadstring
-local setmetatable, rawget, rawset = setmetatable, rawget, rawset
-local math_max = math.max
-
--- WoW APIs
-local UIParent = UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: geterrorhandler, LibStub
-
---local con = LibStub("AceConsole-3.0",true)
-
-AceGUI.WidgetRegistry = AceGUI.WidgetRegistry or {}
-AceGUI.LayoutRegistry = AceGUI.LayoutRegistry or {}
-AceGUI.WidgetBase = AceGUI.WidgetBase or {}
-AceGUI.WidgetContainerBase = AceGUI.WidgetContainerBase or {}
-AceGUI.WidgetVersions = AceGUI.WidgetVersions or {}
-
--- local upvalues
-local WidgetRegistry = AceGUI.WidgetRegistry
-local LayoutRegistry = AceGUI.LayoutRegistry
-local WidgetVersions = AceGUI.WidgetVersions
-
---[[
-	 xpcall safecall implementation
-]]
-local xpcall = xpcall
-
-local function errorhandler(err)
-	return geterrorhandler()(err)
-end
-
-local function CreateDispatcher(argCount)
-	local code = [[
-		local xpcall, eh = ...
-		local method, ARGS
-		local function call() return method(ARGS) end
-
-		local function dispatch(func, ...)
-			method = func
-			if not method then return end
-			ARGS = ...
-			return xpcall(call, eh)
-		end
-
-		return dispatch
-	]]
-
-	local ARGS = {}
-	for i = 1, argCount do ARGS[i] = "arg"..i end
-	code = code:gsub("ARGS", tconcat(ARGS, ", "))
-	return assert(loadstring(code, "safecall Dispatcher["..argCount.."]"))(xpcall, errorhandler)
-end
-
-local Dispatchers = setmetatable({}, {__index=function(self, argCount)
-	local dispatcher = CreateDispatcher(argCount)
-	rawset(self, argCount, dispatcher)
-	return dispatcher
-end})
-Dispatchers[0] = function(func)
-	return xpcall(func, errorhandler)
-end
-
-local function safecall(func, ...)
-	return Dispatchers[select("#", ...)](func, ...)
-end
-
--- Recycling functions
-local newWidget, delWidget
-do
-	-- Version Upgrade in Minor 29
-	-- Internal Storage of the objects changed, from an array table
-	-- to a hash table, and additionally we introduced versioning on
-	-- the widgets which would discard all widgets from a pre-29 version
-	-- anyway, so we just clear the storage now, and don't try to
-	-- convert the storage tables to the new format.
-	-- This should generally not cause *many* widgets to end up in trash,
-	-- since once dialogs are opened, all addons should be loaded already
-	-- and AceGUI should be on the latest version available on the users
-	-- setup.
-	-- -- nevcairiel - Nov 2nd, 2009
-	if oldminor and oldminor < 29 and AceGUI.objPools then
-		AceGUI.objPools = nil
-	end
-
-	AceGUI.objPools = AceGUI.objPools or {}
-	local objPools = AceGUI.objPools
-	--Returns a new instance, if none are available either returns a new table or calls the given contructor
-	function newWidget(type)
-		if not WidgetRegistry[type] then
-			error("Attempt to instantiate unknown widget type", 2)
-		end
-
-		if not objPools[type] then
-			objPools[type] = {}
-		end
-
-		local newObj = next(objPools[type])
-		if not newObj then
-			newObj = WidgetRegistry[type]()
-			newObj.AceGUIWidgetVersion = WidgetVersions[type]
-		else
-			objPools[type][newObj] = nil
-			-- if the widget is older then the latest, don't even try to reuse it
-			-- just forget about it, and grab a new one.
-			if not newObj.AceGUIWidgetVersion or newObj.AceGUIWidgetVersion < WidgetVersions[type] then
-				return newWidget(type)
-			end
-		end
-		return newObj
-	end
-	-- Releases an instance to the Pool
-	function delWidget(obj,type)
-		if not objPools[type] then
-			objPools[type] = {}
-		end
-		if objPools[type][obj] then
-			error("Attempt to Release Widget that is already released", 2)
-		end
-		objPools[type][obj] = true
-	end
-end
-
-
--------------------
--- API Functions --
--------------------
-
--- Gets a widget Object
-
---- Create a new Widget of the given type.
--- This function will instantiate a new widget (or use one from the widget pool), and call the
--- OnAcquire function on it, before returning.
--- @param type The type of the widget.
--- @return The newly created widget.
-function AceGUI:Create(type)
-	if WidgetRegistry[type] then
-		local widget = newWidget(type)
-
-		if rawget(widget, "Acquire") then
-			widget.OnAcquire = widget.Acquire
-			widget.Acquire = nil
-		elseif rawget(widget, "Aquire") then
-			widget.OnAcquire = widget.Aquire
-			widget.Aquire = nil
-		end
-
-		if rawget(widget, "Release") then
-			widget.OnRelease = rawget(widget, "Release")
-			widget.Release = nil
-		end
-
-		if widget.OnAcquire then
-			widget:OnAcquire()
-		else
-			error(("Widget type %s doesn't supply an OnAcquire Function"):format(type))
-		end
-		-- Set the default Layout ("List")
-		safecall(widget.SetLayout, widget, "List")
-		safecall(widget.ResumeLayout, widget)
-		return widget
-	end
-end
-
---- Releases a widget Object.
--- This function calls OnRelease on the widget and places it back in the widget pool.
--- Any data on the widget is being erased, and the widget will be hidden.\\
--- If this widget is a Container-Widget, all of its Child-Widgets will be releases as well.
--- @param widget The widget to release
-function AceGUI:Release(widget)
-	safecall(widget.PauseLayout, widget)
-	widget:Fire("OnRelease")
-	safecall(widget.ReleaseChildren, widget)
-
-	if widget.OnRelease then
-		widget:OnRelease()
---	else
---		error(("Widget type %s doesn't supply an OnRelease Function"):format(widget.type))
-	end
-	for k in pairs(widget.userdata) do
-		widget.userdata[k] = nil
-	end
-	for k in pairs(widget.events) do
-		widget.events[k] = nil
-	end
-	widget.width = nil
-	widget.relWidth = nil
-	widget.height = nil
-	widget.relHeight = nil
-	widget.noAutoHeight = nil
-	widget.frame:ClearAllPoints()
-	widget.frame:Hide()
-	widget.frame:SetParent(UIParent)
-	widget.frame.width = nil
-	widget.frame.height = nil
-	if widget.content then
-		widget.content.width = nil
-		widget.content.height = nil
-	end
-	delWidget(widget, widget.type)
-end
-
------------
--- Focus --
------------
-
-
---- Called when a widget has taken focus.
--- e.g. Dropdowns opening, Editboxes gaining kb focus
--- @param widget The widget that should be focused
-function AceGUI:SetFocus(widget)
-	if self.FocusedWidget and self.FocusedWidget ~= widget then
-		safecall(self.FocusedWidget.ClearFocus, self.FocusedWidget)
-	end
-	self.FocusedWidget = widget
-end
-
-
---- Called when something has happened that could cause widgets with focus to drop it
--- e.g. titlebar of a frame being clicked
-function AceGUI:ClearFocus()
-	if self.FocusedWidget then
-		safecall(self.FocusedWidget.ClearFocus, self.FocusedWidget)
-		self.FocusedWidget = nil
-	end
-end
-
--------------
--- Widgets --
--------------
---[[
-	Widgets must provide the following functions
-		OnAcquire() - Called when the object is acquired, should set everything to a default hidden state
-
-	And the following members
-		frame - the frame or derivitive object that will be treated as the widget for size and anchoring purposes
-		type - the type of the object, same as the name given to :RegisterWidget()
-
-	Widgets contain a table called userdata, this is a safe place to store data associated with the wigdet
-	It will be cleared automatically when a widget is released
-	Placing values directly into a widget object should be avoided
-
-	If the Widget can act as a container for other Widgets the following
-		content - frame or derivitive that children will be anchored to
-
-	The Widget can supply the following Optional Members
-		:OnRelease() - Called when the object is Released, should remove any additional anchors and clear any data
-		:OnWidthSet(width) - Called when the width of the widget is changed
-		:OnHeightSet(height) - Called when the height of the widget is changed
-			Widgets should not use the OnSizeChanged events of thier frame or content members, use these methods instead
-			AceGUI already sets a handler to the event
-		:LayoutFinished(width, height) - called after a layout has finished, the width and height will be the width and height of the
-			area used for controls. These can be nil if the layout used the existing size to layout the controls.
-
-]]
-
---------------------------
--- Widget Base Template --
---------------------------
-do
-	local WidgetBase = AceGUI.WidgetBase
-
-	WidgetBase.SetParent = function(self, parent)
-		local frame = self.frame
-		frame:SetParent(nil)
-		frame:SetParent(parent.content)
-		self.parent = parent
-	end
-
-	WidgetBase.SetCallback = function(self, name, func)
-		if type(func) == "function" then
-			self.events[name] = func
-		end
-	end
-
-	WidgetBase.Fire = function(self, name, ...)
-		if self.events[name] then
-			local success, ret = safecall(self.events[name], self, name, ...)
-			if success then
-				return ret
-			end
-		end
-	end
-
-	WidgetBase.SetWidth = function(self, width)
-		self.frame:SetWidth(width)
-		self.frame.width = width
-		if self.OnWidthSet then
-			self:OnWidthSet(width)
-		end
-	end
-
-	WidgetBase.SetRelativeWidth = function(self, width)
-		if width <= 0 or width > 1 then
-			error(":SetRelativeWidth(width): Invalid relative width.", 2)
-		end
-		self.relWidth = width
-		self.width = "relative"
-	end
-
-	WidgetBase.SetHeight = function(self, height)
-		self.frame:SetHeight(height)
-		self.frame.height = height
-		if self.OnHeightSet then
-			self:OnHeightSet(height)
-		end
-	end
-
-	--[[ WidgetBase.SetRelativeHeight = function(self, height)
-		if height <= 0 or height > 1 then
-			error(":SetRelativeHeight(height): Invalid relative height.", 2)
-		end
-		self.relHeight = height
-		self.height = "relative"
-	end ]]
-
-	WidgetBase.IsVisible = function(self)
-		return self.frame:IsVisible()
-	end
-
-	WidgetBase.IsShown= function(self)
-		return self.frame:IsShown()
-	end
-
-	WidgetBase.Release = function(self)
-		AceGUI:Release(self)
-	end
-
-	WidgetBase.SetPoint = function(self, ...)
-		return self.frame:SetPoint(...)
-	end
-
-	WidgetBase.ClearAllPoints = function(self)
-		return self.frame:ClearAllPoints()
-	end
-
-	WidgetBase.GetNumPoints = function(self)
-		return self.frame:GetNumPoints()
-	end
-
-	WidgetBase.GetPoint = function(self, ...)
-		return self.frame:GetPoint(...)
-	end
-
-	WidgetBase.GetUserDataTable = function(self)
-		return self.userdata
-	end
-
-	WidgetBase.SetUserData = function(self, key, value)
-		self.userdata[key] = value
-	end
-
-	WidgetBase.GetUserData = function(self, key)
-		return self.userdata[key]
-	end
-
-	WidgetBase.IsFullHeight = function(self)
-		return self.height == "fill"
-	end
-
-	WidgetBase.SetFullHeight = function(self, isFull)
-		if isFull then
-			self.height = "fill"
-		else
-			self.height = nil
-		end
-	end
-
-	WidgetBase.IsFullWidth = function(self)
-		return self.width == "fill"
-	end
-
-	WidgetBase.SetFullWidth = function(self, isFull)
-		if isFull then
-			self.width = "fill"
-		else
-			self.width = nil
-		end
-	end
-
---	local function LayoutOnUpdate(this)
---		this:SetScript("OnUpdate",nil)
---		this.obj:PerformLayout()
---	end
-
-	local WidgetContainerBase = AceGUI.WidgetContainerBase
-
-	WidgetContainerBase.PauseLayout = function(self)
-		self.LayoutPaused = true
-	end
-
-	WidgetContainerBase.ResumeLayout = function(self)
-		self.LayoutPaused = nil
-	end
-
-	WidgetContainerBase.PerformLayout = function(self)
-		if self.LayoutPaused then
-			return
-		end
-		safecall(self.LayoutFunc, self.content, self.children)
-	end
-
-	--call this function to layout, makes sure layed out objects get a frame to get sizes etc
-	WidgetContainerBase.DoLayout = function(self)
-		self:PerformLayout()
---		if not self.parent then
---			self.frame:SetScript("OnUpdate", LayoutOnUpdate)
---		end
-	end
-
-	WidgetContainerBase.AddChild = function(self, child, beforeWidget)
-		if beforeWidget then
-			local siblingIndex = 1
-			for _, widget in pairs(self.children) do
-				if widget == beforeWidget then
-					break
-				end
-				siblingIndex = siblingIndex + 1
-			end
-			tinsert(self.children, siblingIndex, child)
-		else
-			tinsert(self.children, child)
-		end
-		child:SetParent(self)
-		child.frame:Show()
-		self:DoLayout()
-	end
-
-	WidgetContainerBase.AddChildren = function(self, ...)
-		for i = 1, select("#", ...) do
-			local child = select(i, ...)
-			tinsert(self.children, child)
-			child:SetParent(self)
-			child.frame:Show()
-		end
-		self:DoLayout()
-	end
-
-	WidgetContainerBase.ReleaseChildren = function(self)
-		local children = self.children
-		for i = 1,#children do
-			AceGUI:Release(children[i])
-			children[i] = nil
-		end
-	end
-
-	WidgetContainerBase.SetLayout = function(self, Layout)
-		self.LayoutFunc = AceGUI:GetLayout(Layout)
-	end
-
-	WidgetContainerBase.SetAutoAdjustHeight = function(self, adjust)
-		if adjust then
-			self.noAutoHeight = nil
-		else
-			self.noAutoHeight = true
-		end
-	end
-
-	local function FrameResize(this)
-		local self = this.obj
-		if this:GetWidth() and this:GetHeight() then
-			if self.OnWidthSet then
-				self:OnWidthSet(this:GetWidth())
-			end
-			if self.OnHeightSet then
-				self:OnHeightSet(this:GetHeight())
-			end
-		end
-	end
-
-	local function ContentResize(this)
-		if this:GetWidth() and this:GetHeight() then
-			this.width = this:GetWidth()
-			this.height = this:GetHeight()
-			this.obj:DoLayout()
-		end
-	end
-
-	setmetatable(WidgetContainerBase, {__index=WidgetBase})
-
-	--One of these function should be called on each Widget Instance as part of its creation process
-
-	--- Register a widget-class as a container for newly created widgets.
-	-- @param widget The widget class
-	function AceGUI:RegisterAsContainer(widget)
-		widget.children = {}
-		widget.userdata = {}
-		widget.events = {}
-		widget.base = WidgetContainerBase
-		widget.content.obj = widget
-		widget.frame.obj = widget
-		widget.content:SetScript("OnSizeChanged", ContentResize)
-		widget.frame:SetScript("OnSizeChanged", FrameResize)
-		setmetatable(widget, {__index = WidgetContainerBase})
-		widget:SetLayout("List")
-		return widget
-	end
-
-	--- Register a widget-class as a widget.
-	-- @param widget The widget class
-	function AceGUI:RegisterAsWidget(widget)
-		widget.userdata = {}
-		widget.events = {}
-		widget.base = WidgetBase
-		widget.frame.obj = widget
-		widget.frame:SetScript("OnSizeChanged", FrameResize)
-		setmetatable(widget, {__index = WidgetBase})
-		return widget
-	end
-end
-
-
-
-
-------------------
--- Widget API   --
-------------------
-
---- Registers a widget Constructor, this function returns a new instance of the Widget
--- @param Name The name of the widget
--- @param Constructor The widget constructor function
--- @param Version The version of the widget
-function AceGUI:RegisterWidgetType(Name, Constructor, Version)
-	assert(type(Constructor) == "function")
-	assert(type(Version) == "number")
-
-	local oldVersion = WidgetVersions[Name]
-	if oldVersion and oldVersion >= Version then return end
-
-	WidgetVersions[Name] = Version
-	WidgetRegistry[Name] = Constructor
-end
-
---- Registers a Layout Function
--- @param Name The name of the layout
--- @param LayoutFunc Reference to the layout function
-function AceGUI:RegisterLayout(Name, LayoutFunc)
-	assert(type(LayoutFunc) == "function")
-	if type(Name) == "string" then
-		Name = Name:upper()
-	end
-	LayoutRegistry[Name] = LayoutFunc
-end
-
---- Get a Layout Function from the registry
--- @param Name The name of the layout
-function AceGUI:GetLayout(Name)
-	if type(Name) == "string" then
-		Name = Name:upper()
-	end
-	return LayoutRegistry[Name]
-end
-
-AceGUI.counts = AceGUI.counts or {}
-
---- A type-based counter to count the number of widgets created.
--- This is used by widgets that require a named frame, e.g. when a Blizzard
--- Template requires it.
--- @param type The widget type
-function AceGUI:GetNextWidgetNum(type)
-	if not self.counts[type] then
-		self.counts[type] = 0
-	end
-	self.counts[type] = self.counts[type] + 1
-	return self.counts[type]
-end
-
---- Return the number of created widgets for this type.
--- In contrast to GetNextWidgetNum, the number is not incremented.
--- @param type The widget type
-function AceGUI:GetWidgetCount(type)
-	return self.counts[type] or 0
-end
-
---- Return the version of the currently registered widget type.
--- @param type The widget type
-function AceGUI:GetWidgetVersion(type)
-	return WidgetVersions[type]
-end
-
--------------
--- Layouts --
--------------
-
---[[
-	A Layout is a func that takes 2 parameters
-		content - the frame that widgets will be placed inside
-		children - a table containing the widgets to layout
-]]
-
--- Very simple Layout, Children are stacked on top of each other down the left side
-AceGUI:RegisterLayout("List",
-	function(content, children)
-		local height = 0
-		local width = content.width or content:GetWidth() or 0
-		for i = 1, #children do
-			local child = children[i]
-
-			local frame = child.frame
-			frame:ClearAllPoints()
-			frame:Show()
-			if i == 1 then
-				frame:SetPoint("TOPLEFT", content)
-			else
-				frame:SetPoint("TOPLEFT", children[i-1].frame, "BOTTOMLEFT")
-			end
-
-			if child.width == "fill" then
-				child:SetWidth(width)
-				frame:SetPoint("RIGHT", content)
-
-				if child.DoLayout then
-					child:DoLayout()
-				end
-			elseif child.width == "relative" then
-				child:SetWidth(width * child.relWidth)
-
-				if child.DoLayout then
-					child:DoLayout()
-				end
-			end
-
-			height = height + (frame.height or frame:GetHeight() or 0)
-		end
-		safecall(content.obj.LayoutFinished, content.obj, nil, height)
-	end)
-
--- A single control fills the whole content area
-AceGUI:RegisterLayout("Fill",
-	function(content, children)
-		if children[1] then
-			children[1]:SetWidth(content:GetWidth() or 0)
-			children[1]:SetHeight(content:GetHeight() or 0)
-			children[1].frame:SetAllPoints(content)
-			children[1].frame:Show()
-			safecall(content.obj.LayoutFinished, content.obj, nil, children[1].frame:GetHeight())
-		end
-	end)
-
-local layoutrecursionblock = nil
-local function safelayoutcall(object, func, ...)
-	layoutrecursionblock = true
-	object[func](object, ...)
-	layoutrecursionblock = nil
-end
-
-AceGUI:RegisterLayout("Flow",
-	function(content, children)
-		if layoutrecursionblock then return end
-		--used height so far
-		local height = 0
-		--width used in the current row
-		local usedwidth = 0
-		--height of the current row
-		local rowheight = 0
-		local rowoffset = 0
-		local lastrowoffset
-
-		local width = content.width or content:GetWidth() or 0
-
-		--control at the start of the row
-		local rowstart
-		local rowstartoffset
-		local lastrowstart
-		local isfullheight
-
-		local frameoffset
-		local lastframeoffset
-		local oversize
-		for i = 1, #children do
-			local child = children[i]
-			oversize = nil
-			local frame = child.frame
-			local frameheight = frame.height or frame:GetHeight() or 0
-			local framewidth = frame.width or frame:GetWidth() or 0
-			lastframeoffset = frameoffset
-			-- HACK: Why did we set a frameoffset of (frameheight / 2) ?
-			-- That was moving all widgets half the widgets size down, is that intended?
-			-- Actually, it seems to be neccessary for many cases, we'll leave it in for now.
-			-- If widgets seem to anchor weirdly with this, provide a valid alignoffset for them.
-			-- TODO: Investigate moar!
-			frameoffset = child.alignoffset or (frameheight / 2)
-
-			if child.width == "relative" then
-				framewidth = width * child.relWidth
-			end
-
-			frame:Show()
-			frame:ClearAllPoints()
-			if i == 1 then
-				-- anchor the first control to the top left
-				frame:SetPoint("TOPLEFT", content)
-				rowheight = frameheight
-				rowoffset = frameoffset
-				rowstart = frame
-				rowstartoffset = frameoffset
-				usedwidth = framewidth
-				if usedwidth > width then
-					oversize = true
-				end
-			else
-				-- if there isn't available width for the control start a new row
-				-- if a control is "fill" it will be on a row of its own full width
-				if usedwidth == 0 or ((framewidth) + usedwidth > width) or child.width == "fill" then
-					if isfullheight then
-						-- a previous row has already filled the entire height, there's nothing we can usefully do anymore
-						-- (maybe error/warn about this?)
-						break
-					end
-					--anchor the previous row, we will now know its height and offset
-					rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
-					height = height + rowheight + 3
-					--save this as the rowstart so we can anchor it after the row is complete and we have the max height and offset of controls in it
-					rowstart = frame
-					rowstartoffset = frameoffset
-					rowheight = frameheight
-					rowoffset = frameoffset
-					usedwidth = framewidth
-					if usedwidth > width then
-						oversize = true
-					end
-				-- put the control on the current row, adding it to the width and checking if the height needs to be increased
-				else
-					--handles cases where the new height is higher than either control because of the offsets
-					--math.max(rowheight-rowoffset+frameoffset, frameheight-frameoffset+rowoffset)
-
-					--offset is always the larger of the two offsets
-					rowoffset = math_max(rowoffset, frameoffset)
-					rowheight = math_max(rowheight, rowoffset + (frameheight / 2))
-
-					frame:SetPoint("TOPLEFT", children[i-1].frame, "TOPRIGHT", 0, frameoffset - lastframeoffset)
-					usedwidth = framewidth + usedwidth
-				end
-			end
-
-			if child.width == "fill" then
-				safelayoutcall(child, "SetWidth", width)
-				frame:SetPoint("RIGHT", content)
-
-				usedwidth = 0
-				rowstart = frame
-				rowstartoffset = frameoffset
-
-				if child.DoLayout then
-					child:DoLayout()
-				end
-				rowheight = frame.height or frame:GetHeight() or 0
-				rowoffset = child.alignoffset or (rowheight / 2)
-				rowstartoffset = rowoffset
-			elseif child.width == "relative" then
-				safelayoutcall(child, "SetWidth", width * child.relWidth)
-
-				if child.DoLayout then
-					child:DoLayout()
-				end
-			elseif oversize then
-				if width > 1 then
-					frame:SetPoint("RIGHT", content)
-				end
-			end
-
-			if child.height == "fill" then
-				frame:SetPoint("BOTTOM", content)
-				isfullheight = true
-			end
-		end
-
-		--anchor the last row, if its full height needs a special case since  its height has just been changed by the anchor
-		if isfullheight then
-			rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -height)
-		elseif rowstart then
-			rowstart:SetPoint("TOPLEFT", content, "TOPLEFT", 0, -(height + (rowoffset - rowstartoffset) + 3))
-		end
-
-		height = height + rowheight + 3
-		safecall(content.obj.LayoutFinished, content.obj, nil, height)
-	end)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/AceGUI-3.0.xml b/ElvUI_SLE/libs/AceGUI-3.0/AceGUI-3.0.xml
deleted file mode 100644
index b515077..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/AceGUI-3.0.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<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="AceGUI-3.0.lua"/>
-	<!-- Container -->
-	<Script file="widgets\AceGUIContainer-BlizOptionsGroup.lua"/>
-	<Script file="widgets\AceGUIContainer-DropDownGroup.lua"/>
-	<Script file="widgets\AceGUIContainer-Frame.lua"/>
-	<Script file="widgets\AceGUIContainer-InlineGroup.lua"/>
-	<Script file="widgets\AceGUIContainer-ScrollFrame.lua"/>
-	<Script file="widgets\AceGUIContainer-SimpleGroup.lua"/>
-	<Script file="widgets\AceGUIContainer-TabGroup.lua"/>
-	<Script file="widgets\AceGUIContainer-TreeGroup.lua"/>
-	<Script file="widgets\AceGUIContainer-Window.lua"/>
-	<!-- Widgets -->
-	<Script file="widgets\AceGUIWidget-Button.lua"/>
-	<Script file="widgets\AceGUIWidget-CheckBox.lua"/>
-	<Script file="widgets\AceGUIWidget-ColorPicker.lua"/>
-	<Script file="widgets\AceGUIWidget-DropDown.lua"/>
-	<Script file="widgets\AceGUIWidget-DropDown-Items.lua"/>
-	<Script file="widgets\AceGUIWidget-EditBox.lua"/>
-	<Script file="widgets\AceGUIWidget-Heading.lua"/>
-	<Script file="widgets\AceGUIWidget-Icon.lua"/>
-	<Script file="widgets\AceGUIWidget-InteractiveLabel.lua"/>
-	<Script file="widgets\AceGUIWidget-Keybinding.lua"/>
-	<Script file="widgets\AceGUIWidget-Label.lua"/>
-	<Script file="widgets\AceGUIWidget-MultiLineEditBox.lua"/>
-	<Script file="widgets\AceGUIWidget-Slider.lua"/>
-</Ui>
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
deleted file mode 100644
index 9a48f8b..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-BlizOptionsGroup.lua
+++ /dev/null
@@ -1,138 +0,0 @@
---[[-----------------------------------------------------------------------------
-BlizOptionsGroup Container
-Simple container widget for the integration of AceGUI into the Blizzard Interface Options
--------------------------------------------------------------------------------]]
-local Type, Version = "BlizOptionsGroup", 21
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local CreateFrame = CreateFrame
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-
-local function OnShow(frame)
-	frame.obj:Fire("OnShow")
-end
-
-local function OnHide(frame)
-	frame.obj:Fire("OnHide")
-end
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-
-local function okay(frame)
-	frame.obj:Fire("okay")
-end
-
-local function cancel(frame)
-	frame.obj:Fire("cancel")
-end
-
-local function default(frame)
-	frame.obj:Fire("default")
-end
-
-local function refresh(frame)
-	frame.obj:Fire("refresh")
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetName()
-		self:SetTitle()
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		local contentwidth = width - 63
-		if contentwidth < 0 then
-			contentwidth = 0
-		end
-		content:SetWidth(contentwidth)
-		content.width = contentwidth
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		local contentheight = height - 26
-		if contentheight < 0 then
-			contentheight = 0
-		end
-		content:SetHeight(contentheight)
-		content.height = contentheight
-	end,
-
-	["SetName"] = function(self, name, parent)
-		self.frame.name = name
-		self.frame.parent = parent
-	end,
-
-	["SetTitle"] = function(self, title)
-		local content = self.content
-		content:ClearAllPoints()
-		if not title or title == "" then
-			content:SetPoint("TOPLEFT", 10, -10)
-			self.label:SetText("")
-		else
-			content:SetPoint("TOPLEFT", 10, -40)
-			self.label:SetText(title)
-		end
-		content:SetPoint("BOTTOMRIGHT", -10, 10)
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Frame")
-	frame:Hide()
-
-	-- support functions for the Blizzard Interface Options
-	frame.okay = okay
-	frame.cancel = cancel
-	frame.default = default
-	frame.refresh = refresh
-
-	frame:SetScript("OnHide", OnHide)
-	frame:SetScript("OnShow", OnShow)
-
-	local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge")
-	label:SetPoint("TOPLEFT", 10, -15)
-	label:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", 10, -45)
-	label:SetJustifyH("LEFT")
-	label:SetJustifyV("TOP")
-
-	--Container Support
-	local content = CreateFrame("Frame", nil, frame)
-	content:SetPoint("TOPLEFT", 10, -10)
-	content:SetPoint("BOTTOMRIGHT", -10, 10)
-
-	local widget = {
-		label   = label,
-		frame   = frame,
-		content = content,
-		type    = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
deleted file mode 100644
index b0f81b7..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-DropDownGroup.lua
+++ /dev/null
@@ -1,157 +0,0 @@
---[[-----------------------------------------------------------------------------
-DropdownGroup Container
-Container controlled by a dropdown on the top.
--------------------------------------------------------------------------------]]
-local Type, Version = "DropdownGroup", 21
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local assert, pairs, type = assert, pairs, type
-
--- WoW APIs
-local CreateFrame = CreateFrame
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function SelectedGroup(self, event, value)
-	local group = self.parentgroup
-	local status = group.status or group.localstatus
-	status.selected = value
-	self.parentgroup:Fire("OnGroupSelected", value)
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self.dropdown:SetText("")
-		self:SetDropdownWidth(200)
-		self:SetTitle("")
-	end,
-
-	["OnRelease"] = function(self)
-		self.dropdown.list = nil
-		self.status = nil
-		for k in pairs(self.localstatus) do
-			self.localstatus[k] = nil
-		end
-	end,
-
-	["SetTitle"] = function(self, title)
-		self.titletext:SetText(title)
-		self.dropdown.frame:ClearAllPoints()
-		if title and title ~= "" then
-			self.dropdown.frame:SetPoint("TOPRIGHT", -2, 0)
-		else
-			self.dropdown.frame:SetPoint("TOPLEFT", -1, 0)
-		end
-	end,
-
-	["SetGroupList"] = function(self,list,order)
-		self.dropdown:SetList(list,order)
-	end,
-
-	["SetStatusTable"] = function(self, status)
-		assert(type(status) == "table")
-		self.status = status
-	end,
-
-	["SetGroup"] = function(self,group)
-		self.dropdown:SetValue(group)
-		local status = self.status or self.localstatus
-		status.selected = group
-		self:Fire("OnGroupSelected", group)
-	end,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		local contentwidth = width - 26
-		if contentwidth < 0 then
-			contentwidth = 0
-		end
-		content:SetWidth(contentwidth)
-		content.width = contentwidth
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		local contentheight = height - 63
-		if contentheight < 0 then
-			contentheight = 0
-		end
-		content:SetHeight(contentheight)
-		content.height = contentheight
-	end,
-
-	["LayoutFinished"] = function(self, width, height)
-		self:SetHeight((height or 0) + 63)
-	end,
-
-	["SetDropdownWidth"] = function(self, width)
-		self.dropdown:SetWidth(width)
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local PaneBackdrop  = {
-	bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
-	edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
-	tile = true, tileSize = 16, edgeSize = 16,
-	insets = { left = 3, right = 3, top = 5, bottom = 3 }
-}
-
-local function Constructor()
-	local frame = CreateFrame("Frame")
-	frame:SetHeight(100)
-	frame:SetWidth(100)
-	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-
-	local titletext = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
-	titletext:SetPoint("TOPLEFT", 4, -5)
-	titletext:SetPoint("TOPRIGHT", -4, -5)
-	titletext:SetJustifyH("LEFT")
-	titletext:SetHeight(18)
-
-	local dropdown = AceGUI:Create("Dropdown")
-	dropdown.frame:SetParent(frame)
-	dropdown.frame:SetFrameLevel(dropdown.frame:GetFrameLevel() + 2)
-	dropdown:SetCallback("OnValueChanged", SelectedGroup)
-	dropdown.frame:SetPoint("TOPLEFT", -1, 0)
-	dropdown.frame:Show()
-	dropdown:SetLabel("")
-
-	local border = CreateFrame("Frame", nil, frame)
-	border:SetPoint("TOPLEFT", 0, -26)
-	border:SetPoint("BOTTOMRIGHT", 0, 3)
-	border:SetBackdrop(PaneBackdrop)
-	border:SetBackdropColor(0.1,0.1,0.1,0.5)
-	border:SetBackdropBorderColor(0.4,0.4,0.4)
-
-	--Container Support
-	local content = CreateFrame("Frame", nil, border)
-	content:SetPoint("TOPLEFT", 10, -10)
-	content:SetPoint("BOTTOMRIGHT", -10, 10)
-
-	local widget = {
-		frame       = frame,
-		localstatus = {},
-		titletext   = titletext,
-		dropdown    = dropdown,
-		border      = border,
-		content     = content,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	dropdown.parentgroup = widget
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
deleted file mode 100644
index 0dae68c..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-Frame.lua
+++ /dev/null
@@ -1,311 +0,0 @@
---[[-----------------------------------------------------------------------------
-Frame Container
--------------------------------------------------------------------------------]]
-local Type, Version = "Frame", 24
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs, assert, type = pairs, assert, type
-local wipe = table.wipe
-
--- WoW APIs
-local PlaySound = PlaySound
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: CLOSE
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Button_OnClick(frame)
-	PlaySound("gsTitleOptionExit")
-	frame.obj:Hide()
-end
-
-local function Frame_OnClose(frame)
-	frame.obj:Fire("OnClose")
-end
-
-local function Frame_OnMouseDown(frame)
-	AceGUI:ClearFocus()
-end
-
-local function Title_OnMouseDown(frame)
-	frame:GetParent():StartMoving()
-	AceGUI:ClearFocus()
-end
-
-local function MoverSizer_OnMouseUp(mover)
-	local frame = mover:GetParent()
-	frame:StopMovingOrSizing()
-	local self = frame.obj
-	local status = self.status or self.localstatus
-	status.width = frame:GetWidth()
-	status.height = frame:GetHeight()
-	status.top = frame:GetTop()
-	status.left = frame:GetLeft()
-end
-
-local function SizerSE_OnMouseDown(frame)
-	frame:GetParent():StartSizing("BOTTOMRIGHT")
-	AceGUI:ClearFocus()
-end
-
-local function SizerS_OnMouseDown(frame)
-	frame:GetParent():StartSizing("BOTTOM")
-	AceGUI:ClearFocus()
-end
-
-local function SizerE_OnMouseDown(frame)
-	frame:GetParent():StartSizing("RIGHT")
-	AceGUI:ClearFocus()
-end
-
-local function StatusBar_OnEnter(frame)
-	frame.obj:Fire("OnEnterStatusBar")
-end
-
-local function StatusBar_OnLeave(frame)
-	frame.obj:Fire("OnLeaveStatusBar")
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self.frame:SetParent(UIParent)
-		self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
-		self:SetTitle()
-		self:SetStatusText()
-		self:ApplyStatus()
-		self:Show()
-        self:EnableResize(true)
-	end,
-
-	["OnRelease"] = function(self)
-		self.status = nil
-		wipe(self.localstatus)
-	end,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		local contentwidth = width - 34
-		if contentwidth < 0 then
-			contentwidth = 0
-		end
-		content:SetWidth(contentwidth)
-		content.width = contentwidth
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		local contentheight = height - 57
-		if contentheight < 0 then
-			contentheight = 0
-		end
-		content:SetHeight(contentheight)
-		content.height = contentheight
-	end,
-
-	["SetTitle"] = function(self, title)
-		self.titletext:SetText(title)
-		self.titlebg:SetWidth((self.titletext:GetWidth() or 0) + 10)
-	end,
-
-	["SetStatusText"] = function(self, text)
-		self.statustext:SetText(text)
-	end,
-
-	["Hide"] = function(self)
-		self.frame:Hide()
-	end,
-
-	["Show"] = function(self)
-		self.frame:Show()
-	end,
-
-	["EnableResize"] = function(self, state)
-		local func = state and "Show" or "Hide"
-		self.sizer_se[func](self.sizer_se)
-		self.sizer_s[func](self.sizer_s)
-		self.sizer_e[func](self.sizer_e)
-	end,
-
-	-- called to set an external table to store status in
-	["SetStatusTable"] = function(self, status)
-		assert(type(status) == "table")
-		self.status = status
-		self:ApplyStatus()
-	end,
-
-	["ApplyStatus"] = function(self)
-		local status = self.status or self.localstatus
-		local frame = self.frame
-		self:SetWidth(status.width or 700)
-		self:SetHeight(status.height or 500)
-		frame:ClearAllPoints()
-		if status.top and status.left then
-			frame:SetPoint("TOP", UIParent, "BOTTOM", 0, status.top)
-			frame:SetPoint("LEFT", UIParent, "LEFT", status.left, 0)
-		else
-			frame:SetPoint("CENTER")
-		end
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local FrameBackdrop = {
-	bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background",
-	edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
-	tile = true, tileSize = 32, edgeSize = 32,
-	insets = { left = 8, right = 8, top = 8, bottom = 8 }
-}
-
-local PaneBackdrop  = {
-	bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
-	edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
-	tile = true, tileSize = 16, edgeSize = 16,
-	insets = { left = 3, right = 3, top = 5, bottom = 3 }
-}
-
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-	frame:Hide()
-
-	frame:EnableMouse(true)
-	frame:SetMovable(true)
-	frame:SetResizable(true)
-	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-	frame:SetBackdrop(FrameBackdrop)
-	frame:SetBackdropColor(0, 0, 0, 1)
-	frame:SetMinResize(400, 200)
-	frame:SetToplevel(true)
-	frame:SetScript("OnHide", Frame_OnClose)
-	frame:SetScript("OnMouseDown", Frame_OnMouseDown)
-
-	local closebutton = CreateFrame("Button", nil, frame, "UIPanelButtonTemplate")
-	closebutton:SetScript("OnClick", Button_OnClick)
-	closebutton:SetPoint("BOTTOMRIGHT", -27, 17)
-	closebutton:SetHeight(20)
-	closebutton:SetWidth(100)
-	closebutton:SetText(CLOSE)
-
-	local statusbg = CreateFrame("Button", nil, frame)
-	statusbg:SetPoint("BOTTOMLEFT", 15, 15)
-	statusbg:SetPoint("BOTTOMRIGHT", -132, 15)
-	statusbg:SetHeight(24)
-	statusbg:SetBackdrop(PaneBackdrop)
-	statusbg:SetBackdropColor(0.1,0.1,0.1)
-	statusbg:SetBackdropBorderColor(0.4,0.4,0.4)
-	statusbg:SetScript("OnEnter", StatusBar_OnEnter)
-	statusbg:SetScript("OnLeave", StatusBar_OnLeave)
-
-	local statustext = statusbg:CreateFontString(nil, "OVERLAY", "GameFontNormal")
-	statustext:SetPoint("TOPLEFT", 7, -2)
-	statustext:SetPoint("BOTTOMRIGHT", -7, 2)
-	statustext:SetHeight(20)
-	statustext:SetJustifyH("LEFT")
-	statustext:SetText("")
-
-	local titlebg = frame:CreateTexture(nil, "OVERLAY")
-	titlebg:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
-	titlebg:SetTexCoord(0.31, 0.67, 0, 0.63)
-	titlebg:SetPoint("TOP", 0, 12)
-	titlebg:SetWidth(100)
-	titlebg:SetHeight(40)
-
-	local title = CreateFrame("Frame", nil, frame)
-	title:EnableMouse(true)
-	title:SetScript("OnMouseDown", Title_OnMouseDown)
-	title:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
-	title:SetAllPoints(titlebg)
-
-	local titletext = title:CreateFontString(nil, "OVERLAY", "GameFontNormal")
-	titletext:SetPoint("TOP", titlebg, "TOP", 0, -14)
-
-	local titlebg_l = frame:CreateTexture(nil, "OVERLAY")
-	titlebg_l:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
-	titlebg_l:SetTexCoord(0.21, 0.31, 0, 0.63)
-	titlebg_l:SetPoint("RIGHT", titlebg, "LEFT")
-	titlebg_l:SetWidth(30)
-	titlebg_l:SetHeight(40)
-
-	local titlebg_r = frame:CreateTexture(nil, "OVERLAY")
-	titlebg_r:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
-	titlebg_r:SetTexCoord(0.67, 0.77, 0, 0.63)
-	titlebg_r:SetPoint("LEFT", titlebg, "RIGHT")
-	titlebg_r:SetWidth(30)
-	titlebg_r:SetHeight(40)
-
-	local sizer_se = CreateFrame("Frame", nil, frame)
-	sizer_se:SetPoint("BOTTOMRIGHT")
-	sizer_se:SetWidth(25)
-	sizer_se:SetHeight(25)
-	sizer_se:EnableMouse()
-	sizer_se:SetScript("OnMouseDown",SizerSE_OnMouseDown)
-	sizer_se:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
-
-	local line1 = sizer_se:CreateTexture(nil, "BACKGROUND")
-	line1:SetWidth(14)
-	line1:SetHeight(14)
-	line1:SetPoint("BOTTOMRIGHT", -8, 8)
-	line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
-	local x = 0.1 * 14/17
-	line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
-
-	local line2 = sizer_se:CreateTexture(nil, "BACKGROUND")
-	line2:SetWidth(8)
-	line2:SetHeight(8)
-	line2:SetPoint("BOTTOMRIGHT", -8, 8)
-	line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
-	local x = 0.1 * 8/17
-	line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
-
-	local sizer_s = CreateFrame("Frame", nil, frame)
-	sizer_s:SetPoint("BOTTOMRIGHT", -25, 0)
-	sizer_s:SetPoint("BOTTOMLEFT")
-	sizer_s:SetHeight(25)
-	sizer_s:EnableMouse(true)
-	sizer_s:SetScript("OnMouseDown", SizerS_OnMouseDown)
-	sizer_s:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
-
-	local sizer_e = CreateFrame("Frame", nil, frame)
-	sizer_e:SetPoint("BOTTOMRIGHT", 0, 25)
-	sizer_e:SetPoint("TOPRIGHT")
-	sizer_e:SetWidth(25)
-	sizer_e:EnableMouse(true)
-	sizer_e:SetScript("OnMouseDown", SizerE_OnMouseDown)
-	sizer_e:SetScript("OnMouseUp", MoverSizer_OnMouseUp)
-
-	--Container Support
-	local content = CreateFrame("Frame", nil, frame)
-	content:SetPoint("TOPLEFT", 17, -27)
-	content:SetPoint("BOTTOMRIGHT", -17, 40)
-
-	local widget = {
-		localstatus = {},
-		titletext   = titletext,
-		statustext  = statustext,
-		titlebg     = titlebg,
-		sizer_se    = sizer_se,
-		sizer_s     = sizer_s,
-		sizer_e     = sizer_e,
-		content     = content,
-		frame       = frame,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	closebutton.obj, statusbg.obj = widget, widget
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
deleted file mode 100644
index f3db7d6..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-InlineGroup.lua
+++ /dev/null
@@ -1,103 +0,0 @@
---[[-----------------------------------------------------------------------------
-InlineGroup Container
-Simple container widget that creates a visible "box" with an optional title.
--------------------------------------------------------------------------------]]
-local Type, Version = "InlineGroup", 21
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetWidth(300)
-		self:SetHeight(100)
-		self:SetTitle("")
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetTitle"] = function(self,title)
-		self.titletext:SetText(title)
-	end,
-
-
-	["LayoutFinished"] = function(self, width, height)
-		if self.noAutoHeight then return end
-		self:SetHeight((height or 0) + 40)
-	end,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		local contentwidth = width - 20
-		if contentwidth < 0 then
-			contentwidth = 0
-		end
-		content:SetWidth(contentwidth)
-		content.width = contentwidth
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		local contentheight = height - 20
-		if contentheight < 0 then
-			contentheight = 0
-		end
-		content:SetHeight(contentheight)
-		content.height = contentheight
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local PaneBackdrop  = {
-	bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
-	edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
-	tile = true, tileSize = 16, edgeSize = 16,
-	insets = { left = 3, right = 3, top = 5, bottom = 3 }
-}
-
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-
-	local titletext = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
-	titletext:SetPoint("TOPLEFT", 14, 0)
-	titletext:SetPoint("TOPRIGHT", -14, 0)
-	titletext:SetJustifyH("LEFT")
-	titletext:SetHeight(18)
-
-	local border = CreateFrame("Frame", nil, frame)
-	border:SetPoint("TOPLEFT", 0, -17)
-	border:SetPoint("BOTTOMRIGHT", -1, 3)
-	border:SetBackdrop(PaneBackdrop)
-	border:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
-	border:SetBackdropBorderColor(0.4, 0.4, 0.4)
-
-	--Container Support
-	local content = CreateFrame("Frame", nil, border)
-	content:SetPoint("TOPLEFT", 10, -10)
-	content:SetPoint("BOTTOMRIGHT", -10, 10)
-
-	local widget = {
-		frame     = frame,
-		content   = content,
-		titletext = titletext,
-		type      = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
deleted file mode 100644
index a56e7cd..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-ScrollFrame.lua
+++ /dev/null
@@ -1,204 +0,0 @@
---[[-----------------------------------------------------------------------------
-ScrollFrame Container
-Plain container that scrolls its content and doesn't grow in height.
--------------------------------------------------------------------------------]]
-local Type, Version = "ScrollFrame", 23
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs, assert, type = pairs, assert, type
-local min, max, floor, abs = math.min, math.max, math.floor, math.abs
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-local function FixScrollOnUpdate(frame)
-	frame:SetScript("OnUpdate", nil)
-	frame.obj:FixScroll()
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function ScrollFrame_OnMouseWheel(frame, value)
-	frame.obj:MoveScroll(value)
-end
-
-local function ScrollFrame_OnSizeChanged(frame)
-	frame:SetScript("OnUpdate", FixScrollOnUpdate)
-end
-
-local function ScrollBar_OnScrollValueChanged(frame, value)
-	frame.obj:SetScroll(value)
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetScroll(0)
-		self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
-	end,
-
-	["OnRelease"] = function(self)
-		self.status = nil
-		for k in pairs(self.localstatus) do
-			self.localstatus[k] = nil
-		end
-		self.scrollframe:SetPoint("BOTTOMRIGHT")
-		self.scrollbar:Hide()
-		self.scrollBarShown = nil
-		self.content.height, self.content.width = nil, nil
-	end,
-
-	["SetScroll"] = function(self, value)
-		local status = self.status or self.localstatus
-		local viewheight = self.scrollframe:GetHeight()
-		local height = self.content:GetHeight()
-		local offset
-
-		if viewheight > height then
-			offset = 0
-		else
-			offset = floor((height - viewheight) / 1000.0 * value)
-		end
-		self.content:ClearAllPoints()
-		self.content:SetPoint("TOPLEFT", 0, offset)
-		self.content:SetPoint("TOPRIGHT", 0, offset)
-		status.offset = offset
-		status.scrollvalue = value
-	end,
-
-	["MoveScroll"] = function(self, value)
-		local status = self.status or self.localstatus
-		local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
-
-		if self.scrollBarShown then
-			local diff = height - viewheight
-			local delta = 1
-			if value < 0 then
-				delta = -1
-			end
-			self.scrollbar:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
-		end
-	end,
-
-	["FixScroll"] = function(self)
-		if self.updateLock then return end
-		self.updateLock = true
-		local status = self.status or self.localstatus
-		local height, viewheight = self.scrollframe:GetHeight(), self.content:GetHeight()
-		local offset = status.offset or 0
-		local curvalue = self.scrollbar:GetValue()
-		-- Give us a margin of error of 2 pixels to stop some conditions that i would blame on floating point inaccuracys
-		-- No-one is going to miss 2 pixels at the bottom of the frame, anyhow!
-		if viewheight < height + 2 then
-			if self.scrollBarShown then
-				self.scrollBarShown = nil
-				self.scrollbar:Hide()
-				self.scrollbar:SetValue(0)
-				self.scrollframe:SetPoint("BOTTOMRIGHT")
-				self:DoLayout()
-			end
-		else
-			if not self.scrollBarShown then
-				self.scrollBarShown = true
-				self.scrollbar:Show()
-				self.scrollframe:SetPoint("BOTTOMRIGHT", -20, 0)
-				self:DoLayout()
-			end
-			local value = (offset / (viewheight - height) * 1000)
-			if value > 1000 then value = 1000 end
-			self.scrollbar:SetValue(value)
-			self:SetScroll(value)
-			if value < 1000 then
-				self.content:ClearAllPoints()
-				self.content:SetPoint("TOPLEFT", 0, offset)
-				self.content:SetPoint("TOPRIGHT", 0, offset)
-				status.offset = offset
-			end
-		end
-		self.updateLock = nil
-	end,
-
-	["LayoutFinished"] = function(self, width, height)
-		self.content:SetHeight(height or 0 + 20)
-		self.scrollframe:SetScript("OnUpdate", FixScrollOnUpdate)
-	end,
-
-	["SetStatusTable"] = function(self, status)
-		assert(type(status) == "table")
-		self.status = status
-		if not status.scrollvalue then
-			status.scrollvalue = 0
-		end
-	end,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		content.width = width
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		content.height = height
-	end
-}
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-	local num = AceGUI:GetNextWidgetNum(Type)
-
-	local scrollframe = CreateFrame("ScrollFrame", nil, frame)
-	scrollframe:SetPoint("TOPLEFT")
-	scrollframe:SetPoint("BOTTOMRIGHT")
-	scrollframe:EnableMouseWheel(true)
-	scrollframe:SetScript("OnMouseWheel", ScrollFrame_OnMouseWheel)
-	scrollframe:SetScript("OnSizeChanged", ScrollFrame_OnSizeChanged)
-
-	local scrollbar = CreateFrame("Slider", ("AceConfigDialogScrollFrame%dScrollBar"):format(num), scrollframe, "UIPanelScrollBarTemplate")
-	scrollbar:SetPoint("TOPLEFT", scrollframe, "TOPRIGHT", 4, -16)
-	scrollbar:SetPoint("BOTTOMLEFT", scrollframe, "BOTTOMRIGHT", 4, 16)
-	scrollbar:SetMinMaxValues(0, 1000)
-	scrollbar:SetValueStep(1)
-	scrollbar:SetValue(0)
-	scrollbar:SetWidth(16)
-	scrollbar:Hide()
-	-- set the script as the last step, so it doesn't fire yet
-	scrollbar:SetScript("OnValueChanged", ScrollBar_OnScrollValueChanged)
-
-	local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND")
-	scrollbg:SetAllPoints(scrollbar)
-	scrollbg:SetTexture(0, 0, 0, 0.4)
-
-	--Container Support
-	local content = CreateFrame("Frame", nil, scrollframe)
-	content:SetPoint("TOPLEFT")
-	content:SetPoint("TOPRIGHT")
-	content:SetHeight(400)
-	scrollframe:SetScrollChild(content)
-
-	local widget = {
-		localstatus = { scrollvalue = 0 },
-		scrollframe = scrollframe,
-		scrollbar   = scrollbar,
-		content     = content,
-		frame       = frame,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	scrollframe.obj, scrollbar.obj = widget, widget
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-SimpleGroup.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-SimpleGroup.lua
deleted file mode 100644
index 57512c3..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-SimpleGroup.lua
+++ /dev/null
@@ -1,69 +0,0 @@
---[[-----------------------------------------------------------------------------
-SimpleGroup Container
-Simple container widget that just groups widgets.
--------------------------------------------------------------------------------]]
-local Type, Version = "SimpleGroup", 20
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetWidth(300)
-		self:SetHeight(100)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["LayoutFinished"] = function(self, width, height)
-		if self.noAutoHeight then return end
-		self:SetHeight(height or 0)
-	end,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		content:SetWidth(width)
-		content.width = width
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		content:SetHeight(height)
-		content.height = height
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-
-	--Container Support
-	local content = CreateFrame("Frame", nil, frame)
-	content:SetPoint("TOPLEFT")
-	content:SetPoint("BOTTOMRIGHT")
-
-	local widget = {
-		frame     = frame,
-		content   = content,
-		type      = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
deleted file mode 100644
index 00be129..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-TabGroup.lua
+++ /dev/null
@@ -1,350 +0,0 @@
---[[-----------------------------------------------------------------------------
-TabGroup Container
-Container that uses tabs on top to switch between groups.
--------------------------------------------------------------------------------]]
-local Type, Version = "TabGroup", 35
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs, ipairs, assert, type, wipe = pairs, ipairs, assert, type, wipe
-
--- WoW APIs
-local PlaySound = PlaySound
-local CreateFrame, UIParent = CreateFrame, UIParent
-local _G = _G
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: PanelTemplates_TabResize, PanelTemplates_SetDisabledTabState, PanelTemplates_SelectTab, PanelTemplates_DeselectTab
-
--- local upvalue storage used by BuildTabs
-local widths = {}
-local rowwidths = {}
-local rowends = {}
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-local function UpdateTabLook(frame)
-	if frame.disabled then
-		PanelTemplates_SetDisabledTabState(frame)
-	elseif frame.selected then
-		PanelTemplates_SelectTab(frame)
-	else
-		PanelTemplates_DeselectTab(frame)
-	end
-end
-
-local function Tab_SetText(frame, text)
-	frame:_SetText(text)
-	local width = frame.obj.frame.width or frame.obj.frame:GetWidth() or 0
-	PanelTemplates_TabResize(frame, 0, nil, nil, width, frame:GetFontString():GetStringWidth())
-end
-
-local function Tab_SetSelected(frame, selected)
-	frame.selected = selected
-	UpdateTabLook(frame)
-end
-
-local function Tab_SetDisabled(frame, disabled)
-	frame.disabled = disabled
-	UpdateTabLook(frame)
-end
-
-local function BuildTabsOnUpdate(frame)
-	local self = frame.obj
-	self:BuildTabs()
-	frame:SetScript("OnUpdate", nil)
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Tab_OnClick(frame)
-	if not (frame.selected or frame.disabled) then
-		PlaySound("igCharacterInfoTab")
-		frame.obj:SelectTab(frame.value)
-	end
-end
-
-local function Tab_OnEnter(frame)
-	local self = frame.obj
-	self:Fire("OnTabEnter", self.tabs[frame.id].value, frame)
-end
-
-local function Tab_OnLeave(frame)
-	local self = frame.obj
-	self:Fire("OnTabLeave", self.tabs[frame.id].value, frame)
-end
-
-local function Tab_OnShow(frame)
-	_G[frame:GetName().."HighlightTexture"]:SetWidth(frame:GetTextWidth() + 30)
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetTitle()
-	end,
-
-	["OnRelease"] = function(self)
-		self.status = nil
-		for k in pairs(self.localstatus) do
-			self.localstatus[k] = nil
-		end
-		self.tablist = nil
-		for _, tab in pairs(self.tabs) do
-			tab:Hide()
-		end
-	end,
-
-	["CreateTab"] = function(self, id)
-		local tabname = ("AceGUITabGroup%dTab%d"):format(self.num, id)
-		local tab = CreateFrame("Button", tabname, self.border, "OptionsFrameTabButtonTemplate")
-		tab.obj = self
-		tab.id = id
-
-		tab.text = _G[tabname .. "Text"]
-		tab.text:ClearAllPoints()
-		tab.text:SetPoint("LEFT", 14, -3)
-		tab.text:SetPoint("RIGHT", -12, -3)
-
-		tab:SetScript("OnClick", Tab_OnClick)
-		tab:SetScript("OnEnter", Tab_OnEnter)
-		tab:SetScript("OnLeave", Tab_OnLeave)
-		tab:SetScript("OnShow", Tab_OnShow)
-
-		tab._SetText = tab.SetText
-		tab.SetText = Tab_SetText
-		tab.SetSelected = Tab_SetSelected
-		tab.SetDisabled = Tab_SetDisabled
-
-		return tab
-	end,
-
-	["SetTitle"] = function(self, text)
-		self.titletext:SetText(text or "")
-		if text and text ~= "" then
-			self.alignoffset = 25
-		else
-			self.alignoffset = 18
-		end
-		self:BuildTabs()
-	end,
-
-	["SetStatusTable"] = function(self, status)
-		assert(type(status) == "table")
-		self.status = status
-	end,
-
-	["SelectTab"] = function(self, value)
-		local status = self.status or self.localstatus
-		local found
-		for i, v in ipairs(self.tabs) do
-			if v.value == value then
-				v:SetSelected(true)
-				found = true
-			else
-				v:SetSelected(false)
-			end
-		end
-		status.selected = value
-		if found then
-			self:Fire("OnGroupSelected",value)
-		end
-	end,
-
-	["SetTabs"] = function(self, tabs)
-		self.tablist = tabs
-		self:BuildTabs()
-	end,
-
-
-	["BuildTabs"] = function(self)
-		local hastitle = (self.titletext:GetText() and self.titletext:GetText() ~= "")
-		local status = self.status or self.localstatus
-		local tablist = self.tablist
-		local tabs = self.tabs
-
-		if not tablist then return end
-
-		local width = self.frame.width or self.frame:GetWidth() or 0
-
-		wipe(widths)
-		wipe(rowwidths)
-		wipe(rowends)
-
-		--Place Text into tabs and get thier initial width
-		for i, v in ipairs(tablist) do
-			local tab = tabs[i]
-			if not tab then
-				tab = self:CreateTab(i)
-				tabs[i] = tab
-			end
-
-			tab:Show()
-			tab:SetText(v.text)
-			tab:SetDisabled(v.disabled)
-			tab.value = v.value
-
-			widths[i] = tab:GetWidth() - 6 --tabs are anchored 10 pixels from the right side of the previous one to reduce spacing, but add a fixed 4px padding for the text
-		end
-
-		for i = (#tablist)+1, #tabs, 1 do
-			tabs[i]:Hide()
-		end
-
-		--First pass, find the minimum number of rows needed to hold all tabs and the initial tab layout
-		local numtabs = #tablist
-		local numrows = 1
-		local usedwidth = 0
-
-		for i = 1, #tablist do
-			--If this is not the first tab of a row and there isn't room for it
-			if usedwidth ~= 0 and (width - usedwidth - widths[i]) < 0 then
-				rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
-				rowends[numrows] = i - 1
-				numrows = numrows + 1
-				usedwidth = 0
-			end
-			usedwidth = usedwidth + widths[i]
-		end
-		rowwidths[numrows] = usedwidth + 10 --first tab in each row takes up an extra 10px
-		rowends[numrows] = #tablist
-
-		--Fix for single tabs being left on the last row, move a tab from the row above if applicable
-		if numrows > 1 then
-			--if the last row has only one tab
-			if rowends[numrows-1] == numtabs-1 then
-				--if there are more than 2 tabs in the 2nd last row
-				if (numrows == 2 and rowends[numrows-1] > 2) or (rowends[numrows] - rowends[numrows-1] > 2) then
-					--move 1 tab from the second last row to the last, if there is enough space
-					if (rowwidths[numrows] + widths[numtabs-1]) <= width then
-						rowends[numrows-1] = rowends[numrows-1] - 1
-						rowwidths[numrows] = rowwidths[numrows] + widths[numtabs-1]
-						rowwidths[numrows-1] = rowwidths[numrows-1] - widths[numtabs-1]
-					end
-				end
-			end
-		end
-
-		--anchor the rows as defined and resize tabs to fill thier row
-		local starttab = 1
-		for row, endtab in ipairs(rowends) do
-			local first = true
-			for tabno = starttab, endtab do
-				local tab = tabs[tabno]
-				tab:ClearAllPoints()
-				if first then
-					tab:SetPoint("TOPLEFT", self.frame, "TOPLEFT", 0, -(hastitle and 14 or 7)-(row-1)*20 )
-					first = false
-				else
-					tab:SetPoint("LEFT", tabs[tabno-1], "RIGHT", -10, 0)
-				end
-			end
-
-			-- equal padding for each tab to fill the available width,
-			-- if the used space is above 75% already
-			-- the 18 pixel is the typical width of a scrollbar, so we can have a tab group inside a scrolling frame,
-			-- and not have the tabs jump around funny when switching between tabs that need scrolling and those that don't
-			local padding = 0
-			if not (numrows == 1 and rowwidths[1] < width*0.75 - 18) then
-				padding = (width - rowwidths[row]) / (endtab - starttab+1)
-			end
-
-			for i = starttab, endtab do
-				PanelTemplates_TabResize(tabs[i], padding + 4, nil, nil, width, tabs[i]:GetFontString():GetStringWidth())
-			end
-			starttab = endtab + 1
-		end
-
-		self.borderoffset = (hastitle and 17 or 10)+((numrows)*20)
-		self.border:SetPoint("TOPLEFT", 1, -self.borderoffset)
-	end,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		local contentwidth = width - 60
-		if contentwidth < 0 then
-			contentwidth = 0
-		end
-		content:SetWidth(contentwidth)
-		content.width = contentwidth
-		self:BuildTabs(self)
-		self.frame:SetScript("OnUpdate", BuildTabsOnUpdate)
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		local contentheight = height - (self.borderoffset + 23)
-		if contentheight < 0 then
-			contentheight = 0
-		end
-		content:SetHeight(contentheight)
-		content.height = contentheight
-	end,
-
-	["LayoutFinished"] = function(self, width, height)
-		if self.noAutoHeight then return end
-		self:SetHeight((height or 0) + (self.borderoffset + 23))
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local PaneBackdrop  = {
-	bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
-	edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
-	tile = true, tileSize = 16, edgeSize = 16,
-	insets = { left = 3, right = 3, top = 5, bottom = 3 }
-}
-
-local function Constructor()
-	local num = AceGUI:GetNextWidgetNum(Type)
-	local frame = CreateFrame("Frame",nil,UIParent)
-	frame:SetHeight(100)
-	frame:SetWidth(100)
-	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-
-	local titletext = frame:CreateFontString(nil,"OVERLAY","GameFontNormal")
-	titletext:SetPoint("TOPLEFT", 14, 0)
-	titletext:SetPoint("TOPRIGHT", -14, 0)
-	titletext:SetJustifyH("LEFT")
-	titletext:SetHeight(18)
-	titletext:SetText("")
-
-	local border = CreateFrame("Frame", nil, frame)
-	border:SetPoint("TOPLEFT", 1, -27)
-	border:SetPoint("BOTTOMRIGHT", -1, 3)
-	border:SetBackdrop(PaneBackdrop)
-	border:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
-	border:SetBackdropBorderColor(0.4, 0.4, 0.4)
-
-	local content = CreateFrame("Frame", nil, border)
-	content:SetPoint("TOPLEFT", 10, -7)
-	content:SetPoint("BOTTOMRIGHT", -10, 7)
-
-	local widget = {
-		num          = num,
-		frame        = frame,
-		localstatus  = {},
-		alignoffset  = 18,
-		titletext    = titletext,
-		border       = border,
-		borderoffset = 27,
-		tabs         = {},
-		content      = content,
-		type         = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
deleted file mode 100644
index 085449b..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-TreeGroup.lua
+++ /dev/null
@@ -1,709 +0,0 @@
---[[-----------------------------------------------------------------------------
-TreeGroup Container
-Container that uses a tree control to switch between groups.
--------------------------------------------------------------------------------]]
-local Type, Version = "TreeGroup", 38
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local next, pairs, ipairs, assert, type = next, pairs, ipairs, assert, type
-local math_min, math_max, floor = math.min, math.max, floor
-local select, tremove, unpack, tconcat = select, table.remove, unpack, table.concat
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameTooltip, FONT_COLOR_CODE_CLOSE
-
--- Recycling functions
-local new, del
-do
-	local pool = setmetatable({},{__mode='k'})
-	function new()
-		local t = next(pool)
-		if t then
-			pool[t] = nil
-			return t
-		else
-			return {}
-		end
-	end
-	function del(t)
-		for k in pairs(t) do
-			t[k] = nil
-		end
-		pool[t] = true
-	end
-end
-
-local DEFAULT_TREE_WIDTH = 175
-local DEFAULT_TREE_SIZABLE = true
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-local function GetButtonUniqueValue(line)
-	local parent = line.parent
-	if parent and parent.value then
-		return GetButtonUniqueValue(parent).."\001"..line.value
-	else
-		return line.value
-	end
-end
-
-local function UpdateButton(button, treeline, selected, canExpand, isExpanded)
-	local self = button.obj
-	local toggle = button.toggle
-	local frame = self.frame
-	local text = treeline.text or ""
-	local icon = treeline.icon
-	local iconCoords = treeline.iconCoords
-	local level = treeline.level
-	local value = treeline.value
-	local uniquevalue = treeline.uniquevalue
-	local disabled = treeline.disabled
-
-	button.treeline = treeline
-	button.value = value
-	button.uniquevalue = uniquevalue
-	if selected then
-		button:LockHighlight()
-		button.selected = true
-	else
-		button:UnlockHighlight()
-		button.selected = false
-	end
-	local normalTexture = button:GetNormalTexture()
-	local line = button.line
-	button.level = level
-	if ( level == 1 ) then
-		button:SetNormalFontObject("GameFontNormal")
-		button:SetHighlightFontObject("GameFontHighlight")
-		button.text:SetPoint("LEFT", (icon and 16 or 0) + 8, 2)
-	else
-		button:SetNormalFontObject("GameFontHighlightSmall")
-		button:SetHighlightFontObject("GameFontHighlightSmall")
-		button.text:SetPoint("LEFT", (icon and 16 or 0) + 8 * level, 2)
-	end
-
-	if disabled then
-		button:EnableMouse(false)
-		button.text:SetText("|cff808080"..text..FONT_COLOR_CODE_CLOSE)
-	else
-		button.text:SetText(text)
-		button:EnableMouse(true)
-	end
-
-	if icon then
-		button.icon:SetTexture(icon)
-		button.icon:SetPoint("LEFT", 8 * level, (level == 1) and 0 or 1)
-	else
-		button.icon:SetTexture(nil)
-	end
-
-	if iconCoords then
-		button.icon:SetTexCoord(unpack(iconCoords))
-	else
-		button.icon:SetTexCoord(0, 1, 0, 1)
-	end
-
-	if canExpand then
-		if not isExpanded then
-			toggle:SetNormalTexture("Interface\\Buttons\\UI-PlusButton-UP")
-			toggle:SetPushedTexture("Interface\\Buttons\\UI-PlusButton-DOWN")
-		else
-			toggle:SetNormalTexture("Interface\\Buttons\\UI-MinusButton-UP")
-			toggle:SetPushedTexture("Interface\\Buttons\\UI-MinusButton-DOWN")
-		end
-		toggle:Show()
-	else
-		toggle:Hide()
-	end
-end
-
-local function ShouldDisplayLevel(tree)
-	local result = false
-	for k, v in ipairs(tree) do
-		if v.children == nil and v.visible ~= false then
-			result = true
-		elseif v.children then
-			result = result or ShouldDisplayLevel(v.children)
-		end
-		if result then return result end
-	end
-	return false
-end
-
-local function addLine(self, v, tree, level, parent)
-	local line = new()
-	line.value = v.value
-	line.text = v.text
-	line.icon = v.icon
-	line.iconCoords = v.iconCoords
-	line.disabled = v.disabled
-	line.tree = tree
-	line.level = level
-	line.parent = parent
-	line.visible = v.visible
-	line.uniquevalue = GetButtonUniqueValue(line)
-	if v.children then
-		line.hasChildren = true
-	else
-		line.hasChildren = nil
-	end
-	self.lines[#self.lines+1] = line
-	return line
-end
-
---fire an update after one frame to catch the treeframes height
-local function FirstFrameUpdate(frame)
-	local self = frame.obj
-	frame:SetScript("OnUpdate", nil)
-	self:RefreshTree()
-end
-
-local function BuildUniqueValue(...)
-	local n = select('#', ...)
-	if n == 1 then
-		return ...
-	else
-		return (...).."\001"..BuildUniqueValue(select(2,...))
-	end
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Expand_OnClick(frame)
-	local button = frame.button
-	local self = button.obj
-	local status = (self.status or self.localstatus).groups
-	status[button.uniquevalue] = not status[button.uniquevalue]
-	self:RefreshTree()
-end
-
-local function Button_OnClick(frame)
-	local self = frame.obj
-	self:Fire("OnClick", frame.uniquevalue, frame.selected)
-	if not frame.selected then
-		self:SetSelected(frame.uniquevalue)
-		frame.selected = true
-		frame:LockHighlight()
-		self:RefreshTree()
-	end
-	AceGUI:ClearFocus()
-end
-
-local function Button_OnDoubleClick(button)
-	local self = button.obj
-	local status = self.status or self.localstatus
-	local status = (self.status or self.localstatus).groups
-	status[button.uniquevalue] = not status[button.uniquevalue]
-	self:RefreshTree()
-end
-
-local function Button_OnEnter(frame)
-	local self = frame.obj
-	self:Fire("OnButtonEnter", frame.uniquevalue, frame)
-
-	if self.enabletooltips then
-		GameTooltip:SetOwner(frame, "ANCHOR_NONE")
-		GameTooltip:SetPoint("LEFT",frame,"RIGHT")
-		GameTooltip:SetText(frame.text:GetText() or "", 1, .82, 0, true)
-
-		GameTooltip:Show()
-	end
-end
-
-local function Button_OnLeave(frame)
-	local self = frame.obj
-	self:Fire("OnButtonLeave", frame.uniquevalue, frame)
-
-	if self.enabletooltips then
-		GameTooltip:Hide()
-	end
-end
-
-local function OnScrollValueChanged(frame, value)
-	if frame.obj.noupdate then return end
-	local self = frame.obj
-	local status = self.status or self.localstatus
-	status.scrollvalue = floor(value + 0.5)
-	self:RefreshTree()
-	AceGUI:ClearFocus()
-end
-
-local function Tree_OnSizeChanged(frame)
-	frame.obj:RefreshTree()
-end
-
-local function Tree_OnMouseWheel(frame, delta)
-	local self = frame.obj
-	if self.showscroll then
-		local scrollbar = self.scrollbar
-		local min, max = scrollbar:GetMinMaxValues()
-		local value = scrollbar:GetValue()
-		local newvalue = math_min(max,math_max(min,value - delta))
-		if value ~= newvalue then
-			scrollbar:SetValue(newvalue)
-		end
-	end
-end
-
-local function Dragger_OnLeave(frame)
-	frame:SetBackdropColor(1, 1, 1, 0)
-end
-
-local function Dragger_OnEnter(frame)
-	frame:SetBackdropColor(1, 1, 1, 0.8)
-end
-
-local function Dragger_OnMouseDown(frame)
-	local treeframe = frame:GetParent()
-	treeframe:StartSizing("RIGHT")
-end
-
-local function Dragger_OnMouseUp(frame)
-	local treeframe = frame:GetParent()
-	local self = treeframe.obj
-	local frame = treeframe:GetParent()
-	treeframe:StopMovingOrSizing()
-	--treeframe:SetScript("OnUpdate", nil)
-	treeframe:SetUserPlaced(false)
-	--Without this :GetHeight will get stuck on the current height, causing the tree contents to not resize
-	treeframe:SetHeight(0)
-	treeframe:SetPoint("TOPLEFT", frame, "TOPLEFT",0,0)
-	treeframe:SetPoint("BOTTOMLEFT", frame, "BOTTOMLEFT",0,0)
-
-	local status = self.status or self.localstatus
-	status.treewidth = treeframe:GetWidth()
-
-	treeframe.obj:Fire("OnTreeResize",treeframe:GetWidth())
-	-- recalculate the content width
-	treeframe.obj:OnWidthSet(status.fullwidth)
-	-- update the layout of the content
-	treeframe.obj:DoLayout()
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetTreeWidth(DEFAULT_TREE_WIDTH, DEFAULT_TREE_SIZABLE)
-		self:EnableButtonTooltips(true)
-	end,
-
-	["OnRelease"] = function(self)
-		self.status = nil
-		for k, v in pairs(self.localstatus) do
-			if k == "groups" then
-				for k2 in pairs(v) do
-					v[k2] = nil
-				end
-			else
-				self.localstatus[k] = nil
-			end
-		end
-		self.localstatus.scrollvalue = 0
-		self.localstatus.treewidth = DEFAULT_TREE_WIDTH
-		self.localstatus.treesizable = DEFAULT_TREE_SIZABLE
-	end,
-
-	["EnableButtonTooltips"] = function(self, enable)
-		self.enabletooltips = enable
-	end,
-
-	["CreateButton"] = function(self)
-		local num = AceGUI:GetNextWidgetNum("TreeGroupButton")
-		local button = CreateFrame("Button", ("AceGUI30TreeButton%d"):format(num), self.treeframe, "OptionsListButtonTemplate")
-		button.obj = self
-
-		local icon = button:CreateTexture(nil, "OVERLAY")
-		icon:SetWidth(14)
-		icon:SetHeight(14)
-		button.icon = icon
-
-		button:SetScript("OnClick",Button_OnClick)
-		button:SetScript("OnDoubleClick", Button_OnDoubleClick)
-		button:SetScript("OnEnter",Button_OnEnter)
-		button:SetScript("OnLeave",Button_OnLeave)
-
-		button.toggle.button = button
-		button.toggle:SetScript("OnClick",Expand_OnClick)
-
-		button.text:SetHeight(14) -- Prevents text wrapping
-
-		return button
-	end,
-
-	["SetStatusTable"] = function(self, status)
-		assert(type(status) == "table")
-		self.status = status
-		if not status.groups then
-			status.groups = {}
-		end
-		if not status.scrollvalue then
-			status.scrollvalue = 0
-		end
-		if not status.treewidth then
-			status.treewidth = DEFAULT_TREE_WIDTH
-		end
-		if status.treesizable == nil then
-			status.treesizable = DEFAULT_TREE_SIZABLE
-		end
-		self:SetTreeWidth(status.treewidth,status.treesizable)
-		self:RefreshTree()
-	end,
-
-	--sets the tree to be displayed
-	["SetTree"] = function(self, tree, filter)
-		self.filter = filter
-		if tree then
-			assert(type(tree) == "table")
-		end
-		self.tree = tree
-		self:RefreshTree()
-	end,
-
-	["BuildLevel"] = function(self, tree, level, parent)
-		local groups = (self.status or self.localstatus).groups
-		local hasChildren = self.hasChildren
-
-		for i, v in ipairs(tree) do
-			if v.children then
-				if not self.filter or ShouldDisplayLevel(v.children) then
-					local line = addLine(self, v, tree, level, parent)
-					if groups[line.uniquevalue] then
-						self:BuildLevel(v.children, level+1, line)
-					end
-				end
-			elseif v.visible ~= false or not self.filter then
-				addLine(self, v, tree, level, parent)
-			end
-		end
-	end,
-
-	["RefreshTree"] = function(self,scrollToSelection)
-		local buttons = self.buttons
-		local lines = self.lines
-
-		for i, v in ipairs(buttons) do
-			v:Hide()
-		end
-		while lines[1] do
-			local t = tremove(lines)
-			for k in pairs(t) do
-				t[k] = nil
-			end
-			del(t)
-		end
-
-		if not self.tree then return end
-		--Build the list of visible entries from the tree and status tables
-		local status = self.status or self.localstatus
-		local groupstatus = status.groups
-		local tree = self.tree
-
-		local treeframe = self.treeframe
-
-		status.scrollToSelection = status.scrollToSelection or scrollToSelection	-- needs to be cached in case the control hasn't been drawn yet (code bails out below)
-
-		self:BuildLevel(tree, 1)
-
-		local numlines = #lines
-
-		local maxlines = (floor(((self.treeframe:GetHeight()or 0) - 20 ) / 18))
-		if maxlines <= 0 then return end
-
-		local first, last
-
-		scrollToSelection = status.scrollToSelection
-		status.scrollToSelection = nil
-
-		if numlines <= maxlines then
-			--the whole tree fits in the frame
-			status.scrollvalue = 0
-			self:ShowScroll(false)
-			first, last = 1, numlines
-		else
-			self:ShowScroll(true)
-			--scrolling will be needed
-			self.noupdate = true
-			self.scrollbar:SetMinMaxValues(0, numlines - maxlines)
-			--check if we are scrolled down too far
-			if numlines - status.scrollvalue < maxlines then
-				status.scrollvalue = numlines - maxlines
-			end
-			self.noupdate = nil
-			first, last = status.scrollvalue+1, status.scrollvalue + maxlines
-			--show selection?
-			if scrollToSelection and status.selected then
-				local show
-				for i,line in ipairs(lines) do	-- find the line number
-					if line.uniquevalue==status.selected then
-						show=i
-					end
-				end
-				if not show then
-					-- selection was deleted or something?
-				elseif show>=first and show<=last then
-					-- all good
-				else
-					-- scrolling needed!
-					if show<first then
-						status.scrollvalue = show-1
-					else
-						status.scrollvalue = show-maxlines
-					end
-					first, last = status.scrollvalue+1, status.scrollvalue + maxlines
-				end
-			end
-			if self.scrollbar:GetValue() ~= status.scrollvalue then
-				self.scrollbar:SetValue(status.scrollvalue)
-			end
-		end
-
-		local buttonnum = 1
-		for i = first, last do
-			local line = lines[i]
-			local button = buttons[buttonnum]
-			if not button then
-				button = self:CreateButton()
-
-				buttons[buttonnum] = button
-				button:SetParent(treeframe)
-				button:SetFrameLevel(treeframe:GetFrameLevel()+1)
-				button:ClearAllPoints()
-				if buttonnum == 1 then
-					if self.showscroll then
-						button:SetPoint("TOPRIGHT", -22, -10)
-						button:SetPoint("TOPLEFT", 0, -10)
-					else
-						button:SetPoint("TOPRIGHT", 0, -10)
-						button:SetPoint("TOPLEFT", 0, -10)
-					end
-				else
-					button:SetPoint("TOPRIGHT", buttons[buttonnum-1], "BOTTOMRIGHT",0,0)
-					button:SetPoint("TOPLEFT", buttons[buttonnum-1], "BOTTOMLEFT",0,0)
-				end
-			end
-
-			UpdateButton(button, line, status.selected == line.uniquevalue, line.hasChildren, groupstatus[line.uniquevalue] )
-			button:Show()
-			buttonnum = buttonnum + 1
-		end
-
-	end,
-
-	["SetSelected"] = function(self, value)
-		local status = self.status or self.localstatus
-		if status.selected ~= value then
-			status.selected = value
-			self:Fire("OnGroupSelected", value)
-		end
-	end,
-
-	["Select"] = function(self, uniquevalue, ...)
-		self.filter = false
-		local status = self.status or self.localstatus
-		local groups = status.groups
-		local path = {...}
-		for i = 1, #path do
-			groups[tconcat(path, "\001", 1, i)] = true
-		end
-		status.selected = uniquevalue
-		self:RefreshTree(true)
-		self:Fire("OnGroupSelected", uniquevalue)
-	end,
-
-	["SelectByPath"] = function(self, ...)
-		self:Select(BuildUniqueValue(...), ...)
-	end,
-
-	["SelectByValue"] = function(self, uniquevalue)
-		self:Select(uniquevalue, ("\001"):split(uniquevalue))
-	end,
-
-	["ShowScroll"] = function(self, show)
-		self.showscroll = show
-		if show then
-			self.scrollbar:Show()
-			if self.buttons[1] then
-				self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",-22,-10)
-			end
-		else
-			self.scrollbar:Hide()
-			if self.buttons[1] then
-				self.buttons[1]:SetPoint("TOPRIGHT", self.treeframe,"TOPRIGHT",0,-10)
-			end
-		end
-	end,
-
-	["OnWidthSet"] = function(self, width)
-		local content = self.content
-		local treeframe = self.treeframe
-		local status = self.status or self.localstatus
-		status.fullwidth = width
-
-		local contentwidth = width - status.treewidth - 20
-		if contentwidth < 0 then
-			contentwidth = 0
-		end
-		content:SetWidth(contentwidth)
-		content.width = contentwidth
-
-		local maxtreewidth = math_min(400, width - 50)
-
-		if maxtreewidth > 100 and status.treewidth > maxtreewidth then
-			self:SetTreeWidth(maxtreewidth, status.treesizable)
-		end
-		treeframe:SetMaxResize(maxtreewidth, 1600)
-	end,
-
-	["OnHeightSet"] = function(self, height)
-		local content = self.content
-		local contentheight = height - 20
-		if contentheight < 0 then
-			contentheight = 0
-		end
-		content:SetHeight(contentheight)
-		content.height = contentheight
-	end,
-
-	["SetTreeWidth"] = function(self, treewidth, resizable)
-		if not resizable then
-			if type(treewidth) == 'number' then
-				resizable = false
-			elseif type(treewidth) == 'boolean' then
-				resizable = treewidth
-				treewidth = DEFAULT_TREE_WIDTH
-			else
-				resizable = false
-				treewidth = DEFAULT_TREE_WIDTH
-			end
-		end
-		self.treeframe:SetWidth(treewidth)
-		self.dragger:EnableMouse(resizable)
-
-		local status = self.status or self.localstatus
-		status.treewidth = treewidth
-		status.treesizable = resizable
-
-		-- recalculate the content width
-		if status.fullwidth then
-			self:OnWidthSet(status.fullwidth)
-		end
-	end,
-
-	["GetTreeWidth"] = function(self)
-		local status = self.status or self.localstatus
-		return status.treewidth or DEFAULT_TREE_WIDTH
-	end,
-
-	["LayoutFinished"] = function(self, width, height)
-		if self.noAutoHeight then return end
-		self:SetHeight((height or 0) + 20)
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local PaneBackdrop  = {
-	bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
-	edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
-	tile = true, tileSize = 16, edgeSize = 16,
-	insets = { left = 3, right = 3, top = 5, bottom = 3 }
-}
-
-local DraggerBackdrop  = {
-	bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
-	edgeFile = nil,
-	tile = true, tileSize = 16, edgeSize = 0,
-	insets = { left = 3, right = 3, top = 7, bottom = 7 }
-}
-
-local function Constructor()
-	local num = AceGUI:GetNextWidgetNum(Type)
-	local frame = CreateFrame("Frame", nil, UIParent)
-
-	local treeframe = CreateFrame("Frame", nil, frame)
-	treeframe:SetPoint("TOPLEFT")
-	treeframe:SetPoint("BOTTOMLEFT")
-	treeframe:SetWidth(DEFAULT_TREE_WIDTH)
-	treeframe:EnableMouseWheel(true)
-	treeframe:SetBackdrop(PaneBackdrop)
-	treeframe:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
-	treeframe:SetBackdropBorderColor(0.4, 0.4, 0.4)
-	treeframe:SetResizable(true)
-	treeframe:SetMinResize(100, 1)
-	treeframe:SetMaxResize(400, 1600)
-	treeframe:SetScript("OnUpdate", FirstFrameUpdate)
-	treeframe:SetScript("OnSizeChanged", Tree_OnSizeChanged)
-	treeframe:SetScript("OnMouseWheel", Tree_OnMouseWheel)
-
-	local dragger = CreateFrame("Frame", nil, treeframe)
-	dragger:SetWidth(8)
-	dragger:SetPoint("TOP", treeframe, "TOPRIGHT")
-	dragger:SetPoint("BOTTOM", treeframe, "BOTTOMRIGHT")
-	dragger:SetBackdrop(DraggerBackdrop)
-	dragger:SetBackdropColor(1, 1, 1, 0)
-	dragger:SetScript("OnEnter", Dragger_OnEnter)
-	dragger:SetScript("OnLeave", Dragger_OnLeave)
-	dragger:SetScript("OnMouseDown", Dragger_OnMouseDown)
-	dragger:SetScript("OnMouseUp", Dragger_OnMouseUp)
-
-	local scrollbar = CreateFrame("Slider", ("AceConfigDialogTreeGroup%dScrollBar"):format(num), treeframe, "UIPanelScrollBarTemplate")
-	scrollbar:SetScript("OnValueChanged", nil)
-	scrollbar:SetPoint("TOPRIGHT", -10, -26)
-	scrollbar:SetPoint("BOTTOMRIGHT", -10, 26)
-	scrollbar:SetMinMaxValues(0,0)
-	scrollbar:SetValueStep(1)
-	scrollbar:SetValue(0)
-	scrollbar:SetWidth(16)
-	scrollbar:SetScript("OnValueChanged", OnScrollValueChanged)
-
-	local scrollbg = scrollbar:CreateTexture(nil, "BACKGROUND")
-	scrollbg:SetAllPoints(scrollbar)
-	scrollbg:SetTexture(0,0,0,0.4)
-
-	local border = CreateFrame("Frame",nil,frame)
-	border:SetPoint("TOPLEFT", treeframe, "TOPRIGHT")
-	border:SetPoint("BOTTOMRIGHT")
-	border:SetBackdrop(PaneBackdrop)
-	border:SetBackdropColor(0.1, 0.1, 0.1, 0.5)
-	border:SetBackdropBorderColor(0.4, 0.4, 0.4)
-
-	--Container Support
-	local content = CreateFrame("Frame", nil, border)
-	content:SetPoint("TOPLEFT", 10, -10)
-	content:SetPoint("BOTTOMRIGHT", -10, 10)
-
-	local widget = {
-		frame        = frame,
-		lines        = {},
-		levels       = {},
-		buttons      = {},
-		hasChildren  = {},
-		localstatus  = { groups = {}, scrollvalue = 0 },
-		filter       = false,
-		treeframe    = treeframe,
-		dragger      = dragger,
-		scrollbar    = scrollbar,
-		border       = border,
-		content      = content,
-		type         = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	treeframe.obj, dragger.obj, scrollbar.obj = widget, widget, widget
-
-	return AceGUI:RegisterAsContainer(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
deleted file mode 100644
index bb0a2a2..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIContainer-Window.lua
+++ /dev/null
@@ -1,331 +0,0 @@
-local AceGUI = LibStub("AceGUI-3.0")
-
--- Lua APIs
-local pairs, assert, type = pairs, assert, type
-
--- WoW APIs
-local PlaySound = PlaySound
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontNormal
-
-----------------
--- Main Frame --
-----------------
---[[
-	Events :
-		OnClose
-
-]]
-do
-	local Type = "Window"
-	local Version = 4
-
-	local function frameOnClose(this)
-		this.obj:Fire("OnClose")
-	end
-
-	local function closeOnClick(this)
-		PlaySound("gsTitleOptionExit")
-		this.obj:Hide()
-	end
-
-	local function frameOnMouseDown(this)
-		AceGUI:ClearFocus()
-	end
-
-	local function titleOnMouseDown(this)
-		this:GetParent():StartMoving()
-		AceGUI:ClearFocus()
-	end
-
-	local function frameOnMouseUp(this)
-		local frame = this:GetParent()
-		frame:StopMovingOrSizing()
-		local self = frame.obj
-		local status = self.status or self.localstatus
-		status.width = frame:GetWidth()
-		status.height = frame:GetHeight()
-		status.top = frame:GetTop()
-		status.left = frame:GetLeft()
-	end
-
-	local function sizerseOnMouseDown(this)
-		this:GetParent():StartSizing("BOTTOMRIGHT")
-		AceGUI:ClearFocus()
-	end
-
-	local function sizersOnMouseDown(this)
-		this:GetParent():StartSizing("BOTTOM")
-		AceGUI:ClearFocus()
-	end
-
-	local function sizereOnMouseDown(this)
-		this:GetParent():StartSizing("RIGHT")
-		AceGUI:ClearFocus()
-	end
-
-	local function sizerOnMouseUp(this)
-		this:GetParent():StopMovingOrSizing()
-	end
-
-	local function SetTitle(self,title)
-		self.titletext:SetText(title)
-	end
-
-	local function SetStatusText(self,text)
-		-- self.statustext:SetText(text)
-	end
-
-	local function Hide(self)
-		self.frame:Hide()
-	end
-
-	local function Show(self)
-		self.frame:Show()
-	end
-
-	local function OnAcquire(self)
-		self.frame:SetParent(UIParent)
-		self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
-		self:ApplyStatus()
-		self:EnableResize(true)
-		self:Show()
-	end
-
-	local function OnRelease(self)
-		self.status = nil
-		for k in pairs(self.localstatus) do
-			self.localstatus[k] = nil
-		end
-	end
-
-	-- called to set an external table to store status in
-	local function SetStatusTable(self, status)
-		assert(type(status) == "table")
-		self.status = status
-		self:ApplyStatus()
-	end
-
-	local function ApplyStatus(self)
-		local status = self.status or self.localstatus
-		local frame = self.frame
-		self:SetWidth(status.width or 700)
-		self:SetHeight(status.height or 500)
-		if status.top and status.left then
-			frame:SetPoint("TOP",UIParent,"BOTTOM",0,status.top)
-			frame:SetPoint("LEFT",UIParent,"LEFT",status.left,0)
-		else
-			frame:SetPoint("CENTER",UIParent,"CENTER")
-		end
-	end
-
-	local function OnWidthSet(self, width)
-		local content = self.content
-		local contentwidth = width - 34
-		if contentwidth < 0 then
-			contentwidth = 0
-		end
-		content:SetWidth(contentwidth)
-		content.width = contentwidth
-	end
-
-
-	local function OnHeightSet(self, height)
-		local content = self.content
-		local contentheight = height - 57
-		if contentheight < 0 then
-			contentheight = 0
-		end
-		content:SetHeight(contentheight)
-		content.height = contentheight
-	end
-
-	local function EnableResize(self, state)
-		local func = state and "Show" or "Hide"
-		self.sizer_se[func](self.sizer_se)
-		self.sizer_s[func](self.sizer_s)
-		self.sizer_e[func](self.sizer_e)
-	end
-
-	local function Constructor()
-		local frame = CreateFrame("Frame",nil,UIParent)
-		local self = {}
-		self.type = "Window"
-
-		self.Hide = Hide
-		self.Show = Show
-		self.SetTitle =  SetTitle
-		self.OnRelease = OnRelease
-		self.OnAcquire = OnAcquire
-		self.SetStatusText = SetStatusText
-		self.SetStatusTable = SetStatusTable
-		self.ApplyStatus = ApplyStatus
-		self.OnWidthSet = OnWidthSet
-		self.OnHeightSet = OnHeightSet
-		self.EnableResize = EnableResize
-
-		self.localstatus = {}
-
-		self.frame = frame
-		frame.obj = self
-		frame:SetWidth(700)
-		frame:SetHeight(500)
-		frame:SetPoint("CENTER",UIParent,"CENTER",0,0)
-		frame:EnableMouse()
-		frame:SetMovable(true)
-		frame:SetResizable(true)
-		frame:SetFrameStrata("FULLSCREEN_DIALOG")
-		frame:SetScript("OnMouseDown", frameOnMouseDown)
-
-		frame:SetScript("OnHide",frameOnClose)
-		frame:SetMinResize(240,240)
-		frame:SetToplevel(true)
-
-		local titlebg = frame:CreateTexture(nil, "BACKGROUND")
-		titlebg:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Title-Background]])
-		titlebg:SetPoint("TOPLEFT", 9, -6)
-		titlebg:SetPoint("BOTTOMRIGHT", frame, "TOPRIGHT", -28, -24)
-
-		local dialogbg = frame:CreateTexture(nil, "BACKGROUND")
-		dialogbg:SetTexture([[Interface\Tooltips\UI-Tooltip-Background]])
-		dialogbg:SetPoint("TOPLEFT", 8, -24)
-		dialogbg:SetPoint("BOTTOMRIGHT", -6, 8)
-		dialogbg:SetVertexColor(0, 0, 0, .75)
-
-		local topleft = frame:CreateTexture(nil, "BORDER")
-		topleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		topleft:SetWidth(64)
-		topleft:SetHeight(64)
-		topleft:SetPoint("TOPLEFT")
-		topleft:SetTexCoord(0.501953125, 0.625, 0, 1)
-
-		local topright = frame:CreateTexture(nil, "BORDER")
-		topright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		topright:SetWidth(64)
-		topright:SetHeight(64)
-		topright:SetPoint("TOPRIGHT")
-		topright:SetTexCoord(0.625, 0.75, 0, 1)
-
-		local top = frame:CreateTexture(nil, "BORDER")
-		top:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		top:SetHeight(64)
-		top:SetPoint("TOPLEFT", topleft, "TOPRIGHT")
-		top:SetPoint("TOPRIGHT", topright, "TOPLEFT")
-		top:SetTexCoord(0.25, 0.369140625, 0, 1)
-
-		local bottomleft = frame:CreateTexture(nil, "BORDER")
-		bottomleft:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		bottomleft:SetWidth(64)
-		bottomleft:SetHeight(64)
-		bottomleft:SetPoint("BOTTOMLEFT")
-		bottomleft:SetTexCoord(0.751953125, 0.875, 0, 1)
-
-		local bottomright = frame:CreateTexture(nil, "BORDER")
-		bottomright:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		bottomright:SetWidth(64)
-		bottomright:SetHeight(64)
-		bottomright:SetPoint("BOTTOMRIGHT")
-		bottomright:SetTexCoord(0.875, 1, 0, 1)
-
-		local bottom = frame:CreateTexture(nil, "BORDER")
-		bottom:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		bottom:SetHeight(64)
-		bottom:SetPoint("BOTTOMLEFT", bottomleft, "BOTTOMRIGHT")
-		bottom:SetPoint("BOTTOMRIGHT", bottomright, "BOTTOMLEFT")
-		bottom:SetTexCoord(0.376953125, 0.498046875, 0, 1)
-
-		local left = frame:CreateTexture(nil, "BORDER")
-		left:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		left:SetWidth(64)
-		left:SetPoint("TOPLEFT", topleft, "BOTTOMLEFT")
-		left:SetPoint("BOTTOMLEFT", bottomleft, "TOPLEFT")
-		left:SetTexCoord(0.001953125, 0.125, 0, 1)
-
-		local right = frame:CreateTexture(nil, "BORDER")
-		right:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-Border]])
-		right:SetWidth(64)
-		right:SetPoint("TOPRIGHT", topright, "BOTTOMRIGHT")
-		right:SetPoint("BOTTOMRIGHT", bottomright, "TOPRIGHT")
-		right:SetTexCoord(0.1171875, 0.2421875, 0, 1)
-
-		local close = CreateFrame("Button", nil, frame, "UIPanelCloseButton")
-		close:SetPoint("TOPRIGHT", 2, 1)
-		close:SetScript("OnClick", closeOnClick)
-		self.closebutton = close
-		close.obj = self
-
-		local titletext = frame:CreateFontString(nil, "ARTWORK")
-		titletext:SetFontObject(GameFontNormal)
-		titletext:SetPoint("TOPLEFT", 12, -8)
-		titletext:SetPoint("TOPRIGHT", -32, -8)
-		self.titletext = titletext
-
-		local title = CreateFrame("Button", nil, frame)
-		title:SetPoint("TOPLEFT", titlebg)
-		title:SetPoint("BOTTOMRIGHT", titlebg)
-		title:EnableMouse()
-		title:SetScript("OnMouseDown",titleOnMouseDown)
-		title:SetScript("OnMouseUp", frameOnMouseUp)
-		self.title = title
-
-		local sizer_se = CreateFrame("Frame",nil,frame)
-		sizer_se:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,0)
-		sizer_se:SetWidth(25)
-		sizer_se:SetHeight(25)
-		sizer_se:EnableMouse()
-		sizer_se:SetScript("OnMouseDown",sizerseOnMouseDown)
-		sizer_se:SetScript("OnMouseUp", sizerOnMouseUp)
-		self.sizer_se = sizer_se
-
-		local line1 = sizer_se:CreateTexture(nil, "BACKGROUND")
-		self.line1 = line1
-		line1:SetWidth(14)
-		line1:SetHeight(14)
-		line1:SetPoint("BOTTOMRIGHT", -8, 8)
-		line1:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
-		local x = 0.1 * 14/17
-		line1:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
-
-		local line2 = sizer_se:CreateTexture(nil, "BACKGROUND")
-		self.line2 = line2
-		line2:SetWidth(8)
-		line2:SetHeight(8)
-		line2:SetPoint("BOTTOMRIGHT", -8, 8)
-		line2:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
-		local x = 0.1 * 8/17
-		line2:SetTexCoord(0.05 - x, 0.5, 0.05, 0.5 + x, 0.05, 0.5 - x, 0.5 + x, 0.5)
-
-		local sizer_s = CreateFrame("Frame",nil,frame)
-		sizer_s:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-25,0)
-		sizer_s:SetPoint("BOTTOMLEFT",frame,"BOTTOMLEFT",0,0)
-		sizer_s:SetHeight(25)
-		sizer_s:EnableMouse()
-		sizer_s:SetScript("OnMouseDown",sizersOnMouseDown)
-		sizer_s:SetScript("OnMouseUp", sizerOnMouseUp)
-		self.sizer_s = sizer_s
-
-		local sizer_e = CreateFrame("Frame",nil,frame)
-		sizer_e:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",0,25)
-		sizer_e:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
-		sizer_e:SetWidth(25)
-		sizer_e:EnableMouse()
-		sizer_e:SetScript("OnMouseDown",sizereOnMouseDown)
-		sizer_e:SetScript("OnMouseUp", sizerOnMouseUp)
-		self.sizer_e = sizer_e
-
-		--Container Support
-		local content = CreateFrame("Frame",nil,frame)
-		self.content = content
-		content.obj = self
-		content:SetPoint("TOPLEFT",frame,"TOPLEFT",12,-32)
-		content:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-12,13)
-
-		AceGUI:RegisterAsContainer(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(Type,Constructor,Version)
-end
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
deleted file mode 100644
index 028e524..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Button.lua
+++ /dev/null
@@ -1,109 +0,0 @@
---[[-----------------------------------------------------------------------------
-Button Widget
-Graphical Button.
--------------------------------------------------------------------------------]]
-local Type, Version = "Button", 23
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local _G = _G
-local PlaySound, CreateFrame, UIParent = PlaySound, CreateFrame, UIParent
-
-local wowMoP
-do
-	local _, _, _, interface = GetBuildInfo()
-	wowMoP = (interface >= 50000)
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Button_OnClick(frame, ...)
-	AceGUI:ClearFocus()
-	PlaySound("igMainMenuOption")
-	frame.obj:Fire("OnClick", ...)
-end
-
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		-- restore default values
-		self:SetHeight(24)
-		self:SetWidth(200)
-		self:SetDisabled(false)
-		self:SetAutoWidth(false)
-		self:SetText()
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetText"] = function(self, text)
-		self.text:SetText(text)
-		if self.autoWidth then
-			self:SetWidth(self.text:GetStringWidth() + 30)
-		end
-	end,
-
-	["SetAutoWidth"] = function(self, autoWidth)
-		self.autoWidth = autoWidth
-		if self.autoWidth then
-			self:SetWidth(self.text:GetStringWidth() + 30)
-		end
-	end,
-
-	["SetDisabled"] = function(self, disabled)
-		self.disabled = disabled
-		if disabled then
-			self.frame:Disable()
-		else
-			self.frame:Enable()
-		end
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local name = "AceGUI30Button" .. AceGUI:GetNextWidgetNum(Type)
-	local frame = CreateFrame("Button", name, UIParent, wowMoP and "UIPanelButtonTemplate" or "UIPanelButtonTemplate2")
-	frame:Hide()
-
-	frame:EnableMouse(true)
-	frame:SetScript("OnClick", Button_OnClick)
-	frame:SetScript("OnEnter", Control_OnEnter)
-	frame:SetScript("OnLeave", Control_OnLeave)
-
-	local text = frame:GetFontString()
-	text:ClearAllPoints()
-	text:SetPoint("TOPLEFT", 15, -1)
-	text:SetPoint("BOTTOMRIGHT", -15, 1)
-	text:SetJustifyV("MIDDLE")
-
-	local widget = {
-		text  = text,
-		frame = frame,
-		type  = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
deleted file mode 100644
index 8847ebc..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-CheckBox.lua
+++ /dev/null
@@ -1,295 +0,0 @@
---[[-----------------------------------------------------------------------------
-Checkbox Widget
--------------------------------------------------------------------------------]]
-local Type, Version = "CheckBox", 22
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local select, pairs = select, pairs
-
--- WoW APIs
-local PlaySound = PlaySound
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: SetDesaturation, GameFontHighlight
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-local function AlignImage(self)
-	local img = self.image:GetTexture()
-	self.text:ClearAllPoints()
-	if not img then
-		self.text:SetPoint("LEFT", self.checkbg, "RIGHT")
-		self.text:SetPoint("RIGHT")
-	else
-		self.text:SetPoint("LEFT", self.image,"RIGHT", 1, 0)
-		self.text:SetPoint("RIGHT")
-	end
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
-local function CheckBox_OnMouseDown(frame)
-	local self = frame.obj
-	if not self.disabled then
-		if self.image:GetTexture() then
-			self.text:SetPoint("LEFT", self.image,"RIGHT", 2, -1)
-		else
-			self.text:SetPoint("LEFT", self.checkbg, "RIGHT", 1, -1)
-		end
-	end
-	AceGUI:ClearFocus()
-end
-
-local function CheckBox_OnMouseUp(frame)
-	local self = frame.obj
-	if not self.disabled then
-		self:ToggleChecked()
-
-		if self.checked then
-			PlaySound("igMainMenuOptionCheckBoxOn")
-		else -- for both nil and false (tristate)
-			PlaySound("igMainMenuOptionCheckBoxOff")
-		end
-
-		self:Fire("OnValueChanged", self.checked)
-		AlignImage(self)
-	end
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetType()
-		self:SetValue(false)
-		self:SetTriState(nil)
-		-- height is calculated from the width and required space for the description
-		self:SetWidth(200)
-		self:SetImage()
-		self:SetDisabled(nil)
-		self:SetDescription(nil)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["OnWidthSet"] = function(self, width)
-		if self.desc then
-			self.desc:SetWidth(width - 30)
-			if self.desc:GetText() and self.desc:GetText() ~= "" then
-				self:SetHeight(28 + self.desc:GetHeight())
-			end
-		end
-	end,
-
-	["SetDisabled"] = function(self, disabled)
-		self.disabled = disabled
-		if disabled then
-			self.frame:Disable()
-			self.text:SetTextColor(0.5, 0.5, 0.5)
-			SetDesaturation(self.check, true)
-			if self.desc then
-				self.desc:SetTextColor(0.5, 0.5, 0.5)
-			end
-		else
-			self.frame:Enable()
-			self.text:SetTextColor(1, 1, 1)
-			if self.tristate and self.checked == nil then
-				SetDesaturation(self.check, true)
-			else
-				SetDesaturation(self.check, false)
-			end
-			if self.desc then
-				self.desc:SetTextColor(1, 1, 1)
-			end
-		end
-	end,
-
-	["SetValue"] = function(self,value)
-		local check = self.check
-		self.checked = value
-		if value then
-			SetDesaturation(self.check, false)
-			self.check:Show()
-		else
-			--Nil is the unknown tristate value
-			if self.tristate and value == nil then
-				SetDesaturation(self.check, true)
-				self.check:Show()
-			else
-				SetDesaturation(self.check, false)
-				self.check:Hide()
-			end
-		end
-		self:SetDisabled(self.disabled)
-	end,
-
-	["GetValue"] = function(self)
-		return self.checked
-	end,
-
-	["SetTriState"] = function(self, enabled)
-		self.tristate = enabled
-		self:SetValue(self:GetValue())
-	end,
-
-	["SetType"] = function(self, type)
-		local checkbg = self.checkbg
-		local check = self.check
-		local highlight = self.highlight
-
-		local size
-		if type == "radio" then
-			size = 16
-			checkbg:SetTexture("Interface\\Buttons\\UI-RadioButton")
-			checkbg:SetTexCoord(0, 0.25, 0, 1)
-			check:SetTexture("Interface\\Buttons\\UI-RadioButton")
-			check:SetTexCoord(0.25, 0.5, 0, 1)
-			check:SetBlendMode("ADD")
-			highlight:SetTexture("Interface\\Buttons\\UI-RadioButton")
-			highlight:SetTexCoord(0.5, 0.75, 0, 1)
-		else
-			size = 24
-			checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
-			checkbg:SetTexCoord(0, 1, 0, 1)
-			check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
-			check:SetTexCoord(0, 1, 0, 1)
-			check:SetBlendMode("BLEND")
-			highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
-			highlight:SetTexCoord(0, 1, 0, 1)
-		end
-		checkbg:SetHeight(size)
-		checkbg:SetWidth(size)
-	end,
-
-	["ToggleChecked"] = function(self)
-		local value = self:GetValue()
-		if self.tristate then
-			--cycle in true, nil, false order
-			if value then
-				self:SetValue(nil)
-			elseif value == nil then
-				self:SetValue(false)
-			else
-				self:SetValue(true)
-			end
-		else
-			self:SetValue(not self:GetValue())
-		end
-	end,
-
-	["SetLabel"] = function(self, label)
-		self.text:SetText(label)
-	end,
-
-	["SetDescription"] = function(self, desc)
-		if desc then
-			if not self.desc then
-				local desc = self.frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
-				desc:ClearAllPoints()
-				desc:SetPoint("TOPLEFT", self.checkbg, "TOPRIGHT", 5, -21)
-				desc:SetWidth(self.frame.width - 30)
-				desc:SetJustifyH("LEFT")
-				desc:SetJustifyV("TOP")
-				self.desc = desc
-			end
-			self.desc:Show()
-			--self.text:SetFontObject(GameFontNormal)
-			self.desc:SetText(desc)
-			self:SetHeight(28 + self.desc:GetHeight())
-		else
-			if self.desc then
-				self.desc:SetText("")
-				self.desc:Hide()
-			end
-			--self.text:SetFontObject(GameFontHighlight)
-			self:SetHeight(24)
-		end
-	end,
-
-	["SetImage"] = function(self, path, ...)
-		local image = self.image
-		image:SetTexture(path)
-
-		if image:GetTexture() then
-			local n = select("#", ...)
-			if n == 4 or n == 8 then
-				image:SetTexCoord(...)
-			else
-				image:SetTexCoord(0, 1, 0, 1)
-			end
-		end
-		AlignImage(self)
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Button", nil, UIParent)
-	frame:Hide()
-
-	frame:EnableMouse(true)
-	frame:SetScript("OnEnter", Control_OnEnter)
-	frame:SetScript("OnLeave", Control_OnLeave)
-	frame:SetScript("OnMouseDown", CheckBox_OnMouseDown)
-	frame:SetScript("OnMouseUp", CheckBox_OnMouseUp)
-
-	local checkbg = frame:CreateTexture(nil, "ARTWORK")
-	checkbg:SetWidth(24)
-	checkbg:SetHeight(24)
-	checkbg:SetPoint("TOPLEFT")
-	checkbg:SetTexture("Interface\\Buttons\\UI-CheckBox-Up")
-
-	local check = frame:CreateTexture(nil, "OVERLAY")
-	check:SetAllPoints(checkbg)
-	check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
-
-	local text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
-	text:SetJustifyH("LEFT")
-	text:SetHeight(18)
-	text:SetPoint("LEFT", checkbg, "RIGHT")
-	text:SetPoint("RIGHT")
-
-	local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
-	highlight:SetTexture("Interface\\Buttons\\UI-CheckBox-Highlight")
-	highlight:SetBlendMode("ADD")
-	highlight:SetAllPoints(checkbg)
-
-	local image = frame:CreateTexture(nil, "OVERLAY")
-	image:SetHeight(16)
-	image:SetWidth(16)
-	image:SetPoint("LEFT", checkbg, "RIGHT", 1, 0)
-
-	local widget = {
-		checkbg   = checkbg,
-		check     = check,
-		text      = text,
-		highlight = highlight,
-		image     = image,
-		frame     = frame,
-		type      = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
deleted file mode 100644
index d172e6f..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-ColorPicker.lua
+++ /dev/null
@@ -1,200 +0,0 @@
---[[-----------------------------------------------------------------------------
-ColorPicker Widget
--------------------------------------------------------------------------------]]
-local Type, Version = "ColorPicker-ElvUI", 1
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: ShowUIPanel, HideUIPanel, ColorPickerFrame, OpacitySliderFrame
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-local function ColorCallback(self, r, g, b, a, isAlpha)
-	if not self.HasAlpha then
-		a = 1
-	end
-	self:SetColor(r, g, b, a)
-	if ColorPickerFrame:IsVisible() then
-		--colorpicker is still open
-		self:Fire("OnValueChanged", r, g, b, a)
-	else
-		--colorpicker is closed, color callback is first, ignore it,
-		--alpha callback is the final call after it closes so confirm now
-		if isAlpha then
-			self:Fire("OnValueConfirmed", r, g, b, a)
-		end
-	end
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
-local function ColorSwatch_OnClick(frame)
-	HideUIPanel(ColorPickerFrame)
-	local self = frame.obj
-	if not self.disabled then
-		ColorPickerFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-		ColorPickerFrame:SetFrameLevel(frame:GetFrameLevel() + 10)
-		ColorPickerFrame:SetClampedToScreen(true)
-
-		ColorPickerFrame.func = function()
-			local r, g, b = ColorPickerFrame:GetColorRGB()
-			local a = 1 - OpacitySliderFrame:GetValue()
-			ColorCallback(self, r, g, b, a)
-		end
-
-		ColorPickerFrame.hasOpacity = self.HasAlpha
-		ColorPickerFrame.opacityFunc = function()
-			local r, g, b = ColorPickerFrame:GetColorRGB()
-			local a = 1 - OpacitySliderFrame:GetValue()
-			ColorCallback(self, r, g, b, a, true)
-		end
-
-		local r, g, b, a, dR, dG, dB, dA = self.r, self.g, self.b, self.a, self.dR, self.dG, self.dB, self.dA
-		if self.HasAlpha then
-			ColorPickerFrame.opacity = 1 - (a or 0)
-		end
-		ColorPickerFrame:SetColorRGB(r, g, b)
-
-		if(ColorPPDefault and self.dR and self.dG and self.dB) then
-			local alpha = 1
-			if(self.dA) then
-				alpha = 1 - self.dA
-			end
-			ColorPPDefault.colors = {r = self.dR, g = self.dG, b = self.dB, a = alpha}
-		end
-
-		ColorPickerFrame.cancelFunc = function()
-			ColorCallback(self, r, g, b, a, true)
-		end
-
-		ShowUIPanel(ColorPickerFrame)
-	end
-	AceGUI:ClearFocus()
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetHeight(24)
-		self:SetWidth(200)
-		self:SetHasAlpha(false)
-		self:SetColor(0, 0, 0, 1)
-		self:SetDisabled(nil)
-		self:SetLabel(nil)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetLabel"] = function(self, text)
-		self.text:SetText(text)
-	end,
-
-	["SetColor"] = function(self, r, g, b, a, defaultR, defaultG, defaultB, defaultA)
-		self.r = r
-		self.g = g
-		self.b = b
-		self.a = a or 1
-		self.dR = defaultR
-		self.dG = defaultG
-		self.dB = defaultB
-		self.dA = defaultA
-		self.colorSwatch:SetVertexColor(r, g, b, a)
-	end,
-
-	["SetHasAlpha"] = function(self, HasAlpha)
-		self.HasAlpha = HasAlpha
-	end,
-
-	["SetDisabled"] = function(self, disabled)
-		self.disabled = disabled
-		if self.disabled then
-			self.frame:Disable()
-			self.text:SetTextColor(0.5, 0.5, 0.5)
-		else
-			self.frame:Enable()
-			self.text:SetTextColor(1, 1, 1)
-		end
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Button", nil, UIParent)
-	frame:Hide()
-
-	frame:EnableMouse(true)
-	frame:SetScript("OnEnter", Control_OnEnter)
-	frame:SetScript("OnLeave", Control_OnLeave)
-	frame:SetScript("OnClick", ColorSwatch_OnClick)
-
-	local colorSwatch = frame:CreateTexture(nil, "OVERLAY")
-	colorSwatch:SetWidth(19)
-	colorSwatch:SetHeight(19)
-	colorSwatch:SetTexture("Interface\\ChatFrame\\ChatFrameColorSwatch")
-	colorSwatch:SetPoint("LEFT")
-
-	local texture = frame:CreateTexture(nil, "BACKGROUND")
-	texture:SetWidth(16)
-	texture:SetHeight(16)
-	texture:SetTexture(1, 1, 1)
-	texture:SetPoint("CENTER", colorSwatch)
-	texture:Show()
-
-	local checkers = frame:CreateTexture(nil, "BACKGROUND")
-	checkers:SetWidth(14)
-	checkers:SetHeight(14)
-	checkers:SetTexture("Tileset\\Generic\\Checkers")
-	checkers:SetTexCoord(.25, 0, 0.5, .25)
-	checkers:SetDesaturated(true)
-	checkers:SetVertexColor(1, 1, 1, 0.75)
-	checkers:SetPoint("CENTER", colorSwatch)
-	checkers:Show()
-
-	local text = frame:CreateFontString(nil,"OVERLAY","GameFontHighlight")
-	text:SetHeight(24)
-	text:SetJustifyH("LEFT")
-	text:SetTextColor(1, 1, 1)
-	text:SetPoint("LEFT", colorSwatch, "RIGHT", 2, 0)
-	text:SetPoint("RIGHT")
-
-	--local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
-	--highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
-	--highlight:SetBlendMode("ADD")
-	--highlight:SetAllPoints(frame)
-
-	local widget = {
-		colorSwatch = colorSwatch,
-		text        = text,
-		frame       = frame,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
deleted file mode 100644
index 1f28cb5..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown-Items.lua
+++ /dev/null
@@ -1,471 +0,0 @@
---[[ $Id: AceGUIWidget-DropDown-Items.lua 996 2010-12-01 18:34:17Z nevcairiel $ ]]--
-
-local AceGUI = LibStub("AceGUI-3.0")
-
--- Lua APIs
-local select, assert = select, assert
-
--- WoW APIs
-local PlaySound = PlaySound
-local CreateFrame = CreateFrame
-
-local function fixlevels(parent,...)
-	local i = 1
-	local child = select(i, ...)
-	while child do
-		child:SetFrameLevel(parent:GetFrameLevel()+1)
-		fixlevels(child, child:GetChildren())
-		i = i + 1
-		child = select(i, ...)
-	end
-end
-
-local function fixstrata(strata, parent, ...)
-	local i = 1
-	local child = select(i, ...)
-	parent:SetFrameStrata(strata)
-	while child do
-		fixstrata(strata, child, child:GetChildren())
-		i = i + 1
-		child = select(i, ...)
-	end
-end
-
--- ItemBase is the base "class" for all dropdown items.
--- Each item has to use ItemBase.Create(widgetType) to
--- create an initial 'self' value.
--- ItemBase will add common functions and ui event handlers.
--- Be sure to keep basic usage when you override functions.
-
-local ItemBase = {
-	-- NOTE: The ItemBase version is added to each item's version number
-	--       to ensure proper updates on ItemBase changes.
-	--       Use at least 1000er steps.
-	version = 1000,
-	counter = 0,
-}
-
-function ItemBase.Frame_OnEnter(this)
-	local self = this.obj
-
-	if self.useHighlight then
-		self.highlight:Show()
-	end
-	self:Fire("OnEnter")
-
-	if self.specialOnEnter then
-		self.specialOnEnter(self)
-	end
-end
-
-function ItemBase.Frame_OnLeave(this)
-	local self = this.obj
-
-	self.highlight:Hide()
-	self:Fire("OnLeave")
-
-	if self.specialOnLeave then
-		self.specialOnLeave(self)
-	end
-end
-
--- exported, AceGUI callback
-function ItemBase.OnAcquire(self)
-	self.frame:SetToplevel(true)
-	self.frame:SetFrameStrata("FULLSCREEN_DIALOG")
-end
-
--- exported, AceGUI callback
-function ItemBase.OnRelease(self)
-	self:SetDisabled(false)
-	self.pullout = nil
-	self.frame:SetParent(nil)
-	self.frame:ClearAllPoints()
-	self.frame:Hide()
-end
-
--- exported
--- NOTE: this is called by a Dropdown-Pullout.
---       Do not call this method directly
-function ItemBase.SetPullout(self, pullout)
-	self.pullout = pullout
-
-	self.frame:SetParent(nil)
-	self.frame:SetParent(pullout.itemFrame)
-	self.parent = pullout.itemFrame
-	fixlevels(pullout.itemFrame, pullout.itemFrame:GetChildren())
-end
-
--- exported
-function ItemBase.SetText(self, text)
-	self.text:SetText(text or "")
-end
-
--- exported
-function ItemBase.GetText(self)
-	return self.text:GetText()
-end
-
--- exported
-function ItemBase.SetPoint(self, ...)
-	self.frame:SetPoint(...)
-end
-
--- exported
-function ItemBase.Show(self)
-	self.frame:Show()
-end
-
--- exported
-function ItemBase.Hide(self)
-	self.frame:Hide()
-end
-
--- exported
-function ItemBase.SetDisabled(self, disabled)
-	self.disabled = disabled
-	if disabled then
-		self.useHighlight = false
-		self.text:SetTextColor(.5, .5, .5)
-	else
-		self.useHighlight = true
-		self.text:SetTextColor(1, 1, 1)
-	end
-end
-
--- exported
--- NOTE: this is called by a Dropdown-Pullout.
---       Do not call this method directly
-function ItemBase.SetOnLeave(self, func)
-	self.specialOnLeave = func
-end
-
--- exported
--- NOTE: this is called by a Dropdown-Pullout.
---       Do not call this method directly
-function ItemBase.SetOnEnter(self, func)
-	self.specialOnEnter = func
-end
-
-function ItemBase.Create(type)
-	-- NOTE: Most of the following code is copied from AceGUI-3.0/Dropdown widget
-	local count = AceGUI:GetNextWidgetNum(type)
-	local frame = CreateFrame("Button", "AceGUI30DropDownItem"..count)
-	local self = {}
-	self.frame = frame
-	frame.obj = self
-	self.type = type
-
-	self.useHighlight = true
-
-	frame:SetHeight(17)
-	frame:SetFrameStrata("FULLSCREEN_DIALOG")
-
-	local text = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
-	text:SetTextColor(1,1,1)
-	text:SetJustifyH("LEFT")
-	text:SetPoint("TOPLEFT",frame,"TOPLEFT",18,0)
-	text:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",-8,0)
-	self.text = text
-
-	local highlight = frame:CreateTexture(nil, "OVERLAY")
-	highlight:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
-	highlight:SetBlendMode("ADD")
-	highlight:SetHeight(14)
-	highlight:ClearAllPoints()
-	highlight:SetPoint("RIGHT",frame,"RIGHT",-3,0)
-	highlight:SetPoint("LEFT",frame,"LEFT",5,0)
-	highlight:Hide()
-	self.highlight = highlight
-
-	local check = frame:CreateTexture("OVERLAY")
-	check:SetWidth(16)
-	check:SetHeight(16)
-	check:SetPoint("LEFT",frame,"LEFT",3,-1)
-	check:SetTexture("Interface\\Buttons\\UI-CheckBox-Check")
-	check:Hide()
-	self.check = check
-
-	local sub = frame:CreateTexture("OVERLAY")
-	sub:SetWidth(16)
-	sub:SetHeight(16)
-	sub:SetPoint("RIGHT",frame,"RIGHT",-3,-1)
-	sub:SetTexture("Interface\\ChatFrame\\ChatFrameExpandArrow")
-	sub:Hide()
-	self.sub = sub
-
-	frame:SetScript("OnEnter", ItemBase.Frame_OnEnter)
-	frame:SetScript("OnLeave", ItemBase.Frame_OnLeave)
-
-	self.OnAcquire = ItemBase.OnAcquire
-	self.OnRelease = ItemBase.OnRelease
-
-	self.SetPullout = ItemBase.SetPullout
-	self.GetText    = ItemBase.GetText
-	self.SetText    = ItemBase.SetText
-	self.SetDisabled = ItemBase.SetDisabled
-
-	self.SetPoint   = ItemBase.SetPoint
-	self.Show       = ItemBase.Show
-	self.Hide       = ItemBase.Hide
-
-	self.SetOnLeave = ItemBase.SetOnLeave
-	self.SetOnEnter = ItemBase.SetOnEnter
-
-	return self
-end
-
--- Register a dummy LibStub library to retrieve the ItemBase, so other addons can use it.
-local IBLib = LibStub:NewLibrary("AceGUI-3.0-DropDown-ItemBase", ItemBase.version)
-if IBLib then
-	IBLib.GetItemBase = function() return ItemBase end
-end
-
---[[
-	Template for items:
-
--- Item:
---
-do
-	local widgetType = "Dropdown-Item-"
-	local widgetVersion = 1
-
-	local function Constructor()
-		local self = ItemBase.Create(widgetType)
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
-end
---]]
-
--- Item: Header
--- A single text entry.
--- Special: Different text color and no highlight
-do
-	local widgetType = "Dropdown-Item-Header"
-	local widgetVersion = 1
-
-	local function OnEnter(this)
-		local self = this.obj
-		self:Fire("OnEnter")
-
-		if self.specialOnEnter then
-			self.specialOnEnter(self)
-		end
-	end
-
-	local function OnLeave(this)
-		local self = this.obj
-		self:Fire("OnLeave")
-
-		if self.specialOnLeave then
-			self.specialOnLeave(self)
-		end
-	end
-
-	-- exported, override
-	local function SetDisabled(self, disabled)
-		ItemBase.SetDisabled(self, disabled)
-		if not disabled then
-			self.text:SetTextColor(1, 1, 0)
-		end
-	end
-
-	local function Constructor()
-		local self = ItemBase.Create(widgetType)
-
-		self.SetDisabled = SetDisabled
-
-		self.frame:SetScript("OnEnter", OnEnter)
-		self.frame:SetScript("OnLeave", OnLeave)
-
-		self.text:SetTextColor(1, 1, 0)
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
-end
-
--- Item: Execute
--- A simple button
-do
-	local widgetType = "Dropdown-Item-Execute"
-	local widgetVersion = 1
-
-	local function Frame_OnClick(this, button)
-		local self = this.obj
-		if self.disabled then return end
-		self:Fire("OnClick")
-		if self.pullout then
-			self.pullout:Close()
-		end
-	end
-
-	local function Constructor()
-		local self = ItemBase.Create(widgetType)
-
-		self.frame:SetScript("OnClick", Frame_OnClick)
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
-end
-
--- Item: Toggle
--- Some sort of checkbox for dropdown menus.
--- Does not close the pullout on click.
-do
-	local widgetType = "Dropdown-Item-Toggle"
-	local widgetVersion = 3
-
-	local function UpdateToggle(self)
-		if self.value then
-			self.check:Show()
-		else
-			self.check:Hide()
-		end
-	end
-
-	local function OnRelease(self)
-		ItemBase.OnRelease(self)
-		self:SetValue(nil)
-	end
-
-	local function Frame_OnClick(this, button)
-		local self = this.obj
-		if self.disabled then return end
-		self.value = not self.value
-		if self.value then
-			PlaySound("igMainMenuOptionCheckBoxOn")
-		else
-			PlaySound("igMainMenuOptionCheckBoxOff")
-		end
-		UpdateToggle(self)
-		self:Fire("OnValueChanged", self.value)
-	end
-
-	-- exported
-	local function SetValue(self, value)
-		self.value = value
-		UpdateToggle(self)
-	end
-
-	-- exported
-	local function GetValue(self)
-		return self.value
-	end
-
-	local function Constructor()
-		local self = ItemBase.Create(widgetType)
-
-		self.frame:SetScript("OnClick", Frame_OnClick)
-
-		self.SetValue = SetValue
-		self.GetValue = GetValue
-		self.OnRelease = OnRelease
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
-end
-
--- Item: Menu
--- Shows a submenu on mouse over
--- Does not close the pullout on click
-do
-	local widgetType = "Dropdown-Item-Menu"
-	local widgetVersion = 2
-
-	local function OnEnter(this)
-		local self = this.obj
-		self:Fire("OnEnter")
-
-		if self.specialOnEnter then
-			self.specialOnEnter(self)
-		end
-
-		self.highlight:Show()
-
-		if not self.disabled and self.submenu then
-			self.submenu:Open("TOPLEFT", self.frame, "TOPRIGHT", self.pullout:GetRightBorderWidth(), 0, self.frame:GetFrameLevel() + 100)
-		end
-	end
-
-	local function OnHide(this)
-		local self = this.obj
-		if self.submenu then
-			self.submenu:Close()
-		end
-	end
-
-	-- exported
-	local function SetMenu(self, menu)
-		assert(menu.type == "Dropdown-Pullout")
-		self.submenu = menu
-	end
-
-	-- exported
-	local function CloseMenu(self)
-		self.submenu:Close()
-	end
-
-	local function Constructor()
-		local self = ItemBase.Create(widgetType)
-
-		self.sub:Show()
-
-		self.frame:SetScript("OnEnter", OnEnter)
-		self.frame:SetScript("OnHide", OnHide)
-
-		self.SetMenu   = SetMenu
-		self.CloseMenu = CloseMenu
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
-end
-
--- Item: Separator
--- A single line to separate items
-do
-	local widgetType = "Dropdown-Item-Separator"
-	local widgetVersion = 1
-
-	-- exported, override
-	local function SetDisabled(self, disabled)
-		ItemBase.SetDisabled(self, disabled)
-		self.useHighlight = false
-	end
-
-	local function Constructor()
-		local self = ItemBase.Create(widgetType)
-
-		self.SetDisabled = SetDisabled
-
-		local line = self.frame:CreateTexture(nil, "OVERLAY")
-		line:SetHeight(1)
-		line:SetTexture(.5, .5, .5)
-		line:SetPoint("LEFT", self.frame, "LEFT", 10, 0)
-		line:SetPoint("RIGHT", self.frame, "RIGHT", -10, 0)
-
-		self.text:Hide()
-
-		self.useHighlight = false
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion + ItemBase.version)
-end
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
deleted file mode 100644
index 0dd3bff..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-DropDown.lua
+++ /dev/null
@@ -1,737 +0,0 @@
---[[ $Id: AceGUIWidget-DropDown.lua 1116 2014-10-12 08:15:46Z nevcairiel $ ]]--
-local AceGUI = LibStub("AceGUI-3.0")
-
--- Lua APIs
-local min, max, floor = math.min, math.max, math.floor
-local select, pairs, ipairs, type = select, pairs, ipairs, type
-local tsort = table.sort
-
--- WoW APIs
-local PlaySound = PlaySound
-local UIParent, CreateFrame = UIParent, CreateFrame
-local _G = _G
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: CLOSE
-
-local function fixlevels(parent,...)
-	local i = 1
-	local child = select(i, ...)
-	while child do
-		child:SetFrameLevel(parent:GetFrameLevel()+1)
-		fixlevels(child, child:GetChildren())
-		i = i + 1
-		child = select(i, ...)
-	end
-end
-
-local function fixstrata(strata, parent, ...)
-	local i = 1
-	local child = select(i, ...)
-	parent:SetFrameStrata(strata)
-	while child do
-		fixstrata(strata, child, child:GetChildren())
-		i = i + 1
-		child = select(i, ...)
-	end
-end
-
-do
-	local widgetType = "Dropdown-Pullout"
-	local widgetVersion = 3
-
-	--[[ Static data ]]--
-
-	local backdrop = {
-		bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
-		edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
-		edgeSize = 32,
-		tileSize = 32,
-		tile = true,
-		insets = { left = 11, right = 12, top = 12, bottom = 11 },
-	}
-	local sliderBackdrop  = {
-		bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
-		edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
-		tile = true, tileSize = 8, edgeSize = 8,
-		insets = { left = 3, right = 3, top = 3, bottom = 3 }
-	}
-
-	local defaultWidth = 200
-	local defaultMaxHeight = 600
-
-	--[[ UI Event Handlers ]]--
-
-	-- HACK: This should be no part of the pullout, but there
-	--       is no other 'clean' way to response to any item-OnEnter
-	--       Used to close Submenus when an other item is entered
-	local function OnEnter(item)
-		local self = item.pullout
-		for k, v in ipairs(self.items) do
-			if v.CloseMenu and v ~= item then
-				v:CloseMenu()
-			end
-		end
-	end
-
-	-- See the note in Constructor() for each scroll related function
-	local function OnMouseWheel(this, value)
-		this.obj:MoveScroll(value)
-	end
-
-	local function OnScrollValueChanged(this, value)
-		this.obj:SetScroll(value)
-	end
-
-	local function OnSizeChanged(this)
-		this.obj:FixScroll()
-	end
-
-	--[[ Exported methods ]]--
-
-	-- exported
-	local function SetScroll(self, value)
-		local status = self.scrollStatus
-		local frame, child = self.scrollFrame, self.itemFrame
-		local height, viewheight = frame:GetHeight(), child:GetHeight()
-
-		local offset
-		if height > viewheight then
-			offset = 0
-		else
-			offset = floor((viewheight - height) / 1000 * value)
-		end
-		child:ClearAllPoints()
-		child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
-		child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", self.slider:IsShown() and -12 or 0, offset)
-		status.offset = offset
-		status.scrollvalue = value
-	end
-
-	-- exported
-	local function MoveScroll(self, value)
-		local status = self.scrollStatus
-		local frame, child = self.scrollFrame, self.itemFrame
-		local height, viewheight = frame:GetHeight(), child:GetHeight()
-
-		if height > viewheight then
-			self.slider:Hide()
-		else
-			self.slider:Show()
-			local diff = height - viewheight
-			local delta = 1
-			if value < 0 then
-				delta = -1
-			end
-			self.slider:SetValue(min(max(status.scrollvalue + delta*(1000/(diff/45)),0), 1000))
-		end
-	end
-
-	-- exported
-	local function FixScroll(self)
-		local status = self.scrollStatus
-		local frame, child = self.scrollFrame, self.itemFrame
-		local height, viewheight = frame:GetHeight(), child:GetHeight()
-		local offset = status.offset or 0
-
-		if viewheight < height then
-			self.slider:Hide()
-			child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, offset)
-			self.slider:SetValue(0)
-		else
-			self.slider:Show()
-			local value = (offset / (viewheight - height) * 1000)
-			if value > 1000 then value = 1000 end
-			self.slider:SetValue(value)
-			self:SetScroll(value)
-			if value < 1000 then
-				child:ClearAllPoints()
-				child:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, offset)
-				child:SetPoint("TOPRIGHT", frame, "TOPRIGHT", -12, offset)
-				status.offset = offset
-			end
-		end
-	end
-
-	-- exported, AceGUI callback
-	local function OnAcquire(self)
-		self.frame:SetParent(UIParent)
-		--self.itemFrame:SetToplevel(true)
-	end
-
-	-- exported, AceGUI callback
-	local function OnRelease(self)
-		self:Clear()
-		self.frame:ClearAllPoints()
-		self.frame:Hide()
-	end
-
-	-- exported
-	local function AddItem(self, item)
-		self.items[#self.items + 1] = item
-
-		local h = #self.items * 16
-		self.itemFrame:SetHeight(h)
-		self.frame:SetHeight(min(h + 34, self.maxHeight)) -- +34: 20 for scrollFrame placement (10 offset) and +14 for item placement
-
-		item.frame:SetPoint("LEFT", self.itemFrame, "LEFT")
-		item.frame:SetPoint("RIGHT", self.itemFrame, "RIGHT")
-
-		item:SetPullout(self)
-		item:SetOnEnter(OnEnter)
-	end
-
-	-- exported
-	local function Open(self, point, relFrame, relPoint, x, y)
-		local items = self.items
-		local frame = self.frame
-		local itemFrame = self.itemFrame
-
-		frame:SetPoint(point, relFrame, relPoint, x, y)
-
-
-		local height = 8
-		for i, item in pairs(items) do
-			if i == 1 then
-				item:SetPoint("TOP", itemFrame, "TOP", 0, -2)
-			else
-				item:SetPoint("TOP", items[i-1].frame, "BOTTOM", 0, 1)
-			end
-
-			item:Show()
-
-			height = height + 16
-		end
-		itemFrame:SetHeight(height)
-		fixstrata("TOOLTIP", frame, frame:GetChildren())
-		frame:Show()
-		self:Fire("OnOpen")
-	end
-
-	-- exported
-	local function Close(self)
-		self.frame:Hide()
-		self:Fire("OnClose")
-	end
-
-	-- exported
-	local function Clear(self)
-		local items = self.items
-		for i, item in pairs(items) do
-			AceGUI:Release(item)
-			items[i] = nil
-		end
-	end
-
-	-- exported
-	local function IterateItems(self)
-		return ipairs(self.items)
-	end
-
-	-- exported
-	local function SetHideOnLeave(self, val)
-		self.hideOnLeave = val
-	end
-
-	-- exported
-	local function SetMaxHeight(self, height)
-		self.maxHeight = height or defaultMaxHeight
-		if self.frame:GetHeight() > height then
-			self.frame:SetHeight(height)
-		elseif (self.itemFrame:GetHeight() + 34) < height then
-			self.frame:SetHeight(self.itemFrame:GetHeight() + 34) -- see :AddItem
-		end
-	end
-
-	-- exported
-	local function GetRightBorderWidth(self)
-		return 6 + (self.slider:IsShown() and 12 or 0)
-	end
-
-	-- exported
-	local function GetLeftBorderWidth(self)
-		return 6
-	end
-
-	--[[ Constructor ]]--
-
-	local function Constructor()
-		local count = AceGUI:GetNextWidgetNum(widgetType)
-		local frame = CreateFrame("Frame", "AceGUI30Pullout"..count, UIParent)
-		local self = {}
-		self.count = count
-		self.type = widgetType
-		self.frame = frame
-		frame.obj = self
-
-		self.OnAcquire = OnAcquire
-		self.OnRelease = OnRelease
-
-		self.AddItem = AddItem
-		self.Open    = Open
-		self.Close   = Close
-		self.Clear   = Clear
-		self.IterateItems = IterateItems
-		self.SetHideOnLeave = SetHideOnLeave
-
-		self.SetScroll  = SetScroll
-		self.MoveScroll = MoveScroll
-		self.FixScroll  = FixScroll
-
-		self.SetMaxHeight = SetMaxHeight
-		self.GetRightBorderWidth = GetRightBorderWidth
-		self.GetLeftBorderWidth = GetLeftBorderWidth
-
-		self.items = {}
-
-		self.scrollStatus = {
-			scrollvalue = 0,
-		}
-
-		self.maxHeight = defaultMaxHeight
-
-		frame:SetBackdrop(backdrop)
-		frame:SetBackdropColor(0, 0, 0)
-		frame:SetFrameStrata("FULLSCREEN_DIALOG")
-		frame:SetClampedToScreen(true)
-		frame:SetWidth(defaultWidth)
-		frame:SetHeight(self.maxHeight)
-		--frame:SetToplevel(true)
-
-		-- NOTE: The whole scroll frame code is copied from the AceGUI-3.0 widget ScrollFrame
-		local scrollFrame = CreateFrame("ScrollFrame", nil, frame)
-		local itemFrame = CreateFrame("Frame", nil, scrollFrame)
-
-		self.scrollFrame = scrollFrame
-		self.itemFrame = itemFrame
-
-		scrollFrame.obj = self
-		itemFrame.obj = self
-
-		local slider = CreateFrame("Slider", "AceGUI30PulloutScrollbar"..count, scrollFrame)
-		slider:SetOrientation("VERTICAL")
-		slider:SetHitRectInsets(0, 0, -10, 0)
-		slider:SetBackdrop(sliderBackdrop)
-		slider:SetWidth(8)
-		slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Vertical")
-		slider:SetFrameStrata("FULLSCREEN_DIALOG")
-		self.slider = slider
-		slider.obj = self
-
-		scrollFrame:SetScrollChild(itemFrame)
-		scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 6, -12)
-		scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -6, 12)
-		scrollFrame:EnableMouseWheel(true)
-		scrollFrame:SetScript("OnMouseWheel", OnMouseWheel)
-		scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
-		scrollFrame:SetToplevel(true)
-		scrollFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-
-		itemFrame:SetPoint("TOPLEFT", scrollFrame, "TOPLEFT", 0, 0)
-		itemFrame:SetPoint("TOPRIGHT", scrollFrame, "TOPRIGHT", -12, 0)
-		itemFrame:SetHeight(400)
-		itemFrame:SetToplevel(true)
-		itemFrame:SetFrameStrata("FULLSCREEN_DIALOG")
-
-		slider:SetPoint("TOPLEFT", scrollFrame, "TOPRIGHT", -16, 0)
-		slider:SetPoint("BOTTOMLEFT", scrollFrame, "BOTTOMRIGHT", -16, 0)
-		slider:SetScript("OnValueChanged", OnScrollValueChanged)
-		slider:SetMinMaxValues(0, 1000)
-		slider:SetValueStep(1)
-		slider:SetValue(0)
-
-		scrollFrame:Show()
-		itemFrame:Show()
-		slider:Hide()
-
-		self:FixScroll()
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
-end
-
-do
-	local widgetType = "Dropdown"
-	local widgetVersion = 30
-
-	--[[ Static data ]]--
-
-	--[[ UI event handler ]]--
-
-	local function Control_OnEnter(this)
-		this.obj.button:LockHighlight()
-		this.obj:Fire("OnEnter")
-	end
-
-	local function Control_OnLeave(this)
-		this.obj.button:UnlockHighlight()
-		this.obj:Fire("OnLeave")
-	end
-
-	local function Dropdown_OnHide(this)
-		local self = this.obj
-		if self.open then
-			self.pullout:Close()
-		end
-	end
-
-	local function Dropdown_TogglePullout(this)
-		local self = this.obj
-		PlaySound("igMainMenuOptionCheckBoxOn") -- missleading name, but the Blizzard code uses this sound
-		if self.open then
-			self.open = nil
-			self.pullout:Close()
-			AceGUI:ClearFocus()
-		else
-			self.open = true
-			self.pullout:SetWidth(self.pulloutWidth or self.frame:GetWidth())
-			self.pullout:Open("TOPLEFT", self.frame, "BOTTOMLEFT", 0, self.label:IsShown() and -2 or 0)
-			AceGUI:SetFocus(self)
-		end
-	end
-
-	local function OnPulloutOpen(this)
-		local self = this.userdata.obj
-		local value = self.value
-
-		if not self.multiselect then
-			for i, item in this:IterateItems() do
-				item:SetValue(item.userdata.value == value)
-			end
-		end
-
-		self.open = true
-		self:Fire("OnOpened")
-	end
-
-	local function OnPulloutClose(this)
-		local self = this.userdata.obj
-		self.open = nil
-		self:Fire("OnClosed")
-	end
-
-	local function ShowMultiText(self)
-		local text
-		for i, widget in self.pullout:IterateItems() do
-			if widget.type == "Dropdown-Item-Toggle" then
-				if widget:GetValue() then
-					if text then
-						text = text..", "..widget:GetText()
-					else
-						text = widget:GetText()
-					end
-				end
-			end
-		end
-		self:SetText(text)
-	end
-
-	local function OnItemValueChanged(this, event, checked)
-		local self = this.userdata.obj
-
-		if self.multiselect then
-			self:Fire("OnValueChanged", this.userdata.value, checked)
-			ShowMultiText(self)
-		else
-			if checked then
-				self:SetValue(this.userdata.value)
-				self:Fire("OnValueChanged", this.userdata.value)
-			else
-				this:SetValue(true)
-			end
-			if self.open then
-				self.pullout:Close()
-			end
-		end
-	end
-
-	--[[ Exported methods ]]--
-
-	-- exported, AceGUI callback
-	local function OnAcquire(self)
-		local pullout = AceGUI:Create("Dropdown-Pullout")
-		self.pullout = pullout
-		pullout.userdata.obj = self
-		pullout:SetCallback("OnClose", OnPulloutClose)
-		pullout:SetCallback("OnOpen", OnPulloutOpen)
-		self.pullout.frame:SetFrameLevel(self.frame:GetFrameLevel() + 1)
-		fixlevels(self.pullout.frame, self.pullout.frame:GetChildren())
-
-		self:SetHeight(44)
-		self:SetWidth(200)
-		self:SetLabel()
-		self:SetPulloutWidth(nil)
-	end
-
-	-- exported, AceGUI callback
-	local function OnRelease(self)
-		if self.open then
-			self.pullout:Close()
-		end
-		AceGUI:Release(self.pullout)
-		self.pullout = nil
-
-		self:SetText("")
-		self:SetDisabled(false)
-		self:SetMultiselect(false)
-
-		self.value = nil
-		self.list = nil
-		self.open = nil
-		self.hasClose = nil
-
-		self.frame:ClearAllPoints()
-		self.frame:Hide()
-	end
-
-	-- exported
-	local function SetDisabled(self, disabled)
-		self.disabled = disabled
-		if disabled then
-			self.text:SetTextColor(0.5,0.5,0.5)
-			self.button:Disable()
-			self.button_cover:Disable()
-			self.label:SetTextColor(0.5,0.5,0.5)
-		else
-			self.button:Enable()
-			self.button_cover:Enable()
-			self.label:SetTextColor(1,.82,0)
-			self.text:SetTextColor(1,1,1)
-		end
-	end
-
-	-- exported
-	local function ClearFocus(self)
-		if self.open then
-			self.pullout:Close()
-		end
-	end
-
-	-- exported
-	local function SetText(self, text)
-		self.text:SetText(text or "")
-	end
-
-	-- exported
-	local function SetLabel(self, text)
-		if text and text ~= "" then
-			self.label:SetText(text)
-			self.label:Show()
-			self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,-14)
-			self:SetHeight(40)
-			self.alignoffset = 26
-		else
-			self.label:SetText("")
-			self.label:Hide()
-			self.dropdown:SetPoint("TOPLEFT",self.frame,"TOPLEFT",-15,0)
-			self:SetHeight(26)
-			self.alignoffset = 12
-		end
-	end
-
-	-- exported
-	local function SetValue(self, value)
-		if self.list then
-			self:SetText(self.list[value] or "")
-		end
-		self.value = value
-	end
-
-	-- exported
-	local function GetValue(self)
-		return self.value
-	end
-
-	-- exported
-	local function SetItemValue(self, item, value)
-		if not self.multiselect then return end
-		for i, widget in self.pullout:IterateItems() do
-			if widget.userdata.value == item then
-				if widget.SetValue then
-					widget:SetValue(value)
-				end
-			end
-		end
-		ShowMultiText(self)
-	end
-
-	-- exported
-	local function SetItemDisabled(self, item, disabled)
-		for i, widget in self.pullout:IterateItems() do
-			if widget.userdata.value == item then
-				widget:SetDisabled(disabled)
-			end
-		end
-	end
-
-	local function AddListItem(self, value, text, itemType)
-		if not itemType then itemType = "Dropdown-Item-Toggle" end
-		local exists = AceGUI:GetWidgetVersion(itemType)
-		if not exists then error(("The given item type, %q, does not exist within AceGUI-3.0"):format(tostring(itemType)), 2) end
-
-		local item = AceGUI:Create(itemType)
-		item:SetText(text)
-		item.userdata.obj = self
-		item.userdata.value = value
-		item:SetCallback("OnValueChanged", OnItemValueChanged)
-		self.pullout:AddItem(item)
-	end
-
-	local function AddCloseButton(self)
-		if not self.hasClose then
-			local close = AceGUI:Create("Dropdown-Item-Execute")
-			close:SetText(CLOSE)
-			self.pullout:AddItem(close)
-			self.hasClose = true
-		end
-	end
-
-	-- exported
-	local sortlist = {}
-	local function SetList(self, list, order, itemType)
-		self.list = list
-		self.pullout:Clear()
-		self.hasClose = nil
-		if not list then return end
-
-		if type(order) ~= "table" then
-			for v in pairs(list) do
-				sortlist[#sortlist + 1] = v
-			end
-			tsort(sortlist)
-
-			for i, key in ipairs(sortlist) do
-				AddListItem(self, key, list[key], itemType)
-				sortlist[i] = nil
-			end
-		else
-			for i, key in ipairs(order) do
-				AddListItem(self, key, list[key], itemType)
-			end
-		end
-		if self.multiselect then
-			ShowMultiText(self)
-			AddCloseButton(self)
-		end
-	end
-
-	-- exported
-	local function AddItem(self, value, text, itemType)
-		if self.list then
-			self.list[value] = text
-			AddListItem(self, value, text, itemType)
-		end
-	end
-
-	-- exported
-	local function SetMultiselect(self, multi)
-		self.multiselect = multi
-		if multi then
-			ShowMultiText(self)
-			AddCloseButton(self)
-		end
-	end
-
-	-- exported
-	local function GetMultiselect(self)
-		return self.multiselect
-	end
-
-	local function SetPulloutWidth(self, width)
-		self.pulloutWidth = width
-	end
-
-	--[[ Constructor ]]--
-
-	local function Constructor()
-		local count = AceGUI:GetNextWidgetNum(widgetType)
-		local frame = CreateFrame("Frame", nil, UIParent)
-		local dropdown = CreateFrame("Frame", "AceGUI30DropDown"..count, frame, "UIDropDownMenuTemplate")
-
-		local self = {}
-		self.type = widgetType
-		self.frame = frame
-		self.dropdown = dropdown
-		self.count = count
-		frame.obj = self
-		dropdown.obj = self
-
-		self.OnRelease   = OnRelease
-		self.OnAcquire   = OnAcquire
-
-		self.ClearFocus  = ClearFocus
-
-		self.SetText     = SetText
-		self.SetValue    = SetValue
-		self.GetValue    = GetValue
-		self.SetList     = SetList
-		self.SetLabel    = SetLabel
-		self.SetDisabled = SetDisabled
-		self.AddItem     = AddItem
-		self.SetMultiselect = SetMultiselect
-		self.GetMultiselect = GetMultiselect
-		self.SetItemValue = SetItemValue
-		self.SetItemDisabled = SetItemDisabled
-		self.SetPulloutWidth = SetPulloutWidth
-
-		self.alignoffset = 26
-
-		frame:SetScript("OnHide",Dropdown_OnHide)
-
-		dropdown:ClearAllPoints()
-		dropdown:SetPoint("TOPLEFT",frame,"TOPLEFT",-15,0)
-		dropdown:SetPoint("BOTTOMRIGHT",frame,"BOTTOMRIGHT",17,0)
-		dropdown:SetScript("OnHide", nil)
-
-		local left = _G[dropdown:GetName() .. "Left"]
-		local middle = _G[dropdown:GetName() .. "Middle"]
-		local right = _G[dropdown:GetName() .. "Right"]
-
-		middle:ClearAllPoints()
-		right:ClearAllPoints()
-
-		middle:SetPoint("LEFT", left, "RIGHT", 0, 0)
-		middle:SetPoint("RIGHT", right, "LEFT", 0, 0)
-		right:SetPoint("TOPRIGHT", dropdown, "TOPRIGHT", 0, 17)
-
-		local button = _G[dropdown:GetName() .. "Button"]
-		self.button = button
-		button.obj = self
-		button:SetScript("OnEnter",Control_OnEnter)
-		button:SetScript("OnLeave",Control_OnLeave)
-		button:SetScript("OnClick",Dropdown_TogglePullout)
-
-		local button_cover = CreateFrame("BUTTON",nil,self.frame)
-		self.button_cover = button_cover
-		button_cover.obj = self
-		button_cover:SetPoint("TOPLEFT",self.frame,"BOTTOMLEFT",0,25)
-		button_cover:SetPoint("BOTTOMRIGHT",self.frame,"BOTTOMRIGHT")
-		button_cover:SetScript("OnEnter",Control_OnEnter)
-		button_cover:SetScript("OnLeave",Control_OnLeave)
-		button_cover:SetScript("OnClick",Dropdown_TogglePullout)
-
-		local text = _G[dropdown:GetName() .. "Text"]
-		self.text = text
-		text.obj = self
-		text:ClearAllPoints()
-		text:SetPoint("RIGHT", right, "RIGHT" ,-43, 2)
-		text:SetPoint("LEFT", left, "LEFT", 25, 2)
-
-		local label = frame:CreateFontString(nil,"OVERLAY","GameFontNormalSmall")
-		label:SetPoint("TOPLEFT",frame,"TOPLEFT",0,0)
-		label:SetPoint("TOPRIGHT",frame,"TOPRIGHT",0,0)
-		label:SetJustifyH("LEFT")
-		label:SetHeight(18)
-		label:Hide()
-		self.label = label
-
-		AceGUI:RegisterAsWidget(self)
-		return self
-	end
-
-	AceGUI:RegisterWidgetType(widgetType, Constructor, widgetVersion)
-end
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
deleted file mode 100644
index c67902c..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-EditBox.lua
+++ /dev/null
@@ -1,261 +0,0 @@
---[[-----------------------------------------------------------------------------
-EditBox Widget
--------------------------------------------------------------------------------]]
-local Type, Version = "EditBox", 25
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local tostring, pairs = tostring, pairs
-
--- WoW APIs
-local PlaySound = PlaySound
-local GetCursorInfo, ClearCursor, GetSpellInfo = GetCursorInfo, ClearCursor, GetSpellInfo
-local CreateFrame, UIParent = CreateFrame, UIParent
-local _G = _G
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: AceGUIEditBoxInsertLink, ChatFontNormal, OKAY
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-if not AceGUIEditBoxInsertLink then
-	-- upgradeable hook
-	hooksecurefunc("ChatEdit_InsertLink", function(...) return _G.AceGUIEditBoxInsertLink(...) end)
-end
-
-function _G.AceGUIEditBoxInsertLink(text)
-	for i = 1, AceGUI:GetWidgetCount(Type) do
-		local editbox = _G["AceGUI-3.0EditBox"..i]
-		if editbox and editbox:IsVisible() and editbox:HasFocus() then
-			editbox:Insert(text)
-			return true
-		end
-	end
-end
-
-local function ShowButton(self)
-	if not self.disablebutton then
-		self.button:Show()
-		self.editbox:SetTextInsets(0, 20, 3, 3)
-	end
-end
-
-local function HideButton(self)
-	self.button:Hide()
-	self.editbox:SetTextInsets(0, 0, 3, 3)
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
-local function Frame_OnShowFocus(frame)
-	frame.obj.editbox:SetFocus()
-	frame:SetScript("OnShow", nil)
-end
-
-local function EditBox_OnEscapePressed(frame)
-	AceGUI:ClearFocus()
-end
-
-local function EditBox_OnEnterPressed(frame)
-	local self = frame.obj
-	local value = frame:GetText()
-	local cancel = self:Fire("OnEnterPressed", value)
-	if not cancel then
-		PlaySound("igMainMenuOptionCheckBoxOn")
-		HideButton(self)
-	end
-end
-
-local function EditBox_OnReceiveDrag(frame)
-	local self = frame.obj
-	local type, id, info = GetCursorInfo()
-	if type == "item" then
-		self:SetText(info)
-		self:Fire("OnEnterPressed", info)
-		ClearCursor()
-	elseif type == "spell" then
-		local name = GetSpellInfo(id, info)
-		self:SetText(name)
-		self:Fire("OnEnterPressed", name)
-		ClearCursor()
-	elseif type == "macro" then
-		local name = GetMacroInfo(id)
-		self:SetText(name)
-		self:Fire("OnEnterPressed", name)
-		ClearCursor()
-	end
-	HideButton(self)
-	AceGUI:ClearFocus()
-end
-
-local function EditBox_OnTextChanged(frame)
-	local self = frame.obj
-	local value = frame:GetText()
-	if tostring(value) ~= tostring(self.lasttext) then
-		self:Fire("OnTextChanged", value)
-		self.lasttext = value
-		ShowButton(self)
-	end
-end
-
-local function EditBox_OnFocusGained(frame)
-	AceGUI:SetFocus(frame.obj)
-end
-
-local function Button_OnClick(frame)
-	local editbox = frame.obj.editbox
-	editbox:ClearFocus()
-	EditBox_OnEnterPressed(editbox)
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		-- height is controlled by SetLabel
-		self:SetWidth(200)
-		self:SetDisabled(false)
-		self:SetLabel()
-		self:SetText()
-		self:DisableButton(false)
-		self:SetMaxLetters(0)
-	end,
-
-	["OnRelease"] = function(self)
-		self:ClearFocus()
-	end,
-
-	["SetDisabled"] = function(self, disabled)
-		self.disabled = disabled
-		if disabled then
-			self.editbox:EnableMouse(false)
-			self.editbox:ClearFocus()
-			self.editbox:SetTextColor(0.5,0.5,0.5)
-			self.label:SetTextColor(0.5,0.5,0.5)
-		else
-			self.editbox:EnableMouse(true)
-			self.editbox:SetTextColor(1,1,1)
-			self.label:SetTextColor(1,.82,0)
-		end
-	end,
-
-	["SetText"] = function(self, text)
-		self.lasttext = text or ""
-		self.editbox:SetText(text or "")
-		self.editbox:SetCursorPosition(0)
-		HideButton(self)
-	end,
-
-	["GetText"] = function(self, text)
-		return self.editbox:GetText()
-	end,
-
-	["SetLabel"] = function(self, text)
-		if text and text ~= "" then
-			self.label:SetText(text)
-			self.label:Show()
-			self.editbox:SetPoint("TOPLEFT",self.frame,"TOPLEFT",7,-18)
-			self:SetHeight(44)
-			self.alignoffset = 30
-		else
-			self.label:SetText("")
-			self.label:Hide()
-			self.editbox:SetPoint("TOPLEFT",self.frame,"TOPLEFT",7,0)
-			self:SetHeight(26)
-			self.alignoffset = 12
-		end
-	end,
-
-	["DisableButton"] = function(self, disabled)
-		self.disablebutton = disabled
-		if disabled then
-			HideButton(self)
-		end
-	end,
-
-	["SetMaxLetters"] = function (self, num)
-		self.editbox:SetMaxLetters(num or 0)
-	end,
-
-	["ClearFocus"] = function(self)
-		self.editbox:ClearFocus()
-		self.frame:SetScript("OnShow", nil)
-	end,
-
-	["SetFocus"] = function(self)
-		self.editbox:SetFocus()
-		if not self.frame:IsShown() then
-			self.frame:SetScript("OnShow", Frame_OnShowFocus)
-		end
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local num  = AceGUI:GetNextWidgetNum(Type)
-	local frame = CreateFrame("Frame", nil, UIParent)
-	frame:Hide()
-
-	local editbox = CreateFrame("EditBox", "AceGUI-3.0EditBox"..num, frame, "InputBoxTemplate")
-	editbox:SetAutoFocus(false)
-	editbox:SetFontObject(ChatFontNormal)
-	editbox:SetScript("OnEnter", Control_OnEnter)
-	editbox:SetScript("OnLeave", Control_OnLeave)
-	editbox:SetScript("OnEscapePressed", EditBox_OnEscapePressed)
-	editbox:SetScript("OnEnterPressed", EditBox_OnEnterPressed)
-	editbox:SetScript("OnTextChanged", EditBox_OnTextChanged)
-	editbox:SetScript("OnReceiveDrag", EditBox_OnReceiveDrag)
-	editbox:SetScript("OnMouseDown", EditBox_OnReceiveDrag)
-	editbox:SetScript("OnEditFocusGained", EditBox_OnFocusGained)
-	editbox:SetTextInsets(0, 0, 3, 3)
-	editbox:SetMaxLetters(256)
-	editbox:SetPoint("BOTTOMLEFT", 6, 0)
-	editbox:SetPoint("BOTTOMRIGHT")
-	editbox:SetHeight(19)
-
-	local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
-	label:SetPoint("TOPLEFT", 0, -2)
-	label:SetPoint("TOPRIGHT", 0, -2)
-	label:SetJustifyH("LEFT")
-	label:SetHeight(18)
-
-	local button = CreateFrame("Button", nil, editbox, "UIPanelButtonTemplate")
-	button:SetWidth(40)
-	button:SetHeight(20)
-	button:SetPoint("RIGHT", -2, 0)
-	button:SetText(OKAY)
-	button:SetScript("OnClick", Button_OnClick)
-	button:Hide()
-
-	local widget = {
-		alignoffset = 30,
-		editbox     = editbox,
-		label       = label,
-		button      = button,
-		frame       = frame,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	editbox.obj, button.obj = widget, widget
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
deleted file mode 100644
index 1aaf3f5..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Heading.lua
+++ /dev/null
@@ -1,78 +0,0 @@
---[[-----------------------------------------------------------------------------
-Heading Widget
--------------------------------------------------------------------------------]]
-local Type, Version = "Heading", 20
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetText()
-		self:SetFullWidth()
-		self:SetHeight(18)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetText"] = function(self, text)
-		self.label:SetText(text or "")
-		if text and text ~= "" then
-			self.left:SetPoint("RIGHT", self.label, "LEFT", -5, 0)
-			self.right:Show()
-		else
-			self.left:SetPoint("RIGHT", -3, 0)
-			self.right:Hide()
-		end
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-	frame:Hide()
-
-	local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontNormal")
-	label:SetPoint("TOP")
-	label:SetPoint("BOTTOM")
-	label:SetJustifyH("CENTER")
-
-	local left = frame:CreateTexture(nil, "BACKGROUND")
-	left:SetHeight(8)
-	left:SetPoint("LEFT", 3, 0)
-	left:SetPoint("RIGHT", label, "LEFT", -5, 0)
-	left:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
-	left:SetTexCoord(0.81, 0.94, 0.5, 1)
-
-	local right = frame:CreateTexture(nil, "BACKGROUND")
-	right:SetHeight(8)
-	right:SetPoint("RIGHT", -3, 0)
-	right:SetPoint("LEFT", label, "RIGHT", 5, 0)
-	right:SetTexture("Interface\\Tooltips\\UI-Tooltip-Border")
-	right:SetTexCoord(0.81, 0.94, 0.5, 1)
-
-	local widget = {
-		label = label,
-		left  = left,
-		right = right,
-		frame = frame,
-		type  = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
deleted file mode 100644
index 8d01b54..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Icon.lua
+++ /dev/null
@@ -1,144 +0,0 @@
---[[-----------------------------------------------------------------------------
-Icon Widget
--------------------------------------------------------------------------------]]
-local Type, Version = "Icon", 21
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local select, pairs, print = select, pairs, print
-
--- WoW APIs
-local CreateFrame, UIParent, GetBuildInfo = CreateFrame, UIParent, GetBuildInfo
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
-local function Button_OnClick(frame, button)
-	frame.obj:Fire("OnClick", button)
-	AceGUI:ClearFocus()
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetHeight(110)
-		self:SetWidth(110)
-		self:SetLabel()
-		self:SetImage(nil)
-		self:SetImageSize(64, 64)
-		self:SetDisabled(false)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetLabel"] = function(self, text)
-		if text and text ~= "" then
-			self.label:Show()
-			self.label:SetText(text)
-			self:SetHeight(self.image:GetHeight() + 25)
-		else
-			self.label:Hide()
-			self:SetHeight(self.image:GetHeight() + 10)
-		end
-	end,
-
-	["SetImage"] = function(self, path, ...)
-		local image = self.image
-		image:SetTexture(path)
-
-		if image:GetTexture() then
-			local n = select("#", ...)
-			if n == 4 or n == 8 then
-				image:SetTexCoord(...)
-			else
-				image:SetTexCoord(0, 1, 0, 1)
-			end
-		end
-	end,
-
-	["SetImageSize"] = function(self, width, height)
-		self.image:SetWidth(width)
-		self.image:SetHeight(height)
-		--self.frame:SetWidth(width + 30)
-		if self.label:IsShown() then
-			self:SetHeight(height + 25)
-		else
-			self:SetHeight(height + 10)
-		end
-	end,
-
-	["SetDisabled"] = function(self, disabled)
-		self.disabled = disabled
-		if disabled then
-			self.frame:Disable()
-			self.label:SetTextColor(0.5, 0.5, 0.5)
-			self.image:SetVertexColor(0.5, 0.5, 0.5, 0.5)
-		else
-			self.frame:Enable()
-			self.label:SetTextColor(1, 1, 1)
-			self.image:SetVertexColor(1, 1, 1, 1)
-		end
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Button", nil, UIParent)
-	frame:Hide()
-
-	frame:EnableMouse(true)
-	frame:SetScript("OnEnter", Control_OnEnter)
-	frame:SetScript("OnLeave", Control_OnLeave)
-	frame:SetScript("OnClick", Button_OnClick)
-
-	local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontHighlight")
-	label:SetPoint("BOTTOMLEFT")
-	label:SetPoint("BOTTOMRIGHT")
-	label:SetJustifyH("CENTER")
-	label:SetJustifyV("TOP")
-	label:SetHeight(18)
-
-	local image = frame:CreateTexture(nil, "BACKGROUND")
-	image:SetWidth(64)
-	image:SetHeight(64)
-	image:SetPoint("TOP", 0, -5)
-
-	local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
-	highlight:SetAllPoints(image)
-	highlight:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-Tab-Highlight")
-	highlight:SetTexCoord(0, 1, 0.23, 0.77)
-	highlight:SetBlendMode("ADD")
-
-	local widget = {
-		label = label,
-		image = image,
-		frame = frame,
-		type  = Type
-	}
-	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
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
deleted file mode 100644
index 9e06049..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-InteractiveLabel.lua
+++ /dev/null
@@ -1,101 +0,0 @@
---[[-----------------------------------------------------------------------------
-InteractiveLabel Widget
--------------------------------------------------------------------------------]]
-local Type, Version = "InteractiveLabel", 20
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local select, pairs = select, pairs
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontHighlightSmall
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
-local function Label_OnClick(frame, button)
-	frame.obj:Fire("OnClick", button)
-	AceGUI:ClearFocus()
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:LabelOnAcquire()
-		self:SetHighlight()
-		self:SetHighlightTexCoord()
-		self:SetDisabled(false)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetHighlight"] = function(self, ...)
-		self.highlight:SetTexture(...)
-	end,
-
-	["SetHighlightTexCoord"] = function(self, ...)
-		local c = select("#", ...)
-		if c == 4 or c == 8 then
-			self.highlight:SetTexCoord(...)
-		else
-			self.highlight:SetTexCoord(0, 1, 0, 1)
-		end
-	end,
-
-	["SetDisabled"] = function(self,disabled)
-		self.disabled = disabled
-		if disabled then
-			self.frame:EnableMouse(false)
-			self.label:SetTextColor(0.5, 0.5, 0.5)
-		else
-			self.frame:EnableMouse(true)
-			self.label:SetTextColor(1, 1, 1)
-		end
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	-- create a Label type that we will hijack
-	local label = AceGUI:Create("Label")
-
-	local frame = label.frame
-	frame:EnableMouse(true)
-	frame:SetScript("OnEnter", Control_OnEnter)
-	frame:SetScript("OnLeave", Control_OnLeave)
-	frame:SetScript("OnMouseDown", Label_OnClick)
-
-	local highlight = frame:CreateTexture(nil, "HIGHLIGHT")
-	highlight:SetTexture(nil)
-	highlight:SetAllPoints()
-	highlight:SetBlendMode("ADD")
-
-	label.highlight = highlight
-	label.type = Type
-	label.LabelOnAcquire = label.OnAcquire
-	for method, func in pairs(methods) do
-		label[method] = func
-	end
-
-	return label
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
-
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
deleted file mode 100644
index 7dccc64..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Keybinding.lua
+++ /dev/null
@@ -1,239 +0,0 @@
---[[-----------------------------------------------------------------------------
-Keybinding Widget
-Set Keybindings in the Config UI.
--------------------------------------------------------------------------------]]
-local Type, Version = "Keybinding", 24
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: NOT_BOUND
-
-local wowMoP
-do
-	local _, _, _, interface = GetBuildInfo()
-	wowMoP = (interface >= 50000)
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
-local function Keybinding_OnClick(frame, button)
-	if button == "LeftButton" or button == "RightButton" then
-		local self = frame.obj
-		if self.waitingForKey then
-			frame:EnableKeyboard(false)
-			self.msgframe:Hide()
-			frame:UnlockHighlight()
-			self.waitingForKey = nil
-		else
-			frame:EnableKeyboard(true)
-			self.msgframe:Show()
-			frame:LockHighlight()
-			self.waitingForKey = true
-		end
-	end
-	AceGUI:ClearFocus()
-end
-
-local ignoreKeys = {
-	["BUTTON1"] = true, ["BUTTON2"] = true,
-	["UNKNOWN"] = true,
-	["LSHIFT"] = true, ["LCTRL"] = true, ["LALT"] = true,
-	["RSHIFT"] = true, ["RCTRL"] = true, ["RALT"] = true,
-}
-local function Keybinding_OnKeyDown(frame, key)
-	local self = frame.obj
-	if self.waitingForKey then
-		local keyPressed = key
-		if keyPressed == "ESCAPE" then
-			keyPressed = ""
-		else
-			if ignoreKeys[keyPressed] then return end
-			if IsShiftKeyDown() then
-				keyPressed = "SHIFT-"..keyPressed
-			end
-			if IsControlKeyDown() then
-				keyPressed = "CTRL-"..keyPressed
-			end
-			if IsAltKeyDown() then
-				keyPressed = "ALT-"..keyPressed
-			end
-		end
-
-		frame:EnableKeyboard(false)
-		self.msgframe:Hide()
-		frame:UnlockHighlight()
-		self.waitingForKey = nil
-
-		if not self.disabled then
-			self:SetKey(keyPressed)
-			self:Fire("OnKeyChanged", keyPressed)
-		end
-	end
-end
-
-local function Keybinding_OnMouseDown(frame, button)
-	if button == "LeftButton" or button == "RightButton" then
-		return
-	elseif button == "MiddleButton" then
-		button = "BUTTON3"
-	elseif button == "Button4" then
-		button = "BUTTON4"
-	elseif button == "Button5" then
-		button = "BUTTON5"
-	end
-	Keybinding_OnKeyDown(frame, button)
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetWidth(200)
-		self:SetLabel("")
-		self:SetKey("")
-		self.waitingForKey = nil
-		self.msgframe:Hide()
-		self:SetDisabled(false)
-		self.button:EnableKeyboard(false)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetDisabled"] = function(self, disabled)
-		self.disabled = disabled
-		if disabled then
-			self.button:Disable()
-			self.label:SetTextColor(0.5,0.5,0.5)
-		else
-			self.button:Enable()
-			self.label:SetTextColor(1,1,1)
-		end
-	end,
-
-	["SetKey"] = function(self, key)
-		if (key or "") == "" then
-			self.button:SetText(NOT_BOUND)
-			self.button:SetNormalFontObject("GameFontNormal")
-		else
-			self.button:SetText(key)
-			self.button:SetNormalFontObject("GameFontHighlight")
-		end
-	end,
-
-	["GetKey"] = function(self)
-		local key = self.button:GetText()
-		if key == NOT_BOUND then
-			key = nil
-		end
-		return key
-	end,
-
-	["SetLabel"] = function(self, label)
-		self.label:SetText(label or "")
-		if (label or "") == "" then
-			self.alignoffset = nil
-			self:SetHeight(24)
-		else
-			self.alignoffset = 30
-			self:SetHeight(44)
-		end
-	end,
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-
-local ControlBackdrop  = {
-	bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
-	edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
-	tile = true, tileSize = 16, edgeSize = 16,
-	insets = { left = 3, right = 3, top = 3, bottom = 3 }
-}
-
-local function keybindingMsgFixWidth(frame)
-	frame:SetWidth(frame.msg:GetWidth() + 10)
-	frame:SetScript("OnUpdate", nil)
-end
-
-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")
-
-	button:EnableMouse(true)
-	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:SetPoint("BOTTOMLEFT")
-	button:SetPoint("BOTTOMRIGHT")
-	button:SetHeight(24)
-	button:EnableKeyboard(false)
-
-	local text = button:GetFontString()
-	text:SetPoint("LEFT", 7, 0)
-	text:SetPoint("RIGHT", -7, 0)
-
-	local label = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight")
-	label:SetPoint("TOPLEFT")
-	label:SetPoint("TOPRIGHT")
-	label:SetJustifyH("CENTER")
-	label:SetHeight(18)
-
-	local msgframe = CreateFrame("Frame", nil, UIParent)
-	msgframe:SetHeight(30)
-	msgframe:SetBackdrop(ControlBackdrop)
-	msgframe:SetBackdropColor(0,0,0)
-	msgframe:SetFrameStrata("FULLSCREEN_DIALOG")
-	msgframe:SetFrameLevel(1000)
-	msgframe:SetToplevel(true)
-
-	local msg = msgframe:CreateFontString(nil, "OVERLAY", "GameFontNormal")
-	msg:SetText("Press a key to bind, ESC to clear the binding or click the button again to cancel.")
-	msgframe.msg = msg
-	msg:SetPoint("TOPLEFT", 5, -5)
-	msgframe:SetScript("OnUpdate", keybindingMsgFixWidth)
-	msgframe:SetPoint("BOTTOM", button, "TOP")
-	msgframe:Hide()
-
-	local widget = {
-		button      = button,
-		label       = label,
-		msgframe    = msgframe,
-		frame       = frame,
-		alignoffset = 30,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	button.obj = widget
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
deleted file mode 100644
index 23897d5..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Label.lua
+++ /dev/null
@@ -1,166 +0,0 @@
---[[-----------------------------------------------------------------------------
-Label Widget
-Displays text and optionally an icon.
--------------------------------------------------------------------------------]]
-local Type, Version = "Label", 23
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local max, select, pairs = math.max, select, pairs
-
--- WoW APIs
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontHighlightSmall
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-
-local function UpdateImageAnchor(self)
-	if self.resizing then return end
-	local frame = self.frame
-	local width = frame.width or frame:GetWidth() or 0
-	local image = self.image
-	local label = self.label
-	local height
-
-	label:ClearAllPoints()
-	image:ClearAllPoints()
-
-	if self.imageshown then
-		local imagewidth = image:GetWidth()
-		if (width - imagewidth) < 200 or (label:GetText() or "") == "" then
-			-- image goes on top centered when less than 200 width for the text, or if there is no text
-			image:SetPoint("TOP")
-			label:SetPoint("TOP", image, "BOTTOM")
-			label:SetPoint("LEFT")
-			label:SetWidth(width)
-			height = image:GetHeight() + label:GetHeight()
-		else
-			-- image on the left
-			image:SetPoint("TOPLEFT")
-			if image:GetHeight() > label:GetHeight() then
-				label:SetPoint("LEFT", image, "RIGHT", 4, 0)
-			else
-				label:SetPoint("TOPLEFT", image, "TOPRIGHT", 4, 0)
-			end
-			label:SetWidth(width - imagewidth - 4)
-			height = max(image:GetHeight(), label:GetHeight())
-		end
-	else
-		-- no image shown
-		label:SetPoint("TOPLEFT")
-		label:SetWidth(width)
-		height = label:GetHeight()
-	end
-
-	self.resizing = true
-	frame:SetHeight(height)
-	frame.height = height
-	self.resizing = nil
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		-- set the flag to stop constant size updates
-		self.resizing = true
-		-- height is set dynamically by the text and image size
-		self:SetWidth(200)
-		self:SetText()
-		self:SetImage(nil)
-		self:SetImageSize(16, 16)
-		self:SetColor()
-		self:SetFontObject()
-
-		-- reset the flag
-		self.resizing = nil
-		-- run the update explicitly
-		UpdateImageAnchor(self)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["OnWidthSet"] = function(self, width)
-		UpdateImageAnchor(self)
-	end,
-
-	["SetText"] = function(self, text)
-		self.label:SetText(text)
-		UpdateImageAnchor(self)
-	end,
-
-	["SetColor"] = function(self, r, g, b)
-		if not (r and g and b) then
-			r, g, b = 1, 1, 1
-		end
-		self.label:SetVertexColor(r, g, b)
-	end,
-
-	["SetImage"] = function(self, path, ...)
-		local image = self.image
-		image:SetTexture(path)
-
-		if image:GetTexture() then
-			self.imageshown = true
-			local n = select("#", ...)
-			if n == 4 or n == 8 then
-				image:SetTexCoord(...)
-			else
-				image:SetTexCoord(0, 1, 0, 1)
-			end
-		else
-			self.imageshown = nil
-		end
-		UpdateImageAnchor(self)
-	end,
-
-	["SetFont"] = function(self, font, height, flags)
-		self.label:SetFont(font, height, flags)
-	end,
-
-	["SetFontObject"] = function(self, font)
-		self:SetFont((font or GameFontHighlightSmall):GetFont())
-	end,
-
-	["SetImageSize"] = function(self, width, height)
-		self.image:SetWidth(width)
-		self.image:SetHeight(height)
-		UpdateImageAnchor(self)
-	end,
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-	frame:Hide()
-
-	local label = frame:CreateFontString(nil, "BACKGROUND", "GameFontHighlightSmall")
-	label:SetJustifyH("LEFT")
-	label:SetJustifyV("TOP")
-
-	local image = frame:CreateTexture(nil, "BACKGROUND")
-
-	-- create widget
-	local widget = {
-		label = label,
-		image = image,
-		frame = frame,
-		type  = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
deleted file mode 100644
index a27a2fc..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-MultiLineEditBox.lua
+++ /dev/null
@@ -1,368 +0,0 @@
-local Type, Version = "MultiLineEditBox", 27
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local pairs = pairs
-
--- WoW APIs
-local GetCursorInfo, GetSpellInfo, ClearCursor = GetCursorInfo, GetSpellInfo, ClearCursor
-local CreateFrame, UIParent = CreateFrame, UIParent
-local _G = _G
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: ACCEPT, ChatFontNormal
-
-local wowMoP
-do
-	local _, _, _, interface = GetBuildInfo()
-	wowMoP = (interface >= 50000)
-end
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-
-if not AceGUIMultiLineEditBoxInsertLink then
-	-- upgradeable hook
-	hooksecurefunc("ChatEdit_InsertLink", function(...) return _G.AceGUIMultiLineEditBoxInsertLink(...) end)
-end
-
-function _G.AceGUIMultiLineEditBoxInsertLink(text)
-	for i = 1, AceGUI:GetWidgetCount(Type) do
-		local editbox = _G[("MultiLineEditBox%uEdit"):format(i)]
-		if editbox and editbox:IsVisible() and editbox:HasFocus() then
-			editbox:Insert(text)
-			return true
-		end
-	end
-end
-
-
-local function Layout(self)
-	self:SetHeight(self.numlines * 14 + (self.disablebutton and 19 or 41) + self.labelHeight)
-
-	if self.labelHeight == 0 then
-		self.scrollBar:SetPoint("TOP", self.frame, "TOP", 0, -23)
-	else
-		self.scrollBar:SetPoint("TOP", self.label, "BOTTOM", 0, -19)
-	end
-
-	if self.disablebutton then
-		self.scrollBar:SetPoint("BOTTOM", self.frame, "BOTTOM", 0, 21)
-		self.scrollBG:SetPoint("BOTTOMLEFT", 0, 4)
-	else
-		self.scrollBar:SetPoint("BOTTOM", self.button, "TOP", 0, 18)
-		self.scrollBG:SetPoint("BOTTOMLEFT", self.button, "TOPLEFT")
-	end
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function OnClick(self)                                                     -- Button
-	self = self.obj
-	self.editBox:ClearFocus()
-	if not self:Fire("OnEnterPressed", self.editBox:GetText()) then
-		self.button:Disable()
-	end
-end
-
-local function OnCursorChanged(self, _, y, _, cursorHeight)                      -- EditBox
-	self, y = self.obj.scrollFrame, -y
-	local offset = self:GetVerticalScroll()
-	if y < offset then
-		self:SetVerticalScroll(y)
-	else
-		y = y + cursorHeight - self:GetHeight()
-		if y > offset then
-			self:SetVerticalScroll(y)
-		end
-	end
-end
-
-local function OnEditFocusLost(self)                                             -- EditBox
-	self:HighlightText(0, 0)
-	self.obj:Fire("OnEditFocusLost")
-end
-
-local function OnEnter(self)                                                     -- EditBox / ScrollFrame
-	self = self.obj
-	if not self.entered then
-		self.entered = true
-		self:Fire("OnEnter")
-	end
-end
-
-local function OnLeave(self)                                                     -- EditBox / ScrollFrame
-	self = self.obj
-	if self.entered then
-		self.entered = nil
-		self:Fire("OnLeave")
-	end
-end
-
-local function OnMouseUp(self)                                                   -- ScrollFrame
-	self = self.obj.editBox
-	self:SetFocus()
-	self:SetCursorPosition(self:GetNumLetters())
-end
-
-local function OnReceiveDrag(self)                                               -- EditBox / ScrollFrame
-	local type, id, info = GetCursorInfo()
-	if type == "spell" then
-		info = GetSpellInfo(id, info)
-	elseif type ~= "item" then
-		return
-	end
-	ClearCursor()
-	self = self.obj
-	local editBox = self.editBox
-	if not editBox:HasFocus() then
-		editBox:SetFocus()
-		editBox:SetCursorPosition(editBox:GetNumLetters())
-	end
-	editBox:Insert(info)
-	self.button:Enable()
-end
-
-local function OnSizeChanged(self, width, height)                                -- ScrollFrame
-	self.obj.editBox:SetWidth(width)
-end
-
-local function OnTextChanged(self, userInput)                                    -- EditBox
-	if userInput then
-		self = self.obj
-		self:Fire("OnTextChanged", self.editBox:GetText())
-		self.button:Enable()
-	end
-end
-
-local function OnTextSet(self)                                                   -- EditBox
-	self:HighlightText(0, 0)
-	self:SetCursorPosition(self:GetNumLetters())
-	self:SetCursorPosition(0)
-	self.obj.button:Disable()
-end
-
-local function OnVerticalScroll(self, offset)                                    -- ScrollFrame
-	local editBox = self.obj.editBox
-	editBox:SetHitRectInsets(0, 0, offset, editBox:GetHeight() - offset - self:GetHeight())
-end
-
-local function OnShowFocus(frame)
-	frame.obj.editBox:SetFocus()
-	frame:SetScript("OnShow", nil)
-end
-
-local function OnEditFocusGained(frame)
-	AceGUI:SetFocus(frame.obj)
-	frame.obj:Fire("OnEditFocusGained")
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self.editBox:SetText("")
-		self:SetDisabled(false)
-		self:SetWidth(200)
-		self:DisableButton(false)
-		self:SetNumLines()
-		self.entered = nil
-		self:SetMaxLetters(0)
-	end,
-
-	["OnRelease"] = function(self)
-		self:ClearFocus()
-	end,
-
-	["SetDisabled"] = function(self, disabled)
-		local editBox = self.editBox
-		if disabled then
-			editBox:ClearFocus()
-			editBox:EnableMouse(false)
-			editBox:SetTextColor(0.5, 0.5, 0.5)
-			self.label:SetTextColor(0.5, 0.5, 0.5)
-			self.scrollFrame:EnableMouse(false)
-			self.button:Disable()
-		else
-			editBox:EnableMouse(true)
-			editBox:SetTextColor(1, 1, 1)
-			self.label:SetTextColor(1, 0.82, 0)
-			self.scrollFrame:EnableMouse(true)
-		end
-	end,
-
-	["SetLabel"] = function(self, text)
-		if text and text ~= "" then
-			self.label:SetText(text)
-			if self.labelHeight ~= 10 then
-				self.labelHeight = 10
-				self.label:Show()
-			end
-		elseif self.labelHeight ~= 0 then
-			self.labelHeight = 0
-			self.label:Hide()
-		end
-		Layout(self)
-	end,
-
-	["SetNumLines"] = function(self, value)
-		if not value or value < 4 then
-			value = 4
-		end
-		self.numlines = value
-		Layout(self)
-	end,
-
-	["SetText"] = function(self, text)
-		self.editBox:SetText(text)
-	end,
-
-	["GetText"] = function(self)
-		return self.editBox:GetText()
-	end,
-
-	["SetMaxLetters"] = function (self, num)
-		self.editBox:SetMaxLetters(num or 0)
-	end,
-
-	["DisableButton"] = function(self, disabled)
-		self.disablebutton = disabled
-		if disabled then
-			self.button:Hide()
-		else
-			self.button:Show()
-		end
-		Layout(self)
-	end,
-
-	["ClearFocus"] = function(self)
-		self.editBox:ClearFocus()
-		self.frame:SetScript("OnShow", nil)
-	end,
-
-	["SetFocus"] = function(self)
-		self.editBox:SetFocus()
-		if not self.frame:IsShown() then
-			self.frame:SetScript("OnShow", OnShowFocus)
-		end
-	end,
-
-	["GetCursorPosition"] = function(self)
-		return self.editBox:GetCursorPosition()
-	end,
-
-	["SetCursorPosition"] = function(self, ...)
-		return self.editBox:SetCursorPosition(...)
-	end,
-
-
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local backdrop = {
-	bgFile = [[Interface\Tooltips\UI-Tooltip-Background]],
-	edgeFile = [[Interface\Tooltips\UI-Tooltip-Border]], edgeSize = 16,
-	insets = { left = 4, right = 3, top = 4, bottom = 3 }
-}
-
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-	frame:Hide()
-
-	local widgetNum = AceGUI:GetNextWidgetNum(Type)
-
-	local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
-	label:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, -4)
-	label:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 0, -4)
-	label:SetJustifyH("LEFT")
-	label:SetText(ACCEPT)
-	label:SetHeight(10)
-
-	local button = CreateFrame("Button", ("%s%dButton"):format(Type, widgetNum), frame, wowMoP and "UIPanelButtonTemplate" or "UIPanelButtonTemplate2")
-	button:SetPoint("BOTTOMLEFT", 0, 4)
-	button:SetHeight(22)
-	button:SetWidth(label:GetStringWidth() + 24)
-	button:SetText(ACCEPT)
-	button:SetScript("OnClick", OnClick)
-	button:Disable()
-
-	local text = button:GetFontString()
-	text:ClearAllPoints()
-	text:SetPoint("TOPLEFT", button, "TOPLEFT", 5, -5)
-	text:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -5, 1)
-	text:SetJustifyV("MIDDLE")
-
-	local scrollBG = CreateFrame("Frame", nil, frame)
-	scrollBG:SetBackdrop(backdrop)
-	scrollBG:SetBackdropColor(0, 0, 0)
-	scrollBG:SetBackdropBorderColor(0.4, 0.4, 0.4)
-
-	local scrollFrame = CreateFrame("ScrollFrame", ("%s%dScrollFrame"):format(Type, widgetNum), frame, "UIPanelScrollFrameTemplate")
-
-	local scrollBar = _G[scrollFrame:GetName() .. "ScrollBar"]
-	scrollBar:ClearAllPoints()
-	scrollBar:SetPoint("TOP", label, "BOTTOM", 0, -19)
-	scrollBar:SetPoint("BOTTOM", button, "TOP", 0, 18)
-	scrollBar:SetPoint("RIGHT", frame, "RIGHT")
-
-	scrollBG:SetPoint("TOPRIGHT", scrollBar, "TOPLEFT", 0, 19)
-	scrollBG:SetPoint("BOTTOMLEFT", button, "TOPLEFT")
-
-	scrollFrame:SetPoint("TOPLEFT", scrollBG, "TOPLEFT", 5, -6)
-	scrollFrame:SetPoint("BOTTOMRIGHT", scrollBG, "BOTTOMRIGHT", -4, 4)
-	scrollFrame:SetScript("OnEnter", OnEnter)
-	scrollFrame:SetScript("OnLeave", OnLeave)
-	scrollFrame:SetScript("OnMouseUp", OnMouseUp)
-	scrollFrame:SetScript("OnReceiveDrag", OnReceiveDrag)
-	scrollFrame:SetScript("OnSizeChanged", OnSizeChanged)
-	scrollFrame:HookScript("OnVerticalScroll", OnVerticalScroll)
-
-	local editBox = CreateFrame("EditBox", ("%s%dEdit"):format(Type, widgetNum), scrollFrame)
-	editBox:SetAllPoints()
-	editBox:SetFontObject(ChatFontNormal)
-	editBox:SetMultiLine(true)
-	editBox:EnableMouse(true)
-	editBox:SetAutoFocus(false)
-	editBox:SetCountInvisibleLetters(false)
-	editBox:SetScript("OnCursorChanged", OnCursorChanged)
-	editBox:SetScript("OnEditFocusLost", OnEditFocusLost)
-	editBox:SetScript("OnEnter", OnEnter)
-	editBox:SetScript("OnEscapePressed", editBox.ClearFocus)
-	editBox:SetScript("OnLeave", OnLeave)
-	editBox:SetScript("OnMouseDown", OnReceiveDrag)
-	editBox:SetScript("OnReceiveDrag", OnReceiveDrag)
-	editBox:SetScript("OnTextChanged", OnTextChanged)
-	editBox:SetScript("OnTextSet", OnTextSet)
-	editBox:SetScript("OnEditFocusGained", OnEditFocusGained)
-
-
-	scrollFrame:SetScrollChild(editBox)
-
-	local widget = {
-		button      = button,
-		editBox     = editBox,
-		frame       = frame,
-		label       = label,
-		labelHeight = 10,
-		numlines    = 4,
-		scrollBar   = scrollBar,
-		scrollBG    = scrollBG,
-		scrollFrame = scrollFrame,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	button.obj, editBox.obj, scrollFrame.obj = widget, widget, widget
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type, Constructor, Version)
diff --git a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua b/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
deleted file mode 100644
index 583f29d..0000000
--- a/ElvUI_SLE/libs/AceGUI-3.0/widgets/AceGUIWidget-Slider.lua
+++ /dev/null
@@ -1,285 +0,0 @@
---[[-----------------------------------------------------------------------------
-Slider Widget
-Graphical Slider, like, for Range values.
--------------------------------------------------------------------------------]]
-local Type, Version = "Slider", 21
-local AceGUI = LibStub and LibStub("AceGUI-3.0", true)
-if not AceGUI or (AceGUI:GetWidgetVersion(Type) or 0) >= Version then return end
-
--- Lua APIs
-local min, max, floor = math.min, math.max, math.floor
-local tonumber, pairs = tonumber, pairs
-
--- WoW APIs
-local PlaySound = PlaySound
-local CreateFrame, UIParent = CreateFrame, UIParent
-
--- Global vars/functions that we don't upvalue since they might get hooked, or upgraded
--- List them here for Mikk's FindGlobals script
--- GLOBALS: GameFontHighlightSmall
-
---[[-----------------------------------------------------------------------------
-Support functions
--------------------------------------------------------------------------------]]
-local function UpdateText(self)
-	local value = self.value or 0
-	if self.ispercent then
-		self.editbox:SetText(("%s%%"):format(floor(value * 1000 + 0.5) / 10))
-	else
-		self.editbox:SetText(floor(value * 100 + 0.5) / 100)
-	end
-end
-
-local function UpdateLabels(self)
-	local min, max = (self.min or 0), (self.max or 100)
-	if self.ispercent then
-		self.lowtext:SetFormattedText("%s%%", (min * 100))
-		self.hightext:SetFormattedText("%s%%", (max * 100))
-	else
-		self.lowtext:SetText(min)
-		self.hightext:SetText(max)
-	end
-end
-
---[[-----------------------------------------------------------------------------
-Scripts
--------------------------------------------------------------------------------]]
-local function Control_OnEnter(frame)
-	frame.obj:Fire("OnEnter")
-end
-
-local function Control_OnLeave(frame)
-	frame.obj:Fire("OnLeave")
-end
-
-local function Frame_OnMouseDown(frame)
-	frame.obj.slider:EnableMouseWheel(true)
-	AceGUI:ClearFocus()
-end
-
-local function Slider_OnValueChanged(frame)
-	local self = frame.obj
-	if not frame.setup then
-		local newvalue = frame:GetValue()
-		if self.step and self.step > 0 then
-			local min_value = self.min or 0
-			newvalue = floor((newvalue - min_value) / self.step + 0.5) * self.step + min_value
-		end
-		if newvalue ~= self.value and not self.disabled then
-			self.value = newvalue
-			self:Fire("OnValueChanged", newvalue)
-		end
-		if self.value then
-			UpdateText(self)
-		end
-	end
-end
-
-local function Slider_OnMouseUp(frame)
-	local self = frame.obj
-	self:Fire("OnMouseUp", self.value)
-end
-
-local function Slider_OnMouseWheel(frame, v)
-	local self = frame.obj
-	if not self.disabled then
-		local value = self.value
-		if v > 0 then
-			value = min(value + (self.step or 1), self.max)
-		else
-			value = max(value - (self.step or 1), self.min)
-		end
-		self.slider:SetValue(value)
-	end
-end
-
-local function EditBox_OnEscapePressed(frame)
-	frame:ClearFocus()
-end
-
-local function EditBox_OnEnterPressed(frame)
-	local self = frame.obj
-	local value = frame:GetText()
-	if self.ispercent then
-		value = value:gsub('%%', '')
-		value = tonumber(value) / 100
-	else
-		value = tonumber(value)
-	end
-
-	if value then
-		PlaySound("igMainMenuOptionCheckBoxOn")
-		self.slider:SetValue(value)
-		self:Fire("OnMouseUp", value)
-	end
-end
-
-local function EditBox_OnEnter(frame)
-	frame:SetBackdropBorderColor(0.5, 0.5, 0.5, 1)
-end
-
-local function EditBox_OnLeave(frame)
-	frame:SetBackdropBorderColor(0.3, 0.3, 0.3, 0.8)
-end
-
---[[-----------------------------------------------------------------------------
-Methods
--------------------------------------------------------------------------------]]
-local methods = {
-	["OnAcquire"] = function(self)
-		self:SetWidth(200)
-		self:SetHeight(44)
-		self:SetDisabled(false)
-		self:SetIsPercent(nil)
-		self:SetSliderValues(0,100,1)
-		self:SetValue(0)
-		self.slider:EnableMouseWheel(false)
-	end,
-
-	-- ["OnRelease"] = nil,
-
-	["SetDisabled"] = function(self, disabled)
-		self.disabled = disabled
-		if disabled then
-			self.slider:EnableMouse(false)
-			self.label:SetTextColor(.5, .5, .5)
-			self.hightext:SetTextColor(.5, .5, .5)
-			self.lowtext:SetTextColor(.5, .5, .5)
-			--self.valuetext:SetTextColor(.5, .5, .5)
-			self.editbox:SetTextColor(.5, .5, .5)
-			self.editbox:EnableMouse(false)
-			self.editbox:ClearFocus()
-		else
-			self.slider:EnableMouse(true)
-			self.label:SetTextColor(1, .82, 0)
-			self.hightext:SetTextColor(1, 1, 1)
-			self.lowtext:SetTextColor(1, 1, 1)
-			--self.valuetext:SetTextColor(1, 1, 1)
-			self.editbox:SetTextColor(1, 1, 1)
-			self.editbox:EnableMouse(true)
-		end
-	end,
-
-	["SetValue"] = function(self, value)
-		self.slider.setup = true
-		self.slider:SetValue(value)
-		self.value = value
-		UpdateText(self)
-		self.slider.setup = nil
-	end,
-
-	["GetValue"] = function(self)
-		return self.value
-	end,
-
-	["SetLabel"] = function(self, text)
-		self.label:SetText(text)
-	end,
-
-	["SetSliderValues"] = function(self, min, max, step)
-		local frame = self.slider
-		frame.setup = true
-		self.min = min
-		self.max = max
-		self.step = step
-		frame:SetMinMaxValues(min or 0,max or 100)
-		UpdateLabels(self)
-		frame:SetValueStep(step or 1)
-		if self.value then
-			frame:SetValue(self.value)
-		end
-		frame.setup = nil
-	end,
-
-	["SetIsPercent"] = function(self, value)
-		self.ispercent = value
-		UpdateLabels(self)
-		UpdateText(self)
-	end
-}
-
---[[-----------------------------------------------------------------------------
-Constructor
--------------------------------------------------------------------------------]]
-local SliderBackdrop  = {
-	bgFile = "Interface\\Buttons\\UI-SliderBar-Background",
-	edgeFile = "Interface\\Buttons\\UI-SliderBar-Border",
-	tile = true, tileSize = 8, edgeSize = 8,
-	insets = { left = 3, right = 3, top = 6, bottom = 6 }
-}
-
-local ManualBackdrop = {
-	bgFile = "Interface\\ChatFrame\\ChatFrameBackground",
-	edgeFile = "Interface\\ChatFrame\\ChatFrameBackground",
-	tile = true, edgeSize = 1, tileSize = 5,
-}
-
-local function Constructor()
-	local frame = CreateFrame("Frame", nil, UIParent)
-
-	frame:EnableMouse(true)
-	frame:SetScript("OnMouseDown", Frame_OnMouseDown)
-
-	local label = frame:CreateFontString(nil, "OVERLAY", "GameFontNormal")
-	label:SetPoint("TOPLEFT")
-	label:SetPoint("TOPRIGHT")
-	label:SetJustifyH("CENTER")
-	label:SetHeight(15)
-
-	local slider = CreateFrame("Slider", nil, frame)
-	slider:SetOrientation("HORIZONTAL")
-	slider:SetHeight(15)
-	slider:SetHitRectInsets(0, 0, -10, 0)
-	slider:SetBackdrop(SliderBackdrop)
-	slider:SetThumbTexture("Interface\\Buttons\\UI-SliderBar-Button-Horizontal")
-	slider:SetPoint("TOP", label, "BOTTOM")
-	slider:SetPoint("LEFT", 3, 0)
-	slider:SetPoint("RIGHT", -3, 0)
-	slider:SetValue(0)
-	slider:SetScript("OnValueChanged",Slider_OnValueChanged)
-	slider:SetScript("OnEnter", Control_OnEnter)
-	slider:SetScript("OnLeave", Control_OnLeave)
-	slider:SetScript("OnMouseUp", Slider_OnMouseUp)
-	slider:SetScript("OnMouseWheel", Slider_OnMouseWheel)
-
-	local lowtext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
-	lowtext:SetPoint("TOPLEFT", slider, "BOTTOMLEFT", 2, 3)
-
-	local hightext = slider:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
-	hightext:SetPoint("TOPRIGHT", slider, "BOTTOMRIGHT", -2, 3)
-
-	local editbox = CreateFrame("EditBox", nil, frame)
-	editbox:SetAutoFocus(false)
-	editbox:SetFontObject(GameFontHighlightSmall)
-	editbox:SetPoint("TOP", slider, "BOTTOM")
-	editbox:SetHeight(14)
-	editbox:SetWidth(70)
-	editbox:SetJustifyH("CENTER")
-	editbox:EnableMouse(true)
-	editbox:SetBackdrop(ManualBackdrop)
-	editbox:SetBackdropColor(0, 0, 0, 0.5)
-	editbox:SetBackdropBorderColor(0.3, 0.3, 0.30, 0.80)
-	editbox:SetScript("OnEnter", EditBox_OnEnter)
-	editbox:SetScript("OnLeave", EditBox_OnLeave)
-	editbox:SetScript("OnEnterPressed", EditBox_OnEnterPressed)
-	editbox:SetScript("OnEscapePressed", EditBox_OnEscapePressed)
-
-	local widget = {
-		label       = label,
-		slider      = slider,
-		lowtext     = lowtext,
-		hightext    = hightext,
-		editbox     = editbox,
-		alignoffset = 25,
-		frame       = frame,
-		type        = Type
-	}
-	for method, func in pairs(methods) do
-		widget[method] = func
-	end
-	slider.obj, editbox.obj = widget, widget
-
-	return AceGUI:RegisterAsWidget(widget)
-end
-
-AceGUI:RegisterWidgetType(Type,Constructor,Version)
diff --git a/ElvUI_SLE/libs/LibAnim/LibAnim.lua b/ElvUI_SLE/libs/LibAnim/LibAnim.lua
new file mode 100644
index 0000000..bb7b5a9
--- /dev/null
+++ b/ElvUI_SLE/libs/LibAnim/LibAnim.lua
@@ -0,0 +1,797 @@
+-- LibAnim by Hydra
+local Version = 2.01
+
+if (_LibAnim and _LibAnim >= Version) then
+	return
+end
+
+local cos = cos
+local sin = sin
+local pairs = pairs
+local floor = floor
+local tinsert = tinsert
+local tremove = tremove
+local strlower = strlower
+local Updater = CreateFrame("StatusBar")
+local Texture = Updater:CreateTexture()
+local Text = Updater:CreateFontString()
+local AnimTypes = {}
+local UpdateFuncs = {}
+local Callbacks = {["onplay"] = {}, ["onpause"] = {}, ["onresume"] = {}, ["onstop"] = {}, ["onreset"] = {}, ["onfinished"] = {}}
+
+-- Update all current animations
+local AnimationOnUpdate = function(self, elapsed)
+	for i = 1, #self do
+		if self[i] then -- Double check the the index still exists, due to pauses/stops removing them on the fly
+			self[i]:Update(elapsed, i)
+		end
+	end
+
+	if (#self == 0) then
+		self:SetScript("OnUpdate", nil)
+	end
+end
+
+local StartUpdating = function(anim)
+	tinsert(Updater, anim)
+
+	if (not Updater:GetScript("OnUpdate")) then
+		Updater:SetScript("OnUpdate", AnimationOnUpdate)
+	end
+end
+
+local GetColor = function(p, r1, g1, b1, r2, g2, b2)
+	return r1 + (r2 - r1) * p, g1 + (g2 - g1) * p, b1 + (b2 - b1) * p
+end
+
+local Set = {
+	["backdrop"] = Updater.SetBackdropColor,
+	["border"] = Updater.SetBackdropBorderColor,
+	["statusbar"] = Updater.SetStatusBarColor,
+	["text"] = Text.SetTextColor,
+	["texture"] = Texture.SetTexture,
+	["vertex"] = Texture.SetVertexColor,
+}
+
+local Get = {
+	["backdrop"] = Updater.GetBackdropColor,
+	["border"] = Updater.GetBackdropBorderColor,
+	["statusbar"] = Updater.GetStatusBarColor,
+	["text"] = Text.GetTextColor,
+	["texture"] = Texture.GetVertexColor,
+	["vertex"] = Texture.GetVertexColor,
+}
+
+local Smoothing = {
+	["none"] = function(t, b, c, d)
+		return c * t / d + b
+	end,
+
+	["in"] = function(t, b, c, d)
+		t = t / d
+
+		return c * t * t + b
+	end,
+
+	["out"] = function(t, b, c, d)
+		t = t / d
+
+		return -c * t * (t - 2) + b
+	end,
+
+	["inout"] = function(t, b, c, d)
+		t = t / (d / 2)
+
+		if (t < 1) then
+			return c / 2 * t * t + b
+		end
+
+		t = t - 1
+		return -c / 2 * (t * (t - 2) - 1) + b
+	end,
+
+	["bounce"] = function(t, b, c, d)
+		t = t / d
+
+		if (t < (1 / 2.75)) then
+			return c * (7.5625 * t * t) + b
+		elseif (t < (2 / 2.75)) then
+			t = t - (1.5 / 2.75)
+
+			return c * (7.5625 * t * t + 0.75) + b
+		elseif (t < (2.5 / 2.75)) then
+			t = t - (2.25 / 2.75)
+
+			return c * (7.5625 * t * t + 0.9375) + b
+		else
+			t = t - (2.625 / 2.75)
+
+			return c * (7.5625 * (t) * t + 0.984375) + b
+		end
+	end,
+}
+
+local AnimMethods = {
+	All = {
+		Play = function(self)
+			if (not self.Paused) then
+				AnimTypes[self.Type](self)
+				self:Callback("OnPlay")
+			else
+				StartUpdating(self)
+				self:Callback("OnResume")
+			end
+
+			self.Playing = true
+			self.Paused = false
+			self.Stopped = false
+		end,
+
+		IsPlaying = function(self)
+			return self.Playing
+		end,
+
+		Pause = function(self)
+			for i = 1, #Updater do
+				if (Updater[i] == self) then
+					tremove(Updater, i)
+
+					break
+				end
+			end
+
+			self.Playing = false
+			self.Paused = true
+			self.Stopped = false
+			self:Callback("OnPause")
+		end,
+
+		IsPaused = function(self)
+			return self.Paused
+		end,
+
+		Stop = function(self, reset)
+			for i = 1, #Updater do
+				if (Updater[i] == self) then
+					tremove(Updater, i)
+
+					break
+				end
+			end
+
+			self.Playing = false
+			self.Paused = false
+			self.Stopped = true
+
+			if reset then
+				self:Reset()
+				self:Callback("OnReset")
+			else
+				self:Callback("OnStop")
+			end
+		end,
+
+		IsStopped = function(self)
+			return self.Stopped
+		end,
+
+		SetSmoothing = function(self, smoothType)
+			smoothType = strlower(smoothType)
+
+			self.Smoothing = Smoothing[smoothType] and smoothType or "none"
+		end,
+
+		GetSmoothing = function(self)
+			return self.Smoothing
+		end,
+
+		SetDuration = function(self, duration)
+			self.Duration = duration or 0
+		end,
+
+		GetDuration = function(self)
+			return self.Duration
+		end,
+
+		GetProgressByTimer = function(self)
+			return self.Timer
+		end,
+
+		SetOrder = function(self, order)
+			self.Order = order or 1
+
+			if (order > self.Group.MaxOrder) then
+				self.Group.MaxOrder = order
+			end
+		end,
+
+		GetOrder = function(self)
+			return self.Order
+		end,
+
+		GetParent = function(self)
+			return self.Parent
+		end,
+
+		SetScript = function(self, handler, func)
+			handler = strlower(handler)
+
+			if (not Callbacks[handler]) then
+				return
+			end
+
+			Callbacks[handler][self] = func
+		end,
+
+		GetScript = function(self, handler)
+			handler = strlower(handler)
+
+			if (Callbacks[handler] and Callbacks[handler][self]) then
+				return Callbacks[handler][self]
+			end
+		end,
+
+		Callback = function(self, handler)
+			handler = strlower(handler)
+
+			if Callbacks[handler][self] then
+				Callbacks[handler][self](self)
+			end
+		end,
+	},
+
+	move = {
+		SetOffset = function(self, x, y)
+			self.XSetting  = x or 0
+			self.YSetting  = y or 0
+		end,
+
+		GetOffset = function(self)
+			return self.XSetting, self.YSetting
+		end,
+
+		SetRounded = function(self, flag)
+			self.IsRounded = flag
+		end,
+
+		GetRounded = function(self)
+			return self.IsRounded
+		end,
+
+		GetProgress = function(self)
+			return self.XOffset, self.YOffset
+		end,
+
+		Reset = function(self)
+			self.Parent:ClearAllPoints()
+			self.Parent:SetPoint(self.A1, self.P, self.A2, self.StartX, self.StartY)
+		end,
+	},
+
+	fade = {
+		SetChange = function(self, alpha)
+			self.EndAlphaSetting = alpha or 0
+		end,
+
+		GetChange = function(self)
+			return self.EndAlphaSetting
+		end,
+
+		GetProgress = function(self)
+			return self.AlphaOffset
+		end,
+
+		Reset = function(self)
+			self.Parent:SetAlpha(self.StartAlpha)
+		end,
+	},
+
+	height = {
+		SetChange = function(self, height)
+			self.EndHeightSetting = height or 0
+		end,
+
+		GetChange = function(self)
+			return self.EndHeightSetting
+		end,
+
+		GetProgress = function(self)
+			return self.HeightOffset
+		end,
+
+		Reset = function(self)
+			self.Parent:SetHeight(self.StartHeight)
+		end,
+	},
+
+	width = {
+		SetChange = function(self, width)
+			self.EndWidthSetting = width or 0
+		end,
+
+		GetChange = function(self)
+			return self.EndWidthSetting
+		end,
+
+		GetProgress = function(self)
+			return self.WidthOffset
+		end,
+
+		Reset = function(self)
+			self.Parent:SetWidth(self.StartWidth)
+		end,
+	},
+
+	color = {
+		SetChange = function(self, r, g, b)
+			self.EndRSetting = r or 1
+			self.EndGSetting = g or 1
+			self.EndBSetting = b or 1
+		end,
+
+		GetChange = function(self)
+			return self.EndRSetting, self.EndGSetting, self.EndBSetting
+		end,
+
+		SetColorType = function(self, type)
+			type = strlower(type)
+
+			self.ColorType = Set[type] and type or "border"
+		end,
+
+		GetColorType = function(self)
+			return self.ColorType
+		end,
+
+		GetProgress = function(self)
+			return self.ColorOffset
+		end,
+
+		Reset = function(self)
+			Set[self.ColorType](self.Parent, self.StartR, self.StartG, self.StartB)
+		end,
+	},
+
+	progress = {
+		SetChange = function(self, value)
+			self.EndValueSetting = value or 0
+		end,
+
+		GetChange = function(self)
+			return self.EndValueSetting
+		end,
+
+		GetProgress = function(self)
+			return self.ValueOffset
+		end,
+
+		Reset = function(self)
+			self.Parent:SetValue(self.StartValue)
+		end,
+	},
+
+	number = {
+		SetChange = function(self, value)
+			self.EndNumberSetting = value or 0
+		end,
+
+		GetChange = function(self)
+			return self.EndNumberSetting
+		end,
+
+		SetPrefix = function(self, text)
+			self.Prefix = text or ""
+		end,
+
+		GetPrefix = function(self)
+			return self.Prefix
+		end,
+
+		SetPostfix = function(self, text)
+			self.Postfix = text or ""
+		end,
+
+		GetPostfix = function(self)
+			return self.Postfix
+		end,
+
+		GetProgress = function(self)
+			return self.NumberOffset
+		end,
+
+		Reset = function(self)
+			self.Parent:SetText(self.StartNumer)
+		end,
+	},
+}
+
+local GroupMethods = {
+	Play = function(self)
+		-- Play!
+		for i = 1, #self.Animations do
+			if (self.Animations[i].Order == self.Order) then
+				self.Animations[i]:Play()
+			end
+		end
+
+		self.Playing = true
+		self.Paused = false
+		self.Stopped = false
+	end,
+
+	IsPlaying = function(self)
+		return self.Playing
+	end,
+
+	Pause = function(self)
+		-- Only pause current order
+		for i = 1, #self.Animations do
+			if (self.Animations[i].Order == self.Order) then
+				self.Animations[i]:Pause()
+			end
+		end
+
+		self.Playing = false
+		self.Paused = true
+		self.Stopped = false
+	end,
+
+	IsPaused = function(self)
+		return self.Paused
+	end,
+
+	Stop = function(self)
+		for i = 1, #self.Animations do
+			self.Animations[i]:Stop()
+		end
+
+		self.Playing = false
+		self.Paused = false
+		self.Stopped = true
+	end,
+
+	IsStopped = function(self)
+		return self.Stopped
+	end,
+
+	SetLooping = function(self, shouldLoop)
+		self.Looping = shouldLoop
+	end,
+
+	GetLooping = function(self)
+		return self.Looping
+	end,
+
+	GetParent = function(self)
+		return self.Parent
+	end,
+
+	CheckOrder = function(self)
+		-- Check if we're done all animations at the current order, then proceed to the next order.
+		local NumAtOrder = 0
+		local NumDoneAtOrder = 0
+
+		for i = 1, #self.Animations do
+			if (self.Animations[i].Order == self.Order) then
+				NumAtOrder = NumAtOrder + 1
+
+				if (not self.Animations[i].Playing) then
+					NumDoneAtOrder = NumDoneAtOrder + 1
+				end
+			end
+		end
+
+		-- All the animations at x order finished, go to next order
+		if (NumAtOrder == NumDoneAtOrder) then
+			self.Order = self.Order + 1
+
+			-- We exceeded max order, reset to 1 and bail the function, or restart if we're looping
+			if (self.Order > self.MaxOrder) then
+				self.Order = 1
+
+				if (self.Stopped or not self.Looping) then
+					self.Playing = false
+
+					return
+				end
+			end
+
+			-- Play!
+			for i = 1, #self.Animations do
+				if (self.Animations[i].Order == self.Order) then
+					self.Animations[i]:Play()
+				end
+			end
+		end
+	end,
+
+	CreateAnimation = function(self, type)
+		type = strlower(type)
+
+		if (not AnimTypes[type]) then
+			return
+		end
+
+		local Animation = {}
+
+		-- General methods
+		for key, func in pairs(AnimMethods.All) do
+			Animation[key] = func
+		end
+
+		-- Animation specific methods
+		if AnimMethods[type] then
+			for key, func in pairs(AnimMethods[type]) do
+				Animation[key] = func
+			end
+		end
+
+		-- Set some attributes and defaults
+		Animation.Paused = false
+		Animation.Playing = false
+		Animation.Stopped = false
+		Animation.Looping = false
+		Animation.Type = type
+		Animation.Group = self
+		Animation.Parent = self.Parent
+		Animation.Order = 1
+		Animation.Duration = 0.3
+		Animation.Smoothing = "none"
+		Animation.Update = UpdateFuncs[type]
+
+		tinsert(self.Animations, Animation)
+
+		return Animation
+	end,
+}
+
+CreateAnimationGroup = function(parent)
+	local Group = {Animations = {}}
+
+	-- Add methods to the group
+	for key, func in pairs(GroupMethods) do
+		Group[key] = func
+	end
+
+	Group.Parent = parent
+	Group.Playing = false
+	Group.Paused = false
+	Group.Stopped = false
+	Group.Order = 1
+	Group.MaxOrder = 1
+
+	return Group
+end
+
+-- Movement
+UpdateFuncs["move"] = function(self, elapsed, i)
+	self.Timer = self.Timer + elapsed
+
+	if self.IsRounded then
+		self.ModTimer = Smoothing[self.Smoothing](self.Timer, 0, self.Duration, self.Duration)
+		self.XOffset = self.StartX - (-1) * (self.XChange * (1 - cos(90 * self.ModTimer / self.Duration)))
+		self.YOffset = self.StartY + self.YChange * sin(90 * self.ModTimer / self.Duration)
+	else
+		self.XOffset = Smoothing[self.Smoothing](self.Timer, self.StartX, self.XChange, self.Duration)
+		self.YOffset = Smoothing[self.Smoothing](self.Timer, self.StartY, self.YChange, self.Duration)
+	end
+
+	self.Parent:SetPoint(self.A1, self.P, self.A2, (self.EndX ~= 0 and self.XOffset or self.StartX), (self.EndY ~= 0 and self.YOffset or self.StartY))
+
+	if (self.Timer >= self.Duration) then
+		tremove(Updater, i)
+		self.Parent:SetPoint(self.A1, self.P, self.A2, self.EndX, self.EndY)
+		self.Playing = false
+		self:Callback("OnFinished")
+		self.Group:CheckOrder()
+	end
+end
+
+AnimTypes["move"] = function(self)
+	if self:IsPlaying() then
+		return
+	end
+
+	local A1, P, A2, X, Y = self.Parent:GetPoint()
+
+	self.Timer = 0
+	self.A1 = A1
+	self.P = P
+	self.A2 = A2
+	self.StartX = X
+	self.EndX = X + self.XSetting or 0
+	self.StartY = Y
+	self.EndY = Y + self.YSetting or 0
+	self.XChange = self.EndX - self.StartX
+	self.YChange = self.EndY - self.StartY
+
+	if self.IsRounded then
+		if (self.XChange == 0 or self.YChange == 0) then -- Double check if we're valid to be rounded
+			self.IsRounded = false
+		else
+			self.ModTimer = 0
+		end
+	end
+
+	StartUpdating(self)
+end
+
+-- Fade
+UpdateFuncs["fade"] = function(self, elapsed, i)
+	self.Timer = self.Timer + elapsed
+	self.AlphaOffset = Smoothing[self.Smoothing](self.Timer, self.StartAlpha, self.Change, self.Duration)
+	self.Parent:SetAlpha(self.AlphaOffset)
+
+	if (self.Timer >= self.Duration) then
+		tremove(Updater, i)
+		self.Parent:SetAlpha(self.EndAlpha)
+		self.Playing = false
+		self:Callback("OnFinished")
+		self.Group:CheckOrder()
+	end
+end
+
+AnimTypes["fade"] = function(self)
+	if self:IsPlaying() then
+		return
+	end
+
+	self.Timer = 0
+	self.StartAlpha = self.Parent:GetAlpha() or 1
+	self.EndAlpha = self.EndAlphaSetting or 0
+	self.Change = self.EndAlpha - self.StartAlpha
+
+	StartUpdating(self)
+end
+
+-- Height
+UpdateFuncs["height"] = function(self, elapsed, i)
+	self.Timer = self.Timer + elapsed
+	self.HeightOffset = Smoothing[self.Smoothing](self.Timer, self.StartHeight, self.HeightChange, self.Duration)
+	self.Parent:SetHeight(self.HeightOffset)
+
+	if (self.Timer >= self.Duration) then
+		tremove(Updater, i)
+		self.Parent:SetHeight(self.EndHeight)
+		self.Playing = false
+		self:Callback("OnFinished")
+		self.Group:CheckOrder()
+	end
+end
+
+AnimTypes["height"] = function(self)
+	if self:IsPlaying() then
+		return
+	end
+
+	self.Timer = 0
+	self.StartHeight = self.Parent:GetHeight() or 0
+	self.EndHeight = self.EndHeightSetting or 0
+	self.HeightChange = self.EndHeight - self.StartHeight
+
+	StartUpdating(self)
+end
+
+-- Width
+UpdateFuncs["width"] = function(self, elapsed, i)
+	self.Timer = self.Timer + elapsed
+	self.WidthOffset = Smoothing[self.Smoothing](self.Timer, self.StartWidth, self.WidthChange, self.Duration)
+	self.Parent:SetWidth(self.WidthOffset)
+
+	if (self.Timer >= self.Duration) then
+		tremove(Updater, i)
+		self.Parent:SetWidth(self.EndWidth)
+		self.Playing = false
+		self:Callback("OnFinished")
+		self.Group:CheckOrder()
+	end
+end
+
+AnimTypes["width"] = function(self)
+	if self:IsPlaying() then
+		return
+	end
+
+	self.Timer = 0
+	self.StartWidth = self.Parent:GetWidth() or 0
+	self.EndWidth = self.EndWidthSetting or 0
+	self.WidthChange = self.EndWidth - self.StartWidth
+
+	StartUpdating(self)
+end
+
+-- Color
+UpdateFuncs["color"] = function(self, elapsed, i)
+	self.Timer = self.Timer + elapsed
+	self.ColorOffset = Smoothing[self.Smoothing](self.Timer, 0, self.Duration, self.Duration)
+	Set[self.ColorType](self.Parent, GetColor(self.Timer / self.Duration, self.StartR, self.StartG, self.StartB, self.EndR, self.EndG, self.EndB))
+
+	if (self.Timer >= self.Duration) then
+		tremove(Updater, i)
+		Set[self.ColorType](self.Parent, self.EndR, self.EndG, self.EndB)
+		self.Playing = false
+		self:Callback("OnFinished")
+		self.Group:CheckOrder()
+	end
+end
+
+AnimTypes["color"] = function(self)
+	self.Timer = 0
+	self.ColorType = self.ColorType or "backdrop"
+	self.StartR, self.StartG, self.StartB = Get[self.ColorType](self.Parent)
+	self.EndR = self.EndRSetting or 1
+	self.EndG = self.EndGSetting or 1
+	self.EndB = self.EndBSetting or 1
+
+	StartUpdating(self)
+end
+
+-- Progress
+UpdateFuncs["progress"] = function(self, elapsed, i)
+	self.Timer = self.Timer + elapsed
+	self.ValueOffset = Smoothing[self.Smoothing](self.Timer, self.StartValue, self.ProgressChange, self.Duration)
+	self.Parent:SetValue(self.ValueOffset)
+
+	if (self.Timer >= self.Duration) then
+		tremove(Updater, i)
+		self.Parent:SetValue(self.EndValue)
+		self.Playing = false
+		self:Callback("OnFinished")
+		self.Group:CheckOrder()
+	end
+end
+
+AnimTypes["progress"] = function(self)
+	self.Timer = 0
+	self.StartValue = self.Parent:GetValue() or 0
+	self.EndValue = self.EndValueSetting or 0
+	self.ProgressChange = self.EndValue - self.StartValue
+
+	StartUpdating(self)
+end
+
+-- Sleep
+UpdateFuncs["sleep"] = function(self, elapsed, i)
+	self.Timer = self.Timer + elapsed
+
+	if (self.Timer >= self.Duration) then
+		tremove(Updater, i)
+		self.Playing = false
+		self:Callback("OnFinished")
+		self.Group:CheckOrder()
+	end
+end
+
+AnimTypes["sleep"] = function(self)
+	self.Timer = 0
+
+	StartUpdating(self)
+end
+
+-- Number
+UpdateFuncs["number"] = function(self, elapsed, i)
+	self.Timer = self.Timer + elapsed
+	self.NumberOffset = Smoothing[self.Smoothing](self.Timer, self.StartNumber, self.NumberChange, self.Duration)
+	self.Parent:SetText(self.Prefix..floor(self.NumberOffset)..self.Postfix)
+
+	if (self.Timer >= self.Duration) then
+		tremove(Updater, i)
+		self.Parent:SetText(self.Prefix..floor(self.EndNumber)..self.Postfix)
+		self.Playing = false
+		self:Callback("OnFinished")
+		self.Group:CheckOrder()
+	end
+end
+
+AnimTypes["number"] = function(self)
+	self.Timer = 0
+	self.StartNumber = tonumber(self.Parent:GetText()) or 0
+	self.EndNumber = self.EndNumberSetting or 0
+	self.NumberChange = self.EndNumberSetting - self.StartNumber
+	self.Prefix = self.Prefix or ""
+	self.Postfix = self.Postfix or ""
+
+	StartUpdating(self)
+end
+
+_G["_LibAnim"] = Version
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/LibAnim/LibAnim.toc b/ElvUI_SLE/libs/LibAnim/LibAnim.toc
new file mode 100644
index 0000000..11d96ce
--- /dev/null
+++ b/ElvUI_SLE/libs/LibAnim/LibAnim.toc
@@ -0,0 +1,7 @@
+## Interface: 60200
+## Author: Hydra
+## Version: 2.01
+## Title: LibAnim
+## Notes: Animations!
+
+LibAnim.lua
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/LibElv-GameMenu-1.0/LibElv-GameMenu-1.0.lua b/ElvUI_SLE/libs/LibElv-GameMenu-1.0/LibElv-GameMenu-1.0.lua
new file mode 100644
index 0000000..7251432
--- /dev/null
+++ b/ElvUI_SLE/libs/LibElv-GameMenu-1.0/LibElv-GameMenu-1.0.lua
@@ -0,0 +1,119 @@
+local MAJOR, MINOR = "LibElv-GameMenu-1.0", 1
+local lib, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+--GLOBALS: CreateFrame
+if not lib then return end
+local E, L, V, P, G = unpack(ElvUI)
+local S = E:GetModule("Skins")
+local TT = E:GetModule("Tooltip")
+local _G = _G
+local tinsert = tinsert
+local menuWidth = _G["GameMenuFrame"]:GetWidth()
+local columns
+local newColumn = {
+	[10] = true,
+	[19] = true,
+	[24] = true,
+}
+local spaceCount = {
+	[4] = 5,
+	[13] = 8,
+	[22] = 16,
+}
+
+local width, height = _G["GameMenuButtonHelp"]:GetWidth(), _G["GameMenuButtonHelp"]:GetHeight()
+local LibHolder = CreateFrame("Frame", "LibGameMenuHolder", _G["GameMenuFrame"])
+LibHolder:SetSize(width, 1)
+LibHolder:SetPoint("TOP", _G["GameMenuFrame"].ElvUI, "BOTTOM", 0, 0)
+
+lib.buttons = {}
+lib.skincheck = false
+
+lib.Header = CreateFrame("Frame", "GameMenuAddonHeader", _G["GameMenuFrame"])
+lib.Header:SetSize(256, 64)
+lib.Header:SetPoint("BOTTOM", LibHolder, "TOP", 0, -25)
+lib.Header:Hide()
+lib.Header.Text = lib.Header:CreateFontString(nil, "OVERLAY", "GameFontNormal")
+lib.Header.Text:SetPoint("TOP", lib.Header, "TOP", 0, -14)
+lib.Header.Text:SetText(_G["ADDONS"])
+lib.Header.Art = lib.Header:CreateTexture(nil, "OVERLAY")
+lib.Header.Art:SetTexture("Interface\\DialogFrame\\UI-DialogBox-Header")
+lib.Header.Art:SetAllPoints()
+
+function lib:CheckForSkin()
+	if E.private.skins.blizzard.enable == true and E.private.skins.blizzard.misc == true then lib.Header.Art:Hide() end
+	lib.skincheck = true
+end
+
+function lib:UpdateHolder()
+	if not lib.skincheck then lib:CheckForSkin() end
+	local total = #lib.buttons
+	LibHolder:SetSize(width, 1 + (height * total))
+	if total > 0 and total <= 5 then
+		lib.Header:Hide()
+		LibHolder:ClearAllPoints()
+		LibHolder:SetPoint("TOP", _G["GameMenuFrame"].ElvUI, "BOTTOM", 0, -1)
+	elseif total > 5 then
+		lib.Header:Show()
+		LibHolder:ClearAllPoints()
+		LibHolder:SetPoint("TOPLEFT", _G["GameMenuButtonHelp"], "TOPRIGHT", 1, 1)
+	end
+	columns = 1
+	for i = 1, total do
+		local button = lib.buttons[i]
+		local space
+		if (spaceCount[i] and total > spaceCount[i]) then space = true end
+		if lib.buttons[i-1] then
+			if newColumn[i] then
+				button:SetPoint("TOPLEFT", lib.buttons[i-9], "TOPRIGHT", 1 , 0)
+				columns = columns + 1
+			else
+				button:SetPoint("TOP", lib.buttons[i-1], "BOTTOM", 0 , space and -16 or -1)
+			end
+		else
+			button:SetPoint("TOPLEFT", LibHolder, "TOPLEFT", 0 , -1)
+		end
+
+	end
+end
+
+--[[data is the table of:
+- name - button name
+- text - text on button
+- func - function to execute on click
+]]
+function lib:AddMenuButton(data)
+	if not data then return end
+	if _G[data.name] then return end
+	local button = CreateFrame("Button", data.name, _G["GameMenuFrame"], "GameMenuButtonTemplate")
+	button:Size(width, height)
+	button:SetScript("OnClick", data.func)
+	button:SetText(data.text)
+
+	if E.private.skins.blizzard.enable == true and E.private.skins.blizzard.misc == true then
+		S:HandleButton(button)
+	end
+
+	tinsert(lib.buttons, button)
+end
+
+_G["GameMenuFrame"]:HookScript("OnShow", function()
+	if #lib.buttons <= 5 then
+		_G["GameMenuButtonLogout"]:ClearAllPoints()
+		_G["GameMenuButtonLogout"]:SetPoint("TOP", LibHolder, "BOTTOM", 0, -16)
+		_G["GameMenuFrame"]:Height(_G["GameMenuFrame"]:GetHeight() + 17 + (height * #lib.buttons))
+	else
+		LibHolder:SetWidth((width + 1) * columns)
+		_G["GameMenuFrameHeader"]:ClearAllPoints()
+		_G["GameMenuFrameHeader"]:SetPoint("BOTTOM", _G["GameMenuButtonHelp"], "TOP", 0, -25)
+		_G["GameMenuButtonHelp"]:ClearAllPoints()
+		_G["GameMenuButtonHelp"]:SetPoint("TOPLEFT", _G["GameMenuFrame"], "TOPLEFT", 25.5, -31.5)
+		_G["GameMenuFrame"]:Width(menuWidth + 1 + width * columns)
+		_G["GameMenuButtonLogout"]:ClearAllPoints()
+		_G["GameMenuButtonLogout"]:SetPoint("TOP", _G["GameMenuButtonAddons"], "BOTTOMLEFT", _G["GameMenuFrame"]:GetWidth()/2 - 25.5, -29)
+	end
+end)
+
+
+if not LibStub("LibElvUIPlugin-1.0").plugins[MAJOR] then
+	LibStub("LibElvUIPlugin-1.0"):RegisterPlugin(MAJOR, function() end, true)
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/LibElv-GameMenu-1.0/LibElv-GameMenu-1.0.toc b/ElvUI_SLE/libs/LibElv-GameMenu-1.0/LibElv-GameMenu-1.0.toc
new file mode 100644
index 0000000..e1e9256
--- /dev/null
+++ b/ElvUI_SLE/libs/LibElv-GameMenu-1.0/LibElv-GameMenu-1.0.toc
@@ -0,0 +1,7 @@
+## Interface: 60200
+## Author: Darth Predator
+## Version: 1.0
+## Title: Lib GameMenu 1.0
+## RequiredDeps: ElvUI
+
+LibElv-GameMenu-1.0.lua
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/LibElv-UIButtons-1.0/LibElv-UIButtons-1.0.lua b/ElvUI_SLE/libs/LibElv-UIButtons-1.0/LibElv-UIButtons-1.0.lua
index 3408b5b..1f24495 100644
--- a/ElvUI_SLE/libs/LibElv-UIButtons-1.0/LibElv-UIButtons-1.0.lua
+++ b/ElvUI_SLE/libs/LibElv-UIButtons-1.0/LibElv-UIButtons-1.0.lua
@@ -1,9 +1,16 @@
-local MAJOR, MINOR = "LibElv-UIButtons-1.0", 01
+local MAJOR, MINOR = "LibElv-UIButtons-1.0", 1
 local lib, oldminor = LibStub:NewLibrary(MAJOR, MINOR)

 if not lib then return end
 local E, L, V, P, G = unpack(ElvUI)
 local S = E:GetModule("Skins")
+local TT = E:GetModule("Tooltip")
+
+local _G = _G
+local pairs, type, tinsert = pairs, type, tinsert
+local UnitName = UnitName
+local GameTooltip = GameTooltip
+local GetAddOnEnableState = GetAddOnEnableState

 --Upon creation menu.db does not account for values missing in E.db = being default.
 --We are using this to fix it.
@@ -21,11 +28,11 @@ end
 local function MoverSize(menu)
 	local db = menu.db
 	if db.orientation == "vertical" then
-		menu:SetWidth(db.size + (E.PixelMode and 2 or 4))
-		menu:SetHeight((db.size*menu.NumBut)+((E.PixelMode and db.spacing or db.spacing+2)*(menu.NumBut-1))+2)
+		menu:SetWidth(db.size + 2 + E.Spacing*2)
+		menu:SetHeight((db.size*menu.NumBut)+((db.spacing + E.Spacing*2)*(menu.NumBut-1))+2)
 	elseif db.orientation == "horizontal" then
-		menu:SetWidth((db.size*menu.NumBut)+((E.PixelMode and db.spacing or db.spacing+2)*(menu.NumBut-1))+2)
-		menu:SetHeight(db.size + (E.PixelMode and 2 or 4))
+		menu:SetWidth((db.size*menu.NumBut)+((db.spacing + E.Spacing*2)*(menu.NumBut-1))+2)
+		menu:SetHeight(db.size + 2 + E.Spacing*2)
 	end
 end

@@ -208,7 +215,7 @@ local function UpdateDropdownLayout(menu, group)
 	local T = menu[group.."Table"]
 	for i = 1, #T do
 		local button, prev, next = T[i], T[i-1], T[i+1]
-		local y_offset = prev and ((E.PixelMode and -db.spacing or -(db.spacing+2))-(prev.isSeparator and prev.space or 0)-(button.isSeparator and button.space or 0)) or 0
+		local y_offset = prev and (-(db.spacing + E.Spacing*2) - (prev.isSeparator and prev.space or 0) - (button.isSeparator and button.space or 0)) or 0
 		button:Point("TOP", (prev or header), (prev and "BOTTOM" or "TOP"), 0, y_offset)
 		count = button.isSeparator and count or count + 1
 		sepS = (button.isSeparator and sepS + ((prev and 2 or 1)*button.space + button.size)) or sepS
@@ -240,13 +247,13 @@ local function Positioning(menu)
 		for i = 1, #menu.ToggleTable do
 			local button, prev = menu.ToggleTable[i], menu.ToggleTable[i-1]
 			menu.ToggleTable[i]:ClearAllPoints()
-			menu.ToggleTable[i]:Point("TOP", (prev or header), prev and "BOTTOM" or "TOP", 0, prev and (E.PixelMode and -db.spacing or -(db.spacing+2)) or (E.PixelMode and -1 or -2))
+			menu.ToggleTable[i]:Point("TOP", (prev or header), prev and "BOTTOM" or "TOP", 0, prev and -(db.spacing + E.Spacing*2) or -(1 + E.Spacing))
 		end
 	elseif db.orientation == "horizontal" then
 		for i = 1, #menu.ToggleTable do
 			local button, prev = menu.ToggleTable[i], menu.ToggleTable[i-1]
 			menu.ToggleTable[i]:ClearAllPoints()
-			menu.ToggleTable[i]:Point("LEFT", (prev or header), prev and "RIGHT" or "LEFT", prev and (E.PixelMode and db.spacing or db.spacing+2) or (E.PixelMode and 1 or 2), 0)
+			menu.ToggleTable[i]:Point("LEFT", (prev or header), prev and "RIGHT" or "LEFT", prev and (db.spacing + E.Spacing*2) or (1 + E.Spacing), 0)
 		end
 	end
 	--Calling for dropdown updates
@@ -307,10 +314,12 @@ end
 local function ToggleShow(menu)
 	if not menu.db.enable then
 		menu:Hide()
+		E:DisableMover(menu.mover:GetName())
 	else
 		menu:Show()
 		menu:UpdateMouseOverSetting()
 		menu:UpdateBackdrop()
+		E:EnableMover(menu.mover:GetName())
 	end
 end

@@ -318,13 +327,9 @@ end
 function lib:CreateFrame(name, db, default, style, styleDefault, strata)
 	--Checks to prevent a shitload of errors cause of wrong arguments passed
 	if _G[name] then return end
-	if not name then print("Sorry but you didn't set a name for this menu bar. Aborting creation"); return end
-	if not db then print("Sorry but you didn't set database for this menu bar. Aborting creation"); return end
-	if not default then print("Sorry but you didn't set defaults for this menu bar. Aborting creation"); return end
-	if not style and not styleDefault then print("Sorry but you didn't set defaults for this menu bar's style. Aborting creation"); return end
 	if not strata then strata = "MEDIUM" end
 	local menu = CreateFrame("Frame", name, E.UIParent)
-	menu.db = db --making manu db table so we can actually keep unified settings calls in other functions
+	menu.db = db --making menu db table so we can actually keep unified settings calls in other functions
 	menu.default = default --same for defaults
 	EqualizeDB(menu.db, menu.default)
 	if not style and styleDefault then style = styleDefault end
@@ -406,7 +411,7 @@ local function GenerateTable(menu, coreGroup, groupName, groupTitle)
 			enabled = {
 				order = 3,
 				type = "toggle",
-				name = ENABLE,
+				name = L["Enable"],
 				desc = L["Show/Hide UI buttons."],
 				get = function(info) return menu.db.enable end,
 				set = function(info, value) menu.db.enable = value; menu:ToggleShow() end
@@ -416,8 +421,8 @@ local function GenerateTable(menu, coreGroup, groupName, groupTitle)
 				name = L["UI Buttons Style"],
 				type = "select",
 				values = {
-					["classic"] = L['Classic'],
-					["dropdown"] = L['Dropdown'],
+					["classic"] = L["Classic"],
+					["dropdown"] = L["Dropdown"],
 				},
 				disabled = function() return not menu.db.enable end,
 				get = function(info) return E.private.sle.uiButtonStyle end,
@@ -431,7 +436,7 @@ local function GenerateTable(menu, coreGroup, groupName, groupTitle)
 			size = {
 				order = 6,
 				type = "range",
-				name = L['Size'],
+				name = L["Size"],
 				desc = L["Sets size of buttons"],
 				min = 12, max = 25, step = 1,
 				disabled = function() return not menu.db.enable end,
@@ -441,8 +446,8 @@ local function GenerateTable(menu, coreGroup, groupName, groupTitle)
 			spacing = {
 				order = 7,
 				type = "range",
-				name = L['Button Spacing'],
-				desc = L['The spacing between buttons.'],
+				name = L["Button Spacing"],
+				desc = L["The spacing between buttons."],
 				min = 1, max = 10, step = 1,
 				disabled = function() return not menu.db.enable end,
 				get = function(info) return menu.db.spacing end,
@@ -479,8 +484,8 @@ local function GenerateTable(menu, coreGroup, groupName, groupTitle)
 				desc = L["Layout for UI buttons."],
 				type = "select",
 				values = {
-					["horizontal"] = L['Horizontal'],
-					["vertical"] = L['Vertical'],
+					["horizontal"] = L["Horizontal"],
+					["vertical"] = L["Vertical"],
 				},
 				disabled = function() return not menu.db.enable end,
 				get = function(info) return menu.db.orientation end,
@@ -489,27 +494,27 @@ local function GenerateTable(menu, coreGroup, groupName, groupTitle)
 			point = {
 				type = 'select',
 				order = 13,
-				name = L['Anchor Point'],
-				desc = L['What point of dropdown will be attached to the toggle button.'],
+				name = L["Anchor Point"],
+				desc = L["What point of dropdown will be attached to the toggle button."],
 				disabled = function() return not menu.db.enable or E.private.sle.uiButtonStyle == "classic" end,
 				get = function(info) return menu.db.point end,
 				set = function(info, value) menu.db.point = value; menu:FrameSize() end,
-				values = positionValues,
+				values = positionValues,
 			},
 			anchor = {
 				type = 'select',
 				order = 14,
-				name = L['Attach To'],
-				desc = L['What point to anchor dropdown on the toggle button.'],
+				name = L["Attach To"],
+				desc = L["What point to anchor dropdown on the toggle button."],
 				disabled = function() return not menu.db.enable or E.private.sle.uiButtonStyle == "classic" end,
 				get = function(info) return menu.db.anchor end,
 				set = function(info, value) menu.db.anchor = value; menu:FrameSize() end,
-				values = positionValues,
+				values = positionValues,
 			},
 			xoffset = {
 				order = 15,
 				type = "range",
-				name = L['X-Offset'],
+				name = L["X-Offset"],
 				desc = L["Horizontal offset of dropdown from the toggle button."],
 				min = -10, max = 10, step = 1,
 				disabled = function() return not menu.db.enable or E.private.sle.uiButtonStyle == "classic" end,
@@ -519,7 +524,7 @@ local function GenerateTable(menu, coreGroup, groupName, groupTitle)
 			yoffset = {
 				order = 16,
 				type = "range",
-				name = L['Y-Offset'],
+				name = L["Y-Offset"],
 				desc = L["Vertical offset of dropdown from the toggle button."],
 				min = -10, max = 10, step = 1,
 				disabled = function() return not menu.db.enable or E.private.sle.uiButtonStyle == "classic" end,
diff --git a/ElvUI_SLE/libs/LibElv-UIButtons-1.0/locales/english.lua b/ElvUI_SLE/libs/LibElv-UIButtons-1.0/locales/english.lua
index 124d0d3..0cd5be7 100644
--- a/ElvUI_SLE/libs/LibElv-UIButtons-1.0/locales/english.lua
+++ b/ElvUI_SLE/libs/LibElv-UIButtons-1.0/locales/english.lua
@@ -1,8 +1,22 @@
 --Russian localization
 local AceLocale = LibStub:GetLibrary("AceLocale-3.0")
-local L = AceLocale:NewLocale("ElvUI", "ruRU")
+local L = AceLocale:NewLocale("ElvUI", "enUS")

 if not L then return; end

 --UI buttons--
+L["UI Buttons"] = true
+L["Show/Hide UI buttons."] = true
+L["Mouse Over"] = true
+L["Show on mouse over."] = true
+L["Dropdown Backdrop"] = true
+L["Buttons position"] = true
+L["Layout for UI buttons."] = true
+L["UI Buttons Style"] = true
+L["Dropdown"] = true
+L["Sets size of buttons"] = true
+L["What point of dropdown will be attached to the toggle button."] = true
+L["What point to anchor dropdown on the toggle button."] = true
+L["Horizontal offset of dropdown from the toggle button."] = true
+L["Vertical offset of dropdown from the toggle button."] = true
 L["LibUIButtons_DESC"] = "This adds a small bar with some useful buttons which acts as a small menu for common things.\nThe options below are provided by LibElv-UIButtons. If you see them that means one of your addons is using this library."
diff --git a/ElvUI_SLE/libs/LibElv-UIButtons-1.0/locales/russian.lua b/ElvUI_SLE/libs/LibElv-UIButtons-1.0/locales/russian.lua
index 2a0df9a..8ec7534 100644
--- a/ElvUI_SLE/libs/LibElv-UIButtons-1.0/locales/russian.lua
+++ b/ElvUI_SLE/libs/LibElv-UIButtons-1.0/locales/russian.lua
@@ -14,9 +14,9 @@ L["Dropdown Backdrop"] = "Фон выпадающего списка"
 L["Buttons position"] = "Положение кнопок"
 L["Layout for UI buttons."] = "Режим положения кнопок"
 L["UI Buttons Style"] = "Стиль меню"
-L['Dropdown'] = "Выпадающий список"
+L["Dropdown"] = "Выпадающий список"
 L["Sets size of buttons"] = "Устанавливает размер кнопок"
-L['What point of dropdown will be attached to the toggle button.'] = "Какая точка выпадающего списка будет крепиться к кнопке его открытия."
-L['What point to anchor dropdown on the toggle button.'] = "К какой точке кнопки будет крепиться ее выпадающий список."
+L["What point of dropdown will be attached to the toggle button."] = "Какая точка выпадающего списка будет крепиться к кнопке его открытия."
+L["What point to anchor dropdown on the toggle button."] = "К какой точке кнопки будет крепиться ее выпадающий список."
 L["Horizontal offset of dropdown from the toggle button."] = "Отступ выпадающего списка от кнопки его открытия по горизонтали."
 L["Vertical offset of dropdown from the toggle button."] = "Отступ выпадающего списка от кнопки его открытия по вертикали."
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/LibFishing-1.0/LibFishing-1.0.lua b/ElvUI_SLE/libs/LibFishing-1.0/LibFishing-1.0.lua
new file mode 100644
index 0000000..2246f5b
--- /dev/null
+++ b/ElvUI_SLE/libs/LibFishing-1.0/LibFishing-1.0.lua
@@ -0,0 +1,1727 @@
+--[[
+Name: LibFishing-1.0
+Maintainers: Sutorix <sutorix@hotmail.com>
+Description: A library with fishing support routines used by Fishing Buddy, Fishing Ace and FB_Broker.
+Copyright (c) by Bob Schumaker
+Licensed under a Creative Commons "Attribution Non-Commercial Share Alike" License
+--]]
+--[[Modded and name altered for purpose of S&L's profession module.]]
+
+local MAJOR_VERSION = "LibFishing-1.0-SLE"
+local MINOR_VERSION = 90000 + tonumber(("$Rev: 971 $"):match("%d+"))
+
+if not LibStub then error(MAJOR_VERSION .. " requires LibStub") end
+
+local FishLib, oldLib = LibStub:NewLibrary(MAJOR_VERSION, MINOR_VERSION)
+if not FishLib then
+	return
+end
+
+-- keep the old stuff, in case we want some of the settings.
+if oldLib then
+	oldLib = {}
+	for k, v in pairs(FishLib) do
+		FishLib[k] = nil
+		oldLib[k] = v
+	end
+end
+
+-- 5.0.4 has a problem with a global "_" (see some for loops below)
+local _
+
+local LT = LibStub("LibTourist-3.0");
+-- These are now provided by LibTourist
+local BZ = LibStub("LibTourist-3.0"):GetLookupTable()
+local BZR = LibStub("LibTourist-3.0"):GetReverseLookupTable();
+
+local BSL = LibStub("LibBabble-SubZone-3.0"):GetBaseLookupTable();
+local BSZ = LibStub("LibBabble-SubZone-3.0"):GetLookupTable();
+local BSZR = LibStub("LibBabble-SubZone-3.0"):GetReverseLookupTable();
+
+FishLib.UNKNOWN = "UNKNOWN";
+
+local WOW = {};
+function FishLib:WOWVersion()
+	return WOW.major, WOW.minor, WOW.dot;
+end
+
+if ( GetBuildInfo ) then
+	local v, b, d = GetBuildInfo();
+	WOW.build = b;
+	WOW.date = d;
+	local s,e,maj,min,dot = string.find(v, "(%d+).(%d+).(%d+)");
+	WOW.major = tonumber(maj);
+	WOW.minor = tonumber(min);
+	WOW.dot = tonumber(dot);
+else
+	WOW.major = 1;
+	WOW.minor = 9;
+	WOW.dot = 0;
+end
+
+function FishLib:GetFishingSkillInfo()
+	local _, _, _, fishing, _, _ = GetProfessions();
+	if ( fishing ) then
+		local name, _, _, _, _, _, _ = GetProfessionInfo(fishing);
+		-- is this always the same as PROFESSIONS_FISHING?
+		return true, name;
+	end
+	return false, PROFESSIONS_FISHING;
+end
+
+-- get our current fishing skill level
+function FishLib:GetCurrentSkill()
+	local _, _, _, fishing, _, _ = GetProfessions();
+	if (fishing) then
+		local name, _, rank, skillmax, _, _, _, mods = GetProfessionInfo(fishing);
+		local _, lure = self:GetPoleBonus();
+		return rank, mods, skillmax, lure;
+	end
+	return 0, 0, 0;
+end
+
+-- Lure library
+local FISHINGLURES = {
+	{	["id"] = 88710,
+		["n"] = "Nat's Hat",						-- 150 for 10 mins
+		["b"] = 150,
+		["s"] = 100,
+		["d"] = 10,
+		["w"] = true,
+	},
+	{	["id"] = 117405,
+		["n"] = "Nat's Drinking Hat",				-- 150 for 10 mins
+		["b"] = 150,
+		["s"] = 100,
+		["d"] = 10,
+		["w"] = true,
+	},
+	{	["id"] = 33820,
+		["n"] = "Weather-Beaten Fishing Hat",		 -- 75 for 10 minutes
+		["b"] = 75,
+		["s"] = 1,
+		["d"] = 10,
+		["w"] = true,
+	},
+	{	["id"] = 116826,
+		["n"] = "Draenic Fishing Pole",				 -- 200 for 10 minutes
+		["b"] = 200,
+		["s"] = 1,
+		["d"] = 20,									 -- 20 minute cooldown
+		["w"] = true,
+	},
+	{	["id"] = 116825,
+		["n"] = "Savage Fishing Pole",				 -- 200 for 10 minutes
+		["b"] = 200,
+		["s"] = 1,
+		["d"] = 20,									 -- 20 minute cooldown
+		["w"] = true,
+	},
+
+	{	["id"] = 34832,
+		["n"] = "Captain Rumsey's Lager",			     -- 10 for 3 mins
+		["b"] = 10,
+		["s"] = 1,
+		["d"] = 3,
+		["u"] = 1,
+	},
+	{	["id"] = 67404,
+		["n"] = "Glass Fishing Bobber",				-- ???
+		["b"] = 15,
+		["s"] = 1,
+		["d"] = 10,
+	},
+	{	["id"] = 6529,
+		["n"] = "Shiny Bauble",							  -- 25 for 10 mins
+		["b"] = 25,
+		["s"] = 1,
+		["d"] = 10,
+	},
+	{	["id"] = 6811,
+		["n"] = "Aquadynamic Fish Lens",				  -- 50 for 10 mins
+		["b"] = 50,
+		["s"] = 50,
+		["d"] = 10,
+	},
+	{	["id"] = 6530,
+		["n"] = "Nightcrawlers",						  -- 50 for 10 mins
+		["b"] = 50,
+		["s"] = 50,
+		["d"] = 10,
+	},
+	{	["id"] = 7307,
+		["n"] = "Flesh Eating Worm",					  -- 75 for 10 mins
+		["b"] = 75,
+		["s"] = 100,
+		["d"] = 10,
+	},
+	{	["id"] = 6532,
+		["n"] = "Bright Baubles",						  -- 75 for 10 mins
+		["b"] = 75,
+		["s"] = 100,
+		["d"] = 10,
+	},
+	{	["id"] = 34861,
+		["n"] = "Sharpened Fish Hook",				  -- 100 for 10 minutes
+		["b"] = 100,
+		["s"] = 100,
+		["d"] = 10,
+	},
+	{	["id"] = 6533,
+		["n"] = "Aquadynamic Fish Attractor",		  -- 100 for 10 minutes
+		["b"] = 100,
+		["s"] = 100,
+		["d"] = 10,
+	},
+	{	["id"] = 62673,
+		["n"] = "Feathered Lure",					  -- 100 for 10 minutes
+		["b"] = 100,
+		["s"] = 100,
+		["d"] = 10,
+	},
+	{	["id"] = 46006,
+		["n"] = "Glow Worm",						-- 100 for 60 minutes
+		["b"] = 100,
+		["s"] = 100,
+		["d"] = 60,
+		["l"] = 1,
+	},
+	{	["id"] = 68049,
+		["n"] = "Heat-Treated Spinning Lure",		 -- 150 for 5 minutes
+		["b"] = 150,
+		["s"] = 250,
+		["d"] = 5,
+	},
+	{	["id"] = 118391,
+		["n"] = "Worm Supreme",						-- 200 for 10 mins
+		["b"] = 200,
+		["s"] = 100,
+		["d"] = 10,
+	},
+}
+
+-- sort ascending bonus and ascending time
+-- we may have to treat "Heat-Treated Spinning Lure" differently someday
+table.sort(FISHINGLURES,
+	function(a,b)
+		if ( a.b == b.b ) then
+			return a.d < b.d;
+		else
+			return a.b < b.b;
+		end
+	end);
+
+function FishLib:GetLureTable()
+	return FISHINGLURES;
+end
+
+function FishLib:IsWorn(itemid)
+	for slot=1,19 do
+		local link = GetInventoryItemLink("player", slot);
+		if ( link ) then
+			local _, id, _ = self:SplitFishLink(link);
+			if ( itemid == id ) then
+				return true;
+			end
+		end
+	end
+	-- return nil
+end
+
+function FishLib:IsItemOneHanded(item)
+	if ( item ) then
+		local _,_,_,_,_,_,_,_,bodyslot,_ = GetItemInfo(item);
+		if ( bodyslot == "INVTYPE_2HWEAPON" or bodyslot == INVTYPE_2HWEAPON ) then
+			return false;
+		end
+	end
+	return true;
+end
+
+local useinventory = {};
+local lureinventory = {};
+function FishLib:UpdateLureInventory()
+	local rawskill, _, _, _ = self:GetCurrentSkill();
+
+	useinventory = {};
+	lureinventory = {};
+	local b = 0;
+	for _,lure in ipairs(FISHINGLURES) do
+		local id = lure.id;
+		local count = GetItemCount(id);
+		-- does this lure have to be "worn"
+		if ( count > 0 ) then
+			local startTime, _, _ = GetItemCooldown(id);
+			if (startTime == 0) then
+				-- get the name so we can check enchants
+				lure.n,_,_,_,_,_,_,_,_,_ = GetItemInfo(id);
+				if ( lure.b > b or lure.w ) then
+					b = lure.b;
+					if ( lure.u ) then
+						tinsert(useinventory, lure);
+					elseif ( lure.s <= rawskill ) then
+						if ( not lure.w or FishLib:IsWorn(id)) then
+							tinsert(lureinventory, lure);
+						end
+					end
+				end
+			end
+		end
+	end
+	return lureinventory, useinventory;
+ end
+
+function FishLib:GetLureInventory()
+	return lureinventory, useinventory;
+end
+
+-- Deal with lures
+function FishLib:HasBuff(buffName)
+	if ( buffName ) then
+		 local name, _, _, _, _, _, _, _, _ = UnitBuff("player", buffName);
+		 return name ~= nil;
+	end
+	-- return nil
+end
+
+local function UseThisLure(lure, b, enchant, skill, level)
+	if ( lure ) then
+		local startTime, _, _ = GetItemCooldown(lure.id);
+		-- already check for skill being nil, so that will skip the whole check with level
+		-- skill = skill or 0;
+		level = level or 0;
+		local bonus = lure.b or 0;
+		if ( startTime == 0 and (skill and level <= (skill + bonus)) and (bonus > enchant) ) then
+			if ( not b or bonus > b ) then
+				return true, bonus;
+			end
+		end
+		return false, bonus;
+	end
+	return false, 0;
+end
+
+function FishLib:FindNextLure(b, state)
+    local n = table.getn(lureinventory);
+    for s=state+1,n,1 do
+		if ( lureinventory[s] ) then
+			local id = lureinventory[s].id;
+			local startTime, _, _ = GetItemCooldown(id);
+			if ( startTime == 0 ) then
+				if ( not b or lureinventory[s].b > b ) then
+					return s, lureinventory[s];
+				end
+			end
+		end
+	end
+	-- return nil;
+end
+
+function FishLib:FindBestLure(b, state, usedrinks)
+	local zone, subzone = self:GetZoneInfo();
+	local level = self:GetFishingLevel(zone, subzone);
+	if ( level and level > 1 ) then
+		local rank, modifier, skillmax, enchant = self:GetCurrentSkill();
+		local skill = rank + modifier;
+		-- don't need this now, LT has the full values
+		-- level = level + 95;		-- for no lost fish
+		if ( skill <= level ) then
+			self:UpdateLureInventory();
+			-- if drinking will work, then we're done
+			if ( usedrinks and #useinventory > 0 ) then
+				if ( not LastUsed or not self:HasBuff(LastUsed.n) ) then
+					local id = useinventory[1].id;
+					if ( not self:HasBuff(useinventory[1].n) ) then
+						if ( level <= (skill + useinventory[1].b) ) then
+							return nil, useinventory[1];
+						end
+					end
+				end
+			end
+			skill = skill - enchant;
+			state = state or 0;
+			local checklure;
+			local useit, b = 0;
+
+			-- Look for lures we're wearing, first
+			for s=state+1,#lureinventory,1 do
+				checklure = lureinventory[s];
+				if (checklure.w) then
+					useit, b = UseThisLure(checklure, b, enchant, skill, level);
+					if ( useit and b and b > 0 ) then
+						return s, checklure;
+					end
+				end
+			end
+
+			b = 0;
+			for s=state+1,#lureinventory,1 do
+				checklure = lureinventory[s];
+				useit, b = UseThisLure(checklure, b, enchant, skill, level);
+				if ( useit and b and b > 0 ) then
+					return s, checklure;
+				end
+			end
+
+			-- if we ran off the end of the table and we had a valid lure, let's use that one
+			if ( (not enchant or enchant == 0) and b and (b > 0) and checklure ) then
+				return #lureinventory, checklure;
+			end
+		end
+	end
+	-- return nil;
+end
+
+if oldlib then
+	FishLib.caughtSoFar = oldlib.caughtSoFar or 0;
+	FishLib.gearcheck = oldlib.gearcheck;
+	FishLib.hasgear = oldlib.hasgear;
+	FishLib.FindFishID = oldlib.FindFishID;
+	FishLib.BOBBER_NAME = oldlib.BOBBER_NAME;
+	FishLib.watchBobber = oldlib.watchBobber;
+	FishLib.ActionBarID = oldlib.ActionBarID;
+else
+	FishLib.caughtSoFar = 0;
+	FishLib.gearcheck = true;
+	FishLib.hasgear = false;
+end
+
+-- Handle events we care about
+local canCreateFrame = false;
+
+local FISHLIBFRAMENAME="FishLibFrame";
+local fishlibframe = getglobal(FISHLIBFRAMENAME);
+if ( not fishlibframe) then
+	fishlibframe = CreateFrame("Frame", FISHLIBFRAMENAME);
+	fishlibframe:RegisterEvent("PLAYER_ENTERING_WORLD");
+	fishlibframe:RegisterEvent("PLAYER_LEAVING_WORLD");
+	fishlibframe:RegisterEvent("UPDATE_CHAT_WINDOWS");
+	fishlibframe:RegisterEvent("LOOT_OPENED");
+	fishlibframe:RegisterEvent("CHAT_MSG_SKILL");
+	fishlibframe:RegisterEvent("SKILL_LINES_CHANGED");
+	fishlibframe:RegisterEvent("UNIT_INVENTORY_CHANGED");
+	fishlibframe:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START");
+	fishlibframe:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP");
+	fishlibframe:RegisterEvent("EQUIPMENT_SWAP_FINISHED");
+	fishlibframe:RegisterEvent("ITEM_LOCK_CHANGED");
+end
+
+fishlibframe.fl = FishLib;
+
+fishlibframe:SetScript("OnEvent", function(self, event, ...)
+	local arg1 = select(1, ...);
+	if ( event == "UPDATE_CHAT_WINDOWS" ) then
+		canCreateFrame = true;
+		self:UnregisterEvent(event);
+	elseif ( event == "UNIT_INVENTORY_CHANGED" and arg1 == "player" ) then
+		self.fl:UpdateLureInventory();
+		-- we can't actually rely on EQUIPMENT_SWAP_FINISHED, it appears
+		self.fl:ForceGearCheck();
+	elseif ( event == "SKILL_LINES_CHANGED" or event == "ITEM_LOCK_CHANGED" or event == "EQUIPMENT_SWAP_FINISHED" ) then
+		-- Did something we're wearing change?
+		self.fl:ForceGearCheck();
+	elseif ( event == "CHAT_MSG_SKILL" ) then
+		self.fl.caughtSoFar = 0;
+	elseif ( event == "LOOT_OPENED" ) then
+		if (IsFishingLoot()) then
+			self.fl.caughtSoFar = self.fl.caughtSoFar + 1;
+		end
+	elseif ( event == "UNIT_SPELLCAST_CHANNEL_START" or event == "UNIT_SPELLCAST_CHANNEL_STOP" ) then
+		if (arg1 == "player" ) then
+			self.fl:UpdateLureInventory();
+		end
+	elseif ( event == "PLAYER_ENTERING_WORLD" ) then
+		self:RegisterEvent("ITEM_LOCK_CHANGED")
+		self:RegisterEvent("PLAYER_EQUIPMENT_CHANGED")
+		self:RegisterEvent("SPELLS_CHANGED")
+	elseif ( event == "PLAYER_LEAVING_WORLD" ) then
+		self:UnregisterEvent("ITEM_LOCK_CHANGED")
+		self:UnregisterEvent("PLAYER_EQUIPMENT_CHANGED")
+		self:UnregisterEvent("SPELLS_CHANGED")
+	end
+end);
+fishlibframe:Show();
+
+-- set up a table of slot mappings for looking up item information
+local slotinfo = {
+	[1] = { name = "HeadSlot", tooltip = HEADSLOT, id = INVSLOT_HEAD },
+	[2] = { name = "NeckSlot", tooltip = NECKSLOT, id = INVSLOT_NECK },
+	[3] = { name = "ShoulderSlot", tooltip = SHOULDERSLOT, id = INVSLOT_SHOULDER },
+	[4] = { name = "BackSlot", tooltip = BACKSLOT, id = INVSLOT_BACK },
+	[5] = { name = "ChestSlot", tooltip = CHESTSLOT, id = INVSLOT_CHEST },
+	[6] = { name = "ShirtSlot", tooltip = SHIRTSLOT, id = INVSLOT_BODY },
+	[7] = { name = "TabardSlot", tooltip = TABARDSLOT, id = INVSLOT_TABARD },
+	[8] = { name = "WristSlot", tooltip = WRISTSLOT, id = INVSLOT_WRIST },
+	[9] = { name = "HandsSlot", tooltip = HANDSSLOT, id = INVSLOT_HAND },
+	[10] = { name = "WaistSlot", tooltip = WAISTSLOT, id = INVSLOT_WAIST },
+	[11] = { name = "LegsSlot", tooltip = LEGSSLOT, id = INVSLOT_LEGS },
+	[12] = { name = "FeetSlot", tooltip = FEETSLOT, id = INVSLOT_FEET },
+	[13] = { name = "Finger0Slot", tooltip = FINGER0SLOT, id = INVSLOT_FINGER1 },
+	[14] = { name = "Finger1Slot", tooltip = FINGER1SLOT, id = INVSLOT_FINGER2 },
+	[15] = { name = "Trinket0Slot", tooltip = TRINKET0SLOT, id = INVSLOT_TRINKET1 },
+	[16] = { name = "Trinket1Slot", tooltip = TRINKET1SLOT, id = INVSLOT_TRINKET2 },
+	[17] = { name = "MainHandSlot", tooltip = MAINHANDSLOT, id = INVSLOT_MAINHAND },
+	[18] = { name = "SecondaryHandSlot", tooltip = SECONDARYHANDSLOT, id = INVSLOT_OFFHAND },
+}
+
+-- A map of item types to locations
+local slotmap = {
+	["INVTYPE_AMMO"] = { INVSLOT_AMMO },
+	["INVTYPE_HEAD"] = { INVSLOT_HEAD },
+	["INVTYPE_NECK"] = { INVSLOT_NECK },
+	["INVTYPE_SHOULDER"] = { INVSLOT_SHOULDER },
+	["INVTYPE_BODY"] = { INVSLOT_BODY },
+	["INVTYPE_CHEST"] = { INVSLOT_CHEST },
+	["INVTYPE_ROBE"] = { INVSLOT_CHEST },
+	["INVTYPE_CLOAK"] = { INVSLOT_CHEST },
+	["INVTYPE_WAIST"] = { INVSLOT_WAIST },
+	["INVTYPE_LEGS"] = { INVSLOT_LEGS },
+	["INVTYPE_FEET"] = { INVSLOT_FEET },
+	["INVTYPE_WRIST"] = { INVSLOT_WRIST },
+	["INVTYPE_HAND"] = { INVSLOT_HAND },
+	["INVTYPE_FINGER"] = { INVSLOT_FINGER1,INVSLOT_FINGER2 },
+	["INVTYPE_TRINKET"] = { INVSLOT_TRINKET1,INVSLOT_TRINKET2 },
+	["INVTYPE_WEAPON"] = { INVSLOT_MAINHAND,INVSLOT_OFFHAND },
+	["INVTYPE_SHIELD"] = { INVSLOT_OFFHAND },
+	["INVTYPE_2HWEAPON"] = { INVSLOT_MAINHAND },
+	["INVTYPE_WEAPONMAINHAND"] = { INVSLOT_MAINHAND },
+	["INVTYPE_WEAPONOFFHAND"] = { INVSLOT_OFFHAND },
+	["INVTYPE_HOLDABLE"] = { INVSLOT_OFFHAND },
+	["INVTYPE_RANGED"] = { INVSLOT_RANGED },
+	["INVTYPE_THROWN"] = { INVSLOT_RANGED },
+	["INVTYPE_RANGEDRIGHT"] = { INVSLOT_RANGED },
+	["INVTYPE_RELIC"] = { INVSLOT_RANGED },
+	["INVTYPE_TABARD"] = { INVSLOT_TABARD },
+	["INVTYPE_BAG"] = { 20,21,22,23 },
+	["INVTYPE_QUIVER"] = { 20,21,22,23 },
+	[""] = { },
+};
+
+function FishLib:GetSlotInfo()
+	return INVSLOT_MAINHAND, INVSLOT_OFFHAND, slotinfo;
+end
+
+function FishLib:GetSlotMap()
+	return slotmap;
+end
+
+function FishLib:copytable(tab, level)
+	local t = {};
+	if (tab) then
+		level = level or 10000;
+		for k,v in pairs(tab) do
+			if ( type(v) == "table" and level > 0 ) then
+				level = level - 1;
+				t[k] = self:copytable(v, level);
+			else
+				t[k] = v;
+			end
+		end
+	end
+	return t;
+end
+
+-- count tables that don't have monotonic integer indexes
+function FishLib:tablecount(tab)
+	local n = 0;
+	for k,v in pairs(tab) do
+		n = n + 1;
+	end
+	return n;
+end
+
+-- return a printable representation of a value
+function FishLib:printable(val)
+	if ( val == nil ) then
+		return "nil";
+	elseif (type(val) == "boolean") then
+		return val and "true" or "false";
+	elseif (type(val) == "table") then
+		return "table";
+	else
+		return ""..val;
+	end
+end
+
+-- this changes all the damn time
+-- "|c(%x+)|Hitem:(%d+)(:%d+):%d+:%d+:%d+:%d+:[-]?%d+:[-]?%d+:[-]?%d+:[-]?%d+|h%[(.*)%]|h|r"
+-- go with a fixed pattern, since sometimes the hyperlink trick appears not to work
+local _itempattern = "|c(%x+)|Hitem:([^:]+):([^:]+)[-:%d]+|h%[(.*)%]|h|r"
+
+function FishLib:GetItemPattern()
+	if ( not _itempattern ) then
+		-- This should work all the time
+		self:GetPoleType(); -- force the default pole into the cache
+		local _, pat, _, _, _, _, _, _ = GetItemInfo(6256);
+		pat = string.gsub(pat, "|c(%x+)|Hitem:(%d+)(:%d+)", "|c(%%x+)|Hitem:(%%d+)(:%%d+)");
+		pat = string.gsub(pat, ":[-]?%d+", ":[-]?%%d+");
+		_itempattern = string.gsub(pat, "|h%[(.*)%]|h|r", "|h%%[(.*)%%]|h|r");
+	end
+	return _itempattern;
+end
+
+function FishLib:SplitLink(link)
+	if ( link ) then
+		local _,_, color, id, enchant, name = string.find(link, self:GetItemPattern());
+		if ( name ) then
+			return color, id..":"..enchant, name, enchant;
+		end
+	end
+end
+
+function FishLib:SplitFishLink(link)
+	if ( link ) then
+		local _,_, color, id, enchant, name = string.find(link, self:GetItemPattern());
+		return color, tonumber(id), name, enchant;
+	end
+end
+
+function FishLib:GetItemInfo(link)
+-- name, link, rarity, itemlevel, minlevel, itemtype
+-- subtype, stackcount, equiploc, texture
+	local itemName, itemLink, itemRarity, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, itemTexture, itemSellPrice = GetItemInfo(link);
+	return itemName, itemLink, itemRarity, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, itemTexture, itemLevel, itemSellPrice;
+end
+
+function FishLib:IsLinkableItem(link)
+	local n,l,_,_,_,_,_,_ = self:GetItemInfo(link);
+	return ( n and l );
+end
+
+-- code taken from examples on wowwiki
+function FishLib:GetFishTooltip(force)
+	local tooltip = FishLibTooltip;
+	if ( force or not tooltip ) then
+		tooltip = CreateFrame("GameTooltip", "FishLibTooltip", nil, "GameTooltipTemplate");
+		tooltip:SetOwner(WorldFrame, "ANCHOR_NONE");
+-- Allow tooltip SetX() methods to dynamically add new lines based on these
+-- I don't think we need it if we use GameTooltipTemplate...
+--		  tooltip:AddFontStrings(
+--				tooltip:CreateFontString( "$parentTextLeft9", nil, "GameTooltipText" ),
+--				tooltip:CreateFontString( "$parentTextRight9", nil, "GameTooltipText" ) )
+	end
+	-- the owner gets unset sometimes, not sure why
+	local owner, anchor = tooltip:GetOwner();
+	if (not owner or not anchor) then
+		tooltip:SetOwner(WorldFrame, "ANCHOR_NONE");
+	end
+	return FishLibTooltip;
+end
+
+local fp_itemtype = nil;
+local fp_subtype = nil;
+
+function FishLib:GetPoleType()
+	if ( not fp_itemtype ) then
+		_,_,_,_,fp_itemtype,fp_subtype,_,_,_,_ = self:GetItemInfo(6256);
+		if ( not fp_itemtype ) then
+			-- make sure it's in our cache
+			local tooltip = self:GetFishTooltip();
+			tooltip:ClearLines();
+			tooltip:SetHyperlink("item:6256");
+			_,_,_,_,fp_itemtype,fp_subtype,_,_,_,_ = self:GetItemInfo(6256);
+		end
+	end
+	return fp_itemtype, fp_subtype;
+end
+
+function FishLib:IsFishingPool(text)
+	if ( not text ) then
+		text = self:GetTooltipText();
+	end
+	if ( text ) then
+		local check = string.lower(text);
+		for _,info in pairs(self.SCHOOLS) do
+			local name = string.lower(info.name);
+			if ( string.find(check, name) ) then
+				return info;
+			end
+		end
+		if ( string.find(check, self.SCHOOL) ) then
+			return { name = text, kind = self.SCHOOL_FISH } ;
+		end
+	end
+	-- return nil;
+end
+
+function FishLib:AddSchoolName(name)
+	tinsert(self.SCHOOLS, { name = name, kind = SCHOOL_FISH });
+end
+
+function FishLib:GetMainHandItem(id)
+	local itemLink = GetInventoryItemLink("player", INVSLOT_MAINHAND);
+	if ( not id ) then
+		return itemLink;
+	end
+	_, id, _ = self:SplitFishLink(itemLink);
+	return id;
+end
+
+function FishLib:IsFishingPole(itemLink)
+	if (not itemLink) then
+		-- Get the main hand item texture
+		itemLink = self:GetMainHandItem();
+	end
+	if ( itemLink ) then
+		local _,_,_,_,itemtype,subtype,_,_,itemTexture,_ = self:GetItemInfo(itemLink);
+		local _, id, _ = self:SplitFishLink(itemLink);
+
+		self:GetPoleType();
+		if ( not fp_itemtype and itemTexture ) then
+			 -- If there is infact an item in the main hand, and it's texture
+			 -- that matches the fishing pole texture, then we have a fishing pole
+			 itemTexture = string.lower(itemTexture);
+			 if ( string.find(itemTexture, "inv_fishingpole") or
+					string.find(itemTexture, "fishing_journeymanfisher") ) then
+				 -- Make sure it's not "Nat Pagle's Fish Terminator"
+				 if ( id ~= 19944  ) then
+					 fp_itemtype = itemtype;
+					 fp_subtype = subtype;
+					 return true;
+				 end
+			 end
+		elseif ( fp_itemtype and fp_subtype ) then
+			return (itemtype == fp_itemtype) and (subtype == fp_subtype);
+		end
+	end
+	return false;
+end
+
+function FishLib:ForceGearCheck()
+	self.gearcheck = true;
+	self.hasgear = false;
+end
+
+function FishLib:IsFishingGear()
+	if ( self.gearcheck ) then
+		if (self:IsFishingPole()) then
+			self.hasgear = true;
+		end
+		for i=1,16,1 do
+			if ( not self.hasgear ) then
+				if (self:FishingBonusPoints(slotinfo[i].id, 1) > 0) then
+					self.hasgear = true;
+				end
+			end
+		end
+		self.gearcheck = false;
+	end
+	return self.hasgear;
+end
+
+function FishLib:IsFishingReady(partial)
+	if ( partial ) then
+		return self:IsFishingGear();
+	else
+		return self:IsFishingPole();
+	end
+end
+
+-- fish tracking skill
+function FishLib:GetTrackingID(tex)
+	if ( tex ) then
+		for id=1,GetNumTrackingTypes() do
+			local _, texture, _, _ = GetTrackingInfo(id);
+			if ( texture == tex) then
+				return id;
+			end
+		end
+	end
+	-- return nil;
+end
+
+local FINDFISHTEXTURE = "Interface\\Icons\\INV_Misc_Fish_02";
+function FishLib:GetFindFishID()
+	if ( not self.FindFishID ) then
+		self.FindFishID = self:GetTrackingID(FINDFISHTEXTURE);
+	end
+	return self.FindFishID;
+end
+
+local bobber = {};
+bobber["enUS"] = "Fishing Bobber";
+bobber["esES"] = "Anzuelo";
+bobber["esMX"] = "Anzuelo";
+bobber["deDE"] = "Schwimmer";
+bobber["frFR"] = "Flotteur";
+bobber["ptBR"] = "Isca de Pesca";
+bobber["ruRU"] = "Поплавок";
+bobber["zhTW"] = "釣魚浮標";
+bobber["zhCN"] = "垂钓水花";
+
+-- in case the addon is smarter than us
+function FishLib:SetBobberName(name)
+	self.BOBBER_NAME = name;
+end
+
+function FishLib:GetBobberName()
+	if ( not self.BOBBER_NAME ) then
+		local locale = GetLocale();
+		if ( bobber[locale] ) then
+			self.BOBBER_NAME = bobber[locale];
+		else
+			self.BOBBER_NAME = bobber["enUS"];
+		end
+	end
+	return self.BOBBER_NAME;
+end
+
+function FishLib:GetTooltipText()
+	if ( GameTooltip:IsVisible() ) then
+		local text = getglobal("GameTooltipTextLeft1");
+		if ( text ) then
+			return text:GetText();
+		end
+	end
+	-- return nil;
+end
+
+function FishLib:SaveTooltipText()
+	self.lastTooltipText = self:GetTooltipText();
+	return self.lastTooltipText;
+end
+
+function FishLib:GetLastTooltipText()
+	return self.lastTooltipText;
+end
+
+function FishLib:ClearLastTooltipText()
+	self.lastTooltipText = nil;
+end
+
+function FishLib:OnFishingBobber()
+   if ( GameTooltip:IsVisible() and GameTooltip:GetAlpha() == 1 ) then
+		local text = self:GetTooltipText() or self:GetLastTooltipText();
+		-- let a partial match work (for translations)
+		return ( text and string.find(text, self:GetBobberName() ) );
+	end
+end
+
+local ACTIONDOUBLEWAIT = 0.4;
+local MINACTIONDOUBLECLICK = 0.05;
+
+function FishLib:WatchBobber(flag)
+	self.watchBobber = flag;
+end
+
+-- look for double clicks
+function FishLib:CheckForDoubleClick(button)
+	if (button and button ~= self:GetSAMouseButton()) then
+		return false;
+	end
+	if ( not LootFrame:IsShown() and self.lastClickTime ) then
+		local pressTime = GetTime();
+		local doubleTime = pressTime - self.lastClickTime;
+		if ( (doubleTime < ACTIONDOUBLEWAIT) and (doubleTime > MINACTIONDOUBLECLICK) ) then
+			if ( not self.watchBobber or not self:OnFishingBobber() ) then
+				self.lastClickTime = nil;
+				return true;
+			end
+		end
+	end
+	self.lastClickTime = GetTime();
+	if ( self:OnFishingBobber() ) then
+		GameTooltip:Hide();
+	end
+	return false;
+end
+
+function FishLib:ExtendDoubleClick()
+	if ( self.lastClickTime ) then
+		self.lastClickTime = self.lastClickTime + ACTIONDOUBLEWAIT/2;
+	end
+end
+
+function FishLib:GetZoneInfo()
+	local zone = GetRealZoneText();
+	local subzone = GetSubZoneText();
+	if ( not zone or zone == "" ) then
+		zone = UNKNOWN;
+	end
+	if ( not subzone or subzone == "" ) then
+		subzone = zone;
+	end
+
+	-- Hack to fix issues with 4.1 and LibBabbleZone and LibTourist
+	if (zone == "City of Ironforge" ) then
+		zone = "Ironforge";
+	end
+
+	local continent = GetCurrentMapContinent();
+	zone = LT:GetUniqueEnglishZoneNameForLookup(zone, continent)
+
+	return zone, subzone;
+end
+
+function FishLib:GetBaseSubZone(sname)
+	if ( sname == FishLib.UNKNOWN or sname == UNKNOWN ) then
+		return FishLib.UNKNOWN;
+	end
+
+	if (sname and not BSL[sname] and BSZR[sname]) then
+		sname = BSZR[sname];
+	end
+
+	if (not sname) then
+		sname = FishLib.UNKNOWN;
+	end
+
+	return sname;
+end
+
+function FishLib:GetLocSubZone(sname)
+	if ( sname == FishLib.UNKNOWN or sname == UNKNOWN ) then
+		return UNKNOWN;
+	end
+
+	if (sname and BSL[sname] ) then
+		sname = BSZ[sname];
+	end
+	if (not sname) then
+		sname = FishLib.UNKNOWN;
+	end
+	return sname;
+end
+
+local subzoneskills = {
+	["Jademir Lake"] = 425,
+	["Verdantis River"] = 300,
+	["The Forbidding Sea"] = 225,
+	["Ruins of Arkkoran"] = 300,
+	["The Tainted Forest"] = 25,
+	["Ruins of Gilneas"] = 75,
+	["The Throne of Flame"] = 1,
+	["Forge Camp: Hate"] = 375,	-- Nagrand
+	["Lake Sunspring"] = 490,	-- Nagrand
+	["Skysong Lake"] = 490,	-- Nagrand
+	["Oasis"] = 100,
+	["South Seas"] = 300,
+	["Lake Everstill"] = 150,
+	["Blackwind"] = 500,
+	["Ere'Noru"] = 500,
+	["Jorune"] = 500,
+	["Silmyr"] = 500,
+	["Cannon's Inferno"] = 1,
+	["Fire Plume Ridge"] = 1,
+	["Marshlight Lake"] = 450,
+	["Sporewind Lake"] = 450,
+	["Serpent Lake"] = 450,
+	["Binan Village"] = 750,	-- seems to be higher here, for some reason
+};
+
+function FishLib:GetFishingLevel(zone, subzone)
+	subzone = self:GetBaseSubZone(subzone);
+
+	local continent = GetCurrentMapContinent();
+	if (continent ~= 7 and subzoneskills[subzone]) then
+		return subzoneskills[subzone];
+	else
+		return LT:GetFishingLevel(zone);
+	end
+end
+
+-- table taken from El's Anglin' pages
+-- More accurate than the previous (skill - 75) / 25 calculation now
+local skilltable = {};
+tinsert(skilltable, { ["level"] = 100, ["inc"] = 1 });
+tinsert(skilltable, { ["level"] = 200, ["inc"] = 2 });
+tinsert(skilltable, { ["level"] = 300, ["inc"] = 2 });
+tinsert(skilltable, { ["level"] = 450, ["inc"] = 4 });
+tinsert(skilltable, { ["level"] = 525, ["inc"] = 6 });
+tinsert(skilltable, { ["level"] = 600, ["inc"] = 10 });
+
+local newskilluptable = {};
+function FishLib:SetSkillupTable(table)
+	newskilluptable = table;
+end
+
+function FishLib:GetSkillupTable()
+	return newskilluptable;
+end
+
+-- this would be faster as a binary search, but I'm not sure it matters :-)
+function FishLib:CatchesAtSkill(skill)
+	for _,chk in ipairs(skilltable) do
+		if ( skill < chk.level ) then
+			return chk.inc;
+		end
+	end
+	-- return nil;
+end
+
+function FishLib:GetSkillUpInfo()
+	local skill, mods, skillmax = self:GetCurrentSkill();
+	if ( skillmax and skill < skillmax ) then
+		local needed = self:CatchesAtSkill(skill);
+		if ( needed ) then
+			return self.caughtSoFar, needed;
+		end
+	else
+		self.caughtSoFar = 0;
+	end
+	return self.caughtSoFar, nil;
+end
+
+-- we should have some way to believe
+function FishLib:SetCaughtSoFar(value)
+	if ( FishingBuddy and FishingBuddy.GetSetting ) then
+		self.caughtSoFar = FishingBuddy.GetSetting("CaughtSoFar") or 0;
+	else
+		self.caughtSoFar = value or 0;
+	end
+end
+
+function FishLib:GetCaughtSoFar()
+	return self.caughtSoFar;
+end
+
+-- Find an action bar for fishing, if there is one
+local FISHINGTEXTURE = "Interface\\Icons\\Trade_Fishing";
+function FishLib:GetFishingActionBarID(force)
+	if ( force or not self.ActionBarID ) then
+		for slot=1,72 do
+			if ( HasAction(slot) and not IsAttackAction(slot) ) then
+				local t,_,_ = GetActionInfo(slot);
+				if ( t == "spell" ) then
+					local tex = GetActionTexture(slot);
+					if ( tex and tex == FISHINGTEXTURE ) then
+						self.ActionBarID = slot;
+						break;
+					end
+				end
+			end
+		end
+	end
+	return self.ActionBarID;
+end
+
+function FishLib:ClearFishingActionBarID()
+	self.ActionBarID = nil;
+end
+
+-- handle classes of fish
+local MissedFishItems = {};
+MissedFishItems[45190] = "Driftwood";
+MissedFishItems[45200] = "Sickly Fish";
+MissedFishItems[45194] = "Tangled Fishing Line";
+MissedFishItems[45196] = "Tattered Cloth";
+MissedFishItems[45198] = "Weeds";
+MissedFishItems[45195] = "Empty Rum Bottle";
+MissedFishItems[45199] = "Old Boot";
+MissedFishItems[45201] = "Rock";
+MissedFishItems[45197] = "Tree Branch";
+MissedFishItems[45202] = "Water Snail";
+MissedFishItems[45188] = "Withered Kelp";
+MissedFishItems[45189] = "Torn Sail";
+MissedFishItems[45191] = "Empty Clam";
+
+function FishLib:IsMissedFish(id)
+	if ( MissedFishItems[id] ) then
+		return true;
+	end
+	-- return nil;
+end
+
+-- utility functions
+local function SplitColor(color)
+	if ( color ) then
+		if ( type(color) == "table" ) then
+			for i,c in pairs(color) do
+				color[i] = SplitColor(c);
+			end
+		elseif ( type(color) == "string" ) then
+			local a = tonumber(string.sub(color,1,2),16);
+			local r = tonumber(string.sub(color,3,4),16);
+			local g = tonumber(string.sub(color,5,6),16);
+			local b = tonumber(string.sub(color,7,8),16);
+			color = { a = a, r = r, g = g, b = b };
+		end
+	end
+	return color;
+end
+
+local function AddTooltipLine(l)
+	if ( type(l) == "table" ) then
+		-- either { t, c } or {{t1, c1}, {t2, c2}}
+		if ( type(l[1]) == "table" ) then
+			local c1 = SplitColor(l[1][2]) or {};
+			local c2 = SplitColor(l[2][2]) or {};
+			GameTooltip:AddDoubleLine(l[1][1], l[2][1],
+											  c1.r, c1.g, c1.b,
+											  c2.r, c2.g, c2.b);
+		else
+			local c = SplitColor(l[2]) or {};
+			GameTooltip:AddLine(l[1], c.r, c.g, c.b, 1);
+		end
+	else
+		GameTooltip:AddLine(l,nil,nil,nil,1);
+	end
+end
+
+function FishLib:AddTooltip(text, tooltip)
+	if ( not tooltip ) then
+		tooltip = GameTooltip;
+	end
+	local c = color or {{}, {}};
+	if ( text ) then
+		if ( type(text) == "table" ) then
+			for _,l in pairs(text) do
+				AddTooltipLine(l, tooltip);
+			end
+		else
+			-- AddTooltipLine(text, color);
+			tooltip:AddLine(text,nil,nil,nil,1);
+		end
+	end
+end
+
+function FishLib:FindChatWindow(name)
+	local frame;
+	for i = 1, NUM_CHAT_WINDOWS do
+		local frame = getglobal("ChatFrame" .. i);
+		if (frame.name == name) then
+			return frame, getglobal("ChatFrame" .. i .. "Tab");
+		end
+	end
+	-- return nil, nil;
+end
+
+function FishLib:GetChatWindow(name)
+	if (canCreateFrame) then
+		local frame, frametab = self:FindChatWindow(name);
+		if ( frame ) then
+			if ( not frametab:IsVisible() ) then
+				-- Dock the frame by default
+				if ( not frame.oldAlpha ) then
+					frame.oldAlpha = frame:GetAlpha() or DEFAULT_CHATFRAME_ALPHA;
+				end
+				FCF_DockFrame(frame, (#FCFDock_GetChatFrames(GENERAL_CHAT_DOCK)+1), true);
+				FCF_FadeInChatFrame(FCFDock_GetSelectedWindow(GENERAL_CHAT_DOCK));
+				FCF_DockUpdate();
+			end
+			return frame, frametab;
+		else
+			local frame = FCF_OpenNewWindow(name);
+			return self:FindChatWindow(name);
+		end
+	end
+	-- if we didn't find our frame, something bad has happened, so
+	-- let's just use the default chat frame
+	return DEFAULT_CHAT_FRAME, nil;
+end
+
+-- Secure action button
+local SABUTTONNAME = "LibFishingSAButton";
+
+function FishLib:ResetOverride()
+	local btn = self.sabutton;
+	if ( btn ) then
+		btn.holder:Hide();
+		ClearOverrideBindings(btn);
+	end
+end
+
+local function ClickHandled(self)
+	self.fl:ResetOverride();
+	if ( self.postclick ) then
+		self.postclick();
+	end
+end
+
+function FishLib:CreateSAButton()
+	local btn = getglobal(SABUTTONNAME);
+	if ( not btn ) then
+		local holder = CreateFrame("Frame", nil, UIParent);
+		btn = CreateFrame("Button", SABUTTONNAME, holder, "SecureActionButtonTemplate");
+		btn.holder = holder;
+		btn:EnableMouse(true);
+		btn:RegisterForClicks(nil);
+		btn:Show();
+
+		holder:SetPoint("LEFT", UIParent, "RIGHT", 10000, 0);
+		holder:SetFrameStrata("LOW");
+		holder:Hide();
+	end
+	if (not self.buttonevent) then
+		self.buttonevent = "RightButtonUp";
+	end
+	btn:SetScript("PostClick", ClickHandled);
+	btn:RegisterForClicks(self.buttonevent);
+	self.sabutton = btn;
+	btn.fl = self;
+end
+
+FishLib.MOUSE1 = "RightButtonUp";
+FishLib.MOUSE2 = "Button4Up";
+FishLib.MOUSE3 = "Button5Up";
+FishLib.CastButton = {};
+FishLib.CastButton[FishLib.MOUSE1] = "RightButton";
+FishLib.CastButton[FishLib.MOUSE2] = "Button4";
+FishLib.CastButton[FishLib.MOUSE3] = "Button5";
+FishLib.CastKey = {};
+FishLib.CastKey[FishLib.MOUSE1] = "BUTTON2";
+FishLib.CastKey[FishLib.MOUSE2] = "BUTTON4";
+FishLib.CastKey[FishLib.MOUSE3] = "BUTTON5";
+
+function FishLib:GetSAMouseEvent()
+	if (not self.buttonevent) then
+		self.buttonevent = "RightButtonUp";
+	end
+	return self.buttonevent;
+end
+
+function FishLib:GetSAMouseButton()
+	return self.CastButton[self:GetSAMouseEvent()];
+end
+
+function FishLib:GetSAMouseKey()
+	return self.CastKey[self:GetSAMouseEvent()];
+end
+
+function FishLib:SetSAMouseEvent(buttonevent)
+	if (not buttonevent) then
+		buttonevent = "RightButtonUp";
+	end
+	if (self.CastButton[buttonevent]) then
+		self.buttonevent = buttonevent;
+		local btn = getglobal(SABUTTONNAME);
+		if ( btn ) then
+			btn:RegisterForClicks(nil);
+			btn:RegisterForClicks(self.buttonevent);
+		end
+		return true;
+	end
+	-- return nil;
+end
+
+function FishLib:InvokeFishing(useaction)
+	local btn = self.sabutton;
+	if ( not btn ) then
+		return;
+	end
+	local _, name = self:GetFishingSkillInfo();
+	local findid = self:GetFishingActionBarID();
+	if ( not useaction or not findid ) then
+		btn:SetAttribute("type", "spell");
+		btn:SetAttribute("spell", name);
+		btn:SetAttribute("action", nil);
+	else
+		btn:SetAttribute("type", "action");
+		btn:SetAttribute("action", findid);
+		btn:SetAttribute("spell", nil);
+	end
+	btn:SetAttribute("item", nil);
+	btn:SetAttribute("target-slot", nil);
+	btn.postclick = nil;
+end
+
+function FishLib:InvokeLuring(id)
+	local btn = self.sabutton;
+	if ( not btn ) then
+		return;
+	end
+	btn:SetAttribute("type", "item");
+	if ( id ) then
+		btn:SetAttribute("item", "item:"..id);
+		btn:SetAttribute("target-slot", INVSLOT_MAINHAND);
+	else
+		btn:SetAttribute("item", nil);
+		btn:SetAttribute("target-slot", nil);
+	end
+	btn:SetAttribute("spell", nil);
+	btn:SetAttribute("action", nil);
+	btn.postclick = nil;
+end
+
+function FishLib:OverrideClick(postclick)
+	local btn = self.sabutton;
+	if ( not btn ) then
+		return;
+	end
+	local buttonkey = self:GetSAMouseKey();
+	fishlibframe.fl = self;
+	btn.fl = self;
+	btn.postclick = postclick;
+	SetOverrideBindingClick(btn, true, buttonkey, SABUTTONNAME);
+	btn.holder:Show();
+end
+
+function FishLib:ClickSAButton()
+	local btn = self.sabutton;
+	if ( not btn ) then
+		return;
+	end
+	btn:Click(self:GetSAMouseButton());
+end
+
+-- Taken from wowwiki tooltip handling suggestions
+local function EnumerateTooltipLines_helper(...)
+	local lines = {};
+	for i = 1, select("#", ...) do
+		local region = select(i, ...)
+		if region and region:GetObjectType() == "FontString" then
+			local text = region:GetText() -- string or nil
+			tinsert(lines, text or "");
+		end
+	end
+	return lines;
+end
+
+function FishLib:EnumerateTooltipLines(tooltip)
+	 return EnumerateTooltipLines_helper(tooltip:GetRegions())
+end
+
+-- Fishing bonus. We used to be able to get the current modifier from
+-- the skill API, but now we have to figure it out ourselves
+local match;
+function FishLib:FishingBonusPoints(item, inv)
+	local points = 0;
+	if ( item and item ~= "" ) then
+		if ( not match ) then
+			local _,skillname = self:GetFishingSkillInfo(true);
+			match = {};
+			match[1] = "%+(%d+) "..skillname;
+			match[2] = skillname.." %+(%d+)";
+			-- Equip: Fishing skill increased by N.
+			match[3] = skillname.."[%a%s]+(%d+)%.";
+			if ( GetLocale() == "deDE" ) then
+				 match[4] = "+(%d+) Angelfertigkeit";
+			end
+		end
+		local tooltip = self:GetFishTooltip();
+		tooltip:ClearLines();
+		if (inv) then
+			tooltip:SetInventoryItem("player", item);
+		else
+			local _, id, _ = self:SplitFishLink(item);
+			if (not id) then
+				item = "item:"..item;
+			end
+			tooltip:SetHyperlink(item);
+		end
+		local lines = EnumerateTooltipLines_helper(tooltip:GetRegions())
+		for i=1,#lines do
+			local bodyslot = lines[i]:gsub("^%s*(.-)%s*$", "%1");
+			if (string.len(bodyslot) > 0) then
+				for _,pat in ipairs(match) do
+					local _,_,bonus = string.find(bodyslot, pat);
+					if ( bonus ) then
+						points = points + bonus;
+					end
+				end
+			end
+		end
+	end
+	return points;
+end
+
+-- if we have a fishing pole, return the bonus from the pole
+-- and the bonus from a lure, if any, separately
+function FishLib:GetPoleBonus()
+	if (self:IsFishingPole()) then
+		-- get the total bonus for the pole
+		local total = self:FishingBonusPoints(INVSLOT_MAINHAND, true);
+		local hmhe,_,_,_,_,_ = GetWeaponEnchantInfo();
+		if ( hmhe ) then
+			-- IsFishingPole has set mainhand for us
+			local itemLink = self:GetMainHandItem();
+			local _, id, _, enchant = self:SplitLink(itemLink);
+			-- get the raw value of the pole without any temp enchants
+			local pole = self:FishingBonusPoints(id);
+			return total, total - pole;
+		else
+			-- no enchant, all pole
+			return total, 0;
+		end
+	end
+	return 0, 0;
+end
+
+function FishLib:GetOutfitBonus()
+	local bonus = 0;
+	-- we can skip the ammo and ranged slots
+	for i=1,16,1 do
+		bonus = bonus + self:FishingBonusPoints(slotinfo[i].id, 1);
+	end
+	-- Blizz seems to have capped this at 50, plus there seems
+	-- to be a maximum of +5 in enchants. Need to do some more work
+	-- to verify.
+	-- if (bonus > 50) then
+	-- 	bonus = 50;
+	-- end
+	local pole, lure = self:GetPoleBonus();
+	return bonus + pole, lure;
+end
+
+-- return a list of the best items we have for a fishing outfit
+function FishLib:GetFishingOutfitItems(wearing, nopole, ignore)
+	local ibp = function(link) return self:FishingBonusPoints(link); end;
+	-- find fishing gear
+	-- no affinity, check all bags
+	local outfit = nil;
+	local itemtable = {};
+	for invslot=1,17,1 do
+		local slotid = slotinfo[invslot].id;
+		local ismain = (slotid == INVSLOT_MAINHAND);
+		if ( not nopole or not ismain ) then
+			local slotname = slotinfo[invslot].name;
+			local maxb = -1;
+			local link;
+			-- should we include what we're already wearing?
+			if ( wearing ) then
+				link = GetInventoryItemLink("player", slotid);
+				if ( link ) then
+					maxb = self:FishingBonusPoints(link);
+					if (maxb > 0) then
+						outfit = outfit or {};
+						outfit[invslot] = { link=link, slot=slotid };
+					end
+				end
+			end
+
+			-- this only gets items in bags, hence the check above for slots
+			wipe(itemtable);
+			itemtable = GetInventoryItemsForSlot(slotid, itemtable);
+			for location,id in pairs(itemtable) do
+				if (not ignore or not ignore[id]) then
+					local player, bank, bags, void, slot, bag = EquipmentManager_UnpackLocation(location);
+					if ( bags and slot and bag ) then
+						link = GetContainerItemLink(bag, slot);
+					else
+						link = nil;
+					end
+					if ( link ) then
+						local b = self:FishingBonusPoints(link);
+						local go = false;
+						if ( ismain ) then
+							go = self:IsFishingPole(link);
+						end
+						if (go or (b > 0)) then
+							local usable, _ = IsUsableItem(link);
+							if ( usable and (b > maxb) ) then
+								maxb = b;
+								outfit = outfit or {};
+								outfit[slotid] = { link=link, bag=bag, slot=slot, slotname=slotname };
+							end
+						end
+					end
+				end
+			end
+		end
+	end
+	return outfit;
+end
+
+function FishLib:GetBagItemStats(bag, slot)
+	local link;
+	local c, i, n;
+	if ( bag ) then
+		link = GetContainerItemLink (bag,slot);
+	else
+		link = GetInventoryItemLink("player", slot);
+	end
+	if (link) then
+		c, i, n = self:SplitFishLink(link);
+	end
+	return c, i, n;
+end
+
+-- look in a particular bag
+function FishLib:CheckThisBag(bag, id, skipcount)
+	-- get the number of slots in the bag (0 if no bag)
+	local numSlots = GetContainerNumSlots(bag);
+	if (numSlots > 0) then
+		-- check each slot in the bag
+		for slot=1, numSlots do
+			local c, i, n = self:GetBagItemStats(bag, slot);
+			if ( i and id == i ) then
+				if ( skipcount == 0 ) then
+					return slot, skipcount;
+				end
+				skipcount = skipcount - 1;
+			end
+		end
+	end
+	return nil, skipcount;
+end
+
+-- look for the item anywhere we can find it, skipping if we're looking
+-- for more than one
+function FishLib:FindThisItem(id, skipcount)
+	if ( not id ) then
+		return nil,nil;
+	end
+	local skipcount = skipcount or 0;
+	-- force id to be a number
+	local n,l,_,_,_,_,_,_ = GetItemInfo(id);
+	if (not n) then
+		n,l,_,_,_,_,_,_ = GetItemInfo("item:"..id);
+	end
+	_, id, _ = self:SplitFishLink(l);
+	-- check each of the bags on the player
+	for bag = BACKPACK_CONTAINER, NUM_BAG_SLOTS do
+		local slot;
+		slot, skipcount = self:CheckThisBag(bag, id, skipcount);
+		if ( slot ) then
+			return bag, slot;
+		end
+	end
+
+	local _,_,slotnames = self:GetSlotInfo();
+	for _,si in ipairs(slotnames) do
+		local slot = si.id;
+		local c, i, n = self:GetBagItemStats(nil, slot);
+		if ( i and id == i ) then
+			if ( skipcount == 0 ) then
+				return nil, slot;
+			end
+			skipcount = skipcount - 1;
+		end
+	end
+
+	-- return nil, nil;
+end
+
+-- Is this item openable?
+function FishLib:IsOpenable(item)
+	local _, id, _ = self:SplitFishLink(item);
+	if (not id) then
+		item = "item:"..item;
+	end
+
+	local canopen = false;
+	local locked = false;
+	local tooltip = self:GetFishTooltip();
+	tooltip:ClearLines();
+	tooltip:SetHyperlink(item);
+	local lines = EnumerateTooltipLines_helper(tooltip:GetRegions())
+	for i=1,#lines do
+		local line = lines[i];
+		if ( line == _G.ITEM_OPENABLE ) then
+			openable = true;
+		elseif ( line == _G.LOCKED ) then
+			locked = true;
+		end
+	end
+	return canopen, locked;
+end
+
+-- Find out where the player is. Based on code from Astrolabe and wowwiki notes
+function FishLib:GetCurrentPlayerPosition()
+	local x, y = GetPlayerMapPosition("player");
+	local lC, lZ = GetCurrentMapContinent(), GetCurrentMapZone();
+	-- if the current location is 0,0 we need to call SetMapToCurrentZone()
+	if ( x <= 0 and y <= 0 ) then
+		-- find out where we are now
+		SetMapToCurrentZone();
+		-- if we haven't changed zones yet, the zoom is incorrect
+		SetMapZoom(GetCurrentMapContinent());
+
+		local C, Z = GetCurrentMapContinent(), GetCurrentMapZone();
+		x, y = GetPlayerMapPosition("player");
+
+		-- put everything back, if we need to
+		if ( C ~= lC or Z ~= lZ ) then
+			SetMapZoom(lC, lZ); --set map zoom back to what it was before
+		end
+
+		if ( x <= 0 and y <= 0 ) then
+			-- we are in an instance or otherwise off the continent map
+			return C, Z, 0, 0;
+		else
+			return C, Z, x, y;
+		end
+	end
+	return lC, lZ, x, y;
+end
+
+-- translation support functions
+-- replace #KEYWORD# with the value of keyword (which might be a color)
+local function FixupThis(target, tag, what)
+	if ( type(what) == "table" ) then
+		local fixed = {};
+		for idx,str in pairs(what) do
+			fixed[idx] = FixupThis(target, tag, str);
+		end
+		for idx,str in pairs(fixed) do
+			what[idx] = str;
+		end
+		return what;
+	elseif ( type(what) == "string" ) then
+		local pattern = "#([A-Z0-9_]+)#";
+		local s,e,w = string.find(what, pattern);
+		while ( w ) do
+			if ( type(target[w]) == "string" ) then
+				local s1 = strsub(what, 1, s-1);
+				local s2 = strsub(what, e+1);
+				what = s1..target[w]..s2;
+				s,e,w = string.find(what, pattern);
+			-- elseif ( Crayon and Crayon["COLOR_HEX_"..w] ) then
+				-- local s1 = strsub(what, 1, s-1);
+				-- local s2 = strsub(what, e+1);
+				-- what = s1.."ff"..Crayon["COLOR_HEX_"..w]..s2;
+				-- s,e,w = string.find(what, pattern);
+			else
+				-- stop if we can't find something to replace it with
+				w = nil;
+			end
+		end
+		return what;
+	end
+	-- do nothing
+	return what;
+end
+
+function FishLib:FixupEntry(constants, tag)
+	FixupThis(constants, tag, constants[tag]);
+end
+
+local function FixupStrings(target)
+	local fixed = {};
+	for tag,_ in pairs(target) do
+		fixed[tag] = FixupThis(target, tag, target[tag]);
+	end
+	for tag,str in pairs(fixed) do
+		target[tag] = str;
+	end
+end
+
+local function FixupBindings(target)
+	for tag,str in pairs(target) do
+		if ( string.find(tag, "^BINDING") ) then
+			setglobal(tag, target[tag]);
+			target[tag] = nil;
+		end
+	end
+end
+
+local missing = {};
+local function LoadTranslation(source, lang, target, record)
+	local translation = source[lang];
+	if ( translation ) then
+		for tag,value in pairs(translation) do
+			if ( not target[tag] ) then
+				target[tag] = value;
+				if ( record ) then
+					missing[tag] = value;
+				end
+			end
+		end
+	end
+end
+
+function FishLib:Translate(addon, source, target, forced)
+	local locale = forced or GetLocale();
+	target.VERSION = GetAddOnMetadata(addon, "Version");
+	LoadTranslation(source, locale, target);
+	if ( locale ~= "enUS" ) then
+		LoadTranslation(source, "enUS", target, forced);
+	end
+	LoadTranslation(source, "Inject", target);
+	FixupStrings(target);
+	FixupBindings(target);
+	if (forced) then
+		return missing;
+	end
+end
+
+-- Pool types
+FishLib.SCHOOL_FISH = 0;
+FishLib.SCHOOL_WRECKAGE = 1;
+FishLib.SCHOOL_DEBRIS = 2;
+FishLib.SCHOOL_WATER = 3;
+FishLib.SCHOOL_TASTY = 4;
+FishLib.SCHOOL_OIL = 5;
+FishLib.SCHOOL_CHURNING = 6;
+FishLib.SCHOOL_FLOTSAM = 7;
+FishLib.SCHOOL_FIRE = 8;
+
+local FLTrans = {};
+
+function FLTrans:Setup(lang, school, ...)
+	self[lang] = {};
+	-- as long as string.lower breaks all UTF-8 equally, this should still work
+	self[lang].SCHOOL = string.lower(school);
+	local n = select("#", ...);
+	local schools = {};
+	for idx=1,n,2 do
+		local name, kind = select(idx, ...);
+		tinsert(schools, { name = name, kind = kind });
+	end
+	-- add in the fish we know are in schools
+	self[lang].SCHOOLS = schools;
+end
+
+FLTrans:Setup("enUS", "school",
+	"Floating Wreckage", FishLib.SCHOOL_WRECKAGE,
+	"Patch of Elemental Water", FishLib.SCHOOL_WATER,
+	"Floating Debris", FishLib.SCHOOL_DEBRIS,
+	"Oil Spill", FishLib.SCHOOL_OIL,
+	"Stonescale Eel Swarm", FishLib.SCHOOL_FISH,
+	"Muddy Churning Water", FishLib.SCHOOL_CHURNING,
+	"Pure Water", FishLib.SCHOOL_WATER,
+	"Steam Pump Flotsam", FishLib.SCHOOL_FLOTSAM,
+	"School of Tastyfish", FishLib.SCHOOL_TASTY,
+	"Pool of Fire", FishLib.SCHOOL_FIRE);
+
+FLTrans:Setup("koKR", "떼",
+	"표류하는 잔해", FishLib.SCHOOL_WRECKAGE, --	 Floating Wreckage
+	"정기가 흐르는 물 웅덩이", FishLib.SCHOOL_WATER, --	 Patch of Elemental Water
+	"표류하는 파편", FishLib.SCHOOL_DEBRIS, --  Floating Debris
+	"떠다니는 기름", FishLib.SCHOOL_OIL, --  Oil Spill
+	"거품이는 진흙탕물", FishLib.SCHOOL_CHURNING, --	Muddy Churning Water
+	"깨끗한 물", FishLib.SCHOOL_WATER, --  Pure Water
+	"증기 양수기 표류물", FishLib.SCHOOL_FLOTSAM, --	Steam Pump Flotsam
+	"맛둥어 떼", FishLib.SCHOOL_TASTY); -- School of Tastyfish
+
+FLTrans:Setup("deDE", "schwarm",
+	"Treibende Wrackteile", FishLib.SCHOOL_WRECKAGE, --  Floating Wreckage
+	"Stelle mit Elementarwasser", FishLib.SCHOOL_WATER, --  Patch of Elemental Water
+	"Schwimmende Trümmer", FishLib.SCHOOL_DEBRIS, --  Floating Debris
+	"Ölfleck", FishLib.SCHOOL_OIL,  --	Oil Spill
+	"Schlammiges aufgewühltes Gewässer", FishLib.SCHOOL_CHURNING, --	Muddy Churning Water
+	"Reines Wasser", FishLib.SCHOOL_WATER, --	 Pure Water
+	"Treibgut der Dampfpumpe", FishLib.SCHOOL_FLOTSAM, --	 Steam Pump Flotsam
+	"Leckerfischschwarm", FishLib.SCHOOL_TASTY); -- School of Tastyfish
+
+FLTrans:Setup("frFR", "banc",
+	"Débris flottants", FishLib.SCHOOL_WRECKAGE, --	 Floating Wreckage
+	"Remous d'eau élémentaire", FishLib.SCHOOL_WATER, --	Patch of Elemental Water
+	"Débris flottant", FishLib.SCHOOL_DEBRIS, --	 Floating Debris
+	"Nappe de pétrole", FishLib.SCHOOL_OIL, --  Oil Spill
+	"Eaux troubles et agitées", FishLib.SCHOOL_CHURNING, --	Muddy Churning Water
+	"Eau pure", FishLib.SCHOOL_WATER, --  Pure Water
+	"Détritus de la pompe à vapeur", FishLib.SCHOOL_FLOTSAM, --	 Steam Pump Flotsam
+	"Banc de courbine", FishLib.SCHOOL_TASTY); -- School of Tastyfish
+
+FLTrans:Setup("esES", "banco",
+	"Restos de un naufragio", FishLib.SCHOOL_WRECKAGE,	  --	Floating Wreckage
+	"Restos flotando", FishLib.SCHOOL_DEBRIS,		--	 Floating Debris
+	"Vertido de petr\195\179leo", FishLib.SCHOOL_OIL,	 --  Oil Spill
+	"Agua pura", FishLib.SCHOOL_WATER, --	Pure Water
+	"Restos flotantes de bomba de vapor", FishLib.SCHOOL_FLOTSAM, --	Steam Pump Flotsam
+	"Banco de pezricos", FishLib.SCHOOL_TASTY); -- School of Tastyfish
+
+FLTrans:Setup("zhCN", "鱼群",
+	"漂浮的残骸", FishLib.SCHOOL_WRECKAGE, --  Floating Wreckage
+	"元素之水", FishLib.SCHOOL_WATER, --	 Patch of Elemental Water
+	"漂浮的碎片", FishLib.SCHOOL_DEBRIS, --	Floating Debris
+	"油井", FishLib.SCHOOL_OIL, --	Oil Spill
+	"石鳞鳗群", FishLib.SCHOOL_FISH, --	Stonescale Eel Swarm
+	"混浊的水", FishLib.SCHOOL_CHURNING, --	 Muddy Churning Water
+	"纯水", FishLib.SCHOOL_WATER,				 --  Pure Water
+	"蒸汽泵废料", FishLib.SCHOOL_FLOTSAM, --	 Steam Pump Flotsam
+	"可口鱼", FishLib.SCHOOL_TASTY); -- School of Tastyfish
+
+FLTrans:Setup("zhTW", "群",
+	"漂浮的殘骸", FishLib.SCHOOL_WRECKAGE, --  Floating Wreckage
+	"元素之水", FishLib.SCHOOL_WATER, --	 Patch of Elemental Water
+	"漂浮的碎片", FishLib.SCHOOL_DEBRIS, --	Floating Debris
+	"油井", FishLib.SCHOOL_OIL, --	Oil Spill
+	"混濁的水", FishLib.SCHOOL_CHURNING, --	 Muddy Churning Water
+	"純水", FishLib.SCHOOL_WATER,				 --  Pure Water
+	"蒸汽幫浦漂浮殘骸", FishLib.SCHOOL_FLOTSAM,	 --  Steam Pump Flotsam
+	"斑點可口魚魚群", FishLib.SCHOOL_TASTY); -- School of Tastyfish
+
+FishLib:Translate("LibFishing", FLTrans, FishLib);
+FLTrans = nil;
diff --git a/ElvUI_SLE/libs/LibFishing-1.0/lib.xml b/ElvUI_SLE/libs/LibFishing-1.0/lib.xml
new file mode 100644
index 0000000..87688d6
--- /dev/null
+++ b/ElvUI_SLE/libs/LibFishing-1.0/lib.xml
@@ -0,0 +1,4 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
+..\FrameXML\UI.xsd">
+	<Script file="LibFishing-1.0.lua" />
+</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/LibTourist-3.0/Changelog-LibTourist-3.0-r181.txt b/ElvUI_SLE/libs/LibTourist-3.0/Changelog-LibTourist-3.0-r181.txt
new file mode 100644
index 0000000..6dc12c0
--- /dev/null
+++ b/ElvUI_SLE/libs/LibTourist-3.0/Changelog-LibTourist-3.0-r181.txt
@@ -0,0 +1,17 @@
+------------------------------------------------------------------------
+r181 | Odica | 2015-07-17 09:55:31 +0000 (Fri, 17 Jul 2015) | 2 lines
+Changed paths:
+   M /trunk/LibTourist-3.0.lua
+   M /trunk/LibTourist-3.0.toc
+
+- Updated TOC to 60200
+- Added Hellfire Citadel raid. Because this is a duplicate name with the Hellfire Citadel complex in Hellfire Peninsula, Outland, the raid is added to the mechanism that handles duplicate names, and is identified by LibTourist as "Hellfire Citadel (Draenor)".
+------------------------------------------------------------------------
+r180 | Odica | 2015-02-25 15:52:03 +0000 (Wed, 25 Feb 2015) | 2 lines
+Changed paths:
+   M /trunk/LibTourist-3.0.lua
+   M /trunk/LibTourist-3.0.toc
+
+- Updated TOC to 60100
+- Added instance entrance portal coordinates for Auchindoun, Iron Docks, Bloodmaul Slag Mines and Skyreach
+------------------------------------------------------------------------
diff --git a/ElvUI_SLE/libs/LibTourist-3.0/LICENSE.txt b/ElvUI_SLE/libs/LibTourist-3.0/LICENSE.txt
new file mode 100644
index 0000000..9078d12
--- /dev/null
+++ b/ElvUI_SLE/libs/LibTourist-3.0/LICENSE.txt
@@ -0,0 +1,31 @@
+
+The MIT License
+
+Copyright (c) <year> <copyright holders>
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy
+of this software and associated documentation files (the "Software"), to
+deal
+in the Software without restriction, including without limitation the
+rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/LibTourist-3.0/LibTourist-3.0.lua b/ElvUI_SLE/libs/LibTourist-3.0/LibTourist-3.0.lua
new file mode 100644
index 0000000..a800963
--- /dev/null
+++ b/ElvUI_SLE/libs/LibTourist-3.0/LibTourist-3.0.lua
@@ -0,0 +1,7052 @@
+--[[
+Name: LibTourist-3.0
+Revision: $Rev: 181 $
+Author(s): ckknight (ckknight@gmail.com), Arrowmaster, Odica (maintainer)
+Website: http://ckknight.wowinterface.com/
+Documentation: http://www.wowace.com/addons/libtourist-3-0/
+SVN: svn://svn.wowace.com/wow/libtourist-3-0/mainline/trunk
+Description: A library to provide information about zones and instances.
+License: MIT
+]]
+
+local MAJOR_VERSION = "LibTourist-3.0"
+local MINOR_VERSION = 90000 + tonumber(("$Revision: 181 $"):match("(%d+)"))
+
+if not LibStub then error(MAJOR_VERSION .. " requires LibStub") end
+
+local Tourist, oldLib = LibStub:NewLibrary(MAJOR_VERSION, MINOR_VERSION)
+if not Tourist then
+	return
+end
+if oldLib then
+	oldLib = {}
+	for k, v in pairs(Tourist) do
+		Tourist[k] = nil
+		oldLib[k] = v
+	end
+end
+
+local function trace(msg)
+--	DEFAULT_CHAT_FRAME:AddMessage(msg)
+end
+
+-- Localization tables
+local BZ = {}
+local BZR = {}
+
+local playerLevel = 1
+
+local isAlliance, isHorde, isNeutral
+do
+	local faction = UnitFactionGroup("player")
+	isAlliance = faction == "Alliance"
+	isHorde = faction == "Horde"
+	isNeutral = not isAlliance and not isHorde
+end
+
+local isWestern = GetLocale() == "enUS" or GetLocale() == "deDE" or GetLocale() == "frFR" or GetLocale() == "esES"
+
+local Azeroth = "Azeroth"
+local Kalimdor = "Kalimdor"
+local Eastern_Kingdoms = "Eastern Kingdoms"
+local Outland = "Outland"
+local Northrend = "Northrend"
+local The_Maelstrom = "The Maelstrom"
+local Pandaria = "Pandaria"
+local Draenor = "Draenor"
+
+local X_Y_ZEPPELIN = "%s - %s Zeppelin"
+local X_Y_BOAT = "%s - %s Boat"
+local X_Y_PORTAL = "%s - %s Portal"
+local X_Y_TELEPORT = "%s - %s Teleport"
+
+
+if GetLocale() == "zhCN" then
+	X_Y_ZEPPELIN = "%s - %s 飞艇"
+	X_Y_BOAT = "%s - %s 船"
+	X_Y_PORTAL = "%s - %s 传送门"
+	X_Y_TELEPORT = "%s - %s 传送门"
+elseif GetLocale() == "zhTW" then
+	X_Y_ZEPPELIN = "%s - %s 飛艇"
+	X_Y_BOAT = "%s - %s 船"
+	X_Y_PORTAL = "%s - %s 傳送門"
+	X_Y_TELEPORT = "%s - %s 傳送門"
+elseif GetLocale() == "frFR" then
+	X_Y_ZEPPELIN = "Zeppelin %s - %s"
+	X_Y_BOAT = "Bateau %s - %s"
+	X_Y_PORTAL = "Portail %s - %s"
+	X_Y_TELEPORT = "Téléport %s - %s"
+elseif GetLocale() == "koKR" then
+	X_Y_ZEPPELIN = "%s - %s 비행선"
+	X_Y_BOAT = "%s - %s 배"
+	X_Y_PORTAL = "%s - %s 차원문"
+	X_Y_TELEPORT = "%s - %s 차원문"
+end
+
+local recZones = {}
+local recInstances = {}
+local lows = setmetatable({}, {__index = function() return 0 end})
+local highs = setmetatable({}, getmetatable(lows))
+local continents = {}
+local instances = {}
+local paths = {}
+local types = {}
+local groupSizes = {}
+local groupAltSizes = {}
+local factions = {}
+local yardWidths = {}
+local yardHeights = {}
+local yardXOffsets = {}
+local yardYOffsets = {}
+local continentScales = {}
+local fishing = {}
+local battlepet_lows = {}
+local battlepet_highs = {}
+local cost = {}
+local textures = {}
+local textures_rev = {}
+local complexOfInstance = {}
+local zoneComplexes = {}
+local entrancePortals_zone = {}
+local entrancePortals_x = {}
+local entrancePortals_y = {}
+
+local zoneIDtoContinentID = {}
+
+-- HELPER AND LOOKUP FUNCTIONS -------------------------------------------------------------
+
+local function PLAYER_LEVEL_UP(self, level)
+	playerLevel = level or UnitLevel("player")
+	for k in pairs(recZones) do
+		recZones[k] = nil
+	end
+	for k in pairs(recInstances) do
+		recInstances[k] = nil
+	end
+	for k in pairs(cost) do
+		cost[k] = nil
+	end
+	for zone in pairs(lows) do
+		if not self:IsHostile(zone) then
+			local low, high = self:GetLevel(zone)
+			local zoneType = self:GetType(zone)
+			if zoneType == "Zone" or zoneType == "PvP Zone" and low and high then
+				if low <= playerLevel and playerLevel <= high then
+					recZones[zone] = true
+				end
+			elseif zoneType == "Battleground" and low and high then
+				local playerLevel = playerLevel
+				if low <= playerLevel and playerLevel <= high then
+					recInstances[zone] = true
+				end
+			elseif zoneType == "Instance" and low and high then
+				if low <= playerLevel and playerLevel <= high then
+					recInstances[zone] = true
+				end
+			end
+		end
+	end
+end
+
+-- Public alternative for GetMapContinents, removes the map IDs that were added to its output in WoW 6.0
+function Tourist:GetMapContinentsAlt()
+	local temp = { GetMapContinents() }
+
+	if tonumber(temp[1]) then
+		-- The first value is an ID instead of a name -> WoW 6.0 or later
+		local continents = {}
+		local index = 0
+		for i = 2, #temp, 2 do
+			index = index + 1
+			continents[index] = temp[i]
+--			trace( "C "..tostring(index).." = "..tostring(continents[index]) )
+		end
+		return continents
+	else
+		-- Backward compatibility for pre-WoW 6.0
+		return temp
+	end
+end
+
+-- Public Alternative for GetMapZones because GetMapZones does NOT return all zones (as of 6.0.2),
+-- making its output useless as input for for SetMapZoom.
+-- Thanks to Blackspirit (US) for this code.
+-- NOTE: This method does not convert duplicate zone names for lookup in LibTourist,
+-- use GetUniqueZoneNameForLookup for that.
+local mapZonesByContinentID = {}
+function Tourist:GetMapZonesAlt(continentID)
+	if mapZonesByContinentID[continentID] then
+		return mapZonesByContinentID[continentID]
+	else
+		-- Just in case GetMapZonesAltLocal has not been called yet:
+		local zones = {}
+		SetMapZoom(continentID)
+		local continentAreaID = GetCurrentMapAreaID()
+		for i=1, 100, 1 do
+			SetMapZoom(continentID, i)
+			local zoneAreaID = GetCurrentMapAreaID()
+			if zoneAreaID == continentAreaID then
+				-- If the index gets out of bounds, the continent map is returned -> exit the loop
+				break
+			end
+			-- Get the localized zone name and store it
+			zones[i] = GetMapNameByID(zoneAreaID)
+		end
+		-- Cache
+		mapZonesByContinentID[continentID] = zones
+		return zones
+	end
+end
+
+-- Local version of GetMapZonesAlt, used during initialisation of LibTourist
+local function GetMapZonesAltLocal(continentID)
+	local zones = {}
+	SetMapZoom(continentID)
+	local continentAreaID = GetCurrentMapAreaID()
+	for i=1, 100, 1 do
+		SetMapZoom(continentID, i)
+		local zoneAreaID = GetCurrentMapAreaID()
+		if zoneAreaID == continentAreaID then
+			-- If the index is out of bounds, the continent map is returned -> exit the loop
+			break
+		end
+		-- Add area IDs to lookup table
+		zoneIDtoContinentID[zoneAreaID] = continentID
+		-- Get the localized zone name and store it
+		zones[i] = GetMapNameByID(zoneAreaID)
+	end
+	-- Cache (for GetMapZonesAlt)
+	mapZonesByContinentID[continentID] = zones
+	return zones
+end
+
+-- Public alternative for GetMapNameByID, returns a unique localized zone name
+-- to be used to lookup data in LibTourist
+function Tourist:GetMapNameByIDAlt(zoneAreaID)
+	local zoneName = GetMapNameByID(zoneAreaID)
+	local continentID = zoneIDtoContinentID[zoneAreaID]
+	return Tourist:GetUniqueZoneNameForLookup(zoneName, continentID)
+end
+
+
+-- Returns a unique localized zone name to be used to lookup data in LibTourist,
+-- based on a localized or English zone name
+function Tourist:GetUniqueZoneNameForLookup(zoneName, continentID)
+	if continentID == 5 then
+		if zoneName == BZ["The Maelstrom"] or zoneName == "The Maelstrom" then
+			zoneName = BZ["The Maelstrom"].." (zone)"
+		end
+	end
+	if continentID == 7 then
+		if zoneName == BZ["Nagrand"] or zoneName == "Nagrand"  then
+			zoneName = BZ["Nagrand"].." ("..BZ["Draenor"]..")"
+		end
+		if zoneName == BZ["Shadowmoon Valley"] or zoneName == "Shadowmoon Valley"  then
+			zoneName = BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")"
+		end
+		if zoneName == BZ["Hellfire Citadel"] or zoneName == "Hellfire Citadel"  then
+			zoneName = BZ["Hellfire Citadel"].." ("..BZ["Draenor"]..")"
+		end
+	end
+	return zoneName
+end
+
+-- Returns a unique English zone name to be used to lookup data in LibTourist,
+-- based on a localized or English zone name
+function Tourist:GetUniqueEnglishZoneNameForLookup(zoneName, continentID)
+	if continentID == 5 then
+		if zoneName == BZ["The Maelstrom"] or zoneName == "The Maelstrom" then
+			zoneName = "The Maelstrom (zone)"
+		end
+	end
+	if continentID == 7 then
+		if zoneName == BZ["Nagrand"] or zoneName == "Nagrand" then
+			zoneName = "Nagrand (Draenor)"
+		end
+		if zoneName == BZ["Shadowmoon Valley"] or zoneName == "Shadowmoon Valley" then
+			zoneName = "Shadowmoon Valley (Draenor)"
+		end
+		if zoneName == BZ["Hellfire Citadel"] or zoneName == "Hellfire Citadel" then
+			zoneName = "Hellfire Citadel (Draenor)"
+		end
+	end
+	return zoneName
+end
+
+-- Minimum fishing skill to fish these zones junk-free (Draenor: to catch Enormous Fish only)
+function Tourist:GetFishingLevel(zone)
+	return fishing[zone]
+end
+
+function Tourist:GetBattlePetLevel(zone)
+	return battlepet_lows[zone], battlepet_highs[zone]
+end
+
+
+function Tourist:GetLevelString(zone)
+	local lo, hi = Tourist:GetLevel(zone)
+	if lo and hi then
+		if lo == hi then
+			return tostring(lo)
+		else
+			return tostring(lo).."-"..tostring(hi)
+		end
+	else
+		return tostring(lo) or tostring(hi) or ""
+	end
+end
+
+function Tourist:GetBattlePetLevelString(zone)
+	local lo, hi = Tourist:GetBattlePetLevel(zone)
+	if lo and hi then
+		if lo == hi then
+			return tostring(lo)
+		else
+			return tostring(lo).."-"..tostring(hi)
+		end
+	else
+		return tostring(lo) or tostring(hi) or ""
+	end
+end
+
+function Tourist:GetLevel(zone)
+	if types[zone] == "Battleground" then
+		-- Note: Not all BG's start at level 10, but all BG's support players up to MAX_PLAYER_LEVEL.
+
+		local playerLvl = playerLevel
+		if playerLvl <= lows[zone] then
+			-- Player is too low level to enter the BG -> return the lowest available bracket
+			-- by assuming the player is at the min level required for the BG.
+			playerLvl = lows[zone]
+		end
+
+		-- Find the most suitable bracket
+		if playerLvl >= MAX_PLAYER_LEVEL then
+			return MAX_PLAYER_LEVEL, MAX_PLAYER_LEVEL
+		elseif playerLvl >= 95 then
+			return 95, 99
+		elseif playerLvl >= 90 then
+			return 90, 94
+		elseif playerLvl >= 85 then
+			return 85, 89
+		elseif playerLvl >= 80 then
+			return 80, 84
+		elseif playerLvl >= 75 then
+			return 75, 79
+		elseif playerLvl >= 70 then
+			return 70, 74
+		elseif playerLvl >= 65 then
+			return 65, 69
+		elseif playerLvl >= 60 then
+			return 60, 64
+		elseif playerLvl >= 55 then
+			return 55, 59
+		elseif playerLvl >= 50 then
+			return 50, 54
+		elseif playerLvl >= 45 then
+			return 45, 49
+		elseif playerLvl >= 40 then
+			return 40, 44
+		elseif playerLvl >= 35 then
+			return 35, 39
+		elseif playerLvl >= 30 then
+			return 30, 34
+		elseif playerLvl >= 25 then
+			return 25, 29
+		elseif playerLvl >= 20 then
+			return 20, 24
+		elseif playerLvl >= 15 then
+			return 15, 19
+		else
+			return 10, 14
+		end
+	end
+
+	-- All non-battlegrounds:
+	return lows[zone], highs[zone]
+end
+
+function Tourist:GetBattlePetLevelColor(zone, petLevel)
+	local low, high = self:GetBattlePetLevel(zone)
+
+	return Tourist:CalculateLevelColor(low, high, petLevel)
+end
+
+
+function Tourist:GetLevelColor(zone)
+	local low, high = self:GetLevel(zone)
+
+	if types[zone] == "Battleground" then
+		if playerLevel < low then
+			-- player cannot enter the lowest bracket of the BG -> red
+			return 1, 0, 0
+		end
+	end
+
+	return Tourist:CalculateLevelColor(low, high, playerLevel)
+end
+
+
+function Tourist:CalculateLevelColor(low, high, currentLevel)
+	local midBracket = (low + high) / 2
+
+	if low <= 0 and high <= 0 then
+		-- City or level unknown -> White
+		return 1, 1, 1
+	elseif currentLevel == low and currentLevel == high then
+		-- Exact match, one-level bracket -> Yellow
+		return 1, 1, 0
+	elseif currentLevel <= low - 3 then
+		-- Player is three or more levels short of Low -> Red
+		return 1, 0, 0
+	elseif currentLevel < low then
+		-- Player is two or less levels short of Low -> sliding scale between Red and Orange
+		-- Green component goes from 0 to 0.5
+		local greenComponent = (currentLevel - low + 3) / 6
+		return 1, greenComponent, 0
+	elseif currentLevel == low then
+		-- Player is at low, at least two-level bracket -> Orange
+		return 1, 0.5, 0
+	elseif currentLevel < midBracket then
+		-- Player is between low and the middle of the bracket -> sliding scale between Orange and Yellow
+		-- Green component goes from 0.5 to 1
+		local halfBracketSize = (high - low) / 2
+		local posInBracketHalf = currentLevel - low
+		local greenComponent = 0.5 + (posInBracketHalf / halfBracketSize) * 0.5
+		return 1, greenComponent, 0
+	elseif currentLevel == midBracket then
+		-- Player is at the middle of the bracket -> Yellow
+		return 1, 1, 0
+	elseif currentLevel < high then
+		-- Player is between the middle of the bracket and High -> sliding scale between Yellow and Green
+		-- Red component goes from 1 to 0
+		local halfBracketSize = (high - low) / 2
+		local posInBracketHalf = currentLevel - midBracket
+		local redComponent = 1 - (posInBracketHalf / halfBracketSize)
+		return redComponent, 1, 0
+	elseif currentLevel == high then
+		-- Player is at High, at least two-level bracket -> Green
+		return 0, 1, 0
+	elseif currentLevel < high + 3 then
+		-- Player is up to three levels above High -> sliding scale between Green and Gray
+		-- Red and Blue components go from 0 to 0.5
+		-- Green component goes from 1 to 0.5
+		local pos = (currentLevel - high) / 3
+		local redAndBlueComponent = pos * 0.5
+		local greenComponent = 1 - redAndBlueComponent
+		return redAndBlueComponent, greenComponent, redAndBlueComponent
+	else
+		-- Player is at High + 3 or above -> Gray
+		return 0.5, 0.5, 0.5
+	end
+end
+
+function Tourist:GetFactionColor(zone)
+	if factions[zone] == "Sanctuary" then
+		-- Blue
+		return 0.41, 0.8, 0.94
+	elseif self:IsPvPZone(zone) then
+		-- Orange
+		return 1, 0.7, 0
+	elseif factions[zone] == (isHorde and "Alliance" or "Horde") then
+		-- Red
+		return 1, 0, 0
+	elseif factions[zone] == (isHorde and "Horde" or "Alliance") then
+		-- Green
+		return 0, 1, 0
+	else
+		-- Yellow
+		return 1, 1, 0
+	end
+end
+
+function Tourist:GetZoneYardSize(zone)
+	return yardWidths[zone], yardHeights[zone]
+end
+
+function Tourist:GetZoneYardOffset(zone)
+	return yardXOffsets[zone], yardYOffsets[zone]
+end
+
+
+-- This function is used to calculate the distance in yards between two sets of coordinates
+-- Zone can be a continent or Azeroth
+function Tourist:GetYardDistance(zone1, x1, y1, zone2, x2, y2)
+	local zone1_continent = continents[zone1]
+	local zone2_continent = continents[zone2]
+
+	if not zone1_continent or not zone2_continent then
+		-- Unknown zone
+		return nil
+	end
+	if (zone1_continent == Outland) ~= (zone2_continent == Outland) then
+		-- Cannot calculate distances from or to outside Outland
+		return nil
+	end
+	if (zone1_continent == The_Maelstrom or zone2_continent == The_Maelstrom) and (zone1 ~= zone2) then
+		-- Cannot calculate distances from or to outside The Maelstrom
+		-- In addition, in The Maelstrom only distances within a single zone can be calculated
+		-- as the zones are not geographically related to each other
+		return nil
+	end
+	if (zone1_continent == Draenor) ~= (zone2_continent == Draenor) then
+		-- Cannot calculate distances from or to outside Draenor
+		return nil
+	end
+
+	-- Get the zone sizes in yards
+	local zone1_yardWidth = yardWidths[zone1]
+	local zone1_yardHeight = yardHeights[zone1]
+	local zone2_yardWidth = yardWidths[zone2]
+	local zone2_yardHeight = yardHeights[zone2]
+	if not zone1_yardWidth or not zone2_yardWidth or zone1_yardWidth == 0 or zone2_yardWidth == 0 then
+		-- Need zone sizes to continue
+		return nil
+	end
+
+	-- Convert position coordinates (a value between 0 and 1) to yards, measured from the top and the left of the map
+	local x1_yard = zone1_yardWidth * x1
+	local y1_yard = zone1_yardHeight * y1
+	local x2_yard = zone2_yardWidth * x2
+	local y2_yard = zone2_yardHeight * y2
+
+	if zone1 ~= zone2 then
+		-- The two locations are not within the same zone. Get the zone offsets (their position at the continent map), which
+		-- are also measured from the top and the left of the map
+		local zone1_yardXOffset = yardXOffsets[zone1]
+		local zone1_yardYOffset = yardYOffsets[zone1]
+		local zone2_yardXOffset = yardXOffsets[zone2]
+		local zone2_yardYOffset = yardYOffsets[zone2]
+
+		-- Don't apply zone offsets if a zone is a continent (this includes Azeroth)
+		if zone1 == zone1_continent then
+			zone1_yardXOffset = 0
+			zone1_yardYOffset = 0
+		end
+		if zone2 == zone2_continent then
+			zone2_yardXOffset = 0
+			zone2_yardYOffset = 0
+		end
+
+		if not zone1_yardXOffset or not zone1_yardYOffset or not zone2_yardXOffset or not zone2_yardYOffset then
+			-- Need all offsets to continue
+			return nil
+		end
+
+		-- Calculate the positions on the continent map, in yards
+		x1_yard = x1_yard + zone1_yardXOffset
+		y1_yard = y1_yard + zone1_yardYOffset
+
+		x2_yard = x2_yard + zone2_yardXOffset
+		y2_yard = y2_yard + zone2_yardYOffset
+
+		if zone1_continent ~= zone2_continent then
+			-- The two locations are not on the same continent
+			-- Possible continents here are the Azeroth continents, except The Maelstrom.
+			local cont1_scale = continentScales[zone1_continent]
+			local cont1_XOffset = yardXOffsets[zone1_continent]
+			local cont1_YOffset = yardYOffsets[zone1_continent]
+			local cont2_scale = continentScales[zone2_continent]
+			local cont2_XOffset = yardXOffsets[zone2_continent]
+			local cont2_YOffset = yardYOffsets[zone2_continent]
+
+			-- Calculate x and y on the Azeroth map, expressed in Azeroth yards
+			if zone1 ~= Azeroth then
+				x1_yard = (x1_yard * cont1_scale) + cont1_XOffset
+				y1_yard = (y1_yard * cont1_scale) + cont1_YOffset
+			end
+			if zone2 ~= Azeroth then
+				x2_yard = (x2_yard * cont2_scale) + cont2_XOffset
+				y2_yard = (y2_yard * cont2_scale) + cont2_YOffset
+			end
+
+			-- Calculate distance, in Azeroth yards
+			local x_diff = x1_yard - x2_yard
+			local y_diff = y1_yard - y2_yard
+			local distAz = x_diff*x_diff + y_diff*y_diff
+
+			if zone1 ~= Azeroth then
+				-- Correct the distance for the source continent scale
+				return (distAz^0.5) / cont1_scale
+			else
+				return (distAz^0.5)
+			end
+		end
+	end
+
+	-- x and y for both locations are now at the same map level (a zone or a continent) -> calculate distance
+	local x_diff = x1_yard - x2_yard
+	local y_diff = y1_yard - y2_yard
+	local dist_2 = x_diff*x_diff + y_diff*y_diff
+	return dist_2^0.5
+end
+
+-- This function is used to calculate the coordinates of a location in zone1, on the map of zone2.
+-- Zone can be a continent or Azeroth
+function Tourist:TransposeZoneCoordinate(x, y, zone1, zone2)
+--	trace("TZC: z1 = "..tostring(zone1)..", z2 = "..tostring(zone2))
+
+	if zone1 == zone2 then
+		-- Nothing to do
+		return x, y
+	end
+
+	local zone1_continent = continents[zone1]
+	local zone2_continent = continents[zone2]
+	if not zone1_continent or not zone2_continent then
+		-- Unknown zone
+		return nil
+	end
+	if (zone1_continent == Outland) ~= (zone2_continent == Outland) then
+		-- Cannot transpose from or to outside Outland
+		return nil
+	end
+	if (zone1_continent == The_Maelstrom or zone2_continent == The_Maelstrom) then
+		-- Cannot transpose from, to or within The Maelstrom
+		return nil
+	end
+	if (zone1_continent == Draenor) ~= (zone2_continent == Draenor) then
+		-- Cannot transpose from or to outside Draenor
+		return nil
+	end
+
+	-- Get the zone sizes in yards
+	local zone1_yardWidth = yardWidths[zone1]
+	local zone1_yardHeight = yardHeights[zone1]
+	local zone2_yardWidth = yardWidths[zone2]
+	local zone2_yardHeight = yardHeights[zone2]
+	if not zone1_yardWidth or not zone2_yardWidth or zone1_yardWidth == 0 or zone2_yardWidth == 0 then
+		-- Need zone sizes to continue
+		return nil
+	end
+
+	-- Get zone offsets
+	local zone1_yardXOffset = yardXOffsets[zone1]
+	local zone1_yardYOffset = yardYOffsets[zone1]
+	local zone2_yardXOffset = yardXOffsets[zone2]
+	local zone2_yardYOffset = yardYOffsets[zone2]
+	if not zone1_yardXOffset or not zone1_yardYOffset or not zone2_yardXOffset or not zone2_yardYOffset then
+		-- Need all offsets to continue
+		return nil
+	end
+
+	-- Don't apply zone offsets if a zone is a continent (this includes Azeroth)
+	if zone1 == zone1_continent then
+		zone1_yardXOffset = 0
+		zone1_yardYOffset = 0
+	end
+	if zone2 == zone2_continent then
+		zone2_yardXOffset = 0
+		zone2_yardYOffset = 0
+	end
+
+	-- Convert source coordinates (a value between 0 and 1) to yards, measured from the top and the left of the map
+	local x_yard = zone1_yardWidth * x
+	local y_yard = zone1_yardHeight * y
+
+	-- Calculate the positions on the continent map, in yards
+	x_yard = x_yard + zone1_yardXOffset
+	y_yard = y_yard + zone1_yardYOffset
+
+	if zone1_continent ~= zone2_continent then
+		-- Target zone is not on the same continent
+		-- Possible continents here are the Azeroth continents, except The Maelstrom.
+		local cont1_scale = continentScales[zone1_continent]
+		local cont1_XOffset = yardXOffsets[zone1_continent]
+		local cont1_YOffset = yardYOffsets[zone1_continent]
+		local cont2_scale = continentScales[zone2_continent]
+		local cont2_XOffset = yardXOffsets[zone2_continent]
+		local cont2_YOffset = yardYOffsets[zone2_continent]
+
+		if zone1 ~= Azeroth then
+			-- Translate the coordinate from the source continent to Azeroth
+			x_yard = (x_yard * cont1_scale) + cont1_XOffset
+			y_yard = (y_yard * cont1_scale) + cont1_YOffset
+		end
+
+		if zone2 ~= Azeroth then
+			-- Translate the coordinate from Azeroth to the target continent
+			x_yard = (x_yard - cont2_XOffset) / cont2_scale
+			y_yard = (y_yard - cont2_YOffset) / cont2_scale
+		end
+	end
+
+	-- 'Move' (transpose) the coordinates to the target zone
+	x_yard = x_yard - zone2_yardXOffset
+	y_yard = y_yard - zone2_yardYOffset
+
+	-- Convert yards back to coordinates
+	x = x_yard / zone2_yardWidth
+	y = y_yard / zone2_yardHeight
+
+	return x, y
+end
+
+local zonesToIterate = setmetatable({}, {__index = function(self, key)
+	local t = {}
+	self[key] = t
+	for k,v in pairs(continents) do
+		if v == key and v ~= k and yardXOffsets[k] then
+			t[#t+1] = k
+		end
+	end
+	return t
+end})
+
+
+-- This function is used to find the actual zone a player is in, including coordinates for that zone, if the current map
+-- is a map that contains the player position, but is not the map of the zone where the player really is.
+-- x, y = player position on current map
+-- zone = the zone of the current map
+function Tourist:GetBestZoneCoordinate(x, y, zone)
+	-- This only works properly if we have a player position and the current map zone is not a continent or so
+	if not x or not y or not zone or x ==0 or y == 0 or Tourist:IsContinent(zone) then
+		return x, y, zone
+	end
+
+	-- Get current map zone data
+	local zone_continent = continents[zone]
+	local zone_yardXOffset = yardXOffsets[zone]
+	local zone_yardYOffset = yardYOffsets[zone]
+	local zone_yardWidth = yardWidths[zone]
+	local zone_yardHeight = yardHeights[zone]
+	if not zone_yardXOffset or not zone_yardYOffset or not zone_yardWidth or not zone_yardHeight then
+		-- Need all offsets to continue
+		return x, y, zone
+	end
+
+	-- Convert coordinates to offsets in yards (within the zone)
+	local x_yard = zone_yardWidth * x
+	local y_yard = zone_yardHeight * y
+
+	-- Translate the location to a location on the continent map
+	x_yard = x_yard + zone_yardXOffset
+	y_yard = y_yard + zone_yardYOffset
+
+	local best_zone, best_x, best_y, best_value
+
+	-- Loop through all zones on the continent...
+	for _,z in ipairs(zonesToIterate[zone_continent]) do
+		local z_yardXOffset = yardXOffsets[z]
+		local z_yardYOffset = yardYOffsets[z]
+		local z_yardWidth = yardWidths[z]
+		local z_yardHeight = yardHeights[z]
+
+		-- Translate the coordinates to the zone
+		local x_yd = x_yard - z_yardXOffset
+		local y_yd = y_yard - z_yardYOffset
+
+		if x_yd >= 0 and y_yd >= 0 and x_yd <= z_yardWidth and y_yd <= z_yardHeight then
+			-- Coordinates are within the probed zone
+			if types[z] == "City" then
+				-- City has no adjacent zones -> done
+				return x_yd/z_yardWidth, y_yd/z_yardHeight, z
+			end
+			-- Calculate the midpoint of the zone map
+			local x_tmp = x_yd - z_yardWidth / 2
+			local y_tmp = y_yd - z_yardHeight / 2
+			-- Calculate the distance (sort of, no need to sqrt)
+			local value = x_tmp*x_tmp + y_tmp*y_tmp
+			if not best_value or value < best_value then
+				-- Lowest distance wins (= closest to map center)
+				best_zone = z
+				best_value = value
+				best_x = x_yd/z_yardWidth
+				best_y = y_yd/z_yardHeight
+			end
+		end
+	end
+
+	if not best_zone then
+		-- No best zone found -> best map is the continent map
+		return x_yard / yardWidths[zone_continent], y_yard / yardHeights[zone_continent], zone_continent
+	end
+
+	return best_x, best_y, best_zone
+end
+
+
+local function retNil() return nil end
+local function retOne(object, state)
+	if state == object then
+		return nil
+	else
+		return object
+	end
+end
+
+local function retNormal(t, position)
+	return (next(t, position))
+end
+
+local function round(num, digits)
+	-- banker's rounding
+	local mantissa = 10^digits
+	local norm = num*mantissa
+	norm = norm + 0.5
+	local norm_f = math.floor(norm)
+	if norm == norm_f and (norm_f % 2) ~= 0 then
+		return (norm_f-1)/mantissa
+	end
+	return norm_f/mantissa
+end
+
+local function mysort(a,b)
+	if not lows[a] then
+		return false
+	elseif not lows[b] then
+		return true
+	else
+		local aval, bval = groupSizes[a], groupSizes[b]
+		if aval and bval then
+			if aval ~= bval then
+				return aval < bval
+			end
+		end
+		aval, bval = lows[a], lows[b]
+		if aval ~= bval then
+			return aval < bval
+		end
+		aval, bval = highs[a], highs[b]
+		if aval ~= bval then
+			return aval < bval
+		end
+		return a < b
+	end
+end
+local t = {}
+local function myiter(t)
+	local n = t.n
+	n = n + 1
+	local v = t[n]
+	if v then
+		t[n] = nil
+		t.n = n
+		return v
+	else
+		t.n = nil
+	end
+end
+function Tourist:IterateZoneInstances(zone)
+	local inst = instances[zone]
+
+	if not inst then
+		return retNil
+	elseif type(inst) == "table" then
+		for k in pairs(t) do
+			t[k] = nil
+		end
+		for k in pairs(inst) do
+			t[#t+1] = k
+		end
+		table.sort(t, mysort)
+		t.n = 0
+		return myiter, t, nil
+	else
+		return retOne, inst, nil
+	end
+end
+
+function Tourist:IterateZoneComplexes(zone)
+	local compl = zoneComplexes[zone]
+
+	if not compl then
+		return retNil
+	elseif type(compl) == "table" then
+		for k in pairs(t) do
+			t[k] = nil
+		end
+		for k in pairs(compl) do
+			t[#t+1] = k
+		end
+		table.sort(t, mysort)
+		t.n = 0
+		return myiter, t, nil
+	else
+		return retOne, compl, nil
+	end
+end
+
+function Tourist:GetInstanceZone(instance)
+	for k, v in pairs(instances) do
+		if v then
+			if type(v) == "string" then
+				if v == instance then
+					return k
+				end
+			else -- table
+				for l in pairs(v) do
+					if l == instance then
+						return k
+					end
+				end
+			end
+		end
+	end
+end
+
+function Tourist:GetComplexZone(complex)
+	for k, v in pairs(zoneComplexes) do
+		if v then
+			if type(v) == "string" then
+				if v == complex then
+					return k
+				end
+			else -- table
+				for l in pairs(v) do
+					if l == complex then
+						return k
+					end
+				end
+			end
+		end
+	end
+end
+
+function Tourist:DoesZoneHaveInstances(zone)
+	return not not instances[zone]
+end
+
+function Tourist:DoesZoneHaveComplexes(zone)
+	return not not zoneComplexes[zone]
+end
+
+local zonesInstances
+local function initZonesInstances()
+	if not zonesInstances then
+		zonesInstances = {}
+		for zone, v in pairs(lows) do
+			if types[zone] ~= "Transport" then
+				zonesInstances[zone] = true
+			end
+		end
+	end
+	initZonesInstances = nil
+end
+
+function Tourist:IterateZonesAndInstances()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return retNormal, zonesInstances, nil
+end
+
+local function zoneIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and (types[k] == "Instance" or types[k] == "Battleground" or types[k] == "Arena" or types[k] == "Complex") do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IterateZones()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return zoneIter, nil, nil
+end
+
+local function instanceIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and (types[k] ~= "Instance" and types[k] ~= "Battleground" and types[k] ~= "Arena") do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IterateInstances()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return instanceIter, nil, nil
+end
+
+local function bgIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and types[k] ~= "Battleground" do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IterateBattlegrounds()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return bgIter, nil, nil
+end
+
+local function arIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and types[k] ~= "Arena" do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IterateArenas()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return arIter, nil, nil
+end
+
+local function compIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and types[k] ~= "Complex" do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IterateComplexes()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return compIter, nil, nil
+end
+
+local function pvpIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and types[k] ~= "PvP Zone" do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IteratePvPZones()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return pvpIter, nil, nil
+end
+
+local function allianceIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and factions[k] ~= "Alliance" do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IterateAlliance()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return allianceIter, nil, nil
+end
+
+local function hordeIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and factions[k] ~= "Horde" do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IterateHorde()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return hordeIter, nil, nil
+end
+
+if isHorde then
+	Tourist.IterateFriendly = Tourist.IterateHorde
+	Tourist.IterateHostile = Tourist.IterateAlliance
+else
+	Tourist.IterateFriendly = Tourist.IterateAlliance
+	Tourist.IterateHostile = Tourist.IterateHorde
+end
+
+local function sanctIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and factions[k] ~= "Sanctuary" do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IterateSanctuaries()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return sanctIter, nil, nil
+end
+
+local function contestedIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and factions[k] do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IterateContested()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return contestedIter, nil, nil
+end
+
+local function kalimdorIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and continents[k] ~= Kalimdor do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IterateKalimdor()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return kalimdorIter, nil, nil
+end
+
+local function easternKingdomsIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and continents[k] ~= Eastern_Kingdoms do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IterateEasternKingdoms()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return easternKingdomsIter, nil, nil
+end
+
+local function outlandIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and continents[k] ~= Outland do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IterateOutland()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return outlandIter, nil, nil
+end
+
+local function northrendIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and continents[k] ~= Northrend do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IterateNorthrend()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return northrendIter, nil, nil
+end
+
+local function theMaelstromIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and continents[k] ~= The_Maelstrom do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IterateTheMaelstrom()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return theMaelstromIter, nil, nil
+end
+
+local function pandariaIter(_, position)
+	local k = next(zonesInstances, position)
+	while k ~= nil and continents[k] ~= Pandaria do
+		k = next(zonesInstances, k)
+	end
+	return k
+end
+function Tourist:IteratePandaria()
+	if initZonesInstances then
+		initZonesInstances()
+	end
+	return pandariaIter, nil, nil
+end
+
+function Tourist:IterateRecommendedZones()
+	return retNormal, recZones, nil
+end
+
+function Tourist:IterateRecommendedInstances()
+	return retNormal, recInstances, nil
+end
+
+function Tourist:HasRecommendedInstances()
+	return next(recInstances) ~= nil
+end
+
+function Tourist:IsInstance(zone)
+	local t = types[zone]
+	return t == "Instance" or t == "Battleground" or t == "Arena"
+end
+
+function Tourist:IsZone(zone)
+	local t = types[zone]
+	return t and t ~= "Instance" and t ~= "Battleground" and t ~= "Transport" and t ~= "Arena" and t ~= "Complex"
+end
+
+function Tourist:IsContinent(zone)
+	local t = types[zone]
+	return t == "Continent"
+end
+
+function Tourist:GetComplex(zone)
+	return complexOfInstance[zone]
+end
+
+function Tourist:GetType(zone)
+	return types[zone] or "Zone"
+end
+
+function Tourist:IsZoneOrInstance(zone)
+	local t = types[zone]
+	return t and t ~= "Transport"
+end
+
+function Tourist:IsTransport(zone)
+	local t = types[zone]
+	return t == "Transport"
+end
+
+function Tourist:IsComplex(zone)
+	local t = types[zone]
+	return t == "Complex"
+end
+
+function Tourist:IsBattleground(zone)
+	local t = types[zone]
+	return t == "Battleground"
+end
+
+function Tourist:IsArena(zone)
+	local t = types[zone]
+	return t == "Arena"
+end
+
+function Tourist:IsPvPZone(zone)
+	local t = types[zone]
+	return t == "PvP Zone"
+end
+
+function Tourist:IsCity(zone)
+	local t = types[zone]
+	return t == "City"
+end
+
+function Tourist:IsAlliance(zone)
+	return factions[zone] == "Alliance"
+end
+
+function Tourist:IsHorde(zone)
+	return factions[zone] == "Horde"
+end
+
+if isHorde then
+	Tourist.IsFriendly = Tourist.IsHorde
+	Tourist.IsHostile = Tourist.IsAlliance
+else
+	Tourist.IsFriendly = Tourist.IsAlliance
+	Tourist.IsHostile = Tourist.IsHorde
+end
+
+function Tourist:IsSanctuary(zone)
+	return factions[zone] == "Sanctuary"
+end
+
+function Tourist:IsContested(zone)
+	return not factions[zone]
+end
+
+function Tourist:GetContinent(zone)
+	return continents[zone] or UNKNOWN
+end
+
+function Tourist:IsInKalimdor(zone)
+	return continents[zone] == Kalimdor
+end
+
+function Tourist:IsInEasternKingdoms(zone)
+	return continents[zone] == Eastern_Kingdoms
+end
+
+function Tourist:IsInOutland(zone)
+	return continents[zone] == Outland
+end
+
+function Tourist:IsInNorthrend(zone)
+	return continents[zone] == Northrend
+end
+
+function Tourist:IsInTheMaelstrom(zone)
+	return continents[zone] == The_Maelstrom
+end
+
+function Tourist:IsInPandaria(zone)
+	return continents[zone] == Pandaria
+end
+
+function Tourist:GetInstanceGroupSize(instance)
+	return groupSizes[instance] or 0
+end
+
+function Tourist:GetInstanceAltGroupSize(instance)
+	return groupAltSizes[instance] or 0
+end
+
+function Tourist:GetTexture(zone)
+	return textures[zone]
+end
+
+function Tourist:GetZoneFromTexture(texture)
+	if not texture then
+		return "Azeroth"
+	end
+	local zone = textures_rev[texture]
+	if zone then
+		return zone
+	else
+		-- Might be phased terrain, look for "_terrain<number>" postfix
+		local pos1 = string.find(texture, "_terrain")
+		if pos1 then
+			-- Remove the postfix from the texture name and try again
+			texture = string.sub(texture, 0, pos1 - 1)
+			zone = textures_rev[texture]
+			if zone then
+				return zone
+			end
+		end
+		-- Might be tiered terrain (garrison), look for "_tier<number>" postfix
+		local pos2 = string.find(texture, "_tier")
+		if pos2 then
+			-- Remove the postfix from the texture name and try again
+			texture = string.sub(texture, 0, pos2 - 1)
+			zone = textures_rev[texture]
+			if zone then
+				return zone
+			end
+		end
+	end
+	return nil
+end
+
+function Tourist:GetEnglishZoneFromTexture(texture)
+	if not texture then
+		return "Azeroth"
+	end
+	local zone = textures_rev[texture]
+	if zone then
+		return BZR[zone]
+	else
+		-- Might be phased terrain, look for "_terrain<number>" postfix
+		local pos1 = string.find(texture, "_terrain")
+		if pos1 then
+			-- Remove the postfix from the texture name
+			texture = string.sub(texture, 0, pos1 - 1)
+			zone = textures_rev[texture]
+			if zone then
+				return BZR[zone]
+			end
+		end
+		-- Might be tiered terrain (garrison), look for "_tier<number>" postfix
+		local pos2 = string.find(texture, "_tier")
+		if pos2 then
+			-- Remove the postfix from the texture name and try again
+			texture = string.sub(texture, 0, pos2 - 1)
+			zone = textures_rev[texture]
+			if zone then
+				return BZR[zone]
+			end
+		end
+	end
+	return nil
+end
+
+function Tourist:GetEntrancePortalLocation(instance)
+	return entrancePortals_zone[instance], entrancePortals_x[instance], entrancePortals_y[instance]
+end
+
+local inf = math.huge
+local stack = setmetatable({}, {__mode='k'})
+local function iterator(S)
+	local position = S['#'] - 1
+	S['#'] = position
+	local x = S[position]
+	if not x then
+		for k in pairs(S) do
+			S[k] = nil
+		end
+		stack[S] = true
+		return nil
+	end
+	return x
+end
+
+setmetatable(cost, {
+	__index = function(self, vertex)
+		local price = 1
+
+		if lows[vertex] > playerLevel then
+			price = price * (1 + math.ceil((lows[vertex] - playerLevel) / 6))
+		end
+
+		if factions[vertex] == (isHorde and "Horde" or "Alliance") then
+			price = price / 2
+		elseif factions[vertex] == (isHorde and "Alliance" or "Horde") then
+			if types[vertex] == "City" then
+				price = price * 10
+			else
+				price = price * 3
+			end
+		end
+
+		if types[x] == "Transport" then
+			price = price * 2
+		end
+
+		self[vertex] = price
+		return price
+	end
+})
+
+function Tourist:IteratePath(alpha, bravo)
+	if paths[alpha] == nil or paths[bravo] == nil then
+		return retNil
+	end
+
+	local d = next(stack) or {}
+	stack[d] = nil
+	local Q = next(stack) or {}
+	stack[Q] = nil
+	local S = next(stack) or {}
+	stack[S] = nil
+	local pi = next(stack) or {}
+	stack[pi] = nil
+
+	for vertex, v in pairs(paths) do
+		d[vertex] = inf
+		Q[vertex] = v
+	end
+	d[alpha] = 0
+
+	while next(Q) do
+		local u
+		local min = inf
+		for z in pairs(Q) do
+			local value = d[z]
+			if value < min then
+				min = value
+				u = z
+			end
+		end
+		if min == inf then
+			return retNil
+		end
+		Q[u] = nil
+		if u == bravo then
+			break
+		end
+
+		local adj = paths[u]
+		if type(adj) == "table" then
+			local d_u = d[u]
+			for v in pairs(adj) do
+				local c = d_u + cost[v]
+				if d[v] > c then
+					d[v] = c
+					pi[v] = u
+				end
+			end
+		elseif adj ~= false then
+			local c = d[u] + cost[adj]
+			if d[adj] > c then
+				d[adj] = c
+				pi[adj] = u
+			end
+		end
+	end
+
+	local i = 1
+	local last = bravo
+	while last do
+		S[i] = last
+		i = i + 1
+		last = pi[last]
+	end
+
+	for k in pairs(pi) do
+		pi[k] = nil
+	end
+	for k in pairs(Q) do
+		Q[k] = nil
+	end
+	for k in pairs(d) do
+		d[k] = nil
+	end
+	stack[pi] = true
+	stack[Q] = true
+	stack[d] = true
+
+	S['#'] = i
+
+	return iterator, S
+end
+
+local function retWithOffset(t, key)
+	while true do
+		key = next(t, key)
+		if not key then
+			return nil
+		end
+		if yardYOffsets[key] then
+			return key
+		end
+	end
+end
+
+function Tourist:IterateBorderZones(zone, zonesOnly)
+	local path = paths[zone]
+	if not path then
+		return retNil
+	elseif type(path) == "table" then
+		return zonesOnly and retWithOffset or retNormal, path
+	else
+		if zonesOnly and not yardYOffsets[path] then
+			return retNil
+		end
+		return retOne, path
+	end
+end
+
+function Tourist:GetLookupTable()
+	return BZ
+end
+
+function Tourist:GetReverseLookupTable()
+	return BZR
+end
+
+--------------------------------------------------------------------------------------------------------
+--                                            Localization                                            --
+--------------------------------------------------------------------------------------------------------
+local MapIdLookupTable = {
+	[-1] = "Azeroth",
+	[4] = "Durotar",
+	[9] = "Mulgore",
+	[11] = "Northern Barrens",
+	[13] = "Kalimdor",
+	[14] = "Eastern Kingdoms",
+	[16] = "Arathi Highlands",
+	[17] = "Badlands",
+	[19] = "Blasted Lands",
+	[20] = "Tirisfal Glades",
+	[21] = "Silverpine Forest",
+	[22] = "Western Plaguelands",
+	[23] = "Eastern Plaguelands",
+	[24] = "Hillsbrad Foothills",
+	[26] = "The Hinterlands",
+	[27] = "Dun Morogh",
+	[28] = "Searing Gorge",
+	[29] = "Burning Steppes",
+	[30] = "Elwynn Forest",
+	[32] = "Deadwind Pass",
+	[34] = "Duskwood",
+	[35] = "Loch Modan",
+	[36] = "Redridge Mountains",
+	[37] = "Northern Stranglethorn",
+	[38] = "Swamp of Sorrows",
+	[39] = "Westfall",
+	[40] = "Wetlands",
+	[41] = "Teldrassil",
+	[42] = "Darkshore",
+	[43] = "Ashenvale",
+	[61] = "Thousand Needles",
+	[81] = "Stonetalon Mountains",
+	[101] = "Desolace",
+	[121] = "Feralas",
+	[141] = "Dustwallow Marsh",
+	[161] = "Tanaris",
+	[181] = "Azshara",
+	[182] = "Felwood",
+	[201] = "Un'Goro Crater",
+	[241] = "Moonglade",
+	[261] = "Silithus",
+	[281] = "Winterspring",
+	[301] = "Stormwind City",
+	[321] = "Orgrimmar",
+	[341] = "Ironforge",
+	[362] = "Thunder Bluff",
+	[381] = "Darnassus",
+	[382] = "Undercity",
+	[401] = "Alterac Valley",
+	[443] = "Warsong Gulch",
+	[461] = "Arathi Basin",
+	[462] = "Eversong Woods",
+	[463] = "Ghostlands",
+	[464] = "Azuremyst Isle",
+	[465] = "Hellfire Peninsula",
+	[466] = "Outland",
+	[467] = "Zangarmarsh",
+	[471] = "The Exodar",
+	[473] = "Shadowmoon Valley",
+	[475] = "Blade's Edge Mountains",
+	[476] = "Bloodmyst Isle",
+	[477] = "Nagrand",
+	[478] = "Terokkar Forest",
+	[479] = "Netherstorm",
+	[480] = "Silvermoon City",
+	[481] = "Shattrath City",
+	[482] = "Eye of the Storm",
+	[485] = "Northrend",
+	[486] = "Borean Tundra",
+	[488] = "Dragonblight",
+	[490] = "Grizzly Hills",
+	[491] = "Howling Fjord",
+	[492] = "Icecrown",
+	[493] = "Sholazar Basin",
+	[495] = "The Storm Peaks",
+	[496] = "Zul'Drak",
+	[499] = "Isle of Quel'Danas",
+	[501] = "Wintergrasp",
+	[502] = "The Scarlet Enclave",
+	[504] = "Dalaran",
+	[510] = "Crystalsong Forest",
+	[512] = "Strand of the Ancients",
+	[520] = "The Nexus",
+	[521] = "The Culling of Stratholme",
+	[522] = "Ahn'kahet: The Old Kingdom",
+	[523] = "Utgarde Keep",
+	[524] = "Utgarde Pinnacle",
+	[525] = "Halls of Lightning",
+	[526] = "Halls of Stone",
+	[527] = "The Eye of Eternity",
+	[528] = "The Oculus",
+	[529] = "Ulduar",
+	[530] = "Gundrak",
+	[531] = "The Obsidian Sanctum",
+	[532] = "Vault of Archavon",
+	[533] = "Azjol-Nerub",
+	[534] = "Drak'Tharon Keep",
+	[535] = "Naxxramas",
+	[536] = "The Violet Hold",
+	[539] = "Gilneas",
+	[540] = "Isle of Conquest",
+	[541] = "Hrothgar's Landing",
+	[542] = "Trial of the Champion",
+	[543] = "Trial of the Crusader",
+	[544] = "The Lost Isles",
+	[545] = "Gilneas",
+	[601] = "The Forge of Souls",
+	[602] = "Pit of Saron",
+	[603] = "Halls of Reflection",
+	[604] = "Icecrown Citadel",
+	[605] = "Kezan",
+	[606] = "Mount Hyjal",
+	[607] = "Southern Barrens",
+	[609] = "The Ruby Sanctum",
+	[610] = "Kelp'thar Forest",
+	[611] = "Gilneas City",
+	[613] = "Vashj'ir",
+	[614] = "Abyssal Depths",
+	[615] = "Shimmering Expanse",
+	[626] = "Twin Peaks",
+	[640] = "Deepholm",
+	[673] = "The Cape of Stranglethorn",
+	[677] = "The Battle for Gilneas",
+	[678] = "Gilneas",
+	[679] = "Gilneas",
+	[680] = "Ragefire Chasm",
+	[681] = "The Lost Isles",
+	[682] = "The Lost Isles",
+	[683] = "Mount Hyjal",
+	[684] = "Ruins of Gilneas",
+	[685] = "Ruins of Gilneas City",
+	[686] = "Zul'Farrak",
+	[687] = "The Temple of Atal'Hakkar",
+	[688] = "Blackfathom Deeps",
+	[689] = "Stranglethorn Vale",
+	[690] = "The Stockade",
+	[691] = "Gnomeregan",
+	[692] = "Uldaman",
+	[696] = "Molten Core",
+	[697] = "Zul'Gurub",
+	[699] = "Dire Maul",
+	[700] = "Twilight Highlands",
+	[704] = "Blackrock Depths",
+	[708] = "Tol Barad",
+	[709] = "Tol Barad Peninsula",
+	[710] = "The Shattered Halls",
+	[717] = "Ruins of Ahn'Qiraj",
+	[718] = "Onyxia's Lair",
+	[720] = "Uldum",
+	[721] = "Blackrock Spire",
+	[722] = "Auchenai Crypts",
+	[723] = "Sethekk Halls",
+	[724] = "Shadow Labyrinth",
+	[725] = "The Blood Furnace",
+	[726] = "The Underbog",
+	[727] = "The Steamvault",
+	[728] = "The Slave Pens",
+	[729] = "The Botanica",
+	[730] = "The Mechanar",
+	[731] = "The Arcatraz",
+	[732] = "Mana-Tombs",
+	[733] = "The Black Morass",
+	[734] = "Old Hillsbrad Foothills",
+	[736] = "The Battle for Gilneas",
+	[737] = "The Maelstrom",
+	[747] = "Lost City of the Tol'vir",
+	[748] = "Uldum",
+	[749] = "Wailing Caverns",
+	[750] = "Maraudon",
+	[751] = "The Maelstrom",
+	[752] = "Baradin Hold",
+	[753] = "Blackrock Caverns",
+	[754] = "Blackwing Descent",
+	[755] = "Blackwing Lair",
+	[756] = "The Deadmines",
+	[757] = "Grim Batol",
+	[758] = "The Bastion of Twilight",
+	[759] = "Halls of Origination",
+	[760] = "Razorfen Downs",
+	[761] = "Razorfen Kraul",
+	[762] = "Scarlet Monastery",
+	[763] = "Scholomance",
+	[764] = "Shadowfang Keep",
+	[765] = "Stratholme",
+	[766] = "Temple of Ahn'Qiraj",
+	[767] = "Throne of the Tides",
+	[768] = "The Stonecore",
+	[769] = "The Vortex Pinnacle",
+	[770] = "Twilight Highlands",
+	[772] = "Ahn'Qiraj: The Fallen Kingdom",
+	[773] = "Throne of the Four Winds",
+	[775] = "Hyjal Summit",
+	[776] = "Gruul's Lair",
+	[779] = "Magtheridon's Lair",
+	[780] = "Serpentshrine Cavern",
+	[781] = "Zul'Aman",
+	[782] = "The Eye",
+	[789] = "Sunwell Plateau",
+	[793] = "Zul'Gurub",
+	[795] = "Molten Front",
+	[796] = "Black Temple",
+	[797] = "Hellfire Ramparts",
+	[798] = "Magisters' Terrace",
+	[799] = "Karazhan",
+	[800] = "Firelands",
+	[803] = "The Nexus",
+	[806] = "The Jade Forest",
+	[807] = "Valley of the Four Winds",
+	[808] = "The Wandering Isle",
+	[809] = "Kun-Lai Summit",
+	[810] = "Townlong Steppes",
+	[811] = "Vale of Eternal Blossoms",
+	[813] = "Eye of the Storm",
+	[816] = "Well of Eternity",
+	[819] = "Hour of Twilight",
+	[820] = "End Time",
+	[823] = "Darkmoon Island",
+	[824] = "Dragon Soul",
+	[851] = "Dustwallow Marsh",
+	[856] = "Temple of Kotmogu",
+	[857] = "Krasarang Wilds",
+	[858] = "Dread Wastes",
+	[860] = "Silvershard Mines",
+	[862] = "Pandaria",
+	[864] = "Northshire",
+	[866] = "Coldridge Valley",
+	[867] = "Temple of the Jade Serpent",
+	[871] = "Scarlet Halls",
+	[873] = "The Veiled Stair",
+	[874] = "Scarlet Monastery",
+	[875] = "Gate of the Setting Sun",
+	[876] = "Stormstout Brewery",
+	[877] = "Shado-pan Monastery",
+	[878] = "A Brewing Storm",
+	[879] = "Kun-Lai Summit",
+	[880] = "The Jade Forest",
+	[881] = "Temple of Kotmogu",
+	[882] = "Unga Ingoo",
+	[883] = "Zan'vess",
+	[884] = "Brewmoon Festival",
+	[885] = "Mogu'shan Palace",
+	[886] = "Terrace of Endless Spring",
+	[887] = "Siege of Niuzao Temple",
+	[888] = "Shadowglen",
+	[889] = "Valley of Trials",
+	[890] = "Camp Narache",
+	[891] = "Echo Isles",
+	[892] = "Deathknell",
+	[893] = "Sunstrider Isle",
+	[894] = "Ammen Vale",
+	[895] = "New Tinkertown",
+	[896] = "Mogu'shan Vaults",
+	[897] = "Heart of Fear",
+	[898] = "Scholomance",
+	[899] = "Proving Grounds",
+	[900] = "Crypt of Forgotten Kings",
+	[903] = "Shrine of Two Moons",
+	[905] = "Shrine of Seven Stars",
+	[906] = "Dustwallow Marsh",
+	[907] = "Dustwallow Marsh",
+	[928] = "Isle of Thunder",
+	[929] = "Isle of Giants",
+	[930] = "Throne of Thunder",
+	[935] = "Deepwind Gorge",
+	[951] = "Timeless Isle",
+	[941] = "Frostfire Ridge",
+	[945] = "Tanaan Jungle",
+	[946] = "Talador",
+	[947] = "Shadowmoon Valley",
+	[948] = "Spires of Arak",
+	[949] = "Gorgrond",
+	[950] = "Nagrand",
+	[953] = "Siege of Orgrimmar",
+	[962] = "Draenor",
+	[964] = "Bloodmaul Slag Mines",
+	[969] = "Shadowmoon Burial Grounds",
+	[970] = "Tanaan Jungle - Assault on the Dark Portal",
+	[971] = "Lunarfall",
+	[976] = "Frostwall",
+	[978] = "Ashran",
+	[984] = "Auchindoun",
+	[987] = "Iron Docks",
+	[988] = "Blackrock Foundry",
+	[989] = "Skyreach",
+	[993] = "Grimrail Depot",
+	[994] = "Highmaul",
+	[995] = "Upper Blackrock Spire",
+	[1008] = "The Everbloom",
+	[1009] = "Stormshield",
+	[1011] = "Warspear",
+}
+
+local zoneTranslation = {
+	enUS = {
+		-- Complexes
+		[1941] = "Caverns of Time",
+		[25] = "Blackrock Mountain",
+		[4406] = "The Ring of Valor",
+		[3545] = "Hellfire Citadel",
+		[3905] = "Coilfang Reservoir",
+		[3893] = "Ring of Observance",
+		[3842] = "Tempest Keep",
+		[4024] = "Coldarra",
+		[5695] = "Ahn'Qiraj: The Fallen Kingdom",
+
+		-- Continents
+		[0] = "Eastern Kingdoms",
+		[1] = "Kalimdor",
+		[530] = "Outland",
+		[571] = "Northrend",
+		[5416] = "The Maelstrom",
+		[870] = "Pandaria",
+		["Azeroth"] = "Azeroth",
+
+		-- Transports
+		[72] = "The Dark Portal",
+		[2257] = "Deeprun Tram",
+
+		-- Dungeons
+		[5914] = "Dire Maul (East)",
+		[5913] = "Dire Maul (North)",
+		[5915] = "Dire Maul (West)",
+
+		-- Arenas
+		[559] = "Nagrand Arena",
+		[562] = "Blade's Edge Arena",
+		[572] = "Ruins of Lordaeron",
+		[4378] = "Dalaran Arena",
+		[6732] = "The Tiger's Peak",
+
+		-- Other
+		[4298] = "Plaguelands: The Scarlet Enclave",
+		[3508] = "Amani Pass",
+		[3979] = "The Frozen Sea",
+	},
+	deDE = {
+		-- Complexes
+		[1941] = "Höhlen der Zeit",
+		[25] = "Der Schwarzfels",
+		[4406] = "Der Ring der Ehre",
+		[3545] = "Höllenfeuerzitadelle",
+		[3905] = "Der Echsenkessel",
+		[3893] = "Ring der Beobachtung",
+		[3842] = "Festung der Stürme",
+		[4024] = "Kaltarra",
+		[5695] = "Ahn'Qiraj: Das Gefallene Königreich",
+
+		-- Continents
+		[0] = "Östliche Königreiche",
+		[1] = "Kalimdor",
+		[530] = "Scherbenwelt",
+		[571] = "Nordend",
+		[5416] = "Der Mahlstrom",
+		[870] = "Pandaria",
+		["Azeroth"] = "Azeroth",
+
+		-- Transports
+		[72] = "Das Dunkle Portal",
+		[2257] = "Die Tiefenbahn",
+
+		-- Dungeons
+		[5914] = "Düsterbruch - Ost",
+		[5913] = "Düsterbruch - Nord",
+		[5915] = "Düsterbruch - West",
+
+		-- Arenas
+		[559] = "Arena von Nagrand",
+		[562] = "Arena des Schergrats",
+		[572] = "Ruinen von Lordaeron",
+		[4378] = "Arena von Dalaran",
+		[6732] = "Der Tigergipfel",
+
+		-- Other
+		[4298] = "Pestländer: Die Scharlachrote Enklave",
+		[3508] = "Amanipass",
+		[3979] = "Die Gefrorene See",
+	},
+	esES = {
+		-- Complexes
+		[1941] = "Cavernas del Tiempo",
+		[25] = "Montaña Roca Negra",
+		[4406] = "El Círculo del Valor",
+		[3545] = "Ciudadela del Fuego Infernal",
+		[3905] = "Reserva Colmillo Torcido",
+		[3893] = "Círculo de la Observancia",
+		[3842] = "El Castillo de la Tempestad",
+		[4024] = "Gelidar",
+		[5695] = "Ahn'Qiraj: El Reino Caído",
+
+		-- Continents
+		[0] = "Reinos del Este",
+		[1] = "Kalimdor",
+		[530] = "Terrallende",
+		[571] = "Rasganorte",
+		[5416] = "La Vorágine",
+		[870] = "Pandaria",
+		["Azeroth"] = "Azeroth",
+
+		-- Transports
+		[72] = "El Portal Oscuro",
+		[2257] = "Tranvía Subterráneo",
+
+		-- Dungeons
+		[5914] = "La Masacre: Este",
+		[5913] = "La Masacre: Norte",
+		[5915] = "La Masacre: Oeste",
+
+		-- Arenas
+		[559] = "Arena de Nagrand",
+		[562] = "Arena Filospada",
+		[572] = "Ruinas de Lordaeron",
+		[4378] = "Arena de Dalaran",
+		[6732] = "La Cima del Tigre",
+
+		-- Other
+		[4298] = "Tierras de la Peste: El Enclave Escarlata",
+		[3508] = "Paso de Amani",
+		[3979] = "El Mar Gélido",
+	},
+	esMX = {
+		-- Complexes
+		[1941] = "Cavernas del Tiempo",
+		[25] = "Montaña Roca Negra",
+		[4406] = "El Círculo del Valor",
+		[3545] = "Ciudadela del Fuego Infernal",
+		[3905] = "Reserva Colmillo Torcido",
+		[3893] = "Círculo de la Observancia",
+		[3842] = "El Castillo de la Tempestad",
+		[4024] = "Gelidar",
+		[5695] = "Ahn'Qiraj: El Reino Caído",
+
+		-- Continents
+		[0] = "Reinos del Este",
+		[1] = "Kalimdor",
+		[530] = "Terrallende",
+		[571] = "Rasganorte",
+		[5416] = "La Vorágine",
+		[870] = "Pandaria",
+		["Azeroth"] = "Azeroth",
+
+		-- Transports
+		[72] = "El Portal Oscuro",
+		[2257] = "Tranvía Subterráneo",
+
+		-- Dungeons
+		[5914] = "La Masacre: Este",
+		[5913] = "La Masacre: Norte",
+		[5915] = "La Masacre: Oeste",
+
+		-- Arenas
+		[559] = "Arena de Nagrand",
+		[562] = "Arena Filospada",
+		[572] = "Ruinas de Lordaeron",
+		[4378] = "Arena de Dalaran",
+		[6732] = "La Cima del Tigre",
+
+		-- Other
+		[4298] = "Tierras de la Peste: El Enclave Escarlata",
+		[3508] = "Paso de Amani",
+		[3979] = "El Mar Gélido",
+	},
+	frFR = {
+		-- Complexes
+		[1941] = "Grottes du Temps",
+		[25] = "Mont Rochenoire",
+		[4406] = "L’arène des Valeureux",
+		[3545] = "Citadelle des Flammes infernales",
+		[3905] = "Réservoir de Glissecroc",
+		[3893] = "Cercle d’observance",
+		[3842] = "Donjon de la Tempête",
+		[4024] = "Frimarra",
+		[5695] = "Ahn’Qiraj : le royaume Déchu",
+
+		-- Continents
+		[0] = "Royaumes de l'est",
+		[1] = "Kalimdor",
+		[530] = "Outreterre",
+		[571] = "Norfendre",
+		[5416] = "Le Maelström",
+		[870] = "Pandarie",
+		["Azeroth"] = "Azeroth",
+
+		-- Transports
+		[72] = "La porte des Ténèbres",
+		[2257] = "Tram des profondeurs",
+
+		-- Dungeons
+		[5914] = "Haches-Tripes - Est",
+		[5913] = "Haches-Tripes - Nord",
+		[5915] = "Haches-Tripes - Ouest",
+
+		-- Arenas
+		[559] = "Arène de Nagrand",
+		[562] = "Arène des Tranchantes",
+		[572] = "Ruines de Lordaeron",
+		[4378] = "Arène de Dalaran",
+		[6732] = "Le croc du Tigre",
+
+		-- Other
+		[4298] = "Maleterres : l’enclave Écarlate",
+		[3508] = "Passage des Amani",
+		[3979] = "La mer Gelée",
+	},
+	itIT = {
+		-- Complexes
+		[1941] = "Caverne del Tempo",
+		[25] = "Massiccio Roccianera",
+		[4406] = "Arena del Valore",
+		[3545] = "Cittadella del Fuoco Infernale",
+		[3905] = "Bacino degli Spiraguzza",
+		[3893] = "Anello dell'Osservanza",
+		[3842] = "Forte Tempesta",
+		[4024] = "Ibernia",
+		[5695] = "Ahn'Qiraj: il Regno Perduto",
+
+		-- Continents
+		[0] = "Regni Orientali",
+		[1] = "Kalimdor",
+		[530] = "Terre Esterne",
+		[571] = "Nordania",
+		[5416] = "Maelstrom",
+		[870] = "Pandaria",
+		["Azeroth"] = "Azeroth",
+
+		-- Transports
+		[72] = "Portale Oscuro",
+		[2257] = "Tram degli Abissi",
+
+		-- Dungeons
+		[5914] = "Maglio Infausto - Est",
+		[5913] = "Maglio Infausto - Nord",
+		[5915] = "Maglio Infausto - Ovest",
+
+		-- Arenas
+		[559] = "Arena di Nagrand",
+		[562] = "Arena di Spinaguzza",
+		[572] = "Rovine di Lordaeron",
+		[4378] = "Arena di Dalaran",
+		[6732] = "Picco della Tigre",
+
+		-- Other
+		[4298] = "Terre Infette: l'Enclave Scarlatta",
+		[3508] = "Passo degli Amani",
+		[3979] = "Mare Ghiacciato",
+	},
+	koKR = {
+		-- Complexes
+		[1941] = "시간의 동굴",
+		[25] = "검은바위 산",
+		[4406] = "용맹의 투기장",
+		[3545] = "지옥불 성채",
+		[3905] = "갈퀴송곳니 저수지",
+		[3893] = "규율의 광장",
+		[3842] = "폭풍우 요새",
+		[4024] = "콜다라",
+		[5695] = "안퀴라즈: 무너진 왕국",
+
+		-- Continents
+		[0] = "동부 왕국",
+		[1] = "칼림도어",
+		[530] = "아웃랜드",
+		[571] = "노스렌드",
+		[5416] = "혼돈의 소용돌이",
+		[870] = "판다리아",
+		["Azeroth"] = "아제로스",
+
+		-- Transports
+		[72] = "어둠의 문",
+		[2257] = "깊은굴 지하철",
+
+		-- Dungeons
+		[5914] = "혈투의 전장 - 동쪽",
+		[5913] = "혈투의 전장 - 북쪽",
+		[5915] = "혈투의 전장 - 서쪽",
+
+		-- Arenas
+		[559] = "나그란드 투기장",
+		[562] = "칼날 산맥 투기장",
+		[572] = "로데론의 폐허",
+		[4378] = "달라란 투기장",
+		[6732] = "범의 봉우리",
+
+		-- Other
+		[4298] = "동부 역병지대: 붉은십자군 초소",
+		[3508] = "아마니 고개",
+		[3979] = "얼어붙은 바다",
+	},
+	ptBR = {
+		-- Complexes
+		[1941] = "Cavernas do Tempo",
+		[25] = "Montanha Rocha Negra",
+		[4406] = "Ringue dos Valorosos",
+		[3545] = "Cidadela Fogo do Inferno",
+		[3905] = "Reservatório Presacurva",
+		[3893] = "Círculo da Obediência",
+		[3842] = "Bastilha da Tormenta",
+		[4024] = "Gelarra",
+		[5695] = "Ahn'Qiraj: O Reino Derrotado",
+
+		-- Continents
+		[0] = "Reinos do Leste",
+		[1] = "Kalimdor",
+		[530] = "Terralém",
+		[571] = "Nortúndria",
+		[5416] = "Voragem",
+		[870] = "Pandária",
+		["Azeroth"] = "Azeroth",
+
+		-- Transports
+		[72] = "Portal Negro",
+		[2257] = "Metrô Correfundo",
+
+		-- Dungeons
+		[5914] = "Gládio Cruel – Leste",
+		[5913] = "Gládio Cruel – Norte",
+		[5915] = "Gládio Cruel – Oeste",
+
+		-- Arenas
+		[559] = "Arena de Nagrand",
+		[562] = "Arena da Lâmina Afiada",
+		[572] = "Ruínas de Lordaeron",
+		[4378] = "Arena de Dalaran",
+		[6732] = "O Pico do Tigre",
+
+		-- Other
+		[4298] = "Terras Pestilentas: Enclave Escarlate",
+		[3508] = "Desfiladeiro Amani",
+		[3979] = "Mar Congelado",
+	},
+	ruRU = {
+		-- Complexes
+		[1941] = "Пещеры Времени",
+		[25] = "Черная гора",
+		[4406] = "Арена Доблести",
+		[3545] = "Цитадель Адского Пламени",
+		[3905] = "Резервуар Кривого Клыка",
+		[3893] = "Ритуальный Круг",
+		[3842] = "Крепость Бурь",
+		[4024] = "Хладарра",
+		[5695] = "Ан'Кираж: Павшее Королевство",
+
+		-- Continents
+		[0] = "Восточные королевства",
+		[1] = "Калимдор",
+		[530] = "Запределье",
+		[571] = "Нордскол",
+		[5416] = "Водоворот",
+		[870] = "Пандария",
+		["Azeroth"] = "Азерот",
+
+		-- Transports
+		[72] = "Темный портал",
+		[2257] = "Подземный поезд",
+
+		-- Dungeons
+		[5914] = "Забытый город – восток",
+		[5913] = "Забытый город – север",
+		[5915] = "Забытый город – запад",
+
+		-- Arenas
+		[559] = "Арена Награнда",
+		[562] = "Арена Острогорья",
+		[572] = "Руины Лордерона",
+		[4378] = "Арена Даларана",
+		[6732] = "Пик Тигра",
+
+		-- Other
+		[4298] = "Чумные земли: Анклав Алого ордена",
+		[3508] = "Перевал Амани",
+		[3979] = "Ледяное море",
+	},
+	zhCN = {
+		-- Complexes
+		[1941] = "时光之穴",
+		[25] = "黑石山",
+		[4406] = "勇气竞技场",
+		[3545] = "地狱火堡垒",
+		[3905] = "盘牙水库",
+		[3893] = "仪式广场",
+		[3842] = "风暴要塞",
+		[4024] = "考达拉",
+		[5695] = "安其拉:堕落王国",
+
+		-- Continents
+		[0] = "东部王国",
+		[1] = "卡利姆多",
+		[530] = "外域",
+		[571] = "诺森德",
+		[5416] = "大漩涡",
+		[870] = "潘达利亚",
+		["Azeroth"] = "艾泽拉斯",
+
+		-- Transports
+		[72] = "黑暗之门",
+		[2257] = "矿道地铁",
+
+		-- Dungeons
+		[5914] = "厄运之槌 - 东",
+		[5913] = "厄运之槌 - 北",
+		[5915] = "厄运之槌 - 西",
+
+		-- Arenas
+		[559] = "纳格兰竞技场",
+		[562] = "刀锋山竞技场",
+		[572] = "洛丹伦废墟",
+		[4378] = "达拉然竞技场",
+		[6732] = "虎踞峰",
+
+		-- Other
+		[4298] = "东瘟疫之地:血色领地",
+		[3508] = "阿曼尼小径",
+		[3979] = "冰冻之海",
+	},
+	zhTW = {
+		-- Complexes
+		[1941] = "時光之穴",
+		[25] = "黑石山",
+		[4406] = "勇武競技場",
+		[3545] = "地獄火堡壘",
+		[3905] = "盤牙蓄湖",
+		[3893] = "儀式競技場",
+		[3842] = "風暴要塞",
+		[4024] = "凜懼島",
+		[5695] = "安其拉: 沒落的王朝",
+
+		-- Continents
+		[0] = "東部王國",
+		[1] = "卡林多",
+		[530] = "外域",
+		[571] = "北裂境",
+		[5416] = "大漩渦",
+		[870] = "潘達利亞",
+		["Azeroth"] = "艾澤拉斯",
+
+		-- Transports
+		[72] = "黑暗之門",
+		[2257] = "礦道地鐵",
+
+		-- Dungeons
+		[5914] = "厄運之槌 - 東方",
+		[5913] = "厄運之槌 - 北方",
+		[5915] = "厄運之槌 - 西方",
+
+		-- Arenas
+		[559] = "納葛蘭競技場",
+		[562] = "劍刃競技場",
+		[572] = "羅德隆廢墟",
+		[4378] = "達拉然競技場",
+		[6732] = "猛虎峰",
+
+		-- Other
+		[4298] = "東瘟疫之地:血色領區",
+		[3508] = "阿曼尼小徑",
+		[3979] = "冰凍之海",
+	},
+}
+
+local function CreateLocalizedZoneNameLookups()
+	local mapID
+	local localizedZoneName
+
+	for mapID, englishName in pairs(MapIdLookupTable) do
+		-- Get localized map name
+		localizedZoneName = GetMapNameByID(mapID)
+		if localizedZoneName then
+			-- Add combination of English and localized name to lookup tables
+			if not BZ[englishName] then
+				BZ[englishName] = localizedZoneName
+			end
+			if not BZR[localizedZoneName] then
+				BZR[localizedZoneName] = englishName
+			end
+		else
+--			trace("! ----- No map for ID "..tostring(mapID).." ("..tostring(englishName)..")")
+		end
+	end
+
+	-- Load from zoneTranslation
+	local GAME_LOCALE = GetLocale()
+	for key, localizedZoneName in pairs(zoneTranslation[GAME_LOCALE]) do
+		local englishName = zoneTranslation["enUS"][key]
+		if not BZ[englishName] then
+			BZ[englishName] = localizedZoneName
+		end
+		if not BZR[localizedZoneName] then
+			BZR[localizedZoneName] = englishName
+		end
+	end
+end
+
+local function AddDuplicatesToLocalizedLookup()
+	BZ[Tourist:GetUniqueEnglishZoneNameForLookup("The Maelstrom", 5)] = Tourist:GetUniqueZoneNameForLookup("The Maelstrom", 5)
+	BZR[Tourist:GetUniqueZoneNameForLookup("The Maelstrom", 5)] = Tourist:GetUniqueEnglishZoneNameForLookup("The Maelstrom", 5)
+
+	BZ[Tourist:GetUniqueEnglishZoneNameForLookup("Nagrand", 7)] = Tourist:GetUniqueZoneNameForLookup("Nagrand", 7)
+	BZR[Tourist:GetUniqueZoneNameForLookup("Nagrand", 7)] = Tourist:GetUniqueEnglishZoneNameForLookup("Nagrand", 7)
+
+	BZ[Tourist:GetUniqueEnglishZoneNameForLookup("Shadowmoon Valley", 7)] = Tourist:GetUniqueZoneNameForLookup("Shadowmoon Valley", 7)
+	BZR[Tourist:GetUniqueZoneNameForLookup("Shadowmoon Valley", 7)] = Tourist:GetUniqueEnglishZoneNameForLookup("Shadowmoon Valley", 7)
+
+	BZ[Tourist:GetUniqueEnglishZoneNameForLookup("Hellfire Citadel", 7)] = Tourist:GetUniqueZoneNameForLookup("Hellfire Citadel", 7)
+	BZR[Tourist:GetUniqueZoneNameForLookup("Hellfire Citadel", 7)] = Tourist:GetUniqueEnglishZoneNameForLookup("Hellfire Citadel", 7)
+end
+
+
+--------------------------------------------------------------------------------------------------------
+--                                            BZ table                                             --
+--------------------------------------------------------------------------------------------------------
+
+do
+	Tourist.frame = oldLib and oldLib.frame or CreateFrame("Frame", MAJOR_VERSION .. "Frame", UIParent)
+	Tourist.frame:UnregisterAllEvents()
+	Tourist.frame:RegisterEvent("PLAYER_LEVEL_UP")
+	Tourist.frame:RegisterEvent("PLAYER_ENTERING_WORLD")
+	Tourist.frame:SetScript("OnEvent", function(frame, event, ...)
+		PLAYER_LEVEL_UP(Tourist, ...)
+	end)
+
+
+	trace("Tourist: Initializing localized zone names...")
+	CreateLocalizedZoneNameLookups()
+	AddDuplicatesToLocalizedLookup()
+
+	-- TRANSPORT DEFINITIONS ----------------------------------------------------------------
+
+	local transports = {}
+
+	transports["BOOTYBAY_RATCHET_BOAT"] = string.format(X_Y_BOAT, BZ["The Cape of Stranglethorn"], BZ["Northern Barrens"])
+	transports["MENETHIL_THERAMORE_BOAT"] = string.format(X_Y_BOAT, BZ["Wetlands"], BZ["Dustwallow Marsh"])
+	transports["MENETHIL_HOWLINGFJORD_BOAT"] = string.format(X_Y_BOAT, BZ["Wetlands"], BZ["Howling Fjord"])
+	transports["DARNASSUS_EXODAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Darnassus"], BZ["The Exodar"])
+	transports["EXODAR_DARNASSUS_PORTAL"] = string.format(X_Y_PORTAL, BZ["The Exodar"], BZ["Darnassus"])
+	transports["TELDRASSIL_AZUREMYST_BOAT"] = string.format(X_Y_BOAT, BZ["Teldrassil"], BZ["Azuremyst Isle"])
+	transports["TELDRASSIL_STORMWIND_BOAT"] = string.format(X_Y_BOAT, BZ["Teldrassil"], BZ["Stormwind City"])
+	transports["DARNASSUS_BLASTEDLANDS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Darnassus"], BZ["Blasted Lands"])
+	transports["EXODAR_BLASTEDLANDS_PORTAL"] = string.format(X_Y_PORTAL, BZ["The Exodar"], BZ["Blasted Lands"])
+	transports["STORMWIND_BOREANTUNDRA_BOAT"] = string.format(X_Y_BOAT, BZ["Stormwind City"], BZ["Borean Tundra"])
+	transports["STORMWIND_BLASTEDLANDS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Blasted Lands"])
+	transports["STORMWIND_HELLFIRE_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Hellfire Peninsula"])
+	transports["IRONFORGE_BLASTEDLANDS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Ironforge"], BZ["Blasted Lands"])
+	transports["ORGRIMMAR_BOREANTUNDRA_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Orgrimmar"], BZ["Borean Tundra"])
+	transports["ORGRIMMAR_UNDERCITY_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Orgrimmar"], BZ["Undercity"])
+	transports["ORGRIMMAR_GROMGOL_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Orgrimmar"], BZ["Northern Stranglethorn"])
+	transports["ORGRIMMAR_THUNDERBLUFF_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Orgrimmar"], BZ["Thunder Bluff"])
+	transports["ORGRIMMAR_BLASTEDLANDS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Blasted Lands"])
+	transports["ORGRIMMAR_HELLFIRE_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Hellfire Peninsula"])
+	transports["UNDERCITY_HOWLINGFJORD_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Undercity"], BZ["Howling Fjord"])
+	transports["UNDERCITY_GROMGOL_ZEPPELIN"] = string.format(X_Y_ZEPPELIN, BZ["Undercity"], BZ["Northern Stranglethorn"])
+	transports["UNDERCITY_BLASTEDLANDS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Undercity"], BZ["Blasted Lands"])
+	transports["THUNDERBLUFF_BLASTEDLANDS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Thunder Bluff"], BZ["Blasted Lands"])
+	transports["SILVERMOON_UNDERCITY_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Silvermoon City"], BZ["Undercity"])
+	transports["SILVERMOON_BLASTEDLANDS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Silvermoon City"], BZ["Blasted Lands"])
+	transports["SHATTRATH_QUELDANAS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Shattrath City"], BZ["Isle of Quel'Danas"])
+	transports["SHATTRATH_COT_PORTAL"] = string.format(X_Y_PORTAL, BZ["Shattrath City"], BZ["Caverns of Time"])
+	transports["MOAKI_UNUPE_BOAT"] = string.format(X_Y_BOAT, BZ["Dragonblight"], BZ["Borean Tundra"])
+	transports["MOAKI_KAMAGUA_BOAT"] = string.format(X_Y_BOAT, BZ["Dragonblight"], BZ["Howling Fjord"])
+	transports["DALARAN_COT_PORTAL"] = string.format(X_Y_PORTAL, BZ["Dalaran"], BZ["Caverns of Time"])
+	transports["DALARAN_CRYSTALSONG_TELEPORT"] = string.format(X_Y_TELEPORT, BZ["Dalaran"], BZ["Crystalsong Forest"])
+	transports["TWILIGHTHIGHLANDS_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Twilight Highlands"], BZ["Orgrimmar"])
+	transports["ORGRIMMAR_TWILIGHTHIGHLANDS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Twilight Highlands"])
+	transports["ORGRIMMAR_MOUNTHYJAL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Mount Hyjal"])
+	transports["ORGRIMMAR_DEEPHOLM_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Deepholm"])
+	transports["DEEPHOLM_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Deepholm"], BZ["Orgrimmar"])
+	transports["ORGRIMMAR_ULDUM_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Uldum"])
+	transports["ORGRIMMAR_VASHJIR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Vashj'ir"])
+	transports["ORGRIMMAR_TOLBARAD_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["Tol Barad Peninsula"])
+	transports["TOLBARAD_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Tol Barad Peninsula"], BZ["Orgrimmar"])
+	transports["TWILIGHTHIGHLANDS_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Twilight Highlands"], BZ["Stormwind City"])
+	transports["STORMWIND_TWILIGHTHIGHLANDS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Twilight Highlands"])
+	transports["STORMWIND_MOUNTHYJAL_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Mount Hyjal"])
+	transports["STORMWIND_DEEPHOLM_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Deepholm"])
+	transports["DEEPHOLM_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Deepholm"], BZ["Stormwind City"])
+	transports["STORMWIND_ULDUM_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Uldum"])
+	transports["STORMWIND_VASHJIR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Vashj'ir"])
+	transports["STORMWIND_TOLBARAD_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["Tol Barad Peninsula"])
+	transports["TOLBARAD_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Tol Barad Peninsula"], BZ["Stormwind City"])
+	transports["HELLFIRE_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Hellfire Peninsula"], BZ["Orgrimmar"])
+	transports["HELLFIRE_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Hellfire Peninsula"], BZ["Stormwind City"])
+	transports["DALARAN_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Dalaran"], BZ["Orgrimmar"])
+	transports["DALARAN_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Dalaran"], BZ["Stormwind City"])
+	transports["ORGRIMMAR_JADEFOREST_PORTAL"] = string.format(X_Y_PORTAL, BZ["Orgrimmar"], BZ["The Jade Forest"])
+	transports["JADEFOREST_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["The Jade Forest"], BZ["Orgrimmar"])
+	transports["STORMWIND_JADEFOREST_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormwind City"], BZ["The Jade Forest"])
+	transports["JADEFOREST_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["The Jade Forest"], BZ["Stormwind City"])
+
+	transports["TOWNLONGSTEPPES_ISLEOFTHUNDER_PORTAL"] = string.format(X_Y_PORTAL, BZ["Townlong Steppes"], BZ["Isle of Thunder"])
+	transports["ISLEOFTHUNDER_TOWNLONGSTEPPES_PORTAL"] = string.format(X_Y_PORTAL, BZ["Isle of Thunder"], BZ["Townlong Steppes"])
+
+	transports["DARKMOON_MULGORE_PORTAL"] = string.format(X_Y_PORTAL, BZ["Darkmoon Island"], BZ["Mulgore"])
+	transports["DARKMOON_ELWYNNFOREST_PORTAL"] = string.format(X_Y_PORTAL, BZ["Darkmoon Island"], BZ["Elwynn Forest"])
+	transports["MULGORE_DARKMOON_PORTAL"] = string.format(X_Y_PORTAL, BZ["Mulgore"], BZ["Darkmoon Island"])
+	transports["ELWYNNFOREST_DARKMOON_PORTAL"] = string.format(X_Y_PORTAL, BZ["Elwynn Forest"], BZ["Darkmoon Island"])
+
+	transports["WARSPEAR_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Warspear"], BZ["Orgrimmar"])
+	transports["WARSPEAR_UNDERCITY_PORTAL"] = string.format(X_Y_PORTAL, BZ["Warspear"], BZ["Undercity"])
+	transports["WARSPEAR_THUNDERBLUFF_PORTAL"] = string.format(X_Y_PORTAL, BZ["Warspear"], BZ["Thunder Bluff"])
+	transports["STORMSHIELD_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormshield"], BZ["Stormwind City"])
+	transports["STORMSHIELD_IRONFORGE_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormshield"], BZ["Ironforge"])
+	transports["STORMSHIELD_DARNASSUS_PORTAL"] = string.format(X_Y_PORTAL, BZ["Stormshield"], BZ["Darnassus"])
+	transports["SHADOWMOONVALLEY_STORMWIND_PORTAL"] = string.format(X_Y_PORTAL, BZ["Shadowmoon Valley"], BZ["Stormwind City"])
+	transports["FROSTFIRERIDGE_ORGRIMMAR_PORTAL"] = string.format(X_Y_PORTAL, BZ["Frostfire Ridge"], BZ["Orgrimmar"])
+
+
+
+
+	local zones = {}
+
+	-- CONTINENTS ---------------------------------------------------------------
+
+	zones[BZ["Azeroth"]] = {
+		type = "Continent",
+--		yards = 44531.82907938571,
+		yards = 33400.121,
+		x_offset = 0,
+		y_offset = 0,
+		continent = Azeroth,
+	}
+
+	zones[BZ["Eastern Kingdoms"]] = {
+		type = "Continent",
+		continent = Eastern_Kingdoms,
+	}
+
+	zones[BZ["Kalimdor"]] = {
+		type = "Continent",
+		continent = Kalimdor,
+	}
+
+	zones[BZ["Outland"]] = {
+		type = "Continent",
+		continent = Outland,
+	}
+
+	zones[BZ["Northrend"]] = {
+		type = "Continent",
+		continent = Northrend,
+	}
+
+	zones[BZ["The Maelstrom"]] = {
+		type = "Continent",
+		continent = The_Maelstrom,
+	}
+
+	zones[BZ["Pandaria"]] = {
+		type = "Continent",
+		continent = Pandaria,
+	}
+
+	zones[BZ["Draenor"]] = {
+		type = "Continent",
+		continent = Draenor,
+	}
+
+
+	-- TRANSPORTS ---------------------------------------------------------------
+
+	zones[transports["STORMWIND_BOREANTUNDRA_BOAT"]] = {
+		paths = {
+			[BZ["Stormwind City"]] = true,
+			[BZ["Borean Tundra"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["ORGRIMMAR_BOREANTUNDRA_ZEPPELIN"]] = {
+		paths = {
+			[BZ["Orgrimmar"]] = true,
+			[BZ["Borean Tundra"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["UNDERCITY_HOWLINGFJORD_ZEPPELIN"]] = {
+		paths = {
+			[BZ["Tirisfal Glades"]] = true,
+			[BZ["Howling Fjord"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["ORGRIMMAR_BLASTEDLANDS_PORTAL"]] = {
+		paths = {
+			[BZ["Blasted Lands"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["ORGRIMMAR_HELLFIRE_PORTAL"]] = {
+		paths = {
+			[BZ["Hellfire Peninsula"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["HELLFIRE_ORGRIMMAR_PORTAL"]] = {
+		paths = {
+			[BZ["Orgrimmar"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["UNDERCITY_BLASTEDLANDS_PORTAL"]] = {
+		paths = {
+			[BZ["Blasted Lands"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["THUNDERBLUFF_BLASTEDLANDS_PORTAL"]] = {
+		paths = {
+			[BZ["Blasted Lands"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["SILVERMOON_BLASTEDLANDS_PORTAL"]] = {
+		paths = {
+			[BZ["Blasted Lands"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["STORMWIND_BLASTEDLANDS_PORTAL"]] = {
+		paths = {
+			[BZ["Blasted Lands"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["STORMWIND_HELLFIRE_PORTAL"]] = {
+		paths = {
+			[BZ["Hellfire Peninsula"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+
+	zones[transports["HELLFIRE_STORMWIND_PORTAL"]] = {
+		paths = {
+			[BZ["Stormwind City"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["DALARAN_STORMWIND_PORTAL"]] = {
+		paths = BZ["Stormwind City"],
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["DALARAN_ORGRIMMAR_PORTAL"]] = {
+		paths = BZ["Orgrimmar"],
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["DARNASSUS_BLASTEDLANDS_PORTAL"]] = {
+		paths = {
+			[BZ["Blasted Lands"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["EXODAR_BLASTEDLANDS_PORTAL"]] = {
+		paths = {
+			[BZ["Blasted Lands"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["DARNASSUS_EXODAR_PORTAL"]] = {
+		paths = {
+			[BZ["The Exodar"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["EXODAR_DARNASSUS_PORTAL"]] = {
+		paths = {
+			[BZ["Darnassus"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+
+	zones[transports["MULGORE_DARKMOON_PORTAL"]] = {
+		paths = BZ["Darkmoon Island"],
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["DARKMOON_MULGORE_PORTAL"]] = {
+		paths = BZ["Mulgore"],
+		faction = "Horde",
+		type = "Transport",
+	}
+
+
+	zones[transports["ELWYNNFOREST_DARKMOON_PORTAL"]] = {
+		paths = BZ["Darkmoon Island"],
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["DARKMOON_ELWYNNFOREST_PORTAL"]] = {
+		paths = BZ["Elwynn Forest"],
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+
+
+	zones[transports["IRONFORGE_BLASTEDLANDS_PORTAL"]] = {
+		paths = {
+			[BZ["Blasted Lands"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["TELDRASSIL_STORMWIND_BOAT"]] = {
+		paths = {
+			[BZ["Teldrassil"]] = true,
+			[BZ["Stormwind City"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["TELDRASSIL_AZUREMYST_BOAT"]] = {
+		paths = {
+			[BZ["Teldrassil"]] = true,
+			[BZ["Azuremyst Isle"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["BOOTYBAY_RATCHET_BOAT"]] = {
+		paths = {
+			[BZ["The Cape of Stranglethorn"]] = true,
+			[BZ["Northern Barrens"]] = true,
+		},
+		type = "Transport",
+	}
+
+	zones[transports["MENETHIL_HOWLINGFJORD_BOAT"]] = {
+		paths = {
+			[BZ["Wetlands"]] = true,
+			[BZ["Howling Fjord"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["MENETHIL_THERAMORE_BOAT"]] = {
+		paths = {
+			[BZ["Wetlands"]] = true,
+			[BZ["Dustwallow Marsh"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["ORGRIMMAR_GROMGOL_ZEPPELIN"]] = {
+		paths = {
+			[BZ["Orgrimmar"]] = true,
+			[BZ["Northern Stranglethorn"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["ORGRIMMAR_UNDERCITY_ZEPPELIN"]] = {
+		paths = {
+			[BZ["Orgrimmar"]] = true,
+			[BZ["Tirisfal Glades"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["ORGRIMMAR_THUNDERBLUFF_ZEPPELIN"]] = {
+		paths = {
+			[BZ["Orgrimmar"]] = true,
+			[BZ["Thunder Bluff"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["SHATTRATH_QUELDANAS_PORTAL"]] = {
+		paths = BZ["Isle of Quel'Danas"],
+		type = "Transport",
+	}
+
+	zones[transports["SHATTRATH_COT_PORTAL"]] = {
+		paths = BZ["Caverns of Time"],
+		type = "Transport",
+	}
+
+	zones[transports["MOAKI_UNUPE_BOAT"]] = {
+		paths = {
+			[BZ["Dragonblight"]] = true,
+			[BZ["Borean Tundra"]] = true,
+		},
+		type = "Transport",
+	}
+
+	zones[transports["MOAKI_KAMAGUA_BOAT"]] = {
+		paths = {
+			[BZ["Dragonblight"]] = true,
+			[BZ["Howling Fjord"]] = true,
+		},
+		type = "Transport",
+	}
+
+	zones[BZ["The Dark Portal"]] = {
+		paths = {
+			[BZ["Blasted Lands"]] = true,
+			[BZ["Hellfire Peninsula"]] = true,
+		},
+		type = "Transport",
+	}
+
+	zones[BZ["Deeprun Tram"]] = {
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Stormwind City"]] = true,
+			[BZ["Ironforge"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["UNDERCITY_GROMGOL_ZEPPELIN"]] = {
+		paths = {
+			[BZ["Northern Stranglethorn"]] = true,
+			[BZ["Tirisfal Glades"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["SILVERMOON_UNDERCITY_TELEPORT"]] = {
+		paths = {
+			[BZ["Silvermoon City"]] = true,
+			[BZ["Undercity"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["DALARAN_CRYSTALSONG_TELEPORT"]] = {
+		paths = {
+			[BZ["Dalaran"]] = true,
+			[BZ["Crystalsong Forest"]] = true,
+		},
+		type = "Transport",
+	}
+
+	zones[transports["DALARAN_COT_PORTAL"]] = {
+		paths = BZ["Caverns of Time"],
+		type = "Transport",
+	}
+
+
+	zones[transports["STORMWIND_TWILIGHTHIGHLANDS_PORTAL"]] = {
+		paths = {
+			[BZ["Twilight Highlands"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["TWILIGHTHIGHLANDS_STORMWIND_PORTAL"]] = {
+		paths = {
+			[BZ["Stormwind City"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["STORMWIND_MOUNTHYJAL_PORTAL"]] = {
+		paths = {
+			[BZ["Mount Hyjal"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["STORMWIND_DEEPHOLM_PORTAL"]] = {
+		paths = {
+			[BZ["Deepholm"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["DEEPHOLM_STORMWIND_PORTAL"]] = {
+		paths = {
+			[BZ["Stormwind City"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["TOLBARAD_STORMWIND_PORTAL"]] = {
+		paths = {
+			[BZ["Stormwind City"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["STORMWIND_ULDUM_PORTAL"]] = {
+		paths = {
+			[BZ["Uldum"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["STORMWIND_VASHJIR_PORTAL"]] = {
+		paths = {
+			[BZ["Vashj'ir"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["STORMWIND_TOLBARAD_PORTAL"]] = {
+		paths = {
+			[BZ["Tol Barad Peninsula"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["ORGRIMMAR_TWILIGHTHIGHLANDS_PORTAL"]] = {
+		paths = {
+			[BZ["Twilight Highlands"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["TWILIGHTHIGHLANDS_ORGRIMMAR_PORTAL"]] = {
+		paths = {
+			[BZ["Orgrimmar"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["ORGRIMMAR_MOUNTHYJAL_PORTAL"]] = {
+		paths = {
+			[BZ["Mount Hyjal"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["ORGRIMMAR_DEEPHOLM_PORTAL"]] = {
+		paths = {
+			[BZ["Deepholm"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["DEEPHOLM_ORGRIMMAR_PORTAL"]] = {
+		paths = {
+			[BZ["Orgrimmar"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["TOLBARAD_ORGRIMMAR_PORTAL"]] = {
+		paths = {
+			[BZ["Orgrimmar"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["ORGRIMMAR_ULDUM_PORTAL"]] = {
+		paths = {
+			[BZ["Uldum"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["ORGRIMMAR_VASHJIR_PORTAL"]] = {
+		paths = {
+			[BZ["Vashj'ir"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["ORGRIMMAR_TOLBARAD_PORTAL"]] = {
+		paths = {
+			[BZ["Tol Barad Peninsula"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+
+	zones[transports["ORGRIMMAR_JADEFOREST_PORTAL"]] = {
+		paths = {
+			[BZ["The Jade Forest"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["JADEFOREST_ORGRIMMAR_PORTAL"]] = {
+		paths = {
+			[BZ["Orgrimmar"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["STORMWIND_JADEFOREST_PORTAL"]] = {
+		paths = {
+			[BZ["The Jade Forest"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["JADEFOREST_STORMWIND_PORTAL"]] = {
+		paths = {
+			[BZ["Stormwind City"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["TOWNLONGSTEPPES_ISLEOFTHUNDER_PORTAL"]] = {
+		paths = {
+			[BZ["Isle of Thunder"]] = true,
+		},
+		type = "Transport",
+	}
+
+	zones[transports["ISLEOFTHUNDER_TOWNLONGSTEPPES_PORTAL"]] = {
+		paths = {
+			[BZ["Townlong Steppes"]] = true,
+		},
+		type = "Transport",
+	}
+
+	zones[transports["WARSPEAR_ORGRIMMAR_PORTAL"]] = {
+		paths = {
+			[BZ["Orgrimmar"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["WARSPEAR_UNDERCITY_PORTAL"]] = {
+		paths = {
+			[BZ["Undercity"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+	zones[transports["WARSPEAR_THUNDERBLUFF_PORTAL"]] = {
+		paths = {
+			[BZ["Thunder Bluff"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+
+	zones[transports["STORMSHIELD_STORMWIND_PORTAL"]] = {
+		paths = {
+			[BZ["Stormwind City"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["STORMSHIELD_IRONFORGE_PORTAL"]] = {
+		paths = {
+			[BZ["Ironforge"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["STORMSHIELD_DARNASSUS_PORTAL"]] = {
+		paths = {
+			[BZ["Darnassus"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["SHADOWMOONVALLEY_STORMWIND_PORTAL"]] = {
+		paths = {
+			[BZ["Stormwind City"]] = true,
+		},
+		faction = "Alliance",
+		type = "Transport",
+	}
+
+	zones[transports["FROSTFIRERIDGE_ORGRIMMAR_PORTAL"]] = {
+		paths = {
+			[BZ["Orgrimmar"]] = true,
+		},
+		faction = "Horde",
+		type = "Transport",
+	}
+
+
+
+	-- ZONES, INSTANCES AND COMPLEXES ---------------------------------------------------------
+
+	zones[BZ["Alterac Valley"]] = {
+		low = 45,
+		high = MAX_PLAYER_LEVEL,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Hillsbrad Foothills"],
+		groupSize = 40,
+		type = "Battleground",
+		texture = "AlteracValley",
+	}
+
+	zones[BZ["Arathi Basin"]] = {
+		low = 10,
+		high = MAX_PLAYER_LEVEL,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Arathi Highlands"],
+		groupSize = 15,
+		type = "Battleground",
+		texture = "ArathiBasin",
+	}
+
+	zones[BZ["Warsong Gulch"]] = {
+		low = 10,
+		high = MAX_PLAYER_LEVEL,
+		continent = Kalimdor,
+		paths = isHorde and BZ["Northern Barrens"] or BZ["Ashenvale"],
+		groupSize = 10,
+		type = "Battleground",
+		texture = "WarsongGulch",
+	}
+
+	zones[BZ["Ironforge"]] = {
+		continent = Eastern_Kingdoms,
+		instances = BZ["Gnomeregan"],
+		paths = {
+			[BZ["Dun Morogh"]] = true,
+			[BZ["Deeprun Tram"]] = true,
+			[transports["IRONFORGE_BLASTEDLANDS_PORTAL"]] = true,
+		},
+		faction = "Alliance",
+		type = "City",
+		fishing_min = 75,
+		battlepet_low = 1,
+		battlepet_high = 3,
+	}
+
+	zones[BZ["Silvermoon City"]] = {
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Eversong Woods"]] = true,
+			[transports["SILVERMOON_UNDERCITY_TELEPORT"]] = true,
+			[transports["SILVERMOON_BLASTEDLANDS_PORTAL"]] = true,
+		},
+		faction = "Horde",
+		type = "City",
+		battlepet_low = 1,
+		battlepet_high = 3,
+	}
+
+	zones[BZ["Stormwind City"]] = {
+		continent = Eastern_Kingdoms,
+		instances = BZ["The Stockade"],
+		paths = {
+			[BZ["Deeprun Tram"]] = true,
+			[BZ["The Stockade"]] = true,
+			[BZ["Elwynn Forest"]] = true,
+			[transports["TELDRASSIL_STORMWIND_BOAT"]] = true,
+			[transports["STORMWIND_BOREANTUNDRA_BOAT"]] = true,
+			[transports["STORMWIND_BLASTEDLANDS_PORTAL"]] = true,
+			[transports["STORMWIND_HELLFIRE_PORTAL"]] = true,
+			[transports["STORMWIND_TWILIGHTHIGHLANDS_PORTAL"]] = true,
+			[transports["STORMWIND_MOUNTHYJAL_PORTAL"]] = true,
+			[transports["STORMWIND_DEEPHOLM_PORTAL"]] = true,
+			[transports["STORMWIND_ULDUM_PORTAL"]] = true,
+			[transports["STORMWIND_VASHJIR_PORTAL"]] = true,
+			[transports["STORMWIND_TOLBARAD_PORTAL"]] = true,
+			[transports["STORMWIND_JADEFOREST_PORTAL"]] = true,
+		},
+		faction = "Alliance",
+		type = "City",
+		fishing_min = 75,
+		battlepet_low = 1,
+		battlepet_high = 1,
+	}
+
+	zones[BZ["Undercity"]] = {
+		continent = Eastern_Kingdoms,
+		instances = BZ["Ruins of Lordaeron"],
+		paths = {
+			[BZ["Tirisfal Glades"]] = true,
+			[transports["SILVERMOON_UNDERCITY_TELEPORT"]] = true,
+			[transports["UNDERCITY_BLASTEDLANDS_PORTAL"]] = true,
+		},
+		faction = "Horde",
+		type = "City",
+		fishing_min = 75,
+		battlepet_low = 1,
+		battlepet_high = 3,
+	}
+
+	zones[BZ["Dun Morogh"]] = {
+		low = 1,
+		high = 10,
+		continent = Eastern_Kingdoms,
+		instances = BZ["Gnomeregan"],
+		paths = {
+			[BZ["Wetlands"]] = true,
+			[BZ["Gnomeregan"]] = true,
+			[BZ["Ironforge"]] = true,
+			[BZ["Loch Modan"]] = true,
+			[BZ["Coldridge Valley"]] = true,
+			[BZ["New Tinkertown"]] = true,
+		},
+		faction = "Alliance",
+		fishing_min = 25,
+		battlepet_low = 1,
+		battlepet_high = 2,
+	}
+
+	zones[BZ["Coldridge Valley"]] = {
+		low = 1,
+		high = 6,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Dun Morogh"]] = true,
+		},
+		faction = "Alliance",
+		fishing_min = 25,
+	}
+
+	zones[BZ["New Tinkertown"]] = {
+		low = 1,
+		high = 6,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Dun Morogh"]] = true,
+		},
+		faction = "Alliance",
+		fishing_min = 25,
+	}
+
+	zones[BZ["Elwynn Forest"]] = {
+		low = 1,
+		high = 10,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Northshire"]] = true,
+			[BZ["Westfall"]] = true,
+			[BZ["Redridge Mountains"]] = true,
+			[BZ["Stormwind City"]] = true,
+			[BZ["Duskwood"]] = true,
+			[BZ["Burning Steppes"]] = true,
+			[transports["ELWYNNFOREST_DARKMOON_PORTAL"]] = true,
+		},
+		faction = "Alliance",
+		fishing_min = 25,
+		battlepet_low = 1,
+		battlepet_high = 2,
+	}
+
+	zones[BZ["Northshire"]] = {
+		low = 1,
+		high = 6,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Elwynn Forest"]] = true,
+		},
+		faction = "Alliance",
+		fishing_min = 25,
+	}
+
+	zones[BZ["Eversong Woods"]] = {
+		low = 1,
+		high = 10,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Silvermoon City"]] = true,
+			[BZ["Ghostlands"]] = true,
+			[BZ["Sunstrider Isle"]] = true,
+		},
+		faction = "Horde",
+		fishing_min = 25,
+		battlepet_low = 1,
+		battlepet_high = 2,
+	}
+
+	zones[BZ["Sunstrider Isle"]] = {
+		low = 1,
+		high = 6,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Eversong Woods"]] = true,
+		},
+		faction = "Horde",
+		fishing_min = 25,
+	}
+
+	zones[BZ["Tirisfal Glades"]] = {
+		low = 1,
+		high = 10,
+		continent = Eastern_Kingdoms,
+		instances = {
+			[BZ["Scarlet Monastery"]] = true,
+			[BZ["Scarlet Halls"]] = true,
+		},
+		paths = {
+			[BZ["Western Plaguelands"]] = true,
+			[BZ["Undercity"]] = true,
+			[BZ["Scarlet Monastery"]] = true,
+			[BZ["Scarlet Halls"]] = true,
+			[transports["UNDERCITY_GROMGOL_ZEPPELIN"]] = true,
+			[transports["ORGRIMMAR_UNDERCITY_ZEPPELIN"]] = true,
+			[transports["UNDERCITY_HOWLINGFJORD_ZEPPELIN"]] = true,
+			[BZ["Silverpine Forest"]] = true,
+			[BZ["Deathknell"]] = true,
+		},
+--		complexes = {
+--			[BZ["Scarlet Monastery"]] = true,   -- Duplicate name with instance (thanks, Blizz)
+--		},
+		faction = "Horde",
+		fishing_min = 25,
+		battlepet_low = 1,
+		battlepet_high = 2,
+	}
+
+	zones[BZ["Deathknell"]] = {
+		low = 1,
+		high = 6,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Tirisfal Glades"]] = true,
+		},
+		faction = "Horde",
+		fishing_min = 25,
+	}
+
+	zones[BZ["Amani Pass"]] = {
+		continent = Eastern_Kingdoms,
+	}
+
+	zones[BZ["Ghostlands"]] = {
+		low = 10,
+		high = 20,
+		continent = Eastern_Kingdoms,
+		instances = BZ["Zul'Aman"],
+		paths = {
+			[BZ["Eastern Plaguelands"]] = true,
+			[BZ["Zul'Aman"]] = true,
+			[BZ["Eversong Woods"]] = true,
+		},
+		faction = "Horde",
+		fishing_min = 75,
+		battlepet_low = 3,
+		battlepet_high = 6,
+	}
+
+	zones[BZ["Loch Modan"]] = {
+		low = 10,
+		high = 20,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Wetlands"]] = true,
+			[BZ["Badlands"]] = true,
+			[BZ["Dun Morogh"]] = true,
+			[BZ["Searing Gorge"]] = not isHorde and true or nil,
+		},
+		faction = "Alliance",
+		fishing_min = 75,
+		battlepet_low = 3,
+		battlepet_high = 6,
+	}
+
+	zones[BZ["Silverpine Forest"]] = {
+		low = 10,
+		high = 20,
+		continent = Eastern_Kingdoms,
+		instances = BZ["Shadowfang Keep"],
+		paths = {
+			[BZ["Tirisfal Glades"]] = true,
+			[BZ["Hillsbrad Foothills"]] = true,
+			[BZ["Shadowfang Keep"]] = true,
+			[BZ["Ruins of Gilneas"]] = true,
+		},
+		faction = "Horde",
+		fishing_min = 75,
+		battlepet_low = 3,
+		battlepet_high = 6,
+	}
+
+	zones[BZ["Westfall"]] = {
+		low = 10,
+		high = 15,
+		continent = Eastern_Kingdoms,
+		instances = BZ["The Deadmines"],
+		paths = {
+			[BZ["Duskwood"]] = true,
+			[BZ["Elwynn Forest"]] = true,
+			[BZ["The Deadmines"]] = true,
+		},
+		faction = "Alliance",
+		fishing_min = 75,
+		battlepet_low = 3,
+		battlepet_high = 4,
+	}
+
+	zones[BZ["Redridge Mountains"]] = {
+		low = 15,
+		high = 20,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Burning Steppes"]] = true,
+			[BZ["Elwynn Forest"]] = true,
+			[BZ["Duskwood"]] = true,
+			[BZ["Swamp of Sorrows"]] = true,
+		},
+		fishing_min = 75,
+		battlepet_low = 4,
+		battlepet_high = 6,
+	}
+
+	zones[BZ["Duskwood"]] = {
+		low = 20,
+		high = 25,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Redridge Mountains"]] = true,
+			[BZ["Northern Stranglethorn"]] = true,
+			[BZ["Westfall"]] = true,
+			[BZ["Deadwind Pass"]] = true,
+			[BZ["Elwynn Forest"]] = true,
+		},
+		fishing_min = 150,
+		battlepet_low = 5,
+		battlepet_high = 7,
+	}
+
+	zones[BZ["Hillsbrad Foothills"]] = {
+		low = 20,
+		high = 25,
+		continent = Eastern_Kingdoms,
+		instances = BZ["Alterac Valley"],
+		paths = {
+			[BZ["Alterac Valley"]] = true,
+			[BZ["The Hinterlands"]] = true,
+			[BZ["Arathi Highlands"]] = true,
+			[BZ["Silverpine Forest"]] = true,
+			[BZ["Western Plaguelands"]] = true,
+		},
+		faction = "Horde",
+		fishing_min = 150,
+		battlepet_low = 6,
+		battlepet_high = 7,
+	}
+
+	zones[BZ["Wetlands"]] = {
+		low = 20,
+		high = 25,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Arathi Highlands"]] = true,
+			[transports["MENETHIL_THERAMORE_BOAT"]] = true,
+			[transports["MENETHIL_HOWLINGFJORD_BOAT"]] = true,
+			[BZ["Dun Morogh"]] = true,
+			[BZ["Loch Modan"]] = true,
+		},
+		fishing_min = 150,
+		battlepet_low = 6,
+		battlepet_high = 7,
+	}
+
+	zones[BZ["Arathi Highlands"]] = {
+		low = 25,
+		high = 30,
+		continent = Eastern_Kingdoms,
+		instances = BZ["Arathi Basin"],
+		paths = {
+			[BZ["Wetlands"]] = true,
+			[BZ["Hillsbrad Foothills"]] = true,
+			[BZ["Arathi Basin"]] = true,
+			[BZ["The Hinterlands"]] = true,
+		},
+		fishing_min = 150,
+		battlepet_low = 7,
+		battlepet_high = 8,
+	}
+
+	zones[BZ["Stranglethorn Vale"]] = {
+		low = 25,
+		high = 35,
+		continent = Eastern_Kingdoms,
+		instances = BZ["Zul'Gurub"],
+		paths = {
+			[BZ["Duskwood"]] = true,
+			[BZ["Zul'Gurub"]] = true,
+			[transports["ORGRIMMAR_GROMGOL_ZEPPELIN"]] = true,
+			[transports["UNDERCITY_GROMGOL_ZEPPELIN"]] = true,
+			[transports["BOOTYBAY_RATCHET_BOAT"]] = true,
+		},
+		fishing_min = 150,
+		battlepet_low = 7,
+		battlepet_high = 10,
+	}
+
+	zones[BZ["Northern Stranglethorn"]] = {
+		low = 25,
+		high = 30,
+		continent = Eastern_Kingdoms,
+		instances = BZ["Zul'Gurub"],
+		paths = {
+			[BZ["The Cape of Stranglethorn"]] = true,
+			[BZ["Duskwood"]] = true,
+			[BZ["Zul'Gurub"]] = true,
+			[transports["ORGRIMMAR_GROMGOL_ZEPPELIN"]] = true,
+			[transports["UNDERCITY_GROMGOL_ZEPPELIN"]] = true,
+		},
+		fishing_min = 150,
+		battlepet_low = 7,
+		battlepet_high = 9,
+	}
+
+	zones[BZ["The Cape of Stranglethorn"]] = {
+		low = 30,
+		high = 35,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[transports["BOOTYBAY_RATCHET_BOAT"]] = true,
+			["Northern Stranglethorn"] = true,
+		},
+		fishing_min = 225,
+		battlepet_low = 9,
+		battlepet_high = 10,
+	}
+
+	zones[BZ["Badlands"]] = {
+		low = 44,
+		high = 48,
+		continent = Eastern_Kingdoms,
+		instances = BZ["Uldaman"],
+		paths = {
+			[BZ["Uldaman"]] = true,
+			[BZ["Searing Gorge"]] = true,
+			[BZ["Loch Modan"]] = true,
+		},
+		fishing_min = 300,
+		battlepet_low = 13,
+		battlepet_high = 14,
+	}
+
+	zones[BZ["Swamp of Sorrows"]] = {
+		low = 52,
+		high = 54,
+		continent = Eastern_Kingdoms,
+		instances = BZ["The Temple of Atal'Hakkar"],
+		paths = {
+			[BZ["Blasted Lands"]] = true,
+			[BZ["Deadwind Pass"]] = true,
+			[BZ["The Temple of Atal'Hakkar"]] = true,
+			[BZ["Redridge Mountains"]] = true,
+		},
+		fishing_min = 425,
+		battlepet_low = 14,
+		battlepet_high = 15,
+	}
+
+	zones[BZ["The Hinterlands"]] = {
+		low = 30,
+		high = 35,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Hillsbrad Foothills"]] = true,
+			[BZ["Western Plaguelands"]] = true,
+			[BZ["Arathi Highlands"]] = true,
+		},
+		fishing_min = 225,
+		battlepet_low = 11,
+		battlepet_high = 12,
+	}
+
+	zones[BZ["Searing Gorge"]] = {
+		low = 47,
+		high = 51,
+		continent = Eastern_Kingdoms,
+		instances = {
+			[BZ["Blackrock Depths"]] = true,
+			[BZ["Blackrock Caverns"]] = true,
+			[BZ["Blackwing Lair"]] = true,
+			[BZ["Blackwing Descent"]] = true,
+			[BZ["Molten Core"]] = true,
+			[BZ["Blackrock Spire"]] = true,
+			[BZ["Upper Blackrock Spire"]] = true,
+		},
+		paths = {
+			[BZ["Blackrock Mountain"]] = true,
+			[BZ["Badlands"]] = true,
+			[BZ["Loch Modan"]] = not isHorde and true or nil,
+		},
+		complexes = {
+			[BZ["Blackrock Mountain"]] = true,
+		},
+		fishing_min = 425,
+		battlepet_low = 13,
+		battlepet_high = 14,
+	}
+
+	zones[BZ["Blackrock Mountain"]] = {
+		low = 47,
+		high = 65,
+		continent = Eastern_Kingdoms,
+		instances = {
+			[BZ["Blackrock Depths"]] = true,
+			[BZ["Blackrock Caverns"]] = true,
+			[BZ["Blackwing Lair"]] = true,
+			[BZ["Blackwing Descent"]] = true,
+			[BZ["Molten Core"]] = true,
+			[BZ["Blackrock Spire"]] = true,
+			[BZ["Upper Blackrock Spire"]] = true,
+		},
+		paths = {
+			[BZ["Burning Steppes"]] = true,
+			[BZ["Searing Gorge"]] = true,
+			[BZ["Blackwing Lair"]] = true,
+			[BZ["Blackwing Descent"]] = true,
+			[BZ["Molten Core"]] = true,
+			[BZ["Blackrock Depths"]] = true,
+			[BZ["Blackrock Caverns"]] = true,
+			[BZ["Blackrock Spire"]] = true,
+			[BZ["Upper Blackrock Spire"]] = true,
+		},
+		type = "Complex",
+		fishing_min = 1, -- lava
+	}
+
+	zones[BZ["Deadwind Pass"]] = {
+		low = 55,
+		high = 60,
+		continent = Eastern_Kingdoms,
+		instances = BZ["Karazhan"],
+		paths = {
+			[BZ["Duskwood"]] = true,
+			[BZ["Swamp of Sorrows"]] = true,
+			[BZ["Karazhan"]] = true,
+		},
+		fishing_min = 425,
+		battlepet_low = 17,
+		battlepet_high = 18,
+	}
+
+	zones[BZ["Blasted Lands"]] = {
+		low = 54,
+		high = 60,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["The Dark Portal"]] = true,
+			[BZ["Swamp of Sorrows"]] = true,
+		},
+		fishing_min = 425,
+		battlepet_low = 16,
+		battlepet_high = 17,
+	}
+
+	zones[BZ["Burning Steppes"]] = {
+		low = 49,
+		high = 52,
+		continent = Eastern_Kingdoms,
+		instances = {
+			[BZ["Blackrock Depths"]] = true,
+			[BZ["Blackrock Caverns"]] = true,
+			[BZ["Blackwing Lair"]] = true,
+			[BZ["Blackwing Descent"]] = true,
+			[BZ["Molten Core"]] = true,
+			[BZ["Blackrock Spire"]] = true,
+			[BZ["Upper Blackrock Spire"]] = true,
+		},
+		paths = {
+			[BZ["Blackrock Mountain"]] = true,
+			[BZ["Redridge Mountains"]] = true,
+			[BZ["Elwynn Forest"]] = true,
+		},
+		complexes = {
+			[BZ["Blackrock Mountain"]] = true,
+		},
+		fishing_min = 425,
+		battlepet_low = 15,
+		battlepet_high = 16,
+	}
+
+	zones[BZ["Western Plaguelands"]] = {
+		low = 35,
+		high = 40,
+		continent = Eastern_Kingdoms,
+		instances = BZ["Scholomance"],
+		paths = {
+			[BZ["The Hinterlands"]] = true,
+			[BZ["Eastern Plaguelands"]] = true,
+			[BZ["Tirisfal Glades"]] = true,
+			[BZ["Scholomance"]] = true,
+			[BZ["Hillsbrad Foothills"]] = true,
+		},
+		fishing_min = 225,
+		battlepet_low = 10,
+		battlepet_high = 11,
+	}
+
+	zones[BZ["Eastern Plaguelands"]] = {
+		low = 40,
+		high = 45,
+		continent = Eastern_Kingdoms,
+		instances = BZ["Stratholme"],
+		paths = {
+			[BZ["Western Plaguelands"]] = true,
+			[BZ["Stratholme"]] = true,
+			[BZ["Ghostlands"]] = true,
+		},
+		type = "PvP Zone",
+		fishing_min = 300,
+		battlepet_low = 12,
+		battlepet_high = 13,
+	}
+
+	zones[BZ["The Deadmines"]] = {
+		low = 15,
+		high = 21,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Westfall"],
+		groupSize = 5,
+		faction = "Alliance",
+		type = "Instance",
+		fishing_min = 75,
+		entrancePortal = { BZ["Westfall"], 42.6, 72.2 },
+	}
+
+	zones[BZ["Shadowfang Keep"]] = {
+		low = 16,
+		high = 26,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Silverpine Forest"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Silverpine Forest"], 44.80, 67.83 },
+	}
+
+	zones[BZ["The Stockade"]] = {
+		low = 20,
+		high = 30,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Stormwind City"],
+		groupSize = 5,
+		faction = "Alliance",
+		type = "Instance",
+		entrancePortal = { BZ["Stormwind City"], 50.5, 66.3 },
+	}
+
+	zones[BZ["Gnomeregan"]] = {
+		low = 24,
+		high = 34,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Dun Morogh"],
+		groupSize = 5,
+		faction = "Alliance",
+		type = "Instance",
+		entrancePortal = { BZ["Dun Morogh"], 24, 38.9 },
+	}
+
+	-- Had to remove the complex 'Scarlet Monastery' because of the new instance with the same name (MoP)
+--	zones[BZ["Scarlet Monastery"]] = {
+--		low = 26,
+--		high = 45,
+--		continent = Eastern_Kingdoms,
+--		instances = {
+--			[BZ["Armory"]] = true,
+--			[BZ["Library"]] = true,
+--			[BZ["Cathedral"]] = true,
+--			[BZ["Graveyard"]] = true,
+--		},
+--		paths = {
+--			[BZ["Tirisfal Glades"]] = true,
+--			[BZ["Armory"]] = true,
+--			[BZ["Library"]] = true,
+--			[BZ["Graveyard"]] = true,
+--			[BZ["Cathedral"]] = true,
+--		},
+--		faction = "Horde",
+--		fishing_min = 225,
+--		type = "Complex",
+--	}
+
+
+	-- Instances Library and Armory have been merged into instance Scarlet Monastery (MoP)
+--	zones[BZ["Library"]] = {
+--		low = 29,
+--		high = 39,
+--		continent = Eastern_Kingdoms,
+--		paths = BZ["Scarlet Monastery"],
+--		groupSize = 5,
+--		type = "Instance",
+--		complex = BZ["Scarlet Monastery"],
+--		entrancePortal = { BZ["Tirisfal Glades"], 85.30, 32.17 },
+--	}
+
+--	zones[BZ["Armory"]] = {
+--		low = 32,
+--		high = 42,
+--		continent = Eastern_Kingdoms,
+--		paths = BZ["Scarlet Monastery"],
+--		groupSize = 5,
+--		type = "Instance",
+--		complex = BZ["Scarlet Monastery"],
+--		entrancePortal = { BZ["Tirisfal Glades"], 85.63, 31.62 },
+--	}
+
+	-- New instance (MoP)
+	zones[BZ["Scarlet Halls"]] = {
+		low = 28,
+		high = 31,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Tirisfal Glades"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Tirisfal Glades"], 84.88, 30.63 },  -- TODO: check
+	}
+
+	-- Instances Graveyard and Cathedral have been merged into instance Scarlet Monastery (MoP)
+--	zones[BZ["Graveyard"]] = {
+--		low = 26,
+--		high = 36,
+--		continent = Eastern_Kingdoms,
+--		paths = BZ["Scarlet Monastery"],
+--		groupSize = 5,
+--		type = "Instance",
+--		complex = BZ["Scarlet Monastery"],
+--		entrancePortal = { BZ["Tirisfal Glades"], 84.88, 30.63 },
+--	}
+
+--	zones[BZ["Cathedral"]] = {
+--		low = 35,
+--		high = 45,
+--		continent = Eastern_Kingdoms,
+--		paths = BZ["Scarlet Monastery"],
+--		groupSize = 5,
+--		type = "Instance",
+--		complex = BZ["Scarlet Monastery"],
+--		entrancePortal = { BZ["Tirisfal Glades"], 85.35, 30.57 },
+--	}
+
+	-- New instance (MoP)
+	zones[BZ["Scarlet Monastery"]] = {
+		low = 30,
+		high = 33,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Tirisfal Glades"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Tirisfal Glades"], 84.88, 30.63 },  -- TODO: check
+	}
+
+	zones[BZ["Uldaman"]] = {
+		low = 35,
+		high = 45,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Badlands"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Badlands"], 42.4, 18.6 },
+	}
+
+	zones[BZ["The Temple of Atal'Hakkar"]] = {
+		low = 50,
+		high = 60,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Swamp of Sorrows"],
+		groupSize = 5,
+		type = "Instance",
+		fishing_min = 300,
+		entrancePortal = { BZ["Swamp of Sorrows"], 70, 54 },
+	}
+
+	zones[BZ["Blackrock Depths"]] = {
+		low = 47,
+		high = 61,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Molten Core"]] = true,
+			[BZ["Blackrock Mountain"]] = true,
+		},
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Blackrock Mountain"],
+		entrancePortal = { BZ["Searing Gorge"], 35.4, 84.4 },
+	}
+
+	zones[BZ["Blackrock Spire"]] = {
+		low = 55,
+		high = 65,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Blackrock Mountain"]] = true,
+			[BZ["Blackwing Lair"]] = true,
+			[BZ["Blackwing Descent"]] = true,
+		},
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Blackrock Mountain"],
+		entrancePortal = { BZ["Burning Steppes"], 29.7, 37.5 },
+	}
+
+	zones[BZ["Upper Blackrock Spire"]] = {
+		low = 100,
+		high = 100,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Blackrock Mountain"]] = true,
+		},
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Blackrock Mountain"],
+		entrancePortal = { BZ["Burning Steppes"], 29.7, 37.5 },
+	}
+
+
+	zones[BZ["Scholomance"]] = {
+		low = 38,
+		high = 48,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Western Plaguelands"],
+		groupSize = 5,
+		type = "Instance",
+		fishing_min = 425,
+		entrancePortal = { BZ["Western Plaguelands"], 69.4, 72.8 },
+	}
+
+	zones[BZ["Stratholme"]] = {
+		low = 42,
+		high = 56,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Eastern Plaguelands"],
+		groupSize = 5,
+		type = "Instance",
+		fishing_min = 425,
+		entrancePortal = { BZ["Eastern Plaguelands"], 30.8, 14.4 },
+	}
+
+	zones[BZ["Blackwing Lair"]] = {
+		low = 60,
+		high = 62,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Blackrock Mountain"],
+		groupSize = 40,
+		type = "Instance",
+		complex = BZ["Blackrock Mountain"],
+		entrancePortal = { BZ["Burning Steppes"], 29.7, 37.5 },
+	}
+
+	zones[BZ["Molten Core"]] = {
+		low = 60,
+		high = 62,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Blackrock Mountain"],
+		groupSize = 40,
+		type = "Instance",
+		complex = BZ["Blackrock Mountain"],
+		fishing_min = 1,  -- lava
+		entrancePortal = { BZ["Searing Gorge"], 35.4, 84.4 },
+	}
+
+	zones[BZ["Karazhan"]] = {
+		low = 70,
+		high = 72,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Deadwind Pass"],
+		groupSize = 10,
+		type = "Instance",
+		entrancePortal = { BZ["Deadwind Pass"], 40.9, 73.2 },
+	}
+
+	zones[BZ["Zul'Aman"]] = {
+		low = 85,
+		high = 85,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Ghostlands"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Ghostlands"], 77.7, 63.2 },
+		fishing_min = 425,
+	}
+
+	zones[BZ["Zul'Gurub"]] = {
+		low = 85,
+		high = 85,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Northern Stranglethorn"],
+		groupSize = 5,
+		type = "Instance",
+--		fishing_min = 330,
+		entrancePortal = { BZ["Northern Stranglethorn"], 52.2, 17.1 },
+	}
+
+	zones[BZ["Darnassus"]] = {
+		continent = Kalimdor,
+		paths = {
+			[BZ["Teldrassil"]] = true,
+			[transports["DARNASSUS_BLASTEDLANDS_PORTAL"]] = true,
+			[transports["DARNASSUS_EXODAR_PORTAL"]] = true,
+		},
+		faction = "Alliance",
+		type = "City",
+		fishing_min = 75,
+		battlepet_low = 1,
+		battlepet_high = 2,
+	}
+
+	zones[BZ["Moonglade"]] = {
+		continent = Kalimdor,
+		low = 55,
+		high = 60,
+		paths = {
+			[BZ["Felwood"]] = true,
+			[BZ["Winterspring"]] = true,
+		},
+		fishing_min = 300,
+		battlepet_low = 15,
+		battlepet_high = 16,
+	}
+
+	zones[BZ["Orgrimmar"]] = {
+		continent = Kalimdor,
+		instances = {
+			[BZ["Ragefire Chasm"]] = true,
+			[BZ["The Ring of Valor"]] = true,
+		},
+		paths = {
+			[BZ["Durotar"]] = true,
+			[BZ["Ragefire Chasm"]] = true,
+			[BZ["Azshara"]] = true,
+			[transports["ORGRIMMAR_UNDERCITY_ZEPPELIN"]] = true,
+			[transports["ORGRIMMAR_GROMGOL_ZEPPELIN"]] = true,
+			[transports["ORGRIMMAR_BOREANTUNDRA_ZEPPELIN"]] = true,
+			[transports["ORGRIMMAR_THUNDERBLUFF_ZEPPELIN"]] = true,
+			[transports["ORGRIMMAR_BLASTEDLANDS_PORTAL"]] = true,
+			[transports["ORGRIMMAR_HELLFIRE_PORTAL"]] = true,
+			[transports["ORGRIMMAR_TWILIGHTHIGHLANDS_PORTAL"]] = true,
+			[transports["ORGRIMMAR_MOUNTHYJAL_PORTAL"]] = true,
+			[transports["ORGRIMMAR_DEEPHOLM_PORTAL"]] = true,
+			[transports["ORGRIMMAR_ULDUM_PORTAL"]] = true,
+			[transports["ORGRIMMAR_VASHJIR_PORTAL"]] = true,
+			[transports["ORGRIMMAR_TOLBARAD_PORTAL"]] = true,
+			[transports["ORGRIMMAR_JADEFOREST_PORTAL"]] = true,
+		},
+		faction = "Horde",
+		type = "City",
+		fishing_min = 75,
+		battlepet_low = 1,
+		battlepet_high = 1,
+	}
+
+	zones[BZ["The Exodar"]] = {
+		continent = Kalimdor,
+		paths = {
+			[BZ["Azuremyst Isle"]] = true,
+			[transports["EXODAR_BLASTEDLANDS_PORTAL"]] = true,
+			[transports["EXODAR_DARNASSUS_PORTAL"]] = true,
+		},
+		faction = "Alliance",
+		type = "City",
+		battlepet_low = 1,
+		battlepet_high = 2,
+	}
+
+	zones[BZ["Thunder Bluff"]] = {
+		continent = Kalimdor,
+		paths = {
+			[BZ["Mulgore"]] = true,
+			[transports["ORGRIMMAR_THUNDERBLUFF_ZEPPELIN"]] = true,
+			[transports["THUNDERBLUFF_BLASTEDLANDS_PORTAL"]] = true,
+		},
+		faction = "Horde",
+		type = "City",
+		fishing_min = 75,
+		battlepet_low = 1,
+		battlepet_high = 2,
+	}
+
+	zones[BZ["Azuremyst Isle"]] = {
+		low = 1,
+		high = 10,
+		continent = Kalimdor,
+		paths = {
+			[BZ["The Exodar"]] = true,
+			[BZ["Ammen Vale"]] = true,
+			[BZ["Bloodmyst Isle"]] = true,
+			[transports["TELDRASSIL_AZUREMYST_BOAT"]] = true,
+		},
+		faction = "Alliance",
+		fishing_min = 25,
+		battlepet_low = 1,
+		battlepet_high = 2,
+	}
+
+	zones[BZ["Ammen Vale"]] = {
+		low = 1,
+		high = 6,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Azuremyst Isle"]] = true,
+		},
+		faction = "Alliance",
+		fishing_min = 25,
+	}
+
+	zones[BZ["Durotar"]] = {
+		low = 1,
+		high = 10,
+		continent = Kalimdor,
+		instances = BZ["Ragefire Chasm"],
+		paths = {
+			[BZ["Northern Barrens"]] = true,
+			[BZ["Orgrimmar"]] = true,
+			[BZ["Valley of Trials"]] = true,
+			[BZ["Echo Isles"]] = true,
+		},
+		faction = "Horde",
+		fishing_min = 25,
+		battlepet_low = 1,
+		battlepet_high = 2,
+	}
+
+	zones[BZ["Valley of Trials"]] = {
+		low = 1,
+		high = 6,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Durotar"]] = true,
+		},
+		faction = "Horde",
+		fishing_min = 25,
+	}
+
+	zones[BZ["Echo Isles"]] = {
+		low = 1,
+		high = 6,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Durotar"]] = true,
+		},
+		faction = "Horde",
+		fishing_min = 25,
+	}
+
+	zones[BZ["Mulgore"]] = {
+		low = 1,
+		high = 10,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Thunder Bluff"]] = true,
+			[BZ["Southern Barrens"]] = true,
+			[transports["MULGORE_DARKMOON_PORTAL"]] = true,
+		},
+		faction = "Horde",
+		fishing_min = 25,
+		battlepet_low = 1,
+		battlepet_high = 2,
+	}
+
+	zones[BZ["Camp Narache"]] = {
+		low = 1,
+		high = 6,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Mulgore"]] = true,
+		},
+		faction = "Horde",
+		fishing_min = 25,
+	}
+
+	zones[BZ["Teldrassil"]] = {
+		low = 1,
+		high = 10,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Darnassus"]] = true,
+			[BZ["Shadowglen"]] = true,
+			[transports["TELDRASSIL_AZUREMYST_BOAT"]] = true,
+			[transports["TELDRASSIL_STORMWIND_BOAT"]] = true,
+		},
+		faction = "Alliance",
+		fishing_min = 25,
+		battlepet_low = 1,
+		battlepet_high = 2,
+	}
+
+	zones[BZ["Shadowglen"]] = {
+		low = 1,
+		high = 6,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Teldrassil"]] = true,
+		},
+		faction = "Alliance",
+		fishing_min = 25,
+	}
+
+	zones[BZ["Bloodmyst Isle"]] = {
+		low = 10,
+		high = 20,
+		continent = Kalimdor,
+		paths = BZ["Azuremyst Isle"],
+		faction = "Alliance",
+		fishing_min = 75,
+		battlepet_low = 3,
+		battlepet_high = 6,
+	}
+
+	zones[BZ["Darkshore"]] = {
+		low = 10,
+		high = 20,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Ashenvale"]] = true,
+		},
+		faction = "Alliance",
+		fishing_min = 75,
+		battlepet_low = 3,
+		battlepet_high = 6,
+	}
+
+	zones[BZ["Northern Barrens"]] = {
+		low = 10,
+		high = 20,
+		continent = Kalimdor,
+		instances = {
+			[BZ["Wailing Caverns"]] = true,
+			[BZ["Warsong Gulch"]] = isHorde and true or nil,
+		},
+		paths = {
+			[BZ["Southern Barrens"]] = true,
+			[BZ["Ashenvale"]] = true,
+			[BZ["Durotar"]] = true,
+			[BZ["Wailing Caverns"]] = true,
+			[transports["BOOTYBAY_RATCHET_BOAT"]] = true,
+			[BZ["Warsong Gulch"]] = isHorde and true or nil,
+			[BZ["Stonetalon Mountains"]] = true,
+		},
+		faction = "Horde",
+		fishing_min = 75,
+		battlepet_low = 3,
+		battlepet_high = 4,
+	}
+
+	zones[BZ["Southern Barrens"]] = {
+		low = 30,
+		high = 35,
+		continent = Kalimdor,
+		instances = {
+			[BZ["Razorfen Kraul"]] = true,
+		},
+		paths = {
+			[BZ["Northern Barrens"]] = true,
+			[BZ["Thousand Needles"]] = true,
+			[BZ["Razorfen Kraul"]] = true,
+			[BZ["Dustwallow Marsh"]] = true,
+			[BZ["Stonetalon Mountains"]] = true,
+			[BZ["Mulgore"]] = true,
+		},
+		fishing_min = 225,
+		battlepet_low = 9,
+		battlepet_high = 10,
+	}
+
+	zones[BZ["Stonetalon Mountains"]] = {
+		low = 25,
+		high = 30,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Desolace"]] = true,
+			[BZ["Northern Barrens"]] = true,
+			[BZ["Southern Barrens"]] = true,
+			[BZ["Ashenvale"]] = true,
+		},
+		fishing_min = 150,
+		battlepet_low = 5,
+		battlepet_high = 7,
+	}
+
+	zones[BZ["Ashenvale"]] = {
+		low = 20,
+		high = 25,
+		continent = Kalimdor,
+		instances = {
+			[BZ["Blackfathom Deeps"]] = true,
+			[BZ["Warsong Gulch"]] = not isHorde and true or nil,
+		},
+		paths = {
+			[BZ["Azshara"]] = true,
+			[BZ["Northern Barrens"]] = true,
+			[BZ["Blackfathom Deeps"]] = true,
+			[BZ["Warsong Gulch"]] = not isHorde and true or nil,
+			[BZ["Felwood"]] = true,
+			[BZ["Darkshore"]] = true,
+			[BZ["Stonetalon Mountains"]] = true,
+		},
+		fishing_min = 150,
+		battlepet_low = 4,
+		battlepet_high = 6,
+	}
+
+	zones[BZ["Thousand Needles"]] = {
+		low = 40,
+		high = 45,
+		continent = Kalimdor,
+		instances = {
+			[BZ["Razorfen Downs"]] = true,
+		},
+		paths = {
+			[BZ["Feralas"]] = true,
+			[BZ["Southern Barrens"]] = true,
+			[BZ["Tanaris"]] = true,
+			[BZ["Dustwallow Marsh"]] = true,
+			[BZ["Razorfen Downs"]] = true,
+		},
+		fishing_min = 300,
+		battlepet_low = 13,
+		battlepet_high = 14,
+	}
+
+	zones[BZ["Desolace"]] = {
+		low = 30,
+		high = 35,
+		continent = Kalimdor,
+		instances = BZ["Maraudon"],
+		paths = {
+			[BZ["Feralas"]] = true,
+			[BZ["Stonetalon Mountains"]] = true,
+			[BZ["Maraudon"]] = true,
+		},
+		fishing_min = 225,
+		battlepet_low = 7,
+		battlepet_high = 9,
+	}
+
+	zones[BZ["Dustwallow Marsh"]] = {
+		low = 35,
+		high = 40,
+		continent = Kalimdor,
+		instances = BZ["Onyxia's Lair"],
+		paths = {
+			[BZ["Onyxia's Lair"]] = true,
+			[BZ["Southern Barrens"]] = true,
+			[BZ["Thousand Needles"]] = true,
+			[transports["MENETHIL_THERAMORE_BOAT"]] = true,
+		},
+		fishing_min = 225,
+		battlepet_low = 12,
+		battlepet_high = 13,
+	}
+
+	zones[BZ["Feralas"]] = {
+		low = 35,
+		high = 40,
+		continent = Kalimdor,
+		instances = {
+			[BZ["Dire Maul (East)"]] = true,
+			[BZ["Dire Maul (North)"]] = true,
+			[BZ["Dire Maul (West)"]] = true,
+		},
+		paths = {
+			[BZ["Thousand Needles"]] = true,
+			[BZ["Desolace"]] = true,
+			[BZ["Dire Maul"]] = true,
+		},
+		complexes = {
+			[BZ["Dire Maul"]] = true,
+		},
+		fishing_min = 225,
+		battlepet_low = 11,
+		battlepet_high = 12,
+	}
+
+	zones[BZ["Tanaris"]] = {
+		low = 45,
+		high = 50,
+		continent = Kalimdor,
+		instances = {
+			[BZ["Zul'Farrak"]] = true,
+			[BZ["Old Hillsbrad Foothills"]] = true,
+			[BZ["The Black Morass"]] = true,
+			[BZ["Hyjal Summit"]] = true,
+			[BZ["The Culling of Stratholme"]] = true,
+			[BZ["End Time"]] = true,
+			[BZ["Hour of Twilight"]] = true,
+			[BZ["Well of Eternity"]] = true,
+			[BZ["Dragon Soul"]] = true,
+		},
+		paths = {
+			[BZ["Thousand Needles"]] = true,
+			[BZ["Un'Goro Crater"]] = true,
+			[BZ["Zul'Farrak"]] = true,
+			[BZ["Caverns of Time"]] = true,
+			[BZ["Uldum"]] = true,
+		},
+		complexes = {
+			[BZ["Caverns of Time"]] = true,
+		},
+		fishing_min = 300,
+		battlepet_low = 13,
+		battlepet_high = 14,
+	}
+
+	zones[BZ["Azshara"]] = {
+		low = 10,
+		high = 20,
+		continent = Kalimdor,
+		paths = BZ["Ashenvale"],
+		paths = BZ["Orgrimmar"],
+		fishing_min = 75,
+		faction = "Horde",
+		battlepet_low = 3,
+		battlepet_high = 6,
+	}
+
+	zones[BZ["Felwood"]] = {
+		low = 45,
+		high = 50,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Winterspring"]] = true,
+			[BZ["Moonglade"]] = true,
+			[BZ["Ashenvale"]] = true,
+		},
+		fishing_min = 300,
+		battlepet_low = 14,
+		battlepet_high = 15,
+	}
+
+	zones[BZ["Un'Goro Crater"]] = {
+		low = 50,
+		high = 55,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Silithus"]] = true,
+			[BZ["Tanaris"]] = true,
+		},
+		fishing_min = 375,
+		battlepet_low = 15,
+		battlepet_high = 16,
+	}
+
+	zones[BZ["Silithus"]] = {
+		low = 55,
+		high = 60,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Ruins of Ahn'Qiraj"]] = true,
+			[BZ["Un'Goro Crater"]] = true,
+			[BZ["Ahn'Qiraj: The Fallen Kingdom"]] = true,
+		},
+		instances = {
+			[BZ["Temple of Ahn'Qiraj"]] = true,
+			[BZ["Ruins of Ahn'Qiraj"]] = true,
+		},
+		complexes = {
+			[BZ["Ahn'Qiraj: The Fallen Kingdom"]] = true,
+		},
+		type = "PvP Zone",
+		fishing_min = 425,
+		battlepet_low = 16,
+		battlepet_high = 17,
+	}
+
+	zones[BZ["Winterspring"]] = {
+		low = 50,
+		high = 55,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Felwood"]] = true,
+			[BZ["Moonglade"]] = true,
+			[BZ["Mount Hyjal"]] = true,
+		},
+		fishing_min = 425,
+		battlepet_low = 17,
+		battlepet_high = 18,
+	}
+
+	zones[BZ["Ragefire Chasm"]] = {
+		low = 15,
+		high = 21,
+		continent = Kalimdor,
+		paths = BZ["Orgrimmar"],
+		groupSize = 5,
+		faction = "Horde",
+		type = "Instance",
+		entrancePortal = { BZ["Orgrimmar"], 52.8, 49 },
+	}
+
+	zones[BZ["Wailing Caverns"]] = {
+		low = 15,
+		high = 25,
+		continent = Kalimdor,
+		paths = BZ["Northern Barrens"],
+		groupSize = 5,
+		type = "Instance",
+		fishing_min = 75,
+		entrancePortal = { BZ["Northern Barrens"], 42.1, 66.5 },
+	}
+
+	zones[BZ["Blackfathom Deeps"]] = {
+		low = 20,
+		high = 30,
+		continent = Kalimdor,
+		paths = BZ["Ashenvale"],
+		groupSize = 5,
+		type = "Instance",
+		fishing_min = 75,
+		entrancePortal = { BZ["Ashenvale"], 14.6, 15.3 },
+	}
+
+	zones[BZ["Razorfen Kraul"]] = {
+		low = 30,
+		high = 40,
+		continent = Kalimdor,
+		paths = BZ["Southern Barrens"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Southern Barrens"], 40.8, 94.5 },
+	}
+
+	zones[BZ["Razorfen Downs"]] = {
+		low = 40,
+		high = 50,
+		continent = Kalimdor,
+		paths = BZ["Thousand Needles"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Thousand Needles"], 47.5, 23.7 },
+	}
+
+	zones[BZ["Zul'Farrak"]] = {
+		low = 44,
+		high = 54,
+		continent = Kalimdor,
+		paths = BZ["Tanaris"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Tanaris"], 36, 11.7 },
+	}
+
+	zones[BZ["Maraudon"]] = {
+		low = 30,
+		high = 44,
+		continent = Kalimdor,
+		paths = BZ["Desolace"],
+		groupSize = 5,
+		type = "Instance",
+		fishing_min = 300,
+		entrancePortal = { BZ["Desolace"], 29, 62.4 },
+	}
+
+	zones[BZ["Dire Maul"]] = {
+		low = 36,
+		high = 52,
+		continent = Kalimdor,
+		instances = {
+			[BZ["Dire Maul (East)"]] = true,
+			[BZ["Dire Maul (North)"]] = true,
+			[BZ["Dire Maul (West)"]] = true,
+		},
+		paths = {
+			[BZ["Feralas"]] = true,
+			[BZ["Dire Maul (East)"]] = true,
+			[BZ["Dire Maul (North)"]] = true,
+			[BZ["Dire Maul (West)"]] = true,
+		},
+		type = "Complex",
+	}
+
+	zones[BZ["Dire Maul (East)"]] = {
+		low = 36,
+		high = 46,
+		continent = Kalimdor,
+		paths = BZ["Dire Maul"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Dire Maul"],
+		entrancePortal = { BZ["Feralas"], 66.7, 34.8 },
+	}
+
+	zones[BZ["Dire Maul (North)"]] = {
+		low = 42,
+		high = 52,
+		continent = Kalimdor,
+		paths = BZ["Dire Maul"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Dire Maul"],
+		entrancePortal = { BZ["Feralas"], 62.5, 24.9 },
+	}
+
+	zones[BZ["Dire Maul (West)"]] = {
+		low = 39,
+		high = 49,
+		continent = Kalimdor,
+		paths = BZ["Dire Maul"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Dire Maul"],
+		entrancePortal = { BZ["Feralas"], 60.3, 30.6 },
+	}
+
+	zones[BZ["Onyxia's Lair"]] = {
+		low = 80,
+		high = 80,
+		continent = Kalimdor,
+		paths = BZ["Dustwallow Marsh"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["Dustwallow Marsh"], 52, 76 },
+	}
+
+	zones[BZ["Temple of Ahn'Qiraj"]] = {
+		low = 60,
+		high = 63,
+		continent = Kalimdor,
+		paths = BZ["Ahn'Qiraj: The Fallen Kingdom"],
+		groupSize = 40,
+		type = "Instance",
+		complex = BZ["Ahn'Qiraj: The Fallen Kingdom"],
+		entrancePortal = { BZ["Ahn'Qiraj: The Fallen Kingdom"], 46.6, 7.4 },
+	}
+
+	zones[BZ["Ruins of Ahn'Qiraj"]] = {
+		low = 60,
+		high = 63,
+		continent = Kalimdor,
+		paths = BZ["Ahn'Qiraj: The Fallen Kingdom"],
+		groupSize = 20,
+		type = "Instance",
+		complex = BZ["Ahn'Qiraj: The Fallen Kingdom"],
+		entrancePortal = { BZ["Ahn'Qiraj: The Fallen Kingdom"], 58.9, 14.3 },
+	}
+
+	zones[BZ["Caverns of Time"]] = {
+		low = 64,
+		high = 85,
+		continent = Kalimdor,
+		instances = {
+			[BZ["Old Hillsbrad Foothills"]] = true,
+			[BZ["The Black Morass"]] = true,
+			[BZ["Hyjal Summit"]] = true,
+			[BZ["The Culling of Stratholme"]] = true,
+			[BZ["End Time"]] = true,
+			[BZ["Hour of Twilight"]] = true,
+			[BZ["Well of Eternity"]] = true,
+			[BZ["Dragon Soul"]] = true,
+		},
+		paths = {
+			[BZ["Tanaris"]] = true,
+			[BZ["Old Hillsbrad Foothills"]] = true,
+			[BZ["The Black Morass"]] = true,
+			[BZ["Hyjal Summit"]] = true,
+			[BZ["The Culling of Stratholme"]] = true,
+		},
+		type = "Complex",
+	}
+
+	-- a.k.a. The Escape from Durnhold Keep
+	zones[BZ["Old Hillsbrad Foothills"]] = {
+		low = 64,
+		high = 73,
+		continent = Kalimdor,
+		paths = BZ["Caverns of Time"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Caverns of Time"],
+		entrancePortal = { BZ["Caverns of Time"], 26.7, 32.6 },
+	}
+
+	zones[BZ["The Black Morass"]] = {
+		low = 68,
+		high = 75,
+		continent = Kalimdor,
+		paths = BZ["Caverns of Time"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Caverns of Time"],
+		entrancePortal = { BZ["Caverns of Time"], 34.4, 84.9 },
+	}
+
+	zones[BZ["The Culling of Stratholme"]] = {
+		low = 77,
+		high = 82,
+		continent = Kalimdor,
+		paths = BZ["Caverns of Time"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Caverns of Time"],
+		entrancePortal = { BZ["Caverns of Time"], 60.3, 82.8 },
+	}
+
+	-- a.k.a. The Battle for Mount Hyjal
+	zones[BZ["Hyjal Summit"]] = {
+		low = 70,
+		high = 72,
+		continent = Kalimdor,
+		paths = BZ["Caverns of Time"],
+		groupSize = 25,
+		type = "Instance",
+		complex = BZ["Caverns of Time"],
+		entrancePortal = { BZ["Caverns of Time"], 38.8, 16.6 },
+	}
+
+	zones[BZ["Shattrath City"]] = {
+		continent = Outland,
+		paths = {
+			[BZ["Terokkar Forest"]] = true,
+			[BZ["Nagrand"]] = true,
+			[transports["SHATTRATH_QUELDANAS_PORTAL"]] = true,
+			--[transports["SHATTRATH_COT_PORTAL"]] = true,
+		},
+		faction = "Sanctuary",
+		type = "City",
+		battlepet_low = 17,
+		battlepet_high = 17,
+	}
+
+	zones[BZ["Hellfire Citadel"]] = {
+		low = 57,
+		high = 75,
+		continent = Outland,
+		instances = {
+			[BZ["The Blood Furnace"]] = true,
+			[BZ["Hellfire Ramparts"]] = true,
+			[BZ["Magtheridon's Lair"]] = true,
+			[BZ["The Shattered Halls"]] = true,
+		},
+		paths = {
+			[BZ["Hellfire Peninsula"]] = true,
+			[BZ["The Blood Furnace"]] = true,
+			[BZ["Hellfire Ramparts"]] = true,
+			[BZ["Magtheridon's Lair"]] = true,
+			[BZ["The Shattered Halls"]] = true,
+		},
+		type = "Complex",
+	}
+
+	zones[BZ["Hellfire Peninsula"]] = {
+		low = 58,
+		high = 63,
+		continent = Outland,
+		instances = {
+			[BZ["The Blood Furnace"]] = true,
+			[BZ["Hellfire Ramparts"]] = true,
+			[BZ["Magtheridon's Lair"]] = true,
+			[BZ["The Shattered Halls"]] = true,
+		},
+		paths = {
+			[BZ["Zangarmarsh"]] = true,
+			[BZ["The Dark Portal"]] = true,
+			[BZ["Terokkar Forest"]] = true,
+			[BZ["Hellfire Citadel"]] = true,
+			[transports["HELLFIRE_ORGRIMMAR_PORTAL"]] = true,
+			[transports["HELLFIRE_STORMWIND_PORTAL"]] = true,
+		},
+		complexes = {
+			[BZ["Hellfire Citadel"]] = true,
+		},
+		type = "PvP Zone",
+		fishing_min = 375,
+		battlepet_low = 17,
+		battlepet_high = 18,
+	}
+
+	zones[BZ["Coilfang Reservoir"]] = {
+		low = 60,
+		high = 75,
+		continent = Outland,
+		instances = {
+			[BZ["The Underbog"]] = true,
+			[BZ["Serpentshrine Cavern"]] = true,
+			[BZ["The Steamvault"]] = true,
+			[BZ["The Slave Pens"]] = true,
+		},
+		paths = {
+			[BZ["Zangarmarsh"]] = true,
+			[BZ["The Underbog"]] = true,
+			[BZ["Serpentshrine Cavern"]] = true,
+			[BZ["The Steamvault"]] = true,
+			[BZ["The Slave Pens"]] = true,
+		},
+		fishing_min = 400,
+		type = "Complex",
+	}
+
+	zones[BZ["Zangarmarsh"]] = {
+		low = 60,
+		high = 64,
+		continent = Outland,
+		instances = {
+			[BZ["The Underbog"]] = true,
+			[BZ["Serpentshrine Cavern"]] = true,
+			[BZ["The Steamvault"]] = true,
+			[BZ["The Slave Pens"]] = true,
+		},
+		paths = {
+			[BZ["Coilfang Reservoir"]] = true,
+			[BZ["Blade's Edge Mountains"]] = true,
+			[BZ["Terokkar Forest"]] = true,
+			[BZ["Nagrand"]] = true,
+			[BZ["Hellfire Peninsula"]] = true,
+		},
+		complexes = {
+			[BZ["Coilfang Reservoir"]] = true,
+		},
+		type = "PvP Zone",
+		fishing_min = 400,
+		battlepet_low = 18,
+		battlepet_high = 19,
+	}
+
+	zones[BZ["Ring of Observance"]] = {
+		low = 62,
+		high = 75,
+		continent = Outland,
+		instances = {
+			[BZ["Mana-Tombs"]] = true,
+			[BZ["Sethekk Halls"]] = true,
+			[BZ["Shadow Labyrinth"]] = true,
+			[BZ["Auchenai Crypts"]] = true,
+		},
+		paths = {
+			[BZ["Terokkar Forest"]] = true,
+			[BZ["Mana-Tombs"]] = true,
+			[BZ["Sethekk Halls"]] = true,
+			[BZ["Shadow Labyrinth"]] = true,
+			[BZ["Auchenai Crypts"]] = true,
+		},
+		type = "Complex",
+	}
+
+	zones[BZ["Terokkar Forest"]] = {
+		low = 62,
+		high = 65,
+		continent = Outland,
+		instances = {
+			[BZ["Mana-Tombs"]] = true,
+			[BZ["Sethekk Halls"]] = true,
+			[BZ["Shadow Labyrinth"]] = true,
+			[BZ["Auchenai Crypts"]] = true,
+		},
+		paths = {
+			[BZ["Ring of Observance"]] = true,
+			[BZ["Shadowmoon Valley"]] = true,
+			[BZ["Zangarmarsh"]] = true,
+			[BZ["Shattrath City"]] = true,
+			[BZ["Hellfire Peninsula"]] = true,
+			[BZ["Nagrand"]] = true,
+		},
+		complexes = {
+			[BZ["Ring of Observance"]] = true,
+		},
+		type = "PvP Zone",
+		fishing_min = 450,
+		battlepet_low = 18,
+		battlepet_high = 19,
+	}
+
+	zones[BZ["Nagrand"]] = {
+		low = 64,
+		high = 67,
+		continent = Outland,
+		instances = {
+			[BZ["Nagrand Arena"]] = true,
+		},
+		paths = {
+			[BZ["Zangarmarsh"]] = true,
+			[BZ["Shattrath City"]] = true,
+			[BZ["Terokkar Forest"]] = true,
+		},
+		type = "PvP Zone",
+		fishing_min = 475,
+		battlepet_low = 18,
+		battlepet_high = 19,
+	}
+
+	zones[BZ["Blade's Edge Mountains"]] = {
+		low = 65,
+		high = 68,
+		continent = Outland,
+		instances =
+		{
+			[BZ["Gruul's Lair"]] = true,
+			[BZ["Blade's Edge Arena"]] = true,
+		},
+		paths = {
+			[BZ["Netherstorm"]] = true,
+			[BZ["Zangarmarsh"]] = true,
+			[BZ["Gruul's Lair"]] = true,
+		},
+		battlepet_low = 18,
+		battlepet_high = 20,
+	}
+
+	zones[BZ["Tempest Keep"]] = {
+		low = 67,
+		high = 75,
+		continent = Outland,
+		instances = {
+			[BZ["The Mechanar"]] = true,
+			[BZ["The Eye"]] = true,
+			[BZ["The Botanica"]] = true,
+			[BZ["The Arcatraz"]] = true,
+		},
+		paths = {
+			[BZ["Netherstorm"]] = true,
+			[BZ["The Mechanar"]] = true,
+			[BZ["The Eye"]] = true,
+			[BZ["The Botanica"]] = true,
+			[BZ["The Arcatraz"]] = true,
+		},
+		type = "Complex",
+	}
+
+	zones[BZ["Netherstorm"]] = {
+		low = 67,
+		high = 70,
+		continent = Outland,
+		instances = {
+			[BZ["The Mechanar"]] = true,
+			[BZ["The Botanica"]] = true,
+			[BZ["The Arcatraz"]] = true,
+			[BZ["The Eye"]] = true,
+			[BZ["Eye of the Storm"]] = true,
+		},
+		paths = {
+			[BZ["Tempest Keep"]] = true,
+			[BZ["Blade's Edge Mountains"]] = true,
+		},
+		complexes = {
+			[BZ["Tempest Keep"]] = true,
+		},
+		fishing_min = 475,
+		battlepet_low = 20,
+		battlepet_high = 21,
+	}
+
+	zones[BZ["Shadowmoon Valley"]] = {
+		low = 67,
+		high = 70,
+		continent = Outland,
+		instances = BZ["Black Temple"],
+		paths = {
+			[BZ["Terokkar Forest"]] = true,
+			[BZ["Black Temple"]] = true,
+		},
+		fishing_min = 375,
+		battlepet_low = 20,
+		battlepet_high = 21,
+	}
+
+	zones[BZ["Black Temple"]] = {
+		low = 70,
+		high = 72,
+		continent = Outland,
+		paths = BZ["Shadowmoon Valley"],
+		groupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["Shadowmoon Valley"], 77.7, 43.7 },
+	}
+
+	zones[BZ["Auchenai Crypts"]] = {
+		low = 63,
+		high = 72,
+		continent = Outland,
+		paths = BZ["Ring of Observance"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Ring of Observance"],
+		entrancePortal = { BZ["Terokkar Forest"], 39.6, 65.5 },
+	}
+
+	zones[BZ["Shadow Labyrinth"]] = {
+		low = 67,
+		high = 75,
+		continent = Outland,
+		paths = BZ["Ring of Observance"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Ring of Observance"],
+		entrancePortal = { BZ["Terokkar Forest"], 39.6, 65.5 },
+	}
+
+	zones[BZ["Sethekk Halls"]] = {
+		low = 65,
+		high = 73,
+		continent = Outland,
+		paths = BZ["Ring of Observance"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Ring of Observance"],
+		entrancePortal = { BZ["Terokkar Forest"], 39.6, 65.5 },
+	}
+
+	zones[BZ["Mana-Tombs"]] = {
+		low = 62,
+		high = 71,
+		continent = Outland,
+		paths = BZ["Ring of Observance"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Ring of Observance"],
+		entrancePortal = { BZ["Terokkar Forest"], 39.6, 65.5 },
+	}
+
+	zones[BZ["Hellfire Ramparts"]] = {
+		low = 57,
+		high = 67,
+		continent = Outland,
+		paths = BZ["Hellfire Citadel"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Hellfire Citadel"],
+		entrancePortal = { BZ["Hellfire Peninsula"], 46.8, 54.9 },
+	}
+
+	zones[BZ["The Blood Furnace"]] = {
+		low = 59,
+		high = 68,
+		continent = Outland,
+		paths = BZ["Hellfire Citadel"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Hellfire Citadel"],
+		entrancePortal = { BZ["Hellfire Peninsula"], 46.8, 54.9 },
+	}
+
+	zones[BZ["The Shattered Halls"]] = {
+		low = 67,
+		high = 75,
+		continent = Outland,
+		paths = BZ["Hellfire Citadel"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Hellfire Citadel"],
+		entrancePortal = { BZ["Hellfire Peninsula"], 46.8, 54.9 },
+	}
+
+	zones[BZ["Magtheridon's Lair"]] = {
+		low = 70,
+		high = 72,
+		continent = Outland,
+		paths = BZ["Hellfire Citadel"],
+		groupSize = 25,
+		type = "Instance",
+		complex = BZ["Hellfire Citadel"],
+		entrancePortal = { BZ["Hellfire Peninsula"], 46.8, 54.9 },
+	}
+
+	zones[BZ["The Slave Pens"]] = {
+		low = 60,
+		high = 69,
+		continent = Outland,
+		paths = BZ["Coilfang Reservoir"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Coilfang Reservoir"],
+		entrancePortal = { BZ["Zangarmarsh"], 50.2, 40.8 },
+	}
+
+	zones[BZ["The Underbog"]] = {
+		low = 61,
+		high = 70,
+		continent = Outland,
+		paths = BZ["Coilfang Reservoir"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Coilfang Reservoir"],
+		entrancePortal = { BZ["Zangarmarsh"], 50.2, 40.8 },
+	}
+
+	zones[BZ["The Steamvault"]] = {
+		low = 67,
+		high = 75,
+		continent = Outland,
+		paths = BZ["Coilfang Reservoir"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Coilfang Reservoir"],
+		entrancePortal = { BZ["Zangarmarsh"], 50.2, 40.8 },
+	}
+
+	zones[BZ["Serpentshrine Cavern"]] = {
+		low = 70,
+		high = 72,
+		continent = Outland,
+		paths = BZ["Coilfang Reservoir"],
+		groupSize = 25,
+		type = "Instance",
+		complex = BZ["Coilfang Reservoir"],
+		entrancePortal = { BZ["Zangarmarsh"], 50.2, 40.8 },
+	}
+
+	zones[BZ["Gruul's Lair"]] = {
+		low = 70,
+		high = 72,
+		continent = Outland,
+		paths = BZ["Blade's Edge Mountains"],
+		groupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["Blade's Edge Mountains"], 68, 24 },
+	}
+
+	zones[BZ["The Mechanar"]] = {
+		low = 67,
+		high = 75,
+		continent = Outland,
+		paths = BZ["Tempest Keep"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Tempest Keep"],
+		entrancePortal = { BZ["Netherstorm"], 76.5, 65.1 },
+	}
+
+	zones[BZ["The Botanica"]] = {
+		low = 67,
+		high = 75,
+		continent = Outland,
+		paths = BZ["Tempest Keep"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Tempest Keep"],
+		entrancePortal = { BZ["Netherstorm"], 76.5, 65.1 },
+	}
+
+	zones[BZ["The Arcatraz"]] = {
+		low = 68,
+		high = 75,
+		continent = Outland,
+		paths = BZ["Tempest Keep"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Tempest Keep"],
+		entrancePortal = { BZ["Netherstorm"], 76.5, 65.1 },
+	}
+
+	zones[BZ["The Eye"]] = {
+		low = 70,
+		high = 72,
+		continent = Outland,
+		paths = BZ["Tempest Keep"],
+		groupSize = 25,
+		type = "Instance",
+		complex = BZ["Tempest Keep"],
+		entrancePortal = { BZ["Netherstorm"], 76.5, 65.1 },
+	}
+
+	zones[BZ["Eye of the Storm"]] = {
+		low = 35,
+		high = MAX_PLAYER_LEVEL,
+		continent = Outland,
+		groupSize = 15,
+		type = "Battleground",
+		texture = "NetherstormArena",
+	}
+
+	-- arenas
+	zones[BZ["Blade's Edge Arena"]] = {
+		low = 70,
+		high = 70,
+		continent = Outland,
+		type = "Arena",
+	}
+
+	zones[BZ["Nagrand Arena"]] = {
+		low = 70,
+		high = 70,
+		continent = Outland,
+		type = "Arena",
+	}
+
+	zones[BZ["Ruins of Lordaeron"]] = {
+		low = 70,
+		high = 70,
+		continent = Kalimdor,
+		type = "Arena",
+	}
+
+	-- 2.4 zones
+	zones[BZ["Isle of Quel'Danas"]] = {
+		continent = Eastern_Kingdoms,
+		low = 70,
+		high = 70,
+		paths = {
+			[BZ["Magisters' Terrace"]] = true,
+			[BZ["Sunwell Plateau"]] = true,
+		},
+		instances = {
+			[BZ["Magisters' Terrace"]] = true,
+			[BZ["Sunwell Plateau"]] = true,
+		},
+		fishing_min = 450,
+		battlepet_low = 20,
+		battlepet_high = 20,
+	}
+
+	zones[BZ["Magisters' Terrace"]] = {
+		low = 68,
+		high = 75,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Isle of Quel'Danas"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Isle of Quel'Danas"], 61.3, 30.9 },
+	}
+
+	zones[BZ["Sunwell Plateau"]] = {
+		low = 70,
+		high = 72,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Isle of Quel'Danas"],
+		groupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["Isle of Quel'Danas"], 44.3, 45.7 },
+	}
+
+	-- WOTLK BZ
+
+	zones[BZ["Dalaran"]] = {
+		continent = Northrend,
+		paths = {
+			[BZ["The Violet Hold"]] = true,
+			[transports["DALARAN_CRYSTALSONG_TELEPORT"]] = true,
+			[transports["DALARAN_COT_PORTAL"]] = true,
+			[transports["DALARAN_STORMWIND_PORTAL"]] = true,
+			[transports["DALARAN_ORGRIMMAR_PORTAL"]] = true,
+		},
+		instances = {
+			[BZ["The Violet Hold"]] = true,
+			[BZ["Dalaran Arena"]] = true,
+		},
+		type = "City",
+		texture = "Dalaran",
+		faction = "Sanctuary",
+		fishing_min = 525,
+		battlepet_low = 21,
+		battlepet_high = 21,
+	}
+
+	zones[BZ["Plaguelands: The Scarlet Enclave"]] = {
+		low = 55,
+		high = 58,
+		continent = Eastern_Kingdoms,
+		yards = 3162.5,
+		x_offset = 0,
+		y_offset = 0,
+		texture = "ScarletEnclave",
+	}
+
+	zones[BZ["Borean Tundra"]] = {
+		low = 68,
+		high = 72,
+		continent = Northrend,
+		paths = {
+			[BZ["Coldarra"]] = true,
+			[BZ["Dragonblight"]] = true,
+			[BZ["Sholazar Basin"]] = true,
+			[transports["STORMWIND_BOREANTUNDRA_BOAT"]] = true,
+			[transports["ORGRIMMAR_BOREANTUNDRA_ZEPPELIN"]] = true,
+			[transports["MOAKI_UNUPE_BOAT"]] = true,
+		},
+		instances = {
+			[BZ["The Nexus"]] = true,
+			[BZ["The Oculus"]] = true,
+			[BZ["The Eye of Eternity"]] = true,
+		},
+		complexes = {
+			[BZ["Coldarra"]] = true,
+		},
+		fishing_min = 475,
+		battlepet_low = 20,
+		battlepet_high = 22,
+	}
+
+	zones[BZ["Coldarra"]] = {
+		low = 69,
+		high = 82,
+		continent = Northrend,
+		paths = {
+			[BZ["Borean Tundra"]] = true,
+			[BZ["The Nexus"]] = true,
+			[BZ["The Oculus"]] = true,
+			[BZ["The Eye of Eternity"]] = true,
+		},
+		instances = {
+			[BZ["The Nexus"]] = true,
+			[BZ["The Oculus"]] = true,
+			[BZ["The Eye of Eternity"]] = true,
+		},
+		type = "Complex",
+	}
+
+	zones[BZ["Howling Fjord"]] = {
+		low = 68,
+		high = 72,
+		continent = Northrend,
+		paths = {
+			[BZ["Grizzly Hills"]] = true,
+			[transports["MENETHIL_HOWLINGFJORD_BOAT"]] = true,
+			[transports["UNDERCITY_HOWLINGFJORD_ZEPPELIN"]] = true,
+			[transports["MOAKI_KAMAGUA_BOAT"]] = true,
+			[BZ["Utgarde Keep"]] = true,
+			[BZ["Utgarde Pinnacle"]] = true,
+		},
+		instances = {
+			[BZ["Utgarde Keep"]] = true,
+			[BZ["Utgarde Pinnacle"]] = true,
+		},
+		fishing_min = 475,
+		battlepet_low = 20,
+		battlepet_high = 22,
+	}
+
+	zones[BZ["Dragonblight"]] = {
+		low = 71,
+		high = 75,
+		continent = Northrend,
+		paths = {
+			[BZ["Borean Tundra"]] = true,
+			[BZ["Grizzly Hills"]] = true,
+			[BZ["Zul'Drak"]] = true,
+			[BZ["Crystalsong Forest"]] = true,
+			[transports["MOAKI_UNUPE_BOAT"]] = true,
+			[transports["MOAKI_KAMAGUA_BOAT"]] = true,
+			[BZ["Azjol-Nerub"]] = true,
+			[BZ["Ahn'kahet: The Old Kingdom"]] = true,
+			[BZ["Naxxramas"]] = true,
+			[BZ["The Obsidian Sanctum"]] = true,
+		},
+		instances = {
+			[BZ["Azjol-Nerub"]] = true,
+			[BZ["Ahn'kahet: The Old Kingdom"]] = true,
+			[BZ["Naxxramas"]] = true,
+			[BZ["The Obsidian Sanctum"]] = true,
+			[BZ["Strand of the Ancients"]] = true,
+		},
+		fishing_min = 475,
+		battlepet_low = 22,
+		battlepet_high = 23,
+	}
+
+	zones[BZ["Grizzly Hills"]] = {
+		low = 73,
+		high = 75,
+		continent = Northrend,
+		paths = {
+			[BZ["Howling Fjord"]] = true,
+			[BZ["Dragonblight"]] = true,
+			[BZ["Zul'Drak"]] = true,
+			[BZ["Drak'Tharon Keep"]] = true,
+		},
+		instances = BZ["Drak'Tharon Keep"],
+		fishing_min = 475,
+		battlepet_low = 21,
+		battlepet_high = 22,
+	}
+
+	zones[BZ["Zul'Drak"]] = {
+		low = 74,
+		high = 76,
+		continent = Northrend,
+		paths = {
+			[BZ["Dragonblight"]] = true,
+			[BZ["Grizzly Hills"]] = true,
+			[BZ["Crystalsong Forest"]] = true,
+			[BZ["Gundrak"]] = true,
+			[BZ["Drak'Tharon Keep"]] = true,
+		},
+		instances = {
+			[BZ["Gundrak"]] = true,
+			[BZ["Drak'Tharon Keep"]] = true,
+		},
+		fishing_min = 475,
+		battlepet_low = 22,
+		battlepet_high = 23,
+	}
+
+	zones[BZ["Sholazar Basin"]] = {
+		low = 76,
+		high = 78,
+		continent = Northrend,
+		paths = BZ["Borean Tundra"],
+		fishing_min = 525,
+		battlepet_low = 21,
+		battlepet_high = 22,
+	}
+
+	zones[BZ["Crystalsong Forest"]] = {
+		low = 77,
+		high = 80,
+		continent = Northrend,
+		paths = {
+			[transports["DALARAN_CRYSTALSONG_TELEPORT"]] = true,
+			[BZ["Dragonblight"]] = true,
+			[BZ["Zul'Drak"]] = true,
+			[BZ["The Storm Peaks"]] = true,
+		},
+		fishing_min = 500,
+		battlepet_low = 22,
+		battlepet_high = 23,
+	}
+
+	zones[BZ["The Storm Peaks"]] = {
+		low = 77,
+		high = 80,
+		continent = Northrend,
+		paths = {
+			[BZ["Crystalsong Forest"]] = true,
+			[BZ["Halls of Stone"]] = true,
+			[BZ["Halls of Lightning"]] = true,
+			[BZ["Ulduar"]] = true,
+		},
+		instances = {
+			[BZ["Halls of Stone"]] = true,
+			[BZ["Halls of Lightning"]] = true,
+			[BZ["Ulduar"]] = true,
+		},
+		fishing_min = 550,
+		battlepet_low = 22,
+		battlepet_high = 23,
+	}
+
+	zones[BZ["Icecrown"]] = {
+		low = 77,
+		high = 80,
+		continent = Northrend,
+		paths = {
+			[BZ["Trial of the Champion"]] = true,
+			[BZ["Trial of the Crusader"]] = true,
+			[BZ["The Forge of Souls"]] = true,
+			[BZ["Pit of Saron"]] = true,
+			[BZ["Halls of Reflection"]] = true,
+			[BZ["Icecrown Citadel"]] = true,
+			[BZ["Hrothgar's Landing"]] = true,
+		},
+		instances = {
+			[BZ["Trial of the Champion"]] = true,
+			[BZ["Trial of the Crusader"]] = true,
+			[BZ["The Forge of Souls"]] = true,
+			[BZ["Pit of Saron"]] = true,
+			[BZ["Halls of Reflection"]] = true,
+			[BZ["Icecrown Citadel"]] = true,
+			[BZ["Isle of Conquest"]] = true,
+		},
+		fishing_min = 550,
+		battlepet_low = 22,
+		battlepet_high = 23,
+	}
+
+	zones[BZ["Hrothgar's Landing"]] = {
+		low = 77,
+		high = 80,
+		paths = BZ["Icecrown"],
+		continent = Northrend,
+		fishing_min = 550,
+		battlepet_low = 22,
+		battlepet_high = 22,
+	}
+
+	zones[BZ["Wintergrasp"]] = {
+		low = 77,
+		high = 80,
+		continent = Northrend,
+		paths = BZ["Vault of Archavon"],
+		instances = BZ["Vault of Archavon"],
+		type = "PvP Zone",
+		fishing_min = 525,
+		battlepet_low = 22,
+		battlepet_high = 22,
+	}
+
+	-- WOTLK Dungeons
+	zones[BZ["Utgarde Keep"]] = {
+		low = 68,
+		high = 78,
+		continent = Northrend,
+		paths = BZ["Howling Fjord"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Howling Fjord"], 57.30, 46.84 },
+	}
+
+	zones[BZ["Utgarde Pinnacle"]] = {
+		low = 77,
+		high = 82,
+		continent = Northrend,
+		paths = BZ["Howling Fjord"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Howling Fjord"], 57.25, 46.60 },
+	}
+
+	zones[BZ["The Nexus"]] = {
+		low = 69,
+		high = 79,
+		continent = Northrend,
+		paths = BZ["Coldarra"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Coldarra"],
+		entrancePortal = { BZ["Borean Tundra"], 27.50, 26.03 },
+	}
+
+	zones[BZ["The Oculus"]] = {
+		low = 77,
+		high = 82,
+		continent = Northrend,
+		paths = BZ["Coldarra"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Coldarra"],
+		entrancePortal = { BZ["Borean Tundra"], 27.52, 26.67 },
+	}
+
+	zones[BZ["The Eye of Eternity"]] = {
+		low = 80,
+		high = 80,
+		continent = Northrend,
+		paths = BZ["Coldarra"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		complex = BZ["Coldarra"],
+		entrancePortal = { BZ["Borean Tundra"], 27.54, 26.68 },
+	}
+
+	zones[BZ["Azjol-Nerub"]] = {
+		low = 70,
+		high = 80,
+		continent = Northrend,
+		paths = BZ["Dragonblight"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Dragonblight"], 26.01, 50.83 },
+	}
+
+	zones[BZ["Ahn'kahet: The Old Kingdom"]] = {
+		low = 71,
+		high = 81,
+		continent = Northrend,
+		paths = BZ["Dragonblight"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Dragonblight"], 28.49, 51.73 },
+	}
+
+	zones[BZ["Naxxramas"]] = {
+		low = 80,
+		high = 80,
+		continent = Northrend,
+		paths = BZ["Dragonblight"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		fishing_min = 1,  -- acid
+		entrancePortal = { BZ["Dragonblight"], 87.30, 51.00 },
+	}
+
+	zones[BZ["The Obsidian Sanctum"]] = {
+		low = 80,
+		high = 80,
+		continent = Northrend,
+		paths = BZ["Dragonblight"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		fishing_min = 1,  -- lava
+		entrancePortal = { BZ["Dragonblight"], 60.00, 57.00 },
+	}
+
+	zones[BZ["Drak'Tharon Keep"]] = {
+		low = 72,
+		high = 82,
+		continent = Northrend,
+		paths = {
+			[BZ["Grizzly Hills"]] = true,
+			[BZ["Zul'Drak"]] = true,
+		},
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Zul'Drak"], 28.53, 86.93 },
+	}
+
+	zones[BZ["Gundrak"]] = {
+		low = 74,
+		high = 82,
+		continent = Northrend,
+		paths = BZ["Zul'Drak"],
+		groupSize = 5,
+		type = "Instance",
+		fishing_min = 475,
+		entrancePortal = { BZ["Zul'Drak"], 76.14, 21.00 },
+	}
+
+	zones[BZ["Halls of Stone"]] = {
+		low = 75,
+		high = 82,
+		continent = Northrend,
+		paths = BZ["The Storm Peaks"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["The Storm Peaks"], 39.52, 26.91 },
+	}
+
+	zones[BZ["Halls of Lightning"]] = {
+		low = 77,
+		high = 82,
+		continent = Northrend,
+		paths = BZ["The Storm Peaks"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["The Storm Peaks"], 45.38, 21.37 },
+	}
+
+	zones[BZ["Ulduar"]] = {
+		low = 80,
+		high = 80,
+		continent = Northrend,
+		paths = BZ["The Storm Peaks"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["The Storm Peaks"], 41.56, 17.76 },
+		fishing_min = 550,
+	}
+
+	zones[BZ["The Violet Hold"]] = {
+		low = 73,
+		high = 82,
+		continent = Northrend,
+		paths = BZ["Dalaran"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Dalaran"], 66.78, 68.19 },
+	}
+
+	zones[BZ["Trial of the Champion"]] = {
+		low = 80,
+		high = 82,
+		continent = Northrend,
+		paths = BZ["Icecrown"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Icecrown"], 74.18, 20.45 },
+	}
+
+	zones[BZ["Trial of the Crusader"]] = {
+		low = 80,
+		high = 80,
+		continent = Northrend,
+		paths = BZ["Icecrown"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["Icecrown"], 75.07, 21.80 },
+	}
+
+	zones[BZ["The Forge of Souls"]] = {
+		low = 80,
+		high = 82,
+		continent = Northrend,
+		paths = BZ["Icecrown"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Icecrown"], 52.60, 89.35 },
+	}
+
+	zones[BZ["Pit of Saron"]] = {
+		low = 80,
+		high = 82,
+		continent = Northrend,
+		paths = BZ["Icecrown"],
+		groupSize = 5,
+		type = "Instance",
+		fishing_min = 550,
+		entrancePortal = { BZ["Icecrown"], 52.60, 89.35 },
+	}
+
+	zones[BZ["Halls of Reflection"]] = {
+		low = 80,
+		high = 82,
+		continent = Northrend,
+		paths = BZ["Icecrown"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Icecrown"], 52.60, 89.35 },
+	}
+
+	zones[BZ["Icecrown Citadel"]] = {
+		low = 80,
+		high = 80,
+		continent = Northrend,
+		paths = BZ["Icecrown"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["Icecrown"], 53.86, 87.27 },
+	}
+
+	zones[BZ["Vault of Archavon"]] = {
+		low = 80,
+		high = 80,
+		continent = Northrend,
+		paths = BZ["Wintergrasp"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["Wintergrasp"], 50, 11.2 },
+	}
+
+	zones[BZ["The Ruby Sanctum"]] = {
+		low = 80,
+		high = 80,
+		continent = Northrend,
+		paths = BZ["Dragonblight"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		fishing_min = 650,
+		entrancePortal = { BZ["Dragonblight"], 61.00, 53.00 },
+	}
+
+
+	zones[BZ["The Frozen Sea"]] = {
+		continent = Northrend,
+		fishing_min = 575,
+	}
+
+	zones[BZ["Strand of the Ancients"]] = {
+		low = 65,
+		high = MAX_PLAYER_LEVEL,
+		continent = Northrend,
+		groupSize = 15,
+		type = "Battleground",
+		texture = "StrandoftheAncients",
+	}
+
+	zones[BZ["Isle of Conquest"]] = {
+		low = 75,
+		high = MAX_PLAYER_LEVEL,
+		continent = Northrend,
+		groupSize = 40,
+		type = "Battleground",
+		texture = "IsleofConquest",
+	}
+
+	zones[BZ["Dalaran Arena"]] = {
+		low = 80,
+		high = 80,
+		continent = Northrend,
+		type = "Arena",
+	}
+
+	zones[BZ["The Ring of Valor"]] = {
+		low = 80,
+		high = 80,
+		continent = Kalimdor,
+		type = "Arena",
+	}
+
+	-- Cataclysm zones
+
+	zones[BZ["Mount Hyjal"]] = {
+		low = 80,
+		high = 82,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Winterspring"]] = true,
+		},
+		instances = {
+			[BZ["Firelands"]] = true,
+		},
+		fishing_min = 575,
+		battlepet_low = 22,
+		battlepet_high = 24,
+	}
+
+	zones[BZ["Uldum"]] = {
+		low = 83,
+		high = 84,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Tanaris"]] = true,
+		},
+		instances = {
+			[BZ["Halls of Origination"]] = true,
+			[BZ["Lost City of the Tol'vir"]] = true,
+			[BZ["The Vortex Pinnacle"]] = true,
+			[BZ["Throne of the Four Winds"]] = true,
+		},
+		fishing_min = 650,
+		battlepet_low = 23,
+		battlepet_high = 24,
+	}
+
+	zones[BZ["Ahn'Qiraj: The Fallen Kingdom"]] = {
+		low = 60,
+		high = 63,
+		continent = Kalimdor,
+		paths = {
+			[BZ["Silithus"]] = true,
+		},
+		instances = {
+			[BZ["Temple of Ahn'Qiraj"]] = true,
+			[BZ["Ruins of Ahn'Qiraj"]] = true,
+		},
+		type = "Complex",
+		battlepet_low = 16,
+		battlepet_high = 17,
+	}
+
+	zones[BZ["Gilneas"]] = {
+		low = 1,
+		high = 12,
+		continent = Eastern_Kingdoms,
+		paths = {},  -- phased instance
+		faction = "Alliance",
+		fishing_min = 25,
+		battlepet_low = 1,
+		battlepet_high = 1,
+	}
+
+	zones[BZ["Gilneas City"]] = {
+		low = 1,
+		high = 12,
+		continent = Eastern_Kingdoms,
+		paths = {},  -- phased instance
+		faction = "Alliance",
+		battlepet_low = 1,
+		battlepet_high = 2,
+	}
+
+	zones[BZ["Ruins of Gilneas"]] = {
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Silverpine Forest"]] = true,
+			[BZ["Ruins of Gilneas City"]] = true,
+		},
+		fishing_min = 75,
+	}
+
+	zones[BZ["Ruins of Gilneas City"]] = {
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Silverpine Forest"]] = true,
+			[BZ["Ruins of Gilneas"]] = true,
+		},
+		fishing_min = 75,
+	}
+
+	zones[BZ["Twilight Highlands"]] = {
+		low = 84,
+		high = 85,
+		continent = Eastern_Kingdoms,
+		instances = {
+			[BZ["Grim Batol"]] = true,
+			[BZ["The Bastion of Twilight"]] = true,
+			[BZ["Twin Peaks"]] = true,
+		},
+		paths = {
+			[BZ["Wetlands"]] = true,
+			[BZ["Grim Batol"]] = true,
+			[BZ["Twin Peaks"]] = true,
+			[transports["TWILIGHTHIGHLANDS_STORMWIND_PORTAL"]] = true,
+			[transports["TWILIGHTHIGHLANDS_ORGRIMMAR_PORTAL"]] = true,
+		},
+		fishing_min = 650,
+		battlepet_low = 23,
+		battlepet_high = 24,
+	}
+
+	zones[BZ["Tol Barad"]] = {
+		low = 84,
+		high = 85,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Tol Barad Peninsula"]] = true,
+		},
+		type = "PvP Zone",
+		fishing_min = 675,
+		battlepet_low = 23,
+		battlepet_high = 24,
+	}
+
+	zones[BZ["Tol Barad Peninsula"]] = {
+		low = 84,
+		high = 85,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Tol Barad"]] = true,
+			[transports["TOLBARAD_ORGRIMMAR_PORTAL"]] = true,
+			[transports["TOLBARAD_STORMWIND_PORTAL"]] = true,
+		},
+		fishing_min = 675,
+		battlepet_low = 23,
+		battlepet_high = 24,
+	}
+
+
+	zones[BZ["Vashj'ir"]] = {
+		low = 80,
+		high = 82,
+		continent = Eastern_Kingdoms,
+		instances = {
+			[BZ["Throne of the Tides"]] = true,
+		},
+		fishing_min = 575,
+		battlepet_low = 22,
+		battlepet_high = 23,
+	}
+
+	zones[BZ["Kelp'thar Forest"]] = {
+		low = 80,
+		high = 81,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Shimmering Expanse"]] = true,
+		},
+		fishing_min = 575,
+		battlepet_low = 22,
+		battlepet_high = 23,
+	}
+
+	zones[BZ["Shimmering Expanse"]] = {
+		low = 80,
+		high = 82,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Kelp'thar Forest"]] = true,
+			[BZ["Abyssal Depths"]] = true,
+		},
+		fishing_min = 575,
+		battlepet_low = 22,
+		battlepet_high = 23,
+	}
+
+	zones[BZ["Abyssal Depths"]] = {
+		low = 81,
+		high = 82,
+		continent = Eastern_Kingdoms,
+		instances = {
+			[BZ["Throne of the Tides"]] = true,
+		},
+		paths = {
+			[BZ["Shimmering Expanse"]] = true,
+			[BZ["Throne of the Tides"]] = true,
+		},
+		fishing_min = 575,
+		battlepet_low = 22,
+		battlepet_high = 23,
+	}
+
+	zones[BZ["The Maelstrom"].." (zone)"] = {
+		low = 82,
+		high = 82,
+		continent = The_Maelstrom,
+		paths = {
+		},
+		faction = "Sanctuary",
+	}
+
+	zones[BZ["Deepholm"]] = {
+		low = 82,
+		high = 83,
+		continent = The_Maelstrom,
+		instances = {
+			[BZ["The Stonecore"]] = true,
+		},
+		paths = {
+			[BZ["The Stonecore"]] = true,
+			[transports["DEEPHOLM_ORGRIMMAR_PORTAL"]] = true,
+			[transports["DEEPHOLM_STORMWIND_PORTAL"]] = true,
+		},
+		fishing_min = 550,
+		battlepet_low = 22,
+		battlepet_high = 23,
+	}
+
+	zones[BZ["Kezan"]] = {
+		low = 1,
+		high = 5,
+		continent = The_Maelstrom,
+		faction = "Horde",
+		fishing_min = 25,
+		battlepet_low = 1,
+		battlepet_high = 1,
+	}
+
+	zones[BZ["The Lost Isles"]] = {
+		low = 6,
+		high = 12,
+		continent = The_Maelstrom,
+		faction = "Horde",
+		fishing_min = 25,
+		battlepet_low = 1,
+		battlepet_high = 2,
+	}
+
+-- 	Patch 4.2 zone
+
+	zones[BZ["Molten Front"]] = {
+		low = 85,
+		high = 85,
+		continent = Kalimdor,
+		battlepet_low = 24,
+		battlepet_high = 24,
+	}
+
+--	Patch 4.3 zone
+
+	zones[BZ["Darkmoon Island"]] = {
+		continent = The_Maelstrom,
+		fishing_min = 75,
+		paths = {
+			[transports["DARKMOON_MULGORE_PORTAL"]] = true,
+			[transports["DARKMOON_ELWYNNFOREST_PORTAL"]] = true,
+		},
+		battlepet_low = 1,
+		battlepet_high = 10,
+	}
+
+
+--	Cataclysm instances
+
+	zones[BZ["Firelands"]] = {
+		low = 85,
+		high = 85,
+		continent = Kalimdor,
+		paths = BZ["Mount Hyjal"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["Mount Hyjal"], 47.3, 78.3 },
+	}
+
+	zones[BZ["Lost City of the Tol'vir"]] = {
+		low = 85,
+		high = 85,
+		continent = Kalimdor,
+		paths = BZ["Uldum"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Uldum"], 60.53, 64.24 },
+	}
+
+	zones[BZ["Halls of Origination"]] = {
+		low = 85,
+		high = 85,
+		continent = Kalimdor,
+		paths = BZ["Uldum"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Uldum"], 69.09, 52.95 },
+	}
+
+	zones[BZ["The Vortex Pinnacle"]] = {
+		low = 82,
+		high = 84,
+		continent = Kalimdor,
+		paths = BZ["Uldum"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Uldum"], 76.79, 84.51 },
+	}
+
+	zones[BZ["Throne of the Four Winds"]] = {
+		low = 85,
+		high = 85,
+		continent = Kalimdor,
+		paths = BZ["Uldum"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["Uldum"], 38.26, 80.66 },
+	}
+
+
+	zones[BZ["Blackrock Caverns"]] = {
+		low = 80,
+		high = 81,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Blackrock Mountain"]] = true,
+		},
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Blackrock Mountain"],
+		entrancePortal = { BZ["Searing Gorge"], 47.8, 69.1 },
+	}
+
+	zones[BZ["Blackwing Descent"]] = {
+		low = 85,
+		high = 85,
+		continent = Eastern_Kingdoms,
+		paths = {
+			[BZ["Burning Steppes"]] = true,
+			[BZ["Blackrock Mountain"]] = true,
+			[BZ["Blackrock Spire"]] = true,
+		},
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		complex = BZ["Blackrock Mountain"],
+--		entrancePortal = { BZ["Burning Steppes"], 29.7, 37.5 },  -- TODO: coordinates
+	}
+
+	zones[BZ["Grim Batol"]] = {
+		low = 85,
+		high = 85,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Twilight Highlands"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Twilight Highlands"], 19, 53.5 },
+	}
+
+	zones[BZ["The Bastion of Twilight"]] = {
+		low = 85,
+		high = 85,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Twilight Highlands"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["Twilight Highlands"], 33.8, 78.2 },
+	}
+
+	zones[BZ["Throne of the Tides"]] = {
+		low = 80,
+		high = 81,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Abyssal Depths"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Abyssal Depths"], 69.3, 25.2 },
+	}
+
+
+	zones[BZ["The Stonecore"]] = {
+		low = 82,
+		high = 84,
+		continent = The_Maelstrom,
+		paths = BZ["Deepholm"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Deepholm"], 47.70, 51.96 },
+	}
+
+
+--	4.3 Dungeons
+
+	zones[BZ["End Time"]] = {
+		low = 85,
+		high = 85,
+		continent = Kalimdor,
+		paths = BZ["Caverns of Time"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Caverns of Time"],
+		entrancePortal = { BZ["Caverns of Time"], 57.1, 25.7 },
+	}
+
+	zones[BZ["Hour of Twilight"]] = {
+		low = 85,
+		high = 85,
+		continent = Kalimdor,
+		paths = BZ["Caverns of Time"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Caverns of Time"],
+		entrancePortal = { BZ["Caverns of Time"], 67.9, 29.0 },
+	}
+
+	zones[BZ["Well of Eternity"]] = {
+		low = 85,
+		high = 85,
+		continent = Kalimdor,
+		paths = BZ["Caverns of Time"],
+		groupSize = 5,
+		type = "Instance",
+		complex = BZ["Caverns of Time"],
+		entrancePortal = { BZ["Caverns of Time"], 22.2, 63.6 },
+	}
+
+	zones[BZ["Dragon Soul"]] = {
+		low = 85,
+		high = 85,
+		continent = Kalimdor,
+		paths = BZ["Caverns of Time"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		complex = BZ["Caverns of Time"],
+		entrancePortal = { BZ["Caverns of Time"], 60.0, 21.1 },
+	}
+
+
+--	Cataclysm Battlegrounds
+
+	zones[BZ["The Battle for Gilneas"]] = {
+		low = 85,
+		high = MAX_PLAYER_LEVEL,
+		continent = Eastern_Kingdoms,
+		groupSize = 10,
+		type = "Battleground",
+		texture = "TheBattleforGilneas",
+	}
+
+	zones[BZ["Twin Peaks"]] = {
+		low = 85,
+		high = MAX_PLAYER_LEVEL,
+		continent = Eastern_Kingdoms,
+		paths = BZ["Twilight Highlands"],
+		groupSize = 10,
+		type = "Battleground",
+		texture = "TwinPeaks",  -- TODO: verify
+	}
+
+
+--	Mists of Pandaria (MoP) zones
+
+	zones[BZ["The Wandering Isle"]] = {
+		low = 1,
+		high = 10,
+		continent = Pandaria,
+--		fishing_min = 25,
+ 		faction = "Sanctuary",  -- Not contested and not Alliance nor Horde -> no PvP -> sanctuary
+	}
+
+	zones[BZ["The Jade Forest"]] = {
+		low = 85,
+		high = 86,
+		continent = Pandaria,
+		instances = {
+			[BZ["Temple of the Jade Serpent"]] = true,
+		},
+		paths = {
+			[BZ["Temple of the Jade Serpent"]] = true,
+			[BZ["Valley of the Four Winds"]] = true,
+			[BZ["Timeless Isle"]] = true,
+			[transports["JADEFOREST_ORGRIMMAR_PORTAL"]] = true,
+			[transports["JADEFOREST_STORMWIND_PORTAL"]] = true,
+		},
+		fishing_min = 650,
+		battlepet_low = 23,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["Valley of the Four Winds"]] = {
+		low = 86,
+		high = 87,
+		continent = Pandaria,
+		instances = {
+			[BZ["Stormstout Brewery"]] = true,
+			[BZ["Deepwind Gorge"]] = true,
+		},
+		paths = {
+			[BZ["Stormstout Brewery"]] = true,
+			[BZ["The Jade Forest"]] = true,
+			[BZ["Krasarang Wilds"]] = true,
+			[BZ["The Veiled Stair"]] = true,
+			[BZ["Deepwind Gorge"]] = true,
+		},
+		fishing_min = 700,
+		battlepet_low = 23,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["Krasarang Wilds"]] = {
+		low = 86,
+		high = 87,
+		continent = Pandaria,
+		paths = {
+			[BZ["Valley of the Four Winds"]] = true,
+		},
+		fishing_min = 700,
+		battlepet_low = 23,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["Kun-Lai Summit"]] = {
+		low = 87,
+		high = 88,
+		continent = Pandaria,
+		instances = {
+			[BZ["Shado-pan Monastery"]] = true,
+			[BZ["Mogu'shan Vaults"]] = true,
+			[BZ["The Tiger's Peak"]] = true,
+		},
+		paths = {
+			[BZ["Shado-pan Monastery"]] = true,
+			[BZ["Mogu'shan Vaults"]] = true,
+			[BZ["Vale of Eternal Blossoms"]] = true,
+			[BZ["The Veiled Stair"]] = true,
+		},
+		fishing_min = 625,
+		battlepet_low = 23,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["Townlong Steppes"]] = {
+		low = 88,
+		high = 89,
+		continent = Pandaria,
+		instances = {
+			[BZ["Siege of Niuzao Temple"]] = true,
+		},
+		paths = {
+			[BZ["Siege of Niuzao Temple"]] = true,
+			[BZ["Dread Wastes"]] = true,
+			[transports["TOWNLONGSTEPPES_ISLEOFTHUNDER_PORTAL"]] = true,
+		},
+		fishing_min = 700,
+		battlepet_low = 24,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["Dread Wastes"]] = {
+		low = 89,
+		high = 90,
+		continent = Pandaria,
+		instances = {
+			[BZ["Gate of the Setting Sun"]] = true,
+			[BZ["Heart of Fear"]] = true,
+		},
+		paths = {
+			[BZ["Gate of the Setting Sun"]] = true,
+			[BZ["Heart of Fear"]] = true,
+			[BZ["Townlong Steppes"]] = true
+		},
+		fishing_min = 625,
+		battlepet_low = 24,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["Vale of Eternal Blossoms"]] = {
+		low = 90,
+		high = 90,
+		continent = Pandaria,
+		instances = {
+			[BZ["Mogu'shan Palace"]] = true,
+			[BZ["Siege of Orgrimmar"]] = true,
+		},
+		paths = {
+			[BZ["Mogu'shan Palace"]] = true,
+			[BZ["Kun-Lai Summit"]] = true,
+			[BZ["Siege of Orgrimmar"]] = true,
+		},
+		fishing_min = 825,
+		battlepet_low = 23,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["The Veiled Stair"]] = {
+		low = 90,
+		high = 90,
+		continent = Pandaria,
+		instances = {
+			[BZ["Terrace of Endless Spring"]] = true,
+		},
+		paths = {
+			[BZ["Terrace of Endless Spring"]] = true,
+			[BZ["Valley of the Four Winds"]] = true,
+			[BZ["Kun-Lai Summit"]] = true,
+		},
+		fishing_min = 750,
+		battlepet_low = 23,
+		battlepet_high = 25,
+	}
+
+	-- Patch 5.2 zones
+	zones[BZ["Isle of Thunder"]] = {
+		low = 90,
+		high = 90,
+		continent = Pandaria,
+		instances = {
+			[BZ["Throne of Thunder"]] = true,
+		},
+		paths = {
+			[transports["ISLEOFTHUNDER_TOWNLONGSTEPPES_PORTAL"]] = true,
+		},
+		fishing_min = 750,
+		battlepet_low = 23,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["Isle of Giants"]] = {
+		low = 90,
+		high = 90,
+		continent = Pandaria,
+		fishing_min = 750,
+		battlepet_low = 23,
+		battlepet_high = 25,
+	}
+
+	-- Patch 5.4 Zone
+	zones[BZ["Timeless Isle"]] = {
+		low = 90,
+		high = 90,
+		continent = Pandaria,
+		paths = BZ["The Jade Forest"],
+		fishing_min = 825,
+		battlepet_low = 25,
+		battlepet_high = 25,
+	}
+
+
+--	Mists of Pandaria (MoP) cities
+
+	zones[BZ["Shrine of Seven Stars"]] = {
+		continent = Pandaria,
+		paths = {
+			[BZ["Vale of Eternal Blossoms"]] = true,
+		},
+		faction = "Alliance",
+		type = "City",
+		battlepet_low = 23,
+		battlepet_high = 23,
+	}
+
+	zones[BZ["Shrine of Two Moons"]] = {
+		continent = Pandaria,
+		paths = {
+			[BZ["Vale of Eternal Blossoms"]] = true,
+		},
+		faction = "Horde",
+		type = "City",
+		battlepet_low = 23,
+		battlepet_high = 23,
+	}
+
+
+
+--	Mists of Pandaria (MoP) instances
+
+	zones[BZ["Temple of the Jade Serpent"]] = {
+		low = 85,
+		high = 86,
+		continent = Pandaria,
+		paths = BZ["The Jade Forest"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["The Jade Forest"], 56.20, 57.90 },
+	}
+
+	zones[BZ["Stormstout Brewery"]] = {
+		low = 86,
+		high = 87,
+		continent = Pandaria,
+		paths = BZ["Valley of the Four Winds"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Valley of the Four Winds"], 36.10, 69.10 },
+	}
+
+	zones[BZ["Shado-pan Monastery"]] = {
+		low = 87,
+		high = 90,
+		continent = Pandaria,
+		paths = BZ["Kun-Lai Summit"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Kun-Lai Summit"], 36.7, 47.6 },
+	}
+
+	zones[BZ["Mogu'shan Vaults"]] = {
+		low = 90,
+		high = 90,
+		continent = Pandaria,
+		paths = BZ["Kun-Lai Summit"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["Kun-Lai Summit"], 59.1, 39.8 },
+	}
+
+	zones[BZ["Siege of Niuzao Temple"]] = {
+		low = 90,
+		high = 90,
+		continent = Pandaria,
+		paths = BZ["Townlong Steppes"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Townlong Steppes"], 34.5, 81.1 },
+	}
+
+	zones[BZ["Mogu'shan Palace"]] = {
+		low = 85,
+		high = 86,
+		continent = Pandaria,
+		paths = BZ["Vale of Eternal Blossoms"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Vale of Eternal Blossoms"], 80.7, 33.0 },
+	}
+
+	zones[BZ["Gate of the Setting Sun"]] = {
+		low = 90,
+		high = 90,
+		continent = Pandaria,
+		paths = BZ["Dread Wastes"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Dread Wastes"], 15.80, 74.30 },
+	}
+
+	zones[BZ["Heart of Fear"]] = {
+		low = 90,
+		high = 90,
+		continent = Pandaria,
+		paths = BZ["Dread Wastes"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["Dread Wastes"], 39.0, 35.0 },
+	}
+
+	zones[BZ["Terrace of Endless Spring"]] = {
+		low = 90,
+		high = 90,
+		continent = Pandaria,
+		paths = BZ["The Veiled Stair"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["The Veiled Stair"], 47.9, 60.8 },
+	}
+
+	-- Patch 5.2 instance
+	zones[BZ["Throne of Thunder"]] = {
+		low = 90,
+		high = 90,
+		continent = Pandaria,
+		paths = BZ["Isle of Thunder"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["The Veiled Stair"], 63.5, 32.2 },
+	}
+
+	-- Patch 5.3 Battleground
+	zones[BZ["Deepwind Gorge"]] = {
+		low = 90,
+		high = MAX_PLAYER_LEVEL,
+		continent = Pandaria,
+		paths = BZ["Valley of the Four Winds"],
+		groupSize = 15,
+		type = "Battleground",
+		texture = "DeepwindGorge",  -- TODO: verify
+	}
+
+	-- Patch 5.3 Arena
+	zones[BZ["The Tiger's Peak"]] = {
+		low = 90,
+		high = 90,
+		continent = Pandaria,
+		type = "Arena",
+	}
+
+	-- Patch 5.4 instance
+	zones[BZ["Siege of Orgrimmar"]] = {
+		low = 90,
+		high = 90,
+		continent = Pandaria,
+		paths = BZ["Vale of Eternal Blossoms"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+		entrancePortal = { BZ["Vale of Eternal Blossoms"], 74.0, 42.2 },
+	}
+
+
+	-- Warlords of Draenor (WoD) zones --------------------------
+
+	zones[BZ["Frostfire Ridge"]] = {
+		low = 90,
+		high = 92,
+		continent = Draenor,
+		instances = {
+			[BZ["Bloodmaul Slag Mines"]] = true,
+		},
+		paths = {
+			[BZ["Gorgrond"]] = true,
+			[BZ["Frostwall"]] = true,
+			[transports["FROSTFIRERIDGE_ORGRIMMAR_PORTAL"]] = true,
+		},
+		fishing_min = 950,
+		battlepet_low = 23,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")"] = {
+		low = 90,
+		high = 92,
+		continent = Draenor,
+		instances = {
+			[BZ["Shadowmoon Burial Grounds"]] = true,
+		},
+		paths = {
+			[BZ["Talador"]] = true,
+			[BZ["Spires of Arak"]] = true,
+			[BZ["Tanaan Jungle"]] = true,
+			[BZ["Lunarfall"]] = true,
+			[transports["SHADOWMOONVALLEY_STORMWIND_PORTAL"]] = true,
+		},
+		fishing_min = 950,
+		battlepet_low = 23,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["Gorgrond"]] = {
+		low = 92,
+		high = 94,
+		continent = Draenor,
+		instances = {
+			[BZ["Iron Docks"]] = true,
+			[BZ["Grimrail Depot"]] = true,
+			[BZ["The Everbloom"]] = true,
+			[BZ["Blackrock Foundry"]] = true,
+		},
+		paths = {
+			[BZ["Frostfire Ridge"]] = true,
+			[BZ["Talador"]] = true,
+			[BZ["Tanaan Jungle"]] = true,
+		},
+		fishing_min = 950,
+		battlepet_low = 25,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["Talador"]] = {
+		low = 94,
+		high = 96,
+		continent = Draenor,
+		instances = {
+			[BZ["Auchindoun"]] = true,
+		},
+		paths = {
+			[BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")"] = true,
+			[BZ["Gorgrond"]] = true,
+			[BZ["Tanaan Jungle"]] = true,
+			[BZ["Spires of Arak"]] = true,
+			[BZ["Nagrand"].." ("..BZ["Draenor"]..")"] = true,
+		},
+		fishing_min = 950,
+		battlepet_low = 25,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["Spires of Arak"]] = {
+		low = 96,
+		high = 98,
+		continent = Draenor,
+		instances = {
+			[BZ["Skyreach"]] = true,
+			[BZ["Blackrock Foundry"]] = true,
+		},
+		paths = {
+			[BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")"] = true,
+			[BZ["Talador"]] = true,
+		},
+		fishing_min = 950,
+		battlepet_low = 25,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["Nagrand"].." ("..BZ["Draenor"]..")"] = {
+		low = 98,
+		high = 100,
+		continent = Draenor,
+		instances = {
+			[BZ["Highmaul"]] = true,
+			[BZ["Blackrock Foundry"]] = true,
+		},
+		paths = {
+			[BZ["Talador"]] = true,
+		},
+		fishing_min = 950,
+		battlepet_low = 25,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["Tanaan Jungle"]] = {
+		low = 100,
+		high = 100,
+		continent = Draenor,
+		instances = {
+			[BZ["Hellfire Citadel"].." ("..BZ["Draenor"]..")"] = true,
+		},
+		paths = {
+			[BZ["Talador"]] = true,
+			[BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")"] = true,
+			[BZ["Gorgrond"]] = true,
+		},
+		fishing_min = 950,
+		battlepet_low = 25,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["Ashran"]] = {
+		low = 100,
+		high = 100,
+		continent = Draenor,
+		type = "PvP Zone",
+		paths = {
+			[BZ["Warspear"]] = true,
+			[BZ["Stormshield"]] = true,
+			[transports["WARSPEAR_ORGRIMMAR_PORTAL"]] = true,
+			[transports["WARSPEAR_UNDERCITY_PORTAL"]] = true,
+			[transports["WARSPEAR_THUNDERBLUFF_PORTAL"]] = true,
+			[transports["STORMSHIELD_STORMWIND_PORTAL"]] = true,
+			[transports["STORMSHIELD_IRONFORGE_PORTAL"]] = true,
+			[transports["STORMSHIELD_DARNASSUS_PORTAL"]] = true,
+		},
+		fishing_min = 950,
+		battlepet_low = 25,
+		battlepet_high = 25,
+	}
+
+
+	-- Warlords of Draenor (WoD) cities
+
+	zones[BZ["Warspear"]] = {
+		continent = Draenor,
+		paths = {
+			[BZ["Ashran"]] = true,
+			[transports["WARSPEAR_ORGRIMMAR_PORTAL"]] = true,
+			[transports["WARSPEAR_UNDERCITY_PORTAL"]] = true,
+			[transports["WARSPEAR_THUNDERBLUFF_PORTAL"]] = true,
+		},
+		faction = "Horde",
+		type = "City",
+        fishing_min = 950,
+		battlepet_low = 25,
+		battlepet_high = 25,
+	}
+
+	zones[BZ["Stormshield"]] = {
+		continent = Draenor,
+		paths = {
+			[BZ["Ashran"]] = true,
+			[transports["STORMSHIELD_STORMWIND_PORTAL"]] = true,
+			[transports["STORMSHIELD_IRONFORGE_PORTAL"]] = true,
+			[transports["STORMSHIELD_DARNASSUS_PORTAL"]] = true,
+		},
+		faction = "Alliance",
+		type = "City",
+        fishing_min = 950,
+		battlepet_low = 25,
+		battlepet_high = 25,
+	}
+
+
+	-- Warlords of Draenor (WoD) garrisons
+
+	zones[BZ["Lunarfall"]] = {
+        low = 90,
+        high = 100,
+        continent = Draenor,
+        paths = {
+            [BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")"] = true,
+        },
+        faction = "Alliance",
+        fishing_min = 950,
+		yards = 683.334,
+		x_offset = 11696.5098,
+		y_offset = 9101.3333,
+		texture = "garrisonsmvalliance"
+    }
+
+	zones[BZ["Frostwall"]] = {
+        low = 90,
+        high = 100,
+        continent = Draenor,
+        paths = {
+            [BZ["Frostfire Ridge"]] = true,
+        },
+        faction = "Horde",
+        fishing_min = 950,
+		yards = 702.08,
+		x_offset = 7356.9277,
+		y_offset = 5378.4173,
+		texture = "garrisonffhorde"
+    }
+
+	-- Warlords of Draenor (WoD) dungeons and raids
+
+	zones[BZ["Bloodmaul Slag Mines"]] = {
+		low = 90,
+		high = 92,
+		continent = Draenor,
+		paths = BZ["Forstfire Ridge"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Forstfire Ridge"], 50.0, 24.8 },
+	}
+
+	zones[BZ["Shadowmoon Burial Grounds"]] = {
+		low = 100,
+		high = 100,
+		continent = Draenor,
+		paths = BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")",
+		groupSize = 5,
+		type = "Instance",
+--		entrancePortal = { BZ["Shadowmoon Valley"].." ("..BZ["Draenor"]..")", 0.00, 0.00 },   TODO
+	}
+
+	zones[BZ["Iron Docks"]] = {
+		low = 92,
+		high = 94,
+		continent = Draenor,
+		paths = BZ["Gorgrond"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Gorgrond"], 45.2, 13.7 },
+	}
+
+	zones[BZ["Grimrail Depot"]] = {
+		low = 100,
+		high = 100,
+		continent = Draenor,
+		paths = BZ["Gorgrond"],
+		groupSize = 5,
+		type = "Instance",
+--		entrancePortal = { BZ["Gorgrond"], 0.00, 0.00 },   TODO
+	}
+
+	zones[BZ["The Everbloom"]] = {
+		low = 100,
+		high = 100,
+		continent = Draenor,
+		paths = BZ["Gorgrond"],
+		groupSize = 5,
+		type = "Instance",
+--		entrancePortal = { BZ["Gorgrond"], 0.00, 0.00 },   TODO
+	}
+
+	zones[BZ["Blackrock Foundry"]] = {
+		low = 100,
+		high = 100,
+		continent = Draenor,
+		paths = BZ["Gorgrond"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+--		entrancePortal = { BZ["Gorgrond"], 0.00, 0.00 },   TODO
+	}
+
+	zones[BZ["Auchindoun"]] = {
+		low = 95,
+		high = 97,
+		continent = Draenor,
+		paths = BZ["Talador"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Talador"], 43.6, 74.1 },
+	}
+
+	zones[BZ["Skyreach"]] = {
+		low = 97,
+		high = 99,
+		continent = Draenor,
+		paths = BZ["Spires of Arak"],
+		groupSize = 5,
+		type = "Instance",
+		entrancePortal = { BZ["Spires of Arak"], 35.6, 33.5 },
+	}
+
+	zones[BZ["Highmaul"]] = {
+		low = 100,
+		high = 100,
+		continent = Draenor,
+		paths = BZ["Nagrand"].." ("..BZ["Draenor"]..")",
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+--		entrancePortal = { BZ["Nagrand"].." ("..BZ["Draenor"]..")", 0.00, 0.00 },   TODO
+	}
+
+	zones[BZ["Hellfire Citadel"].." ("..BZ["Draenor"]..")"] = {
+		low = 100,
+		high = 100,
+		continent = Draenor,
+		paths = BZ["Tanaan Jungle"],
+		groupSize = 10,
+		altGroupSize = 25,
+		type = "Instance",
+--		entrancePortal = { BZ["Tanaan Jungle"], 0.00, 0.00 },   TODO
+	}
+
+
+
+--------------------------------------------------------------------------------------------------------
+--                                                CORE                                                --
+--------------------------------------------------------------------------------------------------------
+
+	trace("Tourist: Initializing continents...")
+	local continentNames = Tourist:GetMapContinentsAlt()
+
+	for continentID, continentName in ipairs(continentNames) do
+		SetMapZoom(continentID)
+
+		if zones[continentName] then
+			-- Get map texture name
+			zones[continentName].texture = GetMapInfo()
+
+			local _, cLeft, cTop, cRight, cBottom = GetCurrentMapZone()
+			-- Calculate size in yards
+			zones[continentName].yards = cLeft - cRight
+
+			-- Calculate x-axis shift and y-axis shift, which indicate how many yards the X and Y axis of the continent map are shifted
+			-- from the midpoint of the map. These shift values are the difference between the zone offsets returned by UpdateMapHighLight and the
+			-- offsets calculated using data provided by GetCurrentMapZone.
+			-- Note: For The Maelstrom continent, no such data is available at all. The four zones of this "continent" are
+			-- geographically not related to each other, so there are no zone offsets and there's no continent shift or size.
+			zones[continentName].x_shift = (cLeft + cRight) / 2
+			zones[continentName].y_shift = (cTop + cBottom) / 2
+
+			trace("Tourist: Continent size in yards for "..tostring(continentName)..": "..tostring(round(zones[continentName].yards, 2)))
+		else
+			-- Unknown Continent
+			trace("|r|cffff4422! -- Tourist:|r TODO: Add Continent '"..tostring(continentName).."'")
+		end
+	end
+
+	-- --------------------------------------------------------------------------------------------------------------------------
+	-- Set the continent offsets and scale for the continents on the Azeroth map, except The Maelstrom.
+	-- The offsets are expressed in Azeroth yards (that is, without the scale correction used for the continent maps)
+	-- and have been calculated as follows.
+	-- I've used a player position because it is displayed at both the continent map and the Azeroth map.
+	-- Using the player coordinates (which are a percentage of the map size) and the continent and Azeroth map sizes:
+
+	-- a = playerXContinent * continentWidth * continentScale (= player X offset on the continent map, expressed in Azeroth yards)
+	-- b = playerXAzeroth * azerothWidth (= player X offset on the Azeroth map)
+	-- continentXOffset = b - a
+
+	-- c = playerYContinent * continentHeight * continentScale (= player Y offset on the continent map, expressed in Azeroth yards)
+	-- d = playerYAzeroth * azerothHeight (= player Y offset on the Azeroth map)
+	-- continentYOffset = d - c
+
+	-- The scales are 'borrowed' from Astrolabe ;-)
+
+	zones[BZ["Kalimdor"]].x_offset = -4023.28
+	zones[BZ["Kalimdor"]].y_offset = 3243.71
+	zones[BZ["Kalimdor"]].scale = 0.5609
+
+	zones[BZ["Eastern Kingdoms"]].x_offset = 16095.36
+	zones[BZ["Eastern Kingdoms"]].y_offset = 2945.14
+	zones[BZ["Eastern Kingdoms"]].scale = 0.5630
+
+	zones[BZ["Northrend"]].x_offset = 12223.65
+	zones[BZ["Northrend"]].y_offset = 520.24
+	zones[BZ["Northrend"]].scale = 0.5949
+
+	zones[BZ["Pandaria"]].x_offset = 12223.65
+	zones[BZ["Pandaria"]].y_offset = 520.24
+	zones[BZ["Pandaria"]].scale = 0.6514
+	-- --------------------------------------------------------------------------------------------------------------------------
+
+
+	trace("Tourist: Initializing zones...")
+	local doneZones = {}
+
+	for continentID, continentName in ipairs(continentNames) do
+		-- Get continent width and height
+		local cWidth = zones[continentName] and zones[continentName].yards or 0
+		local cHeight = 2/3 * cWidth
+
+		-- Build a collection of the indices of the zones within the continent
+		-- to be able to lookup a zone index for SetMapZoom()
+		local zoneNames = GetMapZonesAltLocal(continentID)
+		local zoneIndices = {}
+		for index = 1, #zoneNames do
+			zoneIndices[zoneNames[index]] = index
+		end
+
+		for i = 1, #zoneNames do
+			-- Draenor zones Frostfire Ridge and Shadowmoon Valley appear twice in the collection of Draenor zones
+			-- so we need to be able to skip duplicates, even within a Continent
+			if not doneZones[continentName.."."..zoneNames[i]] then
+				local zoneName = Tourist:GetUniqueZoneNameForLookup(zoneNames[i], continentID)
+				local zoneIndex = zoneIndices[zoneNames[i]]
+				if zones[zoneName] then
+					-- Get zone map data
+					SetMapZoom(continentID, zoneIndex)
+					local z, zLeft, zTop, zRight, zBot = GetCurrentMapZone()
+
+					-- Calculate zone size
+					local sizeInYards = 0
+					if zLeft and zRight then
+						sizeInYards = zLeft - zRight
+					end
+					if sizeInYards ~= 0 or not zones[zoneName].yards then
+						-- Make sure the size is always set (even if it's 0) but don't overwrite any hardcoded values if the size is 0
+						zones[zoneName].yards = sizeInYards
+					end
+					if zones[zoneName].yards == 0 then
+						trace("|r|cffff4422! -- Tourist:|r Size for "..zoneName.." = 0 yards")
+						-- Skip offset calculation as we obviously got no data from GetCurrentMapZone
+					else
+						if cWidth ~= 0 then
+							-- Calculate zone offsets if the size of the continent is know (The Maelstrom has no continent size).
+							-- LibTourist uses positive x and y axis with the source located at the top left corner of the map.
+							-- GetCurrentMapZone uses a source *somewhere* in the middle of the map, and the x axis is
+							-- reversed so it's positive to the LEFT.
+							-- First assume the source is exactly in the middle of the map...
+							local zXOffset = (cWidth * 0.5) - zLeft
+							local zYOffset = (cHeight * 0.5) - zTop
+							-- ...then correct the offsets for continent map axis shifts
+							zXOffset = zXOffset + zones[continentName].x_shift
+							zYOffset = zYOffset + zones[continentName].y_shift
+							zones[zoneName].x_offset = zXOffset
+							zones[zoneName].y_offset = zYOffset
+						end
+					end
+
+					-- Get zone texture filename
+					zones[zoneName].texture = GetMapInfo()
+				else
+					trace("|r|cffff4422! -- Tourist:|r TODO: Add zone "..tostring(zoneName))
+				end
+
+				doneZones[continentName.."."..zoneNames[i]] = true
+			else
+				trace("|r|cffff4422! -- Tourist:|r Duplicate zone: "..tostring(continentName).."["..tostring(i).."]: "..tostring(zoneNames[i]) )
+			end
+
+		end -- zones loop
+		trace( "Tourist: Processed "..tostring(#zoneNames).." zones for "..continentName )
+
+	end -- continents loop
+
+	SetMapToCurrentZone()
+
+	-- Fill the lookup tables
+	for k,v in pairs(zones) do
+		lows[k] = v.low or 0
+		highs[k] = v.high or 0
+		continents[k] = v.continent or UNKNOWN
+		instances[k] = v.instances
+		paths[k] = v.paths or false
+		types[k] = v.type or "Zone"
+		groupSizes[k] = v.groupSize
+		groupAltSizes[k] = v.altGroupSize
+		factions[k] = v.faction
+		yardWidths[k] = v.yards
+		yardHeights[k] = v.yards and v.yards * 2/3 or nil
+		yardXOffsets[k] = v.x_offset
+		yardYOffsets[k] = v.y_offset
+		fishing[k] = v.fishing_min
+		battlepet_lows[k] = v.battlepet_low
+		battlepet_highs[k] = v.battlepet_high
+		textures[k] = v.texture
+		complexOfInstance[k] = v.complex
+		zoneComplexes[k] = v.complexes
+		if v.texture then
+			textures_rev[v.texture] = k
+		end
+		if v.entrancePortal then
+			entrancePortals_zone[k] = v.entrancePortal[1]
+			entrancePortals_x[k] = v.entrancePortal[2]
+			entrancePortals_y[k] = v.entrancePortal[3]
+		end
+		if v.scale then
+			continentScales[k] = v.scale
+		end
+	end
+	zones = nil
+
+	trace("Tourist: Initialized.")
+
+	PLAYER_LEVEL_UP(Tourist)
+end
diff --git a/ElvUI_SLE/libs/LibTourist-3.0/LibTourist-3.0.toc b/ElvUI_SLE/libs/LibTourist-3.0/LibTourist-3.0.toc
new file mode 100644
index 0000000..45a7d40
--- /dev/null
+++ b/ElvUI_SLE/libs/LibTourist-3.0/LibTourist-3.0.toc
@@ -0,0 +1,13 @@
+## Interface: 60200
+## LoadOnDemand: 1
+## Title: Lib: Tourist-3.0
+## Notes: A library to provide information about zones and instances.
+## Author: ckknight, Arrowmaster, Odica
+## X-Category: Library
+## X-Curse-Packaged-Version: r181
+## X-Curse-Project-Name: LibTourist-3.0
+## X-Curse-Project-ID: libtourist-3-0
+## X-Curse-Repository-ID: wow/libtourist-3-0/mainline
+
+LibStub\LibStub.lua
+lib.xml
diff --git a/ElvUI_SLE/libs/LibTourist-3.0/lib.xml b/ElvUI_SLE/libs/LibTourist-3.0/lib.xml
new file mode 100644
index 0000000..6e301c1
--- /dev/null
+++ b/ElvUI_SLE/libs/LibTourist-3.0/lib.xml
@@ -0,0 +1,4 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
+..\FrameXML\UI.xsd">
+	<Script file="LibTourist-3.0.lua" />
+</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/load_libs.xml b/ElvUI_SLE/libs/load_libs.xml
index 9c721fe..7702f29 100644
--- a/ElvUI_SLE/libs/load_libs.xml
+++ b/ElvUI_SLE/libs/load_libs.xml
@@ -1 +1 @@
-<Ui xmlns="http://www.blizzard.com/wow/ui/">
	<Script file="AceAddon-3.0\AceAddon-3.0.lua"/>
	<Script file="AceConsole-3.0\AceConsole-3.0.lua"/>
	<Script file="AceDB-3.0\AceDB-3.0.lua"/>
	<Script file="AceDBOptions-3.0\AceDBOptions-3.0.lua"/>
	<Include file="AceGUI-3.0\AceGUI-3.0.xml"/>
	<Include file="AceConfig-3.0\AceConfig-3.0.xml"/>
	<Include file="LibBabble-SubZone-3.0\lib.xml"/>
	<Script file="oUF_NecroStrike\oUF_NecroStrike.lua"/>
	<Script file="LibQTip-1.0\LibQTip-1.0.lua"/>
	<Script file="LibRangeCheck-2.0\LibRangeCheck-2.0.lua"/>
	<Include file="LibElv-UIButtons-1.0\load_uibuttons.xml"/>
</Ui>
\ No newline at end of file
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
	<Script file="AceAddon-3.0\AceAddon-3.0.lua"/>
	<Script file="AceConsole-3.0\AceConsole-3.0.lua"/>
	<Include file="LibTourist-3.0\lib.xml" />
	<Script file="AceDB-3.0\AceDB-3.0.lua"/>
	<Include file="LibElv-UIButtons-1.0\load_uibuttons.xml"/>
	<Include file="LibElv-GameMenu-1.0\LibElv-GameMenu-1.0.lua"/>
	<Script file="LibAnim\LibAnim.lua"/>
	<Script file="LibQTip-1.0\LibQTip-1.0.lua"/>
	<Script file="LibRangeCheck-2.0\LibRangeCheck-2.0.lua"/>
	<Include file="LibBabble-SubZone-3.0\lib.xml"/>
	<Include file="LibFishing-1.0\lib.xml" />
	<Script file="oUF_OfflineSLE\oUF_OfflineSLE.lua"/>
</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/oUF_NecroStrike/oUF_NecroStrike.lua b/ElvUI_SLE/libs/oUF_NecroStrike/oUF_NecroStrike.lua
deleted file mode 100644
index 9374bcf..0000000
--- a/ElvUI_SLE/libs/oUF_NecroStrike/oUF_NecroStrike.lua
+++ /dev/null
@@ -1,116 +0,0 @@
-local _, ns = ...
-local oUF = ElvUF or oUF
-local E, L, V, P, G =  unpack(ElvUI);
-if not oUF then return end
-local NecroticStrikeTooltip
-
---Enabling only for DKs
-if E.myclass ~= "DEATHKNIGHT" then return end
-
-local function GetNecroticAbsorb(unit)
-	local i = 1
-	while true do
-		local _, _, texture, _, _, _, _, _, _, _, spellId = UnitAura(unit, i, "HARMFUL")
-		--local _, _, texture, _, _, _, _, _, _, _, spellId = UnitAura(unit, i, "HELPFUL") --Debug for testing with holy pally mastery
-		if not texture then break end
-		if spellId == 73975 then
-		--if spellId == 86273 then --Debug for testing with holy pally mastery
-			if not NecroticStrikeTooltip then
-				NecroticStrikeTooltip = CreateFrame("GameTooltip", "NecroticStrikeTooltip", nil, "GameTooltipTemplate")
-				NecroticStrikeTooltip:SetOwner(WorldFrame, "ANCHOR_NONE")
-			end
-			NecroticStrikeTooltip:ClearLines()
-			NecroticStrikeTooltip:SetUnitDebuff(unit, i)
-			--NecroticStrikeTooltip:SetUnitBuff(unit, i)  --Debug for testing with holy pally mastery
-			if (GetLocale() == "ruRU") then
-				return tonumber(string.match(_G[NecroticStrikeTooltip:GetName() .. "TextLeft2"]:GetText(), "(%d+%s?) .*"))
-			else
-				return tonumber(string.match(_G[NecroticStrikeTooltip:GetName() .. "TextLeft2"]:GetText(), ".* (%d+%s?) .*"))
-			end
-		end
-		i = i + 1
-	end
-	return 0
-end
-
-local function UpdateOverlay(object)
-	local healthFrame = object.Health
-	local amount = 0
-	if healthFrame.NecroAbsorb then
-		amount = healthFrame.NecroAbsorb
-	end
-	if amount > 0 then
-		local currHealth = UnitHealth(object.unit)
-		local maxHealth = UnitHealthMax(object.unit)
-
-		--Calculatore overlay posistion based on current health
-		local lOfs = (healthFrame:GetWidth() * (currHealth / maxHealth)) - (healthFrame:GetWidth() * (amount / maxHealth))
-		local rOfs = (healthFrame:GetWidth() * (currHealth / maxHealth)) - healthFrame:GetWidth()
-
-		--Compensate for smooth health bars
-		local rOfs2 = (healthFrame:GetWidth() * (healthFrame:GetValue() / maxHealth)) - healthFrame:GetWidth()
-		if rOfs2 > rOfs then rOfs = rOfs2 end
-
-		--Clamp to health bar
-		if lOfs < 0 then lOfs = 0 end
-		if rOfs > 0 then rOfs = 0 end
-
-		--Redraw overlay
-		healthFrame.NecroticOverlay:ClearAllPoints()
-		healthFrame.NecroticOverlay:SetPoint("LEFT", lOfs, 0)
-		healthFrame.NecroticOverlay:SetPoint("RIGHT", rOfs, 0)
-		healthFrame.NecroticOverlay:SetPoint("TOP", 0, 0)
-		healthFrame.NecroticOverlay:SetPoint("BOTTOM", 0, 0)
-
-		--Select overlay color based on if class color is enabled
-		if healthFrame.colorClass then
-			healthFrame.NecroticOverlay:SetVertexColor(0, 0, 0, 0.4)
-		else
-			local r, g, b = healthFrame:GetStatusBarColor()
-			healthFrame.NecroticOverlay:SetVertexColor(1-r, 1-g, 1-b, 0.4)
-		end
-
-		healthFrame.NecroticOverlay:Show()
-	else
-		healthFrame.NecroticOverlay:Hide()
-	end
-end
-
-local function Update(object, event, unit)
-	if object.unit ~= unit then return end
-	object.Health.NecroAbsorb = GetNecroticAbsorb(unit)
-	UpdateOverlay(object)
-end
-
-local function Enable(object)
-	if not object.Health then return end
-
-	--Create overlay for this object
-	if not object.Health.NecroticOverlay then
-		object.Health.NecroticOverlay = object.Health:CreateTexture(nil, "OVERLAY", object.Health)
-		object.Health.NecroticOverlay:SetAllPoints(object.Health)
-		object.Health.NecroticOverlay:SetTexture(1, 1, 1, 1)
-		object.Health.NecroticOverlay:SetBlendMode("BLEND")
-		object.Health.NecroticOverlay:SetVertexColor(0, 0, 0, 0.4)
-		object.Health.NecroticOverlay:Hide()
-	end
-
-	object:RegisterEvent("UNIT_AURA", Update)
-	object:RegisterEvent("UNIT_HEALTH_FREQUENT", Update)
-	return true
-end
-
-local function Disable(object)
-	if not object.Health then return end
-
-	if object.Health.NecroticOverlay then
-		object.Health.NecroticOverlay:Hide()
-	end
-
-	object:UnregisterEvent("UNIT_AURA", Update)
-	object:UnregisterEvent("UNIT_HEALTH_FREQUENT", Update)
-end
-
-oUF:AddElement('NecroStrike', Update, Enable, Disable)
-
-for i, frame in ipairs(oUF.objects) do Enable(frame) end
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/oUF_NecroStrike/oUF_NecroStrike.toc b/ElvUI_SLE/libs/oUF_NecroStrike/oUF_NecroStrike.toc
deleted file mode 100644
index 809eb62..0000000
--- a/ElvUI_SLE/libs/oUF_NecroStrike/oUF_NecroStrike.toc
+++ /dev/null
@@ -1,9 +0,0 @@
-## Interface: 40300
-## Author: pvtschlag
-## Editor: Jasje
-## Version: 1.1
-## Title: oUF Necrotic Strike
-## Notes: Necrotic strike debuff support for oUF layouts.
-## RequiredDeps: ElvUI
-
-oUF_NecroStrike.lua
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/oUF_OfflineSLE/oUF_OfflineSLE.lua b/ElvUI_SLE/libs/oUF_OfflineSLE/oUF_OfflineSLE.lua
new file mode 100644
index 0000000..46e8403
--- /dev/null
+++ b/ElvUI_SLE/libs/oUF_OfflineSLE/oUF_OfflineSLE.lua
@@ -0,0 +1,40 @@
+local parent, ns = ...
+local oUF = ElvUF or oUF
+local _G = _G
+
+local Update = function(self, event, unit)
+	if(self.unit ~= unit) or not unit then return end
+	local offline = self.Offline
+	local dc = self.Health.disconnected
+
+	if dc or _G[offline.Group].isForced then
+		offline:Show()
+	else
+		offline:Hide()
+	end
+end
+
+local Path = function(self, ...)
+	return (self.Health.Override or Update) (self, ...)
+end
+
+local Enable = function(self, unit)
+	local offline = self.Offline
+	if(offline) then
+		offline.__owner = self
+
+		self:RegisterEvent('UNIT_CONNECTION', Path)
+		Update(self, nil, unit)
+		return true
+	end
+end
+
+local Disable = function(self)
+	local offline = self.Health
+	if(offline) then
+		self:UnregisterEvent('UNIT_CONNECTION', Path)
+		self.Offline:Hide()
+	end
+end
+
+oUF:AddElement('SLE_Offline', Path, Enable, Disable)
\ No newline at end of file
diff --git a/ElvUI_SLE/libs/oUF_OfflineSLE/oUF_OfflineSLE.toc b/ElvUI_SLE/libs/oUF_OfflineSLE/oUF_OfflineSLE.toc
new file mode 100644
index 0000000..cb85ffb
--- /dev/null
+++ b/ElvUI_SLE/libs/oUF_OfflineSLE/oUF_OfflineSLE.toc
@@ -0,0 +1,8 @@
+## Interface: 60200
+## Title: oUF Offline Indicator for S&E
+## Notes: Offline indicator for oUF frames in S&L.
+## Author: Darth Predator
+## Version: 1.0.0
+## Dependencies: oUF
+
+oUF_OfflineSLE.lua
\ No newline at end of file
diff --git a/ElvUI_SLE/locales/english.lua b/ElvUI_SLE/locales/english.lua
index 866fdc3..2c4badc 100644
--- a/ElvUI_SLE/locales/english.lua
+++ b/ElvUI_SLE/locales/english.lua
@@ -3,35 +3,158 @@ local AceLocale = LibStub:GetLibrary("AceLocale-3.0");
 local L = AceLocale:NewLocale("ElvUI", "enUS", true);

 if not L then return; end
+--Popups
+L["MSG_SLE_ELV_OUTDATED"] = "Your version of ElvUI is older than recommended to use with |cff9482c9Shadow & Light|r. Your version is |cff1784d1%.2f|r (recommended is |cff1784d1%.2f|r). Please update your ElvUI."
+L["This will clear your chat history and reload your UI.\nContinue?"] = true
+L["This will clear your editbox history and reload your UI.\nContinue?"] = true
+L["Oh lord, you have got ElvUI Enhanced and Shadow & Light both enabled at the same time. Select an addon to disable."] = true
+L["You have got Loot Confirm and Shadow & Light both enabled at the same time. Select an addon to disable."] = true
+L["You have got OneClickEnchantScroll and Shadow & Light both enabled at the same time. Select an addon to disable."] = true
+L["You have got ElvUI Transparent Actionbar Backdrops and Shadow & Light both enabled at the same time. Select an addon to disable."] = true
+L["SLE_ADVANCED_POPUP_TEXT"] = [[Do you swear that you are an experienced user,
+can read tooltips for options and will not cry for help if you
+horribly break your UI by utilizing additional options?

---Export/Import--
-L["SLE_IMPORTS"] = "|cffFF0000Note:|r Use the filter imports with caution as these will overwrite any custom ones made!\nImporting a class filter will overwrite any modifications you have made to that class filter."
--- L["SLE_EXPORT_HELP"] = [[|cffFFFFFFExporting:
--- Click the Export button and the settings that are different from defaults in selected options tables' will be dumped to the export box.
- -- - Profile will copy profile based settings;
- -- - Private will copy character specific settings;
- -- - Global will copy global settings.|r
--- |cffFF0000Warning: exporting may cause your game to freeze for some time.|r
-
--- |cffFFFFFFImporting:
--- To import the settings you need to paste the setting table
--- or line to the import editbox and click import button.
--- You can use next formats for settings:
--- 1) E.db.chat.panelHeight = 185
--- 2) E.db['chat']['panelHeight'] = 185
--- 3) E.db['chat'] = {
--- ...
--- }
--- In case of the third format you should put at least 2 values.|r
-
--- |cffFF0000Know issue: coloring options will be exported anyway no matter the values and exporting options set.|r]]
-
---Media--
-L["SLE_MEDIA"] = "Options to change the look of several UI elements."
-L["SLE_TIPS"] = {
+If yes, you'll be allowed to enable this option.
+]]
+
+--Install--
+L["Moving Frames"] = true
+L["Author Presets"] = true
+L["|cff9482c9Shadow & Light|r Installation"] = true
+L["Welcome to |cff9482c9Shadow & Light|r version %s!"] = true
+L["SLE_INSTALL_WELCOME"] = [[This will take you through a quick install process to setup some Shadow & Light features.
+If you choose to not setup any options through this config, click Skip Process button to finish the installation.
+
+Note that steps to the right marked with * are optional steps unavailable without selecting something in previous steps.]]
+L["This will enable S&L Armory mode components that will show more detailed information at a quick glance on the toons you inspect or your own character."] = true
+L["SLE_ARMORY_INSTALL"] = "Enable S&L Armory\n(Detailed Character & Inspect frames)."
+L["Shadow & Light Imports"] = true
+L["You can now choose if you want to use one of the authors' set of options. This will change the positioning of some elements as well of other various options."] = true
+L["SLE_Install_Text_AUTHOR"] = [=[This step is optional and only to be used if you are wanting to use one of our configurations. In some cases settings may differ depending on layout options you chose in ElvUI installation.
+Not selecting anything will cause you to skip next step of the installation.
+
+A |cff1784d1"%s"|r role was chosen.
+
+|cffFF0000Warning:|r Please note that the authors' may or may not use any of the layouts/themes you have selected as they may have changed their setup more recently. Also switching between layouts in here may cause some unpredictable and weird results.]=]
+L["Darth's Config"] = true
+L["Repooc's Config"] = true
+L["Darth's Default Set"] = true
+L["Repooc's Default Set"] = true
+L["Layout & Settings Import"] = true
+L["You have selected to use %s."] = true
+L["SLE_INSTALL_LAYOUT_TEXT2"] = [[Following buttons will import layout/addon settings for the selected config and role.
+Please not that this configs may include some settings you may not yet being familiar with.
+
+Also it may reset/change some options you set in previous steps.]]
+L["|cff1784d1%s|r role was chosen"] = true
+L["Author Presets"] = true
+L["Moving Frames"] = true
+L["Import Profile"] = true
+L["AFK Mode"] = true
+L["You have selected to use %s and role %s."] = true
+
+--Config replacements
+L["This option have been disabled by Shadow & Light. To return it you need to disable S&L's option. Click here to see it's location."] = true
+
+--Core
+L["SLE_LOGIN_MSG"] = "|cff9482c9Shadow & Light|r version |cff1784d1%s%s|r for ElvUI is loaded. Thanks for the usage."
+L["Plugin for |cff1784d1ElvUI|r by\nDarth Predator and Repooc."] = true
+L["Resets all movers & options for S&L."] = true
+L["Reset these options to defaults"] = true
+L["Modules designed for older expantions"] = true
+L["Game Menu Buttons"] = true
+L["Adds |cff9482c9Shadow & Light|r buttons to main game menu."] = true
+L["SLE_Advanced_Desc"] = [[Folowing options provide acces to additional customization settings in various modules.
+Is not reccomended to new players or people not experienced in addons' configuration.]]
+L["Allow Advanced Options"] = true
+L["Change Elv's options limits"] = true
+L["Allow |cff9482c9Shadow & Light|r to change some of ElvUI's options limits."] = true
+L["Cyrillics Support"] = true
+L["SLE_CYR_DESC"] = [[If you happen to ocasionaly (or constantly) use Russian alphabet (Cyrillics) for your messages
+and always forget to switch input language afterward when entering slash commands then these options will help you.
+They enable a set of ElvUI's commands to be usable even with wrong input.
+]]
+L["Commands"] = true
+L["SLE_CYR_COM_DESC"] = [[Allows the usage of these common commands with ru input:
+- /rl
+- /in
+- /ec
+- /elvui
+- /bgstats
+- /hellokitty
+- /hellokittyfix
+- /harlemshake
+- /egrid
+- /moveui
+- /resetui
+- /kb]]
+L["Dev Commands"] = true
+L["SLE_CYR_DEVCOM_DESC"] = [[Allows the usage of these commands with ru input:
+- /luaerror
+- /frame
+- /framelist
+- /texlist
+- /cpuimpact
+- /cpuusage
+- /enableblizzard
+
+These are usually used for developing and testing purposes or are extremely rare used by general user.]]
+
+--Config groups
+L["S&L: All"] = true
+L["S&L: Datatexts"] = true
+L["S&L: Backgrounds"] = true
+L["S&L: Misc"] = true
+
+--Actionbars
+L["OOR as Bind Text"] = true
+L["Out Of Range indication will use keybind text instead of the whole icon."] = true
+L["Checked Texture"] = true
+L["Highlight the button of the spell with areal effect untill the area is selected."] = true
+L["Checked Texture Color"] = true
+L["Transparent Backdrop"] = true
+L["Sets actiobars' backgrounds to transparent template."] = true
+L["Transparent Buttons"] = true
+L["Sets actiobars buttons' backgrounds to transparent template."] = true
+
+--Armory
+L["Average"] = true
+L["Not Enchanted"] = true
+L["Empty Socket"] = true
+L["KF"] = true
+L["You can't inspect while dead."] = true
+L["Specialization data seems to be crashed. Please inspect again."] = true
+L["No Specialization"] = true
+L["Character model may differ because it was constructed by the inspect data."] = true
+L["Armory Mode"] = true
+L["Enchant String"] = true
+L["String Replacement"] = true
+L["List of Strings"] = true
+L["Original String"] = true
+L["New String"] = true
+L["Character Armory"] = true
+L["Show Missing Enchants or Gems"] = true
+L["Show Warning Icon"] = true
+L["Select Image"] = true
+L["Custom Image Path"] = true
+L["Gradient"] = true
+L["Gradient Texture Color"] = true
+L["Upgrade Level"] = true
+L["Warning Size"] = true
+L["Warning Only As Icons"] = true
+L["Only Damaged"] = true
+L["Gem Sockets"] = true
+L["Socket Size"] = true
+L["Inspect Armory"] = true
+
+--AFK
+L["You Are Away From Keyboard for"] = true
+L["Take care of yourself, Master!"] = true
+L["SLE_TIPS"] = { --This doesn't need to be translated, every locale can has own tips
 	"Don't stand in the fire!",
 	"Elv: I just utilized my degree in afro engineering and fixed it",
-	[[|TInterface\AddOns\ElvUI_SLE\media\textures\WH:24:24|t Burn the heretic. Kill the mutant. Purge the unclean.]],
+	"Burn the heretic. Kill the mutant. Purge the unclean.",
 	"Blood for the Blood God!",
 	"Coffee for the Coffee God!",
 	"Darth's most favorite change comment - \"Woops\"",
@@ -40,103 +163,615 @@ L["SLE_TIPS"] = {
 	"Need... More... Catgirls... Wait, what?!",
 	"First Aid potions are better then Healthstones. WTF Blizzard?!",
 }
+L["Enable S&L's additional features for AFK screen."] = true
+L["Button restrictions"] = true
+L["Use ElvUI's restrictions for button presses."] = true
+L["Crest Size"] = true
+L["X-Pack Logo Size"] = true
+L["Template"] = true
+L["Player Model"] = true
+L["Model Animation"] = true
+L["Test"] = true
+L["Shows a test model with selected animation for 10 seconds. Clicking again will reset timer."] = true
+L["Misc"] = true
+L["Bouncing"] = true
+L["Use bounce on fade in animations."] = true
+L["Animation time"] = true
+L["Time the fade in animation will take. To disable animation set to 0."] = true
+L["Slide"] = true
+L["Slide Sideways"] = true
+L["Fade"] = true
+L["Tip time"] = true
+L["Number of seconds tip will be shown before changed to another."] = true

---General--
-L["SLE_LOGIN_MSG"] = [=[You are using |cff1784d1Shadow & Light|r version |cff1784d1%s%s|r for ElvUI.
-If you wish to use the original ElvUI addon, disable this edit's plugin in your Addons manager.
-Have a nice day.]=]
-L["SLE_DESC"] = [=[This is an edit of ElvUI that adds some functionality to the original addon and changes some previously existed options.
-The edit doesn't change original files in any respect so you can freely disable it any time from your addon manager without any risk.]=]
-L['MSG_OUTDATED'] = "Your version of ElvUI is older than recommended to use with Shadow & Light. Your version is |cff1784d1%.2f|r (recommended is |cff1784d1%.2f|r). Please update your ElvUI."
+--Auras
+L["Hide Buff Timer"] = true
+L["This hides the time remaining for your buffs."] = true
+L["Hide Debuff Timer"] = true
+L["This hides the time remaining for your debuffs."] = true

---Install--
-L["SLE_Install_Text2"] = [=[This step is optional and only to be used if you are wanting to use one of our configurations. In some cases settings may differ depending on layout options you chose in ElvUI installation.
+--Backgrounds
+L["SLE_BG_1"] = "Background 1"
+L["SLE_BG_2"] = "Background 2"
+L["SLE_BG_3"] = "Background 3"
+L["SLE_BG_4"] = "Background 4"
+L["Additional Background Panels"] = true
+L["BG_DESC"] = "Module for creating additional frames that can be used as backgrounds for anything."
+L["Show/Hide this frame."] = true
+L["Sets width of the frame"] = true
+L["Sets height of the frame"] = true
+L["Set the texture to use in this frame. Requirements are the same as the chat textures."] = true
+L["Backdrop Template"] = true
+L["Change the template used for this backdrop."] = true
+L["Hide in Pet Batlle"] = true
+L["Show/Hide this frame during Pet Battles."] = true

-A |cff1784d1"%s"|r role was chosen.
+--Bags
+L["New Item Flash"] = true
+L["Use the Shadow & Light New Item Flash instead of the default ElvUI flash"] = true
+L["Transparent Slots"] = true
+L["Apply transparent template on bag and bank slots."] = true

-|cffFF0000Warning:|r Please note that the authors' may or may not use any of the layouts/themes you have selected as they may have changed their setup more recently. Also switching between layouts in here may cause some unpredictable and weird results.]=]
-L["SLE_ARMORY_INSTALL"] = "Enable S&L Armory\n(Detailed Character & Inspect frames)\n|cffFF0000Note:|r This is currently a beta option."
+--Blizzard
+L["Move Blizzard frames"] = true
+L["Allow some Blizzard frames to be moved around."] = true
+L["Pet Battles skinning"] = true
+L["Make some elements of pet battles movable via toggle anchors."] = true
+L["Vehicle Seat Scale"] = true

---Backgroungds--
-L["BG_DESC"] = "Module for creating additional frames that can be used as backgrounds for anything."
-L["Sets width of the frame"] = "Wähle die breite dieses Fensters"
-L["Sets height of the frame"] = "Wähle die höhe dieses Fensters"
-L["Sets X offset of the frame"] = "Wähle den X Versatz für dieses Fenster"
-L["Sets Y offset of the frame"] = "Wähle den Y Versatz für dieses Fenster"
-L["Texture"] = "Texture"
-L["Set the texture to use in this frame.  Requirements are the same as the chat textures."] = "Wähle die Textur die für dieses Fenster benutzt wird. Empfohlen wird die selbe wie die Chat Textur."
-L["Backdrop Template"] = "Hintergrund Template"
-L["Change the template used for this backdrop."] = "Wähle das Template das für den Hintergrund benutzt wird."
-L["Default"] = "Standart"
-
---Character Frame Options
-L["CFO_DESC"] = "This section will added different options/features to the character sheet.  Here you can show item level and durability of your items for a quick glance."
-L['IFO_DESC'] = "This section will disable default inspect frame and use a custom one that S&L provides.  Please note that this is in a very early beta and we know there may be issues.  We will be adding customization in later releases, please make sure to check for updates for new features and fixes."
-
---Datatexts--
+--Chat
+L["Reported by %s"] = true
+L["Reset Chat History"]= true
+L["Clears your chat history and will reload your UI."] = true
+L["Reset Editbox History"] = true
+L["Clears the editbox history and will reload your UI."] = true
+L["Guild Master Icon"] = true
+L["Displays an icon near your Guild Master in chat.\n\n|cffFF0000Note:|r Some messages in chat history may disappear on login."] = true
+L["Chat Editbox History"] = true
+L["The amount of messages to save in the editbox history.\n\n|cffFF0000Note:|r To disable, set to 0."] = true
+L["Filter DPS meters' Spam"] = true
+L["Replaces long reports from damage meters with a clickeble hyperlink to reduce chat spam.\nWorks correctly only with general reports such as DPS or HPS. May fail to filter te report of other things"] = true
+L["Texture Alpha"] = true
+L["Allows separate alpha setting for textures in chat"] = true
+L["Chat Frame Justify"] = true
+L["Identify"] = true
+L["Showes the message in each chat frame containing frame's number."] = true
+L["This is %sFrame %s|r"] = true
+L["Loot Icons"] = true
+L["Showes icons of items looted/created near respective messages in chat. Does not affect usual messages."] = true
+L["Frame 1"] = true
+L["Frame 2"] = true
+L["Frame 3"] = true
+L["Frame 4"] = true
+L["Frame 5"] = true
+L["Frame 6"] = true
+L["Frame 7"] = true
+L["Frame 8"] = true
+L["Frame 9"] = true
+L["Frame 10"] = true
+L["Chat Max Messages"] = true
+L["The amount of messages to save in chat window.\n\n|cffFF0000Warning:|r Can increase the amount of memory needed. Also changing this setting will clear the chat in all windows, leaving just lines saved in chat history."] = true
+L["Tabs"] = true
+L["Selected Indicator"] = true
+L["Shows you which of docked chat tabs is currently selected."] = true
+L["Chat history size"] = true
+L["Sets how many messages will be stored in history."] = true
+L["Following options determine which channels to save in chat history.\nNote: disabling a channel will immideately delete saved info for that channel."] = true
+
+--Databars
+L["Full value on Exp Bar"] = true
+L["Changes the way text is shown on exp bar."] = true
+L["Full value on Rep Bar"] = true
+L["Changes the way text is shown on rep bar."] = true
+L["Auto Track Reputation"] = true
+L["Automatically sets reputation tracking to the most recent reputation change."] = true
+L["Change the style of reputation messages."] = true
+L["Reputation increase Style"] = true
+L["Reputation decrease Style"] = true
+L["Output"] = true
+L["Determines in which frame reputation messages will be shown. Auto is for whatever frame has reputation messages enabled via Blizzard options."] = true
+L["Change the style of experience gain messages."] = true
+L["Experience Style"] = true
+L["Full List"] = true
+L["Show all factions affected by the latest reputation change. When disabled only first (in alphabetical order) affected faction will be shown."] = true
+L["Full value on Artifact Bar"] = true
+L["Changes the way text is shown on artifact bar."] = true
+L["Full value on Honor Bar"] = true
+L["Changes the way text is shown on honor bar."] = true
+L["Chat Filters"] = true
+L["Replace massages about honorable kills in chat."] = true
+L["Award"] = true
+L["Replace massages about honor points being awarded."] = true
+L["Defines the style of changed string. Colored parts will be shown with your selected value color in chat."] = true
+L["Award Style"] = true
+L["HK Style"] = true
+
+--Datatexts
+L["D"] = true
+L["Previous Level:"] = true
+L["Account Time Played"] = true
+L["SLE_DataPanel_1"] = "S&L Data Panel 1"
+L["SLE_DataPanel_2"] = "S&L Data Panel 2"
+L["SLE_DataPanel_3"] = "S&L Data Panel 3"
+L["SLE_DataPanel_4"] = "S&L Data Panel 4"
+L["SLE_DataPanel_5"] = "S&L Data Panel 5"
+L["SLE_DataPanel_6"] = "S&L Data Panel 6"
+L["SLE_DataPanel_7"] = "S&L Data Panel 7"
+L["SLE_DataPanel_8"] = "S&L Data Panel 8"
+L["This LFR isn't available for your level/gear."] = true
+L["You didn't select any instance to track."] = true
+L["Bosses killed: "] = true
+L["Current:"] = true
+L["Weekly:"] = true
+L["|cffeda55fLeft Click|r to open the friends panel."] = true
+L["|cffeda55fRight Click|r to open configuration panel."] = true
+L["|cffeda55fLeft Click|r a line to whisper a player."] = true
+L["|cffeda55fShift+Left Click|r a line to lookup a player."] = true
+L["|cffeda55fCtrl+Left Click|r a line to edit a note."] = true
+L["|cffeda55fMiddleClick|r a line to expand RealID."] = true
+L["|cffeda55fAlt+Left Click|r a line to invite."] = true
+L["|cffeda55fLeft Click|r a Header to hide it or sort it."] = true
+L["|cffeda55fLeft Click|r to open the guild panel."] = true
+L["|cffeda55fCtrl+Left Click|r a line to edit note."] = true
+L["|cffeda55fCtrl+Right Click|r a line to edit officer note."] = true
+L["New Mail"] = true
+L["No Mail"] = true
+L["Range"] = true
 L["SLE_AUTHOR_INFO"] = "Shadow & Light by Darth Predator & Repooc"
 L["SLE_CONTACTS"] = [=[If you have suggestions or a bug report,
 please submit ticket at http://git.tukui.org/repooc/elvui-shadowandlight]=]
-L["DP_1"] = "DT Panel 1"
-L["DP_2"] = "DT Panel 2"
-L["DP_3"] = "DT Panel 3"
-L["DP_4"] = "DT Panel 4"
-L["DP_5"] = "DT Panel 5"
-L["DP_6"] = "DT Panel 6"
-L["Bottom_Panel"] = "Bottom Panel"
-L["Top_Center"] = "Top Panel"
+L["Additional Datatext Panels"] = true
 L["DP_DESC"] = [=[Additional Datatext Panels.
-8 panels with 20 datatext points total and a dashboard with 4 status bars.
-You can't disable chat panels.]=]
-
---Equip Manager--
-L["EM_DESC"] = "This module provides different options to automatically change your equipment sets on spec change or entering certain locations."
-
+8 panels with 20 datatext points total.]=]
+L["Sets size of this panel"] = true
+L["Don't show this panel, only datatexts assinged to it"] = true
+L["Override Chat DT Panels"] = true
+L["This will have S&L handle chat datatext panels and place them below the left & right chat panels.\n\n|cffFF0000Note:|r When you first enabled, you may need to move the chat panels up to see your datatext panels."] = true
+L["S&L Datatexts"] = true
+L["Datatext Options"] = true
+L["LFR Lockout"] = true
+L["Show/Hide LFR lockout info in time datatext's tooltip."] = true
+L["ElvUI Improved Currency Options"] = true
+L["Show Archaeology Fragments"] = true
+L["Show Jewelcrafting Tokens"] = true
+L["Show Player vs Player Currency"] = true
+L["Show Dungeon and Raid Currency"] = true
+L["Show Cooking Awards"] = true
+L["Show Miscellaneous Currency"] = true
+L["Show Zero Currency"] = true
+L["Show Icons"] = true
+L["Show Faction Totals"] = true
+L["Show Unsed Currency"] = true
+L["These options are for modifing the Shadow & Light Friends datatext."] = true
+L["Hide In Combat"] = true
+L["Will not show the tooltip while in combat."] = true
+L["Hide Friends"] = true
+L["Minimize the Friend Datatext."] = true
+L["Show Totals"] = true
+L["Show total friends in the datatext."] = true
+L["Hide Hints"] = true
+L["Hide the hints in the tooltip."] = true
+L["Expand RealID"] = true
+L["Display realid with two lines to view broadcasts."] = true
+L["Autohide Delay:"] = true
+L["Adjust the tooltip autohide delay when mouse is no longer hovering of the datatext."] = true
+L["S&L Guild"] = true
+L["These options are for modifing the Shadow & Light Guild datatext."] = true
+L["Show total guild members in the datatext."] = true
+L["Hide MOTD"] = true
+L["Hide the guild's Message of the Day in the tooltip."] = true
+L["Hide Guild"] = true
+L["Minimize the Guild Datatext."] = true
+L["Hide Guild Name"] = true
+L["Hide the guild's name in the tooltip."] = true
+L["S&L Mail"] = true
+L["These options are for modifing the Shadow & Light Mail datatext."] = true
+L["Minimap icon"] = true
+L["If enabled will show new mail icon on minimap."] = true
+L["Options below are for standard ElvUI's durability datatext."] = true
+L["If enabled will color durability text based on it's value."] = true
+L["Durability Threshold"] = true
+L["Datatext will flash if durability shown will be equal or lower that this value. Set to -1 to disable"] = true
+L["Short text"] = true
+L["Changes the text string to a shorter variant."] = true
+L["Delete character info"] = true
+L["Remove selected character from the stored gold values"] = true
+L["Are you sure you want to remove |cff1784d1%s|r from currency datatexts?"] = true

---Farm--
-L["FARM_DESC"] = [[Additional actionbars for the Sunsong Ranch containing seeds, tools and portals.
-They will appear only if you are on the Ranch or The Halfhill Market.]]
+--Equip Manager
+L["Equipment Manager"] = true
+L["EM_DESC"] = "This module provides different options to automatically change your equipment sets on spec change or entering certain locations. All options are character based."
+L["Equipment Set Overlay"] = true
+L["Show the associated equipment sets for the items in your bags (or bank)."] = true
+L["Here you can choose what equipment sets to use in different situations."] = true
+L["Equip this set when switching to specialization %s."] = true
+L["Equip this set for open world/general use."] = true
+L["Equip this set after entering dungeons or raids."] = true
+L["Equip this set after entering battlegrounds or arens."] = true
+L["Use a dedicated set for instances and raids."] = true
+L["Use a dedicated set for PvP situations."] = true
+L["Impossible to switch to appropriate equipment set in combat. Will switch after combat ends."] = true

---Loot--
+--Loot
+L["Loot Dropped:"] = true
+L["Loot Auto Roll"] = true
+L["LOOT_AUTO_DESC"] = "Automatically selects an apropriate roll on dropped loot."
+L["Auto Confirm"] = true
+L["Automatically click OK on BOP items"] = true
+L["Auto Greed"] = true
+L["Automatically greed uncommon (green) quality items at max level"] = true
+L["Auto Disenchant"] = true
+L["Automatically disenchant uncommon (green) quality items at max level"] = true
+L["Loot Quality"] = true
+L["Sets the auto greed/disenchant quality\n\nUncommon: Rolls on Uncommon only\nRare: Rolls on Rares & Uncommon"] = true
+L["Roll based on level."] = true
+L["This will auto-roll if you are above the given level if: You cannot equip the item being rolled on, or the ilevel of your equipped item is higher than the item being rolled on or you have an heirloom equipped in that slot"] = true
+L["Level to start auto-rolling from"] = true
+L["Loot Announcer"] = true
 L["AUTOANNOUNCE_DESC"] = "When enabled, will automatically announce the loot when the loot window opens.\n\n|cffFF0000Note:|r Raid Lead, Assist, & Master Looter Only."
+L["Auto Announce"] = true
+L["Manual Override"] = true
+L["Sets the button for manual override."] = true
+L["No Override"] = true
+L["Automatic Override"] = true
+L["Sets the minimum loot threshold to announce."] = true
+L["Select chat channel to announce loot to."] = true
+L["Loot Roll History"] = true
 L["LOOTH_DESC"] = "These are options for tweaking the Loot Roll History window."
-L["LOOT_AUTO_DESC"] = "Automatically selects an apropriate roll on dropped loot."
+L["Auto hide"] = true
+L["Automaticaly hides Loot Roll Histroy frame when leaving the instance."] = true
+L["Sets the alpha of Loot Roll Histroy frame."] = true
+L["Channels"] = true
+L["Private channels"] = true
+L["Incoming"] = true
+L["Outgoing"] = true
+
+--Media
+L["SLE_MEDIA_ZONES"] = {
+	"Washington",
+	"Moscow",
+	"Moon Base",
+	"Goblin Spa Resort",
+	"Illuminaty Headquaters",
+	"Elv's Closet",
+	"BlizzCon",
+}
+L["SLE_MEDIA_PVP"] = {
+	"(Horde Territory)",
+	"(Alliance Territory)",
+	"(Contested Territory)",
+	"(Russian Territory)",
+	"(Aliens Territory)",
+	"(Cats Territory)",
+	"(Japanese Territory)",
+	"(EA Territory)",
+}
+L["SLE_MEDIA_SUBZONES"] = {
+	"Administration",
+	"Hellhole",
+	"Alley of Bullshit",
+	"Dr. Pepper Storage",
+	"Vodka Storage",
+	"Last National Bank",
+}
+L["SLE_MEDIA_PVPARENA"] = {
+	"(PvP)",
+	"No Smoking!",
+	"Only 5% Taxes",
+	"Free For All",
+	"Self destruction is in process",
+}
+L["SLE_MEDIA"] = "Options to change the look of several UI elements."
+L["Zone Text"] = true
+L["Subzone Text"] = true
+L["PvP Status Text"] = true
+L["Misc Texts"] = true
+L["Mail Text"] = true
+L["Chat Editbox Text"] = true
+L["Gossip and Quest Frames Text"] = true
+
+--Minimap
+L["Minimap Options"] = true
+L['MINIMAP_DESC'] = "These options effect various aspects of the minimap. Some options may not work if you disable minimap in the General section of ElvUI config."
+L["Hide minimap in combat."] = true
+L["Minimap Alpha"] = true
+L["Minimap Coordinates"] = true
+L["Enable/Disable Square Minimap Coords."] = true
+L["Coords Display"] = true
+L["Change settings for the display of the coordinates that are on the minimap."] = true
+L["Coords Location"] = true
+L["This will determine where the coords are shown on the minimap."] = true
+L["Bottom Corners"] = true
+L["Bottom Center"] = true
+L["Minimap Buttons"] = true
+L["Enable/Disable Square Minimap Buttons."] = true
+L["Bar Enable"] = true
+L["Enable/Disable Square Minimap Bar."] = true
+L["Skin Dungeon"] = true
+L["Skin dungeon icon."] = true
+L["Skin Mail"] = true
+L["Skin mail icon."] = true
+L["The size of the minimap buttons when not anchored to the minimap."] = true
+L["Icons Per Row"] = true
+L["Anchor mode for displaying the minimap buttons are skinned."] = true
+L["Show minimap buttons on mouseover."] = true
+L["Instance indication"] = true
+L["Show instance difficulty info as text."] = true
+L["Show texture"] = true
+L["Show instance difficulty info as default texture."] = true
+L["Sets the colors for difficulty abbreviation"] = true
+L["Location Panel"] = true
+L["Update Throttle"] = true
+L["The frequency of coordinates and zonetext updates. Check will be done more often with lower values."] = true
+L["Full Location"] = true
+L["Color Type"] = true
+L["Reaction"] = true
+L["Teleports"] = true
+L["Portals"] = true
+L["Link Position"] = true
+L["Allow pasting of your coordinates in chat editbox via holding shift and clicking on the location name."] = true
+L["Relocation Menu"] = true
+L["Right click on the location panel will bring up a menu with available options for relocating your character (e.g. Hearthstones, Portals, etc)."] = true
+L["Custom Width"] = true
+L["By default menu's width will be equal to the location panel width. Checking this option will allow you to set own width."] = true
+L["Justify Text"] = true
+
+
+--Miscs
+L["Error Frame"] = true
+L["Ghost Frame"] = true
+L["Raid Utility Mouse Over"] = true
+L["Set the width of Error Frame. Too narrow frame may cause messages to be split in several lines"] = true
+L["Set the height of Error Frame. Higher frame can show more lines at once."] = true
+L["Enabling mouse over will make ElvUI's raid utility show on mouse over instead of always showing."] = true
+L["Adjust the position of the threat bar to any of the datatext panels in ElvUI & S&L."] = true
+L["Enhanced Vehicle Bar"] = true
+L["A different look/feel vehicle bar"] = true
+
+--Nameplates
+L["Target Count"] = true
+L["Display the number of party / raid members targetting the nameplate unit."] = true
+L["Threat Text"] = true
+L["Display threat level as text on targeted, boss or mouseover nameplate."] = true

---Minimap--
-L['MINIMAP_DESC'] = "These options effect various aspects of the minimap.  Some options may not work if you disable minimap in the General section of ElvUI config."
+--Professions
+L['Scroll'] = true

---Tooltip--
+--PvP
+L["Functions dedicated to player versus player modes."] = true
+L["PvP Auto Release"] = true
+L["Automatically release body when killed inside a battleground."] = true
+L["Check for rebirth mechanics"] = true
+L["Do not release if reincarnation or soulstone is up."] = true
+L["SLE_DuelCancel_REGULAR"] = "Duel request from %s rejected."
+L["SLE_DuelCancel_PET"] = "Pet duel request from %s rejected."
+L["Automatically cancel PvP duel requests."] = true
+L["Automatically cancel pet battles duel requests."] = true
+L["Announce"] = true
+L["Announce in chat if duel was rejected."] = true
+L["Show your PvP killing blows as a popup."] = true
+L["KB Sound"] = true
+L["Play sound when Kkilling blows popup is shown."] = true
+
+--Quests
+L["Rested"] = true
+L["Auto Reward"] = true
+L["Automatically selects areward with higherst selling price when quest is completed. Does not really finish the quest."] = true
+
+--Raid Marks
+L["Raid Markers"] = true
+L["Click to clear the mark."] = true
+L["Click to mark the target."] = true
+L["%sClick to remove all worldmarkers."] = true
+L["%sClick to place a worldmarker."] = true
+L["Raid Marker Bar"] = true
+L["Options for panels providing fast access to raid markers and flares."] = true
+L["Show/Hide raid marks."] = true
+L["Reverse"] = true
+L["Modifier Key"] = true
+L["Set the modifier key for placing world markers."] = true
+L["Visibility State"] = true
+
+--Raidroles
+L["Options for customizing Blizzard Raid Manager \"O - > Raid\""] = true
+L["Show role icons"] = true
+L["Show level"] = true
+
+--Skins
+L["SLE_SKINS_DESC"] = [[This section is designed to enhance skins existing in ElvUI.
+
+Please note that some of these options will not be available if corresponding skin is disabled in
+main ElvUI skins section.]]
+L["Pet Battle Status"] = true
+L["Pet Battle AB"] = true
+L["Sets the texture for statusbars in quest tracker, e.g. bonus objectives/timers."] = true
+L["Statusbar Color"] = true
+L["Class Colored Statusbars"] = true
+L["Underline"] = true
+L["Creates a cosmetic line under objective headers."] = true
+L["Underline Color"] = true
+L["Class Colored Underline"] = true
+L["Underline Height"] = true
+L["Header Text Color"] = true
+L["Class Colored Header Text"] = true
+L["Subpages"] = true
+L["Subpages are blocks of 10 items. This option set how many of subpages will be shown on a single page."] = true
+L["SLE_SKINS_QUESTKING_DESC"] = [[Following options controls additional features for Quest King addon. Settings are character based.
+Due to the way of how that addon works it is mostly impossible to hook into its functions.
+Affected options are:
+- Tooltip positioning and scale
+- Clicks processing
+- Quest tagging
+- Award frame is now following Objective tracker opions of ElvUI
+- Quest names are following header settings from S&L's objective tracker skin
+- Quest King's position is now controlled by ElvUI's objectives mover
+- A lot of lines are now pulled from the client instead of being hardcoded
+- Tracked quest icon is larger]]
+L["Tooltip Anchor"] = true
+L["Tooltip Scale"] = true
+L["Quest Type Indications"] = true
+L["Clicks Registration"] = true
+L["SLE_SKINS_QUESTKING_TEMPLATE_DESC"] = [[|cff9482c9Quest King|r
+Original Quest King's controls:
+Left Click to open quest info
+Alt + Right Click to untrack
+Alt + Left Click to collapce quest
+Right Click to set quest watch
+
+|cff9482c9Blizzlike|r
+Controls of standart Blizzard quest log:
+Left Click to open quest info
+Shift + Left Click to untrack
+Right Click to set uest follow
+Ctrl + Left Click to collapce]]
+L["SLE_QUESTKING_Required"] = "  Required: "
+L["ElvUI Objective Tracker"] = true
+L["ElvUI Skins"] = true
+
+--Toolbars
+L["We are sorry, but you can't do this now. Try again after the end of this combat."] = true
+L["Right-click to drop the item."] = true
+L["Button Size"] = true
+L["Only active buttons"] = true
+--Farm
+L["Tilled Soil"] = true
+L["Farm Seed Bars"] = true
+L["Farm Tool Bar"] = true
+L["Farm Portal Bar"] = true
+L["Farm"] = true
+L["Only show the buttons for the seeds, portals, tools you have in your bags."] = true
+L["Auto Planting"] = true
+L["Automatically plant seeds to the nearest tilled soil if one is not already selected."] = true
+L["Quest Glow"] = true
+L["Show glowing border on seeds needed for any quest in your log."] = true
+L["Dock Buttons To"] = true
+L["Change the position from where seed bars will grow."] = true
+--Garrison
+L["Garrison Tools Bar"] = true
+L["Auto Work Orders"] = true
+L["Automatically queue maximum number of work orders available when visiting respected NPC."] = true
+L["Auto Work Orders for Warmill"] = true
+L["Automatically queue maximum number of work orders available for Warmill/Dwarven Bunker."] = true
+L["Auto Work Orders for Trading Post"] = true
+L["Automatically queue maximum number of work orders available for Trading Post."] = true
+L["Auto Work Orders for Shipyard"] = true
+L["Automatically queue maximum number of work orders available for Shipyard."] = true
+
+--Tooltip
+L["Faction Icon"] = true
+L["Show faction icon to the left of player's name on tooltip."] = true
 L["TTOFFSET_DESC"] = "This adds the ability to have the tooltip offset from the cursor.  Make sure to have the \"Cursor Anchor\" option enabled in ElvUI's Tooltip section to use this feature."
+L["Tooltip X-offset"] = true
+L["Offset the tooltip on the X-axis."] = true
+L["Tooltip Y-offset"] = true
+L["Offset the tooltip on the Y-axis."] = true
+L["RAID_HFC"] = "HFC"
+L["RAID_BRF"] = "BRF"
+L["RAID_HM"] = "HM"
+L["Raid Progression"] = true
+L["Show raid experience of character in tooltip (requires holding shift)."] = true

---UI buttons--
+--UI Buttons
+L["S&L UI Buttons"] = true
+L["Custom roll limits are set incorrectly! Minimum should be smaller then or equial to maximum."] = true
+L["ElvUI Config"] = true
+L["Click to toggle config window"] = true
+L["S&L Config"] = true
+L["Click to toggle Shadow & Light config group"] = true
+L["Reload UI"] = true
+L["Click to reload your interface"] = true
+L["Move UI"] = true
+L["Click to unlock moving ElvUI elements"] = true
+L["AddOns"] = true
+L["AddOns Manager"] = true
+L["Click to toggle the AddOn Manager frame."] = true
+L["Boss Mod"] = true
+L["Click to toggle the Configuration/Option Window from the Bossmod you have enabled."] = true
+L["Custom"] = true
 L["UB_DESC"] = "This adds a small bar with some useful buttons which acts as a small menu for common things."
+L["Minimum Roll Value"] = true
+L["The lower limit for custom roll button."] = true
+L["Maximum Roll Value"] = true
+L["The higher limit for custom roll button."] = true
+L["Quick Action"] = true
+L["Use quick access (on right click) for this button."] = true
+L["Function"] = true
+L["Function called by quick access."] = true
+
+--Unitframes
+L["Options for customizing unit frames. Please don't change these setting when ElvUI's testing frames for bosses and arena teams are shown. That will make them invisible until retoggling."] = true
+L["Player Frame Indicators"] = true
+L["Combat Icon"] = true
+L["LFG Icons"] = true
+L["Choose what icon set will unitframes and chat use."] = true
+L["Offline Indicator"] = true
+L["Shows an icon on party or raid unitframes for people that are offline."] = true
+L["Texture"] = true
+L["Statusbars"] = true
+L["Power Texture"] = true
+L["Castbar Texture"] = true
+L["Red Icon"] = true
+L["Aura Bars Texture"] = true
+L["Higher Overlay Portrait"] = true
+L["Makes frame portrait visible regardles of health level when overlay portrait is set."] = true
+L["Classbar Texture"] = true
+L["Resize Health Prediction"] = true
+L["Slightly chages size of health prediction bars."] = true
+
+
+--Viewport
+L["Viewport"] = true
+L["Left Offset"] = true
+L["Set the offset from the left border of the screen."] = true
+L["Right Offset"] = true
+L["Set the offset from the right border of the screen."] = true
+L["Top Offset"] = true
+L["Set the offset from the top border of the screen."] = true
+L["Bottom Offset"] = true
+L["Set the offset from the bottom border of the screen."] = true
+
+--Help
+L["SLE_DESC"] = [=[|cff9482c9Shadow & Light|r is an extention of ElvUI. It adds:
+- a lot of new features
+- more customization options for existing ones

---About/help--
+|cff3cbf27Note:|r It is compatible with most of addons and ElvUI plugins available. But some functions may be unaccesable to avoid possible conflicts.]=]
+L["Links"] = true
 L["LINK_DESC"] = [[Following links will direct you to the Shadow & Light's pages on various sites.]]

 --FAQ--
 L["FAQ_DESC"] = "This section contains some questions about ElvUI and Shadow & Light."
-L["FAQ_Elv_1"] = [[|cff30ee30В: Where can I cat ElvUI support?|r
-|cff9482c9О:|r Best way is official forum - tukui.org/forums/
+L["FAQ_Elv_1"] = [[|cff30ee30Q: Where can I cat ElvUI support?|r
+|cff9482c9A:|r Best way is official forum - tukui.org/forums/
 For bug reports you can also use bug tracker - git.tukui.org/Elv/elvui/issues]]
-L["FAQ_Elv_2"] = [[|cff30ee30В: Do I need to have good English in order to do so?|r
-|cff9482c9О:|r English is official language of tuoui.org forums so most posts in there are in English.
+L["FAQ_Elv_2"] = [[|cff30ee30Q: Do I need to have good English in order to do so?|r
+|cff9482c9A:|r English is official language of tukui.org forums so most posts in there are in English.
 But this doesn't mean it's the only language used there. You will be able to find posts in Spanish, French, German, Russian, Italian, etc.
 While you follow some simple rules of common sense everyone will be ok with you posting in your native language. Like stating said language in the topic's title.
 Keep in mind that you can still get an answer in English cause the person answering can be unable to speak your language.]]
-L["FAQ_Elv_3"] = [[|cff30ee30В: What info do I need to provide in a bug report?|r
-|cff9482c9О:|r First you need to ensure the error really comes from ElvUI.
+L["FAQ_Elv_3"] = [[|cff30ee30Q: What info do I need to provide in a bug report?|r
+|cff9482c9A:|r First you need to ensure the error really comes from ElvUI.
 To do so you need to disable all other addons except of ElvUI and ElvUI_Config.
 If error didn't disappear then you need to send us a bug report.
-In it you'll need to provide ElvUI version ("latest" is nt a valid version number), the text of the error, screenshot if needed.
+In it you'll need to provide ElvUI version ("latest" is not a valid version number), the text of the error, screenshot if needed.
 The more info you'll give us on how to reproduce said error the faster it will be fixed.]]
-L["FAQ_Elv_4"] = [[|cff30ee30В: Why some options are not applied on other characters while using the same profile?|r
-|cff9482c9О:|r ElvUI has three kinds of options. First (profile) is stored in your profile, second (private) is stored on a character basis, third (global) are applied across all character regardless of profile used.
+L["FAQ_Elv_4"] = [[|cff30ee30Q: Why some options are not applied on other characters while using the same profile?|r
+|cff9482c9A:|r ElvUI has three kinds of options. First (profile) is stored in your profile, second (private) is stored on a character basis, third (global) are applied across all character regardless of profile used.
 In this case you most likely came across the option of type two.]]
+L["FAQ_Elv_5"] = [[|cff30ee30Q: What are ElvUI slash (chat) commands?|r
+|cff9482c9A:|r ElvUI has a lot of different chat commands used for different purposes. They are:
+/ec or /elvui - Opening config window
+/bgstats - Shows battleground specific datatexts if you are on battleground and closed those
+/hellokitty - Want a pink kawaii UI? We got you covered!
+/harlemshake - Need a shake? Just do it!
+/luaerror - loads you UI in testing mode that is designed for making a proper bug report (see Q #3)
+/egrid - Sets the size of a grid in toggle anchors mode
+/moveui - Allows to move stuff around
+/resetui - Resets your entire UI]]
 L["FAQ_sle_1"] = [[|cff30ee30Q: What to do if I encounter an error is Shadow & Light?|r
 |cff9482c9A:|r Pretty much the same as for ElvUI (see it's faq section ) but you'll have to provide S&L version too.]]
-L["FAQ_sle_2"] = [[|cff30ee30В: Does Shadow & Light have the same language policy as ElvUI?|r
-|cff9482c9О:|r Yes. But S&L actually have two official languages - English and Russian.]]
+L["FAQ_sle_2"] = [[|cff30ee30Q: Does Shadow & Light have the same language policy as ElvUI?|r
+|cff9482c9A:|r Yes. But S&L actually have two official languages - English and Russian.]]
 L["FAQ_sle_3"] = [[|cff30ee30Q: Why are layouts' screenshots on download page are different from what I see in game?|r
 |cff9482c9A:|r Because we just forgot to update those.]]
 L["FAQ_sle_4"] = [[|cff30ee30Q: Why I see some weird icons near some peoples' names in chat?|r
@@ -152,7 +787,7 @@ Tukz
 Affinitii
 Arstraea
 Azilroka
-Benik
+Benik, The Slacker
 Blazeflack
 Boradan
 Camealion
@@ -163,7 +798,7 @@ Sinaris
 Sortokk
 Swordyy
 ]=]
-L["ELVUI_SLE_MISC"] = [=[BuG - for being french lol
+L["ELVUI_SLE_MISC"] = [=[BuG - for always hilariously breaking stuff
 TheSamaKutra
 The rest of TukUI community
 ]=]
diff --git a/ElvUI_SLE/locales/russian.lua b/ElvUI_SLE/locales/russian.lua
index 4a681fa..62f395b 100644
--- a/ElvUI_SLE/locales/russian.lua
+++ b/ElvUI_SLE/locales/russian.lua
@@ -1,280 +1,332 @@
---Russian localization
-local AceLocale = LibStub:GetLibrary("AceLocale-3.0")
-local L = AceLocale:NewLocale("ElvUI", "ruRU")
+-- English localization file for ruRU.
+local AceLocale = LibStub:GetLibrary("AceLocale-3.0");
+local L = AceLocale:NewLocale("ElvUI", "ruRU");

 if not L then return; end
-
---Tutorial--
-L["To enable full values of health/power on unitframes in Shadow & Light add \":sl\" to the end of the health/power tag.\nExample: [health:current:sl]."] = "Чтобы включить отображение полного значения здоровья/ресурса при использовании Shadow & Light, нужно добавить \":sl\" в конец нужного тэга.\nПример: [health:current:sl]."
-
---Movers--
-L["S&L: All"] = "S&L: Все"
-L["S&L: Datatexts"] = "S&L: Инфо-тексты"
-L["S&L: Backgrounds"] = "S&L: Фоновые фреймы"
-L["S&L: Misc"] = "S&L: Прочее"
-L["Pet Battle Status"] = "Статус битвы питомцев"
-L["Pet Battle AB"] = "Панель битв питомцев"
-L["Ghost Frame"] = "Фрейм призрака"
-L['Raid Marker Bar'] = "Полоса меток"
-
---Import--
-L["Import Options"] = "Импорт Настроек"
-L["Author Specific Imports"] = "Импорт специфических настроек авторов"
-L['Select Author'] = "Выберите автора"
-L["Please be aware that importing any of the filters will require a reload of the UI for the settings to take effect.\nOnce you click a filter button, your screen will reload automatically."] = "Пожалуйста, учтите, что импортирование любого фильтра потребует перезагрузки интерфейса для вступления в силу.\nКак только вы нажмете на кнопку, Ваш интерфейс перезагрузится автоматически."
-L["Import"] = "Импорт"
-L["This will import non class specific filters from this author."] = "Это импортирует не привязанные к классу фильтры этого автора."
-L["This will import All Class specific filters from this author."] = "Это импортирует все классовые фильтры этого автора."
-L['Import All'] = "Импорт всего"
-
---General--
-L["SLE_LOGIN_MSG"] = [=[Вы используете редакцию ElvUI под названием |cff1784d1"Shadow & Light"|r версия |cff1784d1%s%s|r.
-Если вы хотите использовать оригинальный ElvUI, просто отключите плагин этой редакции в вашем менеджере аддонов.
-Приятной игры.]=]
-L["SLE_DESC"] = [=[Это редакция ElvUI добавляет некоторые новые функции к оригинальному аддону и изменяет функционал некоторых старых опций.
-Эта редакция ни в коем виде не изменяет оригинальные файлы, так что вы можете спокойно отключить ее в вашем менеджере аддонов по желанию.]=]
-L["Plugin for |cff1784d1ElvUI|r by\nDarth Predator and Repooc."] = "Плагин для |cff1784d1ElvUI|r  от\nDarth Predator'а и Repooc'а"
-L['MSG_OUTDATED'] = "Ваша версия ElvUI старее, чем рекомендованная для использования с Shadow & Light. У Вас версия |cff1784d1%.2f|r (рекомендованная |cff1784d1%.2f|r). Пожалуйста, обновите ElvUI."
-L["Reset these options to defaults"] = "Восстановить умолчания для этих опций"
-L["Reset All"] = "Сбросить все"
-L["Resets all movers & options for S&L."] = "Сбросить все фиксаторы и опции S&L"
-L['Oh lord, you have got ElvUI Enhanced and Shadow & Light both enabled at the same time. Select an addon to disable.'] = "Ешкин конь, одновременно включены ElvUI Enhanced и Shadow & Light. Выберите что отключить."
+--Popups
+L["MSG_SLE_ELV_OUTDATED"] = "Ваша версия ElvUI старее, чем рекомендованная для использования с |cff9482c9Shadow & Light|r. У Вас версия |cff1784d1%.2f|r (рекомендованная |cff1784d1%.2f|r). Пожалуйста, обновите ElvUI."
+L["This will clear your chat history and reload your UI.\nContinue?"] = "Это отчистит вашу историю чата и перезагрузит интерфейс.\nПродолжить?"
+L["This will clear your editbox history and reload your UI.\nContinue?"] = "Это отчистит вашу историю введенных сообщений и перезагрузит интерфейс.\nПродолжить?"
+L["Oh lord, you have got ElvUI Enhanced and Shadow & Light both enabled at the same time. Select an addon to disable."] = "Ешкин конь, одновременно включены ElvUI Enhanced и Shadow & Light. Выберите что отключить."
 L['You have got Loot Confirm and Shadow & Light both enabled at the same time. Select an addon to disable.'] = "Одновременно активны Loot Confirm и Shadow & Light. Выберите что из них отключить."
-L["Enabling mouse over will make ElvUI's raid utility show on mouse over instead of always showing."] = "Отображать кнопку управления рейдом только при наведении мыши."
-L['Adjust the position of the threat bar to any of the datatext panels in ElvUI & S&L.'] = "Позволяет поместить полосу угрозы на любой панели инфо-текстов."
-L["This option have been moved by Shadow & Light. Click to access it's new place."] = "Shadow & Light переместил эту опцию. Кликните для перехода к ее новому расположению."
-L["This option have been disabled by Shadow & Light. To return it you need to disable S&L's option. Click here to see it's location."] = "Shadow & Light отключил эту опцию. Для доступа к ней нужно отключить соответствующую опцию S&L. Кликните для перехода к ее расположению."
-L["This will clear your chat history and reload your UI.\nContinue?"] = "История чата будет очищена, а интерфейс перезагружен.\nПродолжить?"
-L["This will clear your editbox history and reload your UI.\nContinue?"] = "История введенных сообщений будет очищена, а интерфейс перезагружен.\nПродолжить?"
-
---Chat--
-L["Reset Chat History"] = "Сбросить историю чата"
-L["Clears your chat history and will reload your UI."] = "Очищает историю сохраненных сообщений в чате и перезагружет интерфейс."
-L["Reset Editbox History"] = "Сбросить введенное"
-L["Clears the editbox history and will reload your UI."] = "Очищает историю введенных сообщений и перезагружает интерфейс."
-L["Chat Editbox History"] = "История ввода"
-L["The amount of messages to save in the editbox history.\n\n|cffFF0000Note:|r To disable, set to 0."] = "Количество сообщений, введенных вами, которое будет сохранено между сеансами.\n\n|cffFF0000Напоминание:|r Для отключения, установите на 0."
-L["Guild Master Icon"] = "Иконка Главы гильдии"
-L["Displays an icon near your Guild Master in chat.\n\n|cffFF0000Note:|r Some messages in chat history may disappear on login."] = "Отображает иконку рядом с сообщениями главы вашей гильдии в чате.\n\n|cffFF0000Предупреждение:|r Некоторые сообщения в истории чата в истории чата могут исчезать при входе в игру."
-L["Filter DPS meters' Spam"] = "Фильтровать отчеты о УВС"
-L["Replaces long reports from damage meters with a clickeble hyperlink to reduce chat spam.\nWorks correctly only with general reports such as DPS or HPS. May fail to filter te report of other things"] = "Заменяет длиные отчеты от аддонов для измерения УВС на гиперссылку, сокращая уровень спама в чате.\nКорректно работает с отчетами урона и исцеления. Может не отфильтровать другие специфические отчеты."
-L["Reported by %s"] = "Отчет от %s"
-L["Texture Alpha"] = "Прозрачность текстур"
-L["Allows separate alpha setting for textures in chat"] = "Включает отдельную настройку прозрачности для текстур в чате"
+L["You have got OneClickEnchantScroll and Shadow & Light both enabled at the same time. Select an addon to disable."] = "Одновременно активны OneClickEnchantScroll и Shadow & Light. Выберите что из них отключить."
+L["You have got ElvUI Transparent Actionbar Backdrops and Shadow & Light both enabled at the same time. Select an addon to disable."] = "Одновременно активны ElvUI Transparent Actionbar Backdrops и Shadow & Light. Выберите что из них отключить."
+L["SLE_ADVANCED_POPUP_TEXT"] = [[Клянетесь ли вы, что являетесь опытным пользователем,
+умеете читать подсказки и не будете разводить панику, если
+жестоким образом обезобразите интерфейс ипри помощи дополнительных опций?

---Raid utility--
-L['Raid Utility'] = "Управление рейдом"
-
---Media--
-L["SLE_MEDIA"] = "Опции для изменения внешнего вида некоторых элементов интерфейса."
-L["Zone Text"] = "Текст локации"
-L["Test"] = "Тест"
-L["Subzone Text"] = "Название сублокации"
-L["PvP Status Text"] = "PvP статус"
-L["Misc Texts"] = "Прочие тексты"
-L["Mail Text"] = "Текст письма"
-L["Chat Editbox Text"] = "Текст поля ввода"
-L["Gossip and Quest Frames Text"] = "Текст окон заданий и диалогов"
-L["Screensaver"] = "Заставка"
-L["Title font"] = "Заголовок"
-L["Subitle font"] = "Подзаголовок"
-L["Date font"] = "Дата"
-L["Player info font"] = "Информация игрока"
-L["Tips font"] = "Советы"
-L["Graphics"] = "Графика"
-L["Crest Size"] = "Размер гербов"
-L["X-Pack Logo Size"] = "Логотип дополнения"
-L["Model Animation"] = "Анимация модели"
-L["Model Position"] = "Позиция модели"
-L["SLE_TIPS"] = {
-	"Не стой в огне!",
-	"Спать вредно! Пока ты спишь, враг качается!",
-	"Сделал дейлик - спас китайца!",
-	"Elv: I just utilized my degree in afro engineering and fixed it",
-	"Варлоки пришли к нам из сказочного мира, где их любят и уважают. Поэтому они ненавидят наш мир лютой ненавистью.",
-	[[|TInterface\AddOns\ElvUI_SLE\media\textures\WH:24:24|t Сожги еретика. Убей мутанта. Преследуй нечисть.]],
-	"Кровь для Бога Крови!",
-	"Кофе для Бога Кофе!",
-	"Друид живет в единении с природой... Поэтому он не курит всякий фуфел, как другие таурены!",
-	"На форумах tukui.org поддержка по ElvUI оказывается в том числе и на русском языке.",
-	"Любимый комментарий Дарта к изменениям в коде - \"Ууууупс\"",
-	"Нужно... Больше... Некодевочек... Стоп. Что?!",
-}
-L['You Are Away From Keyboard'] = "Вы отошли от компьютера"
-L["Take care of yourself, Master!"] = "Не задерживайтесь, Хозяин!"
+Если да, то вам дадут включить эту опцию.]]

 --Install--
-L["|cff1784d1Shadow & Light|r Installation"] = "Установка |cff1784d1Shadow & Light|r"
-L["Welcome to |cff1784d1Shadow & Light|r version %s!"] = "Добро пожаловать в |cff1784d1Shadow & Light|r версии %s!"
-L["This will take you through a quick install process to setup some Shadow & Light features.\nIf you choose to not setup any options through this config, click Skip Process button to finish the installation."] = "Этот установщик позволит ван выбрать поведение некоторых функций Shadow & Light.\nЕсли вы не хотите настраивать эти опции, то нажмите кнопку \"Пропустить установку\" для ее завершения немедленно."
-L["This will determine if you want to use ElvUI's default layout for chat datatext panels or let Shadow & Light handle them."] = "Здесь вы можете указать использовать ли стандартное положение информационных панелей чата ElvUI или позволить Shadow & Light его изменить."
-L["If you select S&L Panels, the datatext panels will be attached below the left and right chat frames instead of being inside the chat frame."] = "Если вы выберете стиль S&L, то информационные панели будут прикреплены к нижней границе панелей чата вместо нахождения внутри них."
-L["SLE_ARMORY_INSTALL"] = "Включить режим оружейной S&L\n(Детализированные окна персонажа и осмотра)\n|cffFF0000Предепреждаем:|r Эта опция на данный момент находится в состоянии беты."
+L["Moving Frames"] = "Перемещение фреймов"
+L["Author Presets"] = "Пресеты авторов"
+L["|cff9482c9Shadow & Light|r Installation"] = "Установка |cff9482c9Shadow & Light|r"
+L["Welcome to |cff9482c9Shadow & Light|r version %s!"] = "Добро пожаловать в |cff9482c9Shadow & Light|r версии %s!"
+L["SLE_INSTALL_WELCOME"] = [[Этот установщик позволит ван выбрать поведение некоторых функций Shadow & Light.
+Если вы не хотите настраивать эти опции, то нажмите кнопку \"Пропустить установку\" для ее завершения немедленно.
+
+Заметьте, что шаги отмеченные * являются опциональными и не будут отображены без соблюдения определенных условий в предыдущих шагах.]]
 L["This will enable S&L Armory mode components that will show more detailed information at a quick glance on the toons you inspect or your own character."] = "Активирует компоненты оружейной Shadow & Light, которые покажут вам более детальную информацию о вашем персонаже или игроке, которого вы осматриваете."
-L["Shadow & Light Layouts"] = "Шаблоны Shadow & Light"
+L["SLE_ARMORY_INSTALL"] = "Включить режим оружейной S&L\n(Детализированные окна персонажа и осмотра)."
+L["Shadow & Light Imports"] = "Импорт Shadow & Light"
 L["You can now choose if you want to use one of the authors' set of options. This will change the positioning of some elements as well of other various options."] = "Вы можете использовать набор настроек, используемый одним из представленных людей. Будут изменены положения элементов и другие настройки."
-L["SLE_Install_Text2"] = [=[Этот шаг опционален и должен использоваться только в случае, если Вы хотите использовать одну из наших конфигураций. В зависимости от роли, выбранной в ElvUI (шаг "Расположение"), результат может отличаться.
+L["SLE_Install_Text_AUTHOR"] = [=[Этот шаг опционален и должен использоваться только в  случае, если вы собираетесь использовать одну из наших конфигурацй. В зависимости от выбланного расположения в установке ElvUI результат может отличться.
+Если вы не выберете ни один из вариантов, то следующий шаг установки будет автоматически пропущен.

 Была выбрана роль |cff1784d1"%s"|r.

-|cffFF0000Внимание:|r Пожалуйста помните, что авторы могут не использовать тему/роль, которую вы выбрали, и потому результат не всегда будет хорошим. Также переключение между шаблонами здесь может привести к неоднозначным результатам.
-]=]
+|cffFF0000Внимание:|r Пожалуйста помните, что авторы могут не использовать тему/роль, которую вы выбрали, и потому результат не всегда будет хорошим. Также переключение между шаблонами здесь может привести к неоднозначным результатам.]=]
 L["Darth's Config"] = "Опции Дарта"
-L["Darth's Default Set"] = "Установлены настройки Дарта"
-L["Repooc's Config"] = "Опции Repooc'а"
-L["Repooc's Default Set"] = "Установлены настройки Repooc'а"
-L["Affinitii's Config"] = "Опции  Affinitii"
-L["Affinitii's Default Set"] = "Установлены настройки Affinitii"
-
---Auras--
-L["Hide Buff Timer"] = "Спрятать таймеры баффов"
-L["This hides the time remaining for your buffs."] = "Скрывает текст оставшегося времени действия около баффов"
-L["Hide Debuff Timer"] = "Спрятать таймеры дебаффов"
-L["This hides the time remaining for your debuffs."] = "Скрывает текст оставшегося времени действия около дебаффов"
-L["Mark Your Consolidated Buffs"] = "Отмечать ваши объединенные эффекты"
-L["Create a mark bar on a consolidated buffs bar's icons for buffs your class can provide."] = "Создавать метку в полосе объединенных эффектов на иконках, бафф которых может предоставить ваш класс."
-L["You are in combat, Consolidated Buffs Bars will be updated upon leaving it"] = "Вы в бою. Полоса объединенных эффектов будет обновлена по его окончанию."
-
---Autoreleas--
-L["PvP Auto Release"] = "Автоматический выход из тела"
-L["Automatically release body when killed inside a battleground."] = "Автоматически выходить из тела на полях боя."
+L["Repooc's Config"] = "Опции Repooc'а"
+L["Darth's Default Set"] = "Установлены настройки Дарта"
+L["Repooc's Default Set"] = "Установлены настройки Repooc'а"
+L["Layout & Settings Import"] = "Импорт расположений и настроек"
+L["You have selected to use %s."] = "Вы выбрали %s"
+L["SLE_INSTALL_LAYOUT_TEXT2"] = [[Данные опции импортируют расположения/настройки аддонов для выбранных опций и роли.
+Учтите, что эти пресеты могут включать незнакомые вам настройки.
+
+Также это пожет сбросить/изменить некоторые из опций, выбранных вами на предыдущих шагах.]]
+L["|cff1784d1%s|r role was chosen"] = 'Была выбрана роль |cff1784d1"%s"|r.'
+L["Import Profile"] = "Импорт профиля"
+L["AFK Mode"] = "Режим АФК"
+L["You have selected to use %s and role %s."] = "Вы выбрали %s для роли %s."
+
+--Config replacements
+L["This option have been disabled by Shadow & Light. To return it you need to disable S&L's option. Click here to see it's location."] = "Shadow & Light отключил эту опцию. Для ее возвращения нужно отключить соответственную опцию в S&L. Нажмите для перехода к ней."
+
+--Core
+L["SLE_LOGIN_MSG"] = "|cff9482c9Shadow & Light|r версии |cff1784d1%s%s|r для ElvUI загружен. Спасибо за использование."
+L["Plugin for |cff1784d1ElvUI|r by\nDarth Predator and Repooc."] = "Плагин для |cff1784d1ElvUI|r  от\nDarth Predator'а и Repooc'а"
+L["Resets all movers & options for S&L."] = "Сбросить все фиксаторы и опции S&L"
+L["Reset these options to defaults"] = "Восстановить умолчания для этих опций"
+L["Modules designed for older expantions"] = "Модули для предыдущих дополнений"
+L["Game Menu Buttons"] = "Кнопки главного меню"
+L["Adds |cff9482c9Shadow & Light|r buttons to main game menu."] = "Добавляет кнопки |cff9482c9Shadow & Light|r в главное меню."
+L["SLE_Advanced_Desc"] = [[Следующие опции дают доступ к дополнительным настройкам.
+Не рекомендуется для использванием новичкам или людям без опыта настройки аддонов.]]
+L["Allow Advanced Options"] = "Разрешить продвинутые настройки"
+L["Change Elv's options limits"] = "Измениь пределы опций ElvUI"
+L["Allow |cff9482c9Shadow & Light|r to change some of ElvUI's options limits."] = "Позволяет |cff9482c9Shadow & Light|r изменить пределы некоторых опций ElvUI."
+L["Cyrillics Support"] = "Поддержка кириллицы"
+L["SLE_CYR_DESC"] = [[Если вы иногда (или на постоянной основе) используете кириллицу при написании сообщений
+и постоянно забываете переключить язык для ввода слэш команд, тогда эти опции для вас.
+Они позволяют использовать команды ElvUI на неверной раскладке.
+]]
+L["Commands"] = "Команды"
+L["SLE_CYR_COM_DESC"] = [[Позволяет использование следующих команд на русской раскладке:
+- /rl
+- /in
+- /ec
+- /elvui
+- /bgstats
+- /hellokitty
+- /hellokittyfix
+- /harlemshake
+- /egrid
+- /moveui
+- /resetui
+- /kb]]
+L["Dev Commands"] = "Тех. команды"
+L["SLE_CYR_DEVCOM_DESC"] = [[Позволяет использование следующих команд на русской раскладке:
+- /luaerror
+- /frame
+- /framelist
+- /texlist
+- /cpuimpact
+- /cpuusage
+- /enableblizzard
+
+Они обычно используются с целью тестирования или разработки и крайне редко применяются среднестатистическим игроком.]]
+
+--Config groups
+L["S&L: All"] = "S&L: Все"
+L["S&L: Datatexts"] = "S&L: Инфо-тексты"
+L["S&L: Backgrounds"] = "S&L: Фоновые фреймы"
+L["S&L: Misc"] = "S&L: Прочее"

---Backgroungds--
-L["Backgrounds"] = "Фоновые фреймы"
-L["Additional Background Panels"] = "Дополнительные фоновые фреймы"
-L["BG_DESC"] = "Модуль для создания дополнительных фреймов, которые могут использоваться в качестве фонов для чего-нибудь."
-L["Show/Hide this frame."] = "Показать/скрыть этот фрейм."
-L["Bottom BG"] = "Нижний фон"
-L["Left BG"] = "Левый фон"
-L["Right BG"] = "Правый фон"
-L["Actionbar BG"] = "Верхний фон"
-L["Sets width of the frame"] = "Устанавливает ширину фрейма"
-L["Sets height of the frame"] = "Устанавливает высоту фрейма"
-L["Sets X offset of the frame"] = "Устанавливает смещение по оси X"
-L["Sets Y offset of the frame"] = "Устанавливает смещение по оси Y"
-L["Texture"] = "Текстура"
-L["Set the texture to use in this frame.  Requirements are the same as the chat textures."] = "Устанавливает текстуру этого фрейма. Требования к текстуре такие же, как для текстур чата."
+--Actionbars
+L["OOR as Bind Text"] = "Вне радиуса на назначнии"
+L["Out Of Range indication will use keybind text instead of the whole icon."] = "Индикация о слишком далекой цели будет окрашивать текст назначенной клавиши вместо всей иконки."
+L["Checked Texture"] = "Текстура выделения"
+L["Highlight the button of the spell with areal effect untill the area is selected."] = "Пдсвечивает кнопку с эффектом по области пока не будет выбрана точка применения."
+L["Checked Texture Color"] = "Цвет выделения"
+L["Transparent Backdrop"] = "Прозрачный фон"
+L["Sets actiobars' backgrounds to transparent template."] = "Делает фон панелей команд прозрачным."
+L["Transparent Buttons"] = "Прозрачные кнопки"
+L["Sets actiobars buttons' backgrounds to transparent template."] = "Делает кнопки панелей команд прозрачными"
+
+--Armory
+L["Average"] = "Средний"
+L["Not Enchanted"] = "Не зачаровано"
+L["Empty Socket"] = "Пустой слот"
+L["KF"] = true
+L["You can't inspect while dead."] = "Вы не можете осматривать будучи трупом."
+L["Specialization data seems to be crashed. Please inspect again."] = "Данные по специализации кажется исчезли. Пожалуйста, повторно осмотрите цель."
+L["No Specialization"] = "Нет специализации"
+L["Character model may differ because it was constructed by the inspect data."] = "Модель персонажа может отличаться, так как была составлена на основе данных осмотра."
+L["Armory Mode"] = "Оружейная"
+L["Enchant String"] = "Текст чар"
+L["String Replacement"] = "Замена текста"
+L["List of Strings"] = "Список строк"
+L["Original String"] = "Оригинал"
+L["New String"] = "Новый текст"
+L["Character Armory"] = "Персонаж"
+L["Show Missing Enchants or Gems"] = "Показывать отсутствие чар и камней"
+L["Show Warning Icon"] = "Показывать иконку предупреждения"
+L["Select Image"] = "Выберите изображение"
+L["Custom Image Path"] = "Путь к своему изображению"
+L["Gradient"] = "Градиент"
+L["Gradient Texture Color"] = "Цвет градиента"
+L["Upgrade Level"] = "Уровень улучшения"
+L["Warning Size"] = "Размер предупреждения"
+L["Warning Only As Icons"] = "Предупреждение только иконкой"
+L["Only Damaged"] = "Только поврежденные"
+L["Gem Sockets"] = "Слоты камней"
+L["Socket Size"] = "Размер слотов"
+L["Inspect Armory"] = "Осмотр"
+
+--AFK
+L["You Are Away From Keyboard for"] = "Вы отошли на"
+L["Take care of yourself, Master!"] = "Возвращайтесь, хозяин!"
+L["SLE_TIPS"] = { --This doesn't need to be translated, every locale can has own tips
+	"Не стой в огне!",
+	"Elv: I just utilized my degree in afro engineering and fixed it",
+	"Сожги еретика. Убей мутанта. Преследуй нечисть.",
+	"Кровь Богу Крови!",
+	"Больше Кофе Богу Кофе!",
+	"Любимый комментарий Дарта к обновлениям кода - \"Woops\"",
+	"Сделал дейлик - спас китайца.",
+	"Со для слабых! Пока ты спишь, враг качается!",
+}
+L["Enable S&L's additional features for AFK screen."] = "Активировать дополнительные опции для режима АФК."
+L["Button restrictions"] = "Ограничения клавиш"
+L["Use ElvUI's restrictions for button presses."] = "Использовать ограничения Elv'а на нажатия клавиш."
+L["Crest Size"] = "Размер герба"
+L["X-Pack Logo Size"] = "Размел иконки дополнения"
+L["Template"] = "Шаблон"
+L["Player Model"] = "Модель игрока"
+L["Model Animation"] = "Анмиация модели"
+L["Test"] = "Проверка"
+L["Shows a test model with selected animation for 10 seconds. Clicking again will reset timer."] = "Показать тестовую модель с выбраной анимацией на 10 секунд. Повторное нажатие сбросит таймер."
+L["Misc"] = "Прочее"
+L["Bouncing"] = "Отскок"
+L["Use bounce on fade in animations."] = "При появлении элементы будут отскакивать от краев экрана."
+L["Animation time"] = "Время анимации"
+L["Time the fade in animation will take. To disable animation set to 0."] = "Время, которое займет анимация появления. Для отключения установите на 0."
+L["Slide"] = "Скольжение"
+L["Slide Sideways"] = "Скольжение вбок"
+L["Fade"] = "Появление"
+L["Tip time"] = "Длительность подсказки"
+L["Number of seconds tip will be shown before changed to another."] = "Кол-во секунд, которое будет показана каждая подсказка."
+
+--Auras
+L["Hide Buff Timer"] = "Скрыть время баффов"
+L["This hides the time remaining for your buffs."] = "Скрывает оставшееся время действия баффов на вас."
+L["Hide Debuff Timer"] = "Скрыть время дебаффов"
+L["This hides the time remaining for your debuffs."] = "Скрывает оставшееся время действия дебаффов на вас."
+
+--Backgrounds
+L["SLE_BG_1"] = "Фон 1"
+L["SLE_BG_2"] = "Фон 2"
+L["SLE_BG_3"] = "Фон 3"
+L["SLE_BG_4"] = "Фон 4"
+L["Additional Background Panels"] = "Дополнительные фоновые панели"
+L["BG_DESC"] = "Модуль для создания дополнительных фреймов, которые можно использовать в качестве фона для чего-нибудь."
+L["Show/Hide this frame."] = "Показать/скрыть фрейм."
+L["Sets width of the frame"] = "Установить ширину фрейма"
+L["Sets height of the frame"] = "Установить высоту фрейма"
+L["Set the texture to use in this frame. Requirements are the same as the chat textures."] = "Устанавливает текстуру этого фрейма. Требования к текстуре такие же, как для текстур чата."
 L["Backdrop Template"] = "Тип фона"
 L["Change the template used for this backdrop."] = "Измените шаблон, используемый при создании этого фона"
-L["Default"] = "Обычный"
 L["Hide in Pet Batlle"] = "Прятать в битвах питомцев"
 L["Show/Hide this frame during Pet Battles."] = "Показать/скрыть этот фрейм в битвах питомцев"

---Character Frame Options--
-L["Armory Mode"] = "Оружейная"
-L['Enchant String'] = "Текст чар"
-L['String Replacement'] = "Замена текста"
-L['Original String'] = "Оригинальный текст"
-L['New String'] = "Новый текст"
-L['List of Strings'] = "Список замен"
-L['Create Replacement'] = "Создать замену"
-L['Character Armory'] = "Персонаж"
-L['Inspect Armory'] = "Осмотр"
-L['Show Missing Enchants or Gems'] = "Показывать отсутствие чар и камней"
-L['Show Warning Icon'] = "Показывать иконку предупреждения"
-L['Select Image'] = "Выберите картинку"
-L["Custom"] = "Своя"
-L['Custom Image Path'] = "Путь к своей картинке"
-L['Gradient Texture Color'] = "Цвет градиентной текстуры"
-L['Upgrade Level'] = "Уровень улучшения"
-L["Only Damaged"] = "На поврежденных"
-L["Warning Size"] = "Размер предупреждений"
-L['Warning Only As Icons'] = "Только иконки предупреждений"
-L["Gem Sockets"] = "Слоты для камней"
-L["Socket Size"] = "Размер слотов"
-
---Character Frame--
-L["Not Enchanted"] = "Нет чар"
-L['This is not profession only.'] = "Не усиление от профессии"
-L['Empty Socket'] = "Пустое гнездо"
-L['Average'] = "Средний ур. предметов" --Not sure if still used. Saw it in code, never saw in game
-
---Marks--
-L['Options for panels providing fast access to raid markers and flares.'] = "Опции панелей, предоставляющих быстрый доступ к рейдовым меткам и маркерам на земле."
-L["Raid Markers"] = "Рейдовые Метки"
-L["Show/Hide raid marks."] = "Показать/скрыть фрейм рейдовых меток."
-L["Change the direction of buttons growth from the skull marker"] = "Изменяет направление роста кнопок от метки \"череп\"."
-L["Reverse"] = "Обратный порядок"
-L['Modifier Key'] = "Модификатор"
-L['Set the modifier key for placing world markers.'] = "Модификатор для установки меток на земле."
-
---Bags--
+--Bags
 L["New Item Flash"] = "Мерцание новых предметов"
 L["Use the Shadow & Light New Item Flash instead of the default ElvUI flash"] = "Использовать полное мерцание Shadow & Light вместо обычного из ElvUI."
+L["Transparent Slots"] = "Прозрачные слоты"
+L["Apply transparent template on bag and bank slots."] = "Использовать прозрачный фон для слотов в сумках и банке."

+--Blizzard
+L["Move Blizzard frames"] = "Перемещение фреймов Blizzard"
+L["Allow some Blizzard frames to be moved around."] = "Разрешить перемещение некоторых фреймов Blizzard."
+L["Pet Battles skinning"] = "Скин битв питомцев"
+L["Make some elements of pet battles movable via toggle anchors."] = "Дает возможность перемещать некоторые элементы боев питомцев при пмощи фиксаторов."
+L["Vehicle Seat Scale"] = "Масштаб фрейма транспорта."

---Datatexts--
-L["Panels & Dashboard"] = "Панели и Информация"
-L["LFR Lockout"] = "Состояние ЛФР"
-L["Loot History"] = "История добычи"
-L["Raid Saves"] = "Сохранения рейдов"
-L["Show/Hide LFR lockout info in time datatext's tooltip."] = "Отображать/скрывать информацию о сохранении ЛФР"
-L["Bosses killed: "] = "Боссов убито: "
+--Chat
+L["Reported by %s"] = "Отчет от %s"
+L["Reset Chat History"] = "Сбросить историю чата"
+L["Clears your chat history and will reload your UI."] = "Очищает историю сохраненных сообщений в чате и перезагружет интерфейс."
+L["Reset Editbox History"] = "Сбросить введенное"
+L["Clears the editbox history and will reload your UI."] = "Очищает историю введенных сообщений и перезагружает интерфейс."
+L["Guild Master Icon"] = "Иконка Главы гильдии"
+L["Displays an icon near your Guild Master in chat.\n\n|cffFF0000Note:|r Some messages in chat history may disappear on login."] = "Отображает иконку рядом с сообщениями главы вашей гильдии в чате.\n\n|cffFF0000Предупреждение:|r Некоторые сообщения в истории чата в истории чата могут исчезать при входе в игру."
+L["Chat Editbox History"] = "История ввода"
+L["The amount of messages to save in the editbox history.\n\n|cffFF0000Note:|r To disable, set to 0."] = "Количество сообщений, введенных вами, которое будет сохранено между сеансами.\n\n|cffFF0000Напоминание:|r Для отключения, установите на 0."
+L["Filter DPS meters' Spam"] = "Фильтровать отчеты о УВС"
+L["Replaces long reports from damage meters with a clickeble hyperlink to reduce chat spam.\nWorks correctly only with general reports such as DPS or HPS. May fail to filter te report of other things"] = "Заменяет длиные отчеты от аддонов для измерения УВС на гиперссылку, сокращая уровень спама в чате.\nКорректно работает с отчетами урона и исцеления. Может не отфильтровать другие специфические отчеты."
+L["Texture Alpha"] = "Прозрачность текстур"
+L["Allows separate alpha setting for textures in chat"] = "Включает отдельную настройку прозрачности для текстур в чате"
+L["Chat Frame Justify"] = "Выравнивание текста"
+L["Identify"] = "Определить"
+L["Showes the message in each chat frame containing frame's number."] = "Оображает на каждой вкладке сообщеине с ее идентификатором."
+L["This is %sFrame %s|r"] = "Это %sВкладка %s|r"
+L["Loot Icons"] = "Иконки добычи"
+L["Showes icons of items looted/created near respective messages in chat. Does not affect usual messages."] = "Отображает иконки созданных/полученных предметов в соответствующих сообщениях чата. Не влияет на обычные сообщения."
+L["Frame 1"] = "Вкладка 1"
+L["Frame 2"] = "Вкладка 2"
+L["Frame 3"] = "Вкладка 3"
+L["Frame 4"] = "Вкладка 4"
+L["Frame 5"] = "Вкладка 5"
+L["Frame 6"] = "Вкладка 6"
+L["Frame 7"] = "Вкладка 7"
+L["Frame 8"] = "Вкладка 8"
+L["Frame 9"] = "Вкладка 9"
+L["Frame 10"] = "Вкладка 10"
+L["Chat Max Messages"] = "Максимум сообщений в чате"
+L["The amount of messages to save in chat window.\n\n|cffFF0000Warning:|r Can increase the amount of memory needed. Also changing this setting will clear the chat in all windows, leaving just lines saved in chat history."] = "Кол-во сообщений хранащихся в окне чата.\n\n|cffFF0000Внимание:|r Может повысить количество необходимой памяти. Также изменение этой опции мгновенно очистит чат от сообщений, оставив только сохраненное в истории чата."
+L["Tabs"] = "Вкладки"
+L["Selected Indicator"] = "Индитакор активной"
+L["Shows you which of docked chat tabs is currently selected."] = "Показывает какая из закрепленных вкладок сейчас активна."
+L["Chat history size"] = "Размер истории чата"
+L["Sets how many messages will be stored in history."] = "Кол-во сообщений, сохраняемых в истории чата."
+L["Following options determine which channels to save in chat history.\nNote: disabling a channel will immideately delete saved info for that channel."] = "Следующие опции задают каналы, которые будут сохраняться в истории чата.\nОбратите внимание: отключение канала тутже отчистит историю чата от сообщений из этого канала."
+
+--Databars
+L["Full value on Exp Bar"] = "Полное значение опыта"
+L["Changes the way text is shown on exp bar."] = "Изменяет отображение значений опыта на полосе."
+L["Full value on Rep Bar"] = "Полное значение репутации"
+L["Changes the way text is shown on rep bar."] = "Изменяет отображение значений репутации на полосе."
+L["Auto Track Reputation"] = "Автоматически отслеживать репутацию"
+L["Automatically sets reputation tracking to the most recent reputation change."] = "Автоматически изменять отслеживаемую репутацию на последнюю фракцию, чье отношение к Вам изменилось."
+L["Change the style of reputation messages."] = "Изменяет стиль сообщений о получении репутации"
+L["Reputation increase Style"] = "Стиль прибавки"
+L["Reputation decrease Style"] = "Стиль уменьшения"
+L["Output"] = "Вывод"
+L["Determines in which frame reputation messages will be shown. Auto is for whatever frame has reputation messages enabled via Blizzard options."] = "Определяет вкладку, на которой будут выводиться сообщения. Авто будет выводить в соответствии с настроками Blizzard."
+L["Change the style of experience gain messages."] = "Изменяет стиль сообщений о получении опыта."
+L["Experience Style"] = "Стиль опыта"
+L["Full List"] = "Полный список"
+L["Show all factions affected by the latest reputation change. When disabled only first (in alphabetical order) affected faction will be shown."] = "Показывать все фракции, затронутые последним изменеием репутации. При отключении будет показываться только первая (в алфавитном порядке) фракция."
+L["Full value on Artifact Bar"] = "Полное значение силы артефакта"
+L["Changes the way text is shown on artifact bar."] = "Изменяет отображение значения силы артефакта на полосе."
+L["Full value on Honor Bar"] = "Полное значение чести"
+L["Changes the way text is shown on honor bar."] = "Изменяет отображение количества чести на полосе."
+L["Chat Filters"] = "Фильтры чата"
+L["Replace massages about honorable kills in chat."] = "Заменять сообщения о почетных победах в чате."
+L["Award"] = "Награда"
+L["Replace massages about honor points being awarded."] = "Заменять сообщения о наградной чести."
+L["Defines the style of changed string. Colored parts will be shown with your selected value color in chat."] = "Определяет стил сообщения. Окрашенные элементы будут отображаться выбранным вами цветом значений."
+L["Award Style"] = "Стиль наград"
+L["HK Style"] = "Стиль почетной победы"
+
+--Datatexts
+L["D"] = "Дн"
+L["Previous Level:"] = "Предыдущий уровень:"
+L['Current:'] = "Текущее:"
+L['Weekly:'] = "За неделю:"
+L["Account Time Played"] = "Время в игре на аккаунте"
+L["SLE_DataPanel_1"] = "S&L Инфо-панель 1"
+L["SLE_DataPanel_2"] = "S&L Инфо-панель 2"
+L["SLE_DataPanel_3"] = "S&L Инфо-панель 3"
+L["SLE_DataPanel_4"] = "S&L Инфо-панель 4"
+L["SLE_DataPanel_5"] = "S&L Инфо-панель 5"
+L["SLE_DataPanel_6"] = "S&L Инфо-панель 6"
+L["SLE_DataPanel_7"] = "S&L Инфо-панель 7"
+L["SLE_DataPanel_8"] = "S&L Инфо-панель 8"
 L["You didn't select any instance to track."] = "Вы не выбрали подземелья для отслеживания"
 L["This LFR isn't available for your level/gear."] = "Это подземелье не доступно для Вашего уровня или экипировки."
-L["This raid isn't available for your level/gear."] = "Этот рейд не доступен для Вашего уровня или экипировки."
+L["Bosses killed: "] = "Боссов убито: "
+L["|cffeda55fLeft Click|r to open the friends panel."] = "|cffeda55fЛКМ|r для открытия списка друзей"
+L["|cffeda55fRight Click|r to open configuration panel."] = "|cffeda55fПКМ|r для открытия настроек"
+L["|cffeda55fLeft Click|r a line to whisper a player."] = "|cffeda55fЛКМ|r на строке для сообщения игроку."
+L["|cffeda55fShift+Left Click|r a line to lookup a player."] = true
+L["|cffeda55fCtrl+Left Click|r a line to edit a note."] = "|cffeda55fCtrl+ЛКМ|r для редактирования заметки."
+L["|cffeda55fMiddleClick|r a line to expand RealID."] = "|cffeda55fКлик клесиком|r по строке для разворота RealID."
+L["|cffeda55fAlt+Left Click|r a line to invite."] = "|cffeda55fAlt+ЛКМ|r по строке для приглашения."
+L["|cffeda55fLeft Click|r a Header to hide it or sort it."] = "|cffeda55fЛКМ|r по заголовку для скрытия или сортировки."
+L["|cffeda55fLeft Click|r to open the guild panel."] = "|cffeda55fЛКМ|r для открытия окна гильдии."
+L["|cffeda55fCtrl+Left Click|r a line to edit note."] = "|cffeda55fCtrl+ЛКМ|r по строке для редактирвоания заметки."
+L["|cffeda55fCtrl+Right Click|r a line to edit officer note."] = "|cffeda55fCtrl+ПКМ|r по строке для редактирвоания офицерской заметки."
+L["New Mail"] = "Новое письмо"
+L["No Mail"] = "Нет писем"
+L["Range"] = "Дальность"
 L["SLE_AUTHOR_INFO"] = "\"Shadow & Light\" от Darth Predator'а и Repooc'а"
 L["SLE_CONTACTS"] = [=[При возникновении вопросов, предложений и прочего обращаться:
 http://git.tukui.org/repooc/elvui-shadowandlight]=]
-L["DP_1"] = "Панель 1"
-L["DP_2"] = "Панель 2"
-L["DP_3"] = "Панель 3"
-L["DP_4"] = "Панель 4"
-L["DP_5"] = "Панель 5"
-L["DP_6"] = "Панель 6"
-L["Bottom_Panel"] = "Нижняя панель"
-L["Top_Center"] = "Верхняя панель"
--- L["Left Chat"] = "Левый чат"
--- L["Right Chat"] = "Правый чат"
 L["Additional Datatext Panels"] = "Дополнительные панели инфо-текстов"
 L["DP_DESC"] = [=[Дополнительные панели под информационные тексты.
-Всего здесь 8 дополнительных панелей и 20 дополнительных слотов под инфо-тексты, а также панель состояния с 4мя индикаторами.
-Панели на чатах отключить нельзя.]=]
-L["Dashboard"] = "Панель состояния"
-L["Show/Hide dashboard."] = "Показать/скрыть панель состояния."
-L["Dashboard Panels Width"] = "Ширина панелей"
-L["Sets size of dashboard panels."] = "Устанавливает размер полос панели состояния."
-L["Override Chat DT Panels"] = "Изменить инфо-панели чата"
-L["This will have S&L handle chat datatext panels and place them below the left & right chat panels.\n\n|cffFF0000Note:|r When you first enabled, you may need to move the chat panels up to see your datatext panels."] = "S&L перенесет панели информации чатов. Информационные панели будут перемещены под панели чата. \n\n|cffFF0000Внимание:|r При первой активации может потребоваться вручную переместить панели чата, чтобы увидеть инфо-панели."
-L["Show/Hide this panel."] = "Показать/скрыть эту панель."
+Всего здесь 8 дополнительных панелей и 20 дополнительных слотов под инфо-тексты.]=]
 L["Sets size of this panel"] = "Установить ширину панели"
-L['Hide panel background'] = "Скрыть фон панели"
 L["Don't show this panel, only datatexts assinged to it"] = "Не показывать саму панель, а только назначенные на нее инфо-тексты"
-L["Some datatexts that Shadow & Light are supplied with, has settings that can be modified to alter the displayed information."] = "Некоторые инфо-тексты Shadow & Light имеют настройки, которые могут изменить отображаемую информацию."
-L["S&L Friends"] = true
-L["Show total friends in the datatext."] = "Показывать общее кол-во друзей на инфо-тексте."
-L["Show total guild members in the datatext."] = "Показывать общее кол-во членов гильдии на инфо-тексте."
-L["These options are for modifing the Shadow & Light Friends datatext."] = "Опции для настройки инфо-текста S&L Friends."
-L["S&L Guild"] = true
-L["Show Totals"] = "Показывать общее"
-L["Expand RealID"] = "Развернуть RealID"
-L["Display realid with two lines to view broadcasts."] = "Отображать информацию друзей по RealID в две строки для отображения рассылки."
-L["Hide Hints"] = "Скрыть управление"
-L["Hide the hints in the tooltip."] = "Скрывать инструкцию по управлению в подсказке инфо-текста"
-L["Autohide Delay:"] = "Задержка скрывания"
-L["Adjust the tooltip autohide delay when mouse is no longer hovering of the datatext."] = "Устанавливает время исчезновения подсказки, после ухода курсора с инфо-текста."
-L["S&L Mail"] = true
-L["These options are for modifing the Shadow & Light Mail datatext."] = "Опции для настройки инфо-текста S&L Mail"
-L["Minimap icon"] = "Иконка на миникарте"
-L["If enabled will show new mail icon on minimap."] = "Если включено, то иконка почты на миникарте будет отображаться."
+L["Override Chat DT Panels"] = "Изменить инфо-панели чата"
+L["This will have S&L handle chat datatext panels and place them below the left & right chat panels.\n\n|cffFF0000Note:|r When you first enabled, you may need to move the chat panels up to see your datatext panels."] = "S&L перенесет панели информации чатов. Информационные панели будут перемещены под панели чата. \n\n|cffFF0000Внимание:|r При первой активации может потребоваться вручную переместить панели чата, чтобы увидеть инфо-панели."
 L["S&L Datatexts"] = "Инфо-тексты S&L"
 L["Datatext Options"] = "Опции инфо-текстов"
-L["These options are for modifing the Shadow & Light Guild datatext."] = "Опции для настройки инфо-текста S&L Guild."
-L["Hide MOTD"] = "Скрыть сообщение дня"
-L["Hide the guild's Message of the Day in the tooltip."] = "Скрывает сообщение дня гильдии на подсказке."
-L["Hide Guild Name"] = "Скрыть название гильдии"
-L["Hide the guild's name in the tooltip."] = "Скрывает название гильдии на подсказке."
-L["Hide In Combat"] = "Скрывать в бою"
-L["Will not show the tooltip while in combat."] = "Не отображать подсказки инфо-текста в бою."
-L["World Loot"] = "Мировая добыча"
-L["Show/Hide the status of Key to the Palace of Lei Shen and Trove of the Thunder King."] = "Показать/скрыть статус Ключа от дворца Лэй Шэня и Сокровищ Властелина Грома."
-L["Time Played"] = "Времени в игре"
-L["Account Time Played"] = "Время в игре на аккаунте"
-L["D"] = "Дн"
-L["Previous Level:"] = "Предыдущий уровень:"
-L['Current:'] = "Текущее:"
-L['Weekly:'] = "За неделю:"
-L['ElvUI Improved Currency Options'] = "Опции расширенного инфо-текста валюты"
+L["LFR Lockout"] = "Состояние ЛФР"
+L["Show/Hide LFR lockout info in time datatext's tooltip."] = "Отображать/скрывать информацию о сохранении ЛФР в инфо-тексте времени"
+L["ElvUI Improved Currency Options"] = "Опции расширенного инфо-текста валюты"
 L['Show Archaeology Fragments'] = "Показывать фрагменты археологии"
 L['Show Jewelcrafting Tokens'] = "Показывать ювелирные значки"
 L['Show Player vs Player Currency'] = "Показывать PvP валюту"
@@ -285,160 +337,335 @@ L['Show Zero Currency'] = "Показывать отсутствующую ва
 L['Show Icons'] = "Показывать иконки"
 L['Show Faction Totals'] = "Показывать сумму по фракциям"
 L['Show Unsed Currency'] = "Показывать неиспользуемую валюту"
-L["Gradient"] = "Градиент"
-L["If enabled will color durability text based on it's value."] = "Если включено, будет окрашивать текст прочности в зависимости от значения."
+L["These options are for modifing the Shadow & Light Friends datatext."] = "Опции для настройки инфо-текста S&L Friends."
+L["Hide In Combat"] = "Скрывать в бою"
+L["Will not show the tooltip while in combat."] = "Не отображать подсказки инфо-текста в бою."
+L["Hide Friends"] = "Скрыть друзей"
+L["Minimize the Friend Datatext."] = "Минимизировать список друзей"
+L["Show Totals"] = "Показывать общее"
+L["Show total friends in the datatext."] = "Показывать общее кол-во друзей на инфо-тексте."
+L["Hide Hints"] = "Скрыть управление"
+L["Hide the hints in the tooltip."] = "Скрывать инструкцию по управлению в подсказке инфо-текста."
+L["Expand RealID"] = "Развернуть RealID"
+L["Display realid with two lines to view broadcasts."] = "Отображать информацию друзей по RealID в две строки для отображения рассылки."
+L["Autohide Delay:"] = "Задержка скрывания"
+L["Adjust the tooltip autohide delay when mouse is no longer hovering of the datatext."] = "Устанавливает время исчезновения подсказки, после ухода курсора с инфо-текста."
+L["S&L Guild"] = true
+L["These options are for modifing the Shadow & Light Guild datatext."] = "Опции для настройки инфо-текста S&L Guild."
+L["Show total guild members in the datatext."] = "Показывать общее кол-во членов гильдии на инфо-тексте."
+L["Hide MOTD"] = "Скрыть сообщение дня"
+L["Hide the guild's Message of the Day in the tooltip."] = "Скрывает сообщение дня гильдии на подсказке."
+L["Hide Guild"] = "Скрыть гильдию"
+L["Minimize the Guild Datatext."] = "Минимизировать состав гильдии."
+L["Hide Guild Name"] = "Скрыть название гильдии"
+L["Hide the guild's name in the tooltip."] = "Скрывает название гильдии на подсказке."
+L["S&L Mail"] = true
+L["These options are for modifing the Shadow & Light Mail datatext."] = "Опции для настройки инфо-текста S&L Mail"
+L["Minimap icon"] = "Иконка на миникарте"
+L["If enabled will show new mail icon on minimap."] = "Если включено, то иконка почты на миникарте будет отображаться."
+L["Options below are for standard ElvUI's durability datatext."] = "Опции ниже предназначены для стандартного инфо-тектса прочности."
+L["If enabled will color durability text based on it's value."] = "Если включено, будет окрашивать текст прочности в зависимости от его значения."
 L["Durability Threshold"] = "Порог прочности"
 L["Datatext will flash if durability shown will be equal or lower that this value. Set to -1 to disable"] = "Инфотекст начнет мигать, если показанная прочность будет меньшей либо равной заданному числу. Поставьте на -1 для отключения."
-L["Any changes made will take effect only after:\n - Opening vendor\n - Item durability changes\n - Experiencing loading screen."] = "Изменения данных параметров вступят в силу только после одного из следующих действий:\n - Взаимодействия с торговцем\n - Изменения прочности предметов\n - Окончания экрана загрузки."
+L["Short text"] = "Короткий текст"
+L["Changes the text string to a shorter variant."] = "Зменяет текст на инфо-тексте более коротким вариантом."
+L["Delete character info"] = "Удалить данные персонажа."
+L["Remove selected character from the stored gold values"] = "Удалить выбранного персонажа из данных о золоте."
+L["Are you sure you want to remove |cff1784d1%s|r from currency datatexts?"] = "Вы уверены, что хотите удалить |cff1784d1%s|r из инфо-текстов валют?л"
+L["Time Played"] = "Времени в игре"
+L["Account Time Played"] = "Время в игре на аккаунте"

---Equip Manager--
-L['Equipment Manager'] = "Менеджер экипировки"
-L["EM_DESC"] = "Этот модуль предоставляет различные опции для автоматической смены комплектов экипировки при переключении набора талантов или попадании в определенную локацию."
-L['Spam Throttling'] = "Подавление спама"
-L["Removes the spam from chat stating what talents were learned or unlearned during spec change."] = "Удаляет спам об изученных/забытых заклинаниях при смене талантов."
+--Equip Manager
+L["Equipment Manager"] = "Менеджер экипировки"
+L["EM_DESC"] = "Этот модуль предоставляет различные опции для автоматической смены комплектов экипировки при переключении набора талантов или попадании в определенную локацию."
 L['Equipment Set Overlay'] = "Название комплекта"
 L['Show the associated equipment sets for the items in your bags (or bank).'] = "Отображает название комплекта экипировки, к которому привязан предмет, на его иконке в сумках или банке."
 L["Here you can choose what equipment sets to use in different situations."] = "Здесь Вы можете выбрать какие комплекты экипировки использовать в различных случаях."
-L["Equip this set when switching to primary talents."] = "Надеть этот набор при переключении на основной набор талантов."
-L["Equip this set when switching to secondary talents."] = "Надеть этот набор при переключении на дополнительный набор талантов."
-L["Equip this set after entering dungeons or raids."] = "Надеть этот набор при попадании в подземелье или рейд."
-L["Equip this set after entering battlegrounds or arens."] = "Надеть этот набор при попадании на поля боя или арены."
-
---XP-Rep Bar--
-L["Xp-Rep Text"] = "Текст Опыта/Репутации"
-L["Full value on Exp Bar"] = "Полное значение опыта"
-L["Changes the way text is shown on exp bar."] = "Изменяет отображение значений опыта на полосе."
-L["Full value on Rep Bar"] = "Полное значение репутации"
-L["Changes the way text is shown on rep bar."] = "Изменяет отображение значений репутации на полосе."
-L["Auto Track Reputation"] = "Автоматически отслеживать репутацию"
-L["Automatically sets reputation tracking to the most recent reputation change."] = "Автоматически изменять отслеживаемую репутацию на последнюю фракцию, чье отношение к Вам изменилось."
-
---Farm--
-L['Farm'] = "Ферма"
-L["Farm Options"] = "Опции фермы"
-L["FARM_DESC"] = [[Дополнительные панели с семенами, инструментами и порталами для Фермы Солнечной Песни.
-Они будут отображаться только если Вы находитесь на ферме или рынке Полугорья.]]
-L['Only active buttons'] = "Только активные"
-L['Only show the buttons for the seeds, portals, tools you have in your bags.'] = "Отображать только кнопки для тех семян/инструментов/порталов, которые есть у Вас в сумках."
-L["Seed Bars"] = "Панели семян"
-L["Auto Planting"] = "Автоматическая посадка"
-L["Automatically plant seeds to the nearest tilled soil if one is not already selected."] = "Автоматически высаживать указанное растение на ближайшую возделанную землю, если не выбрана другая."
-L["Drop Seeds"] = "Удалять семена"
-L["Allow seeds to be destroyed from seed bars."] = "Позволить удаление семян при помощи панелей."
-L["Quest Glow"] = "Свечение заданий"
-L["Show glowing border on seeds needed for any quest in your log."] = "Показывать светящуюся границу на семенах, необходимых на какое-либо из взятых заданий из Вашего журнала."
-L["Dock Buttons To"] = "Прикрепить кнопки к"
-L["Change the position from where seed bars will grow."] = "Изменить сторону, с которой будут расти панели семян."
-L["Bottom"] = "Низ"
-L["Top"] = "Верх"
-L["Farm Seed Bars"] = "Панели семян"
-L["Farm Tool Bar"] = "Панель инструментов"
-L["Farm Portal Bar"] = "Панель порталов"
-L["Garrison Tools Bar"] = "Панель гарнизона"
-L["Tilled Soil"] = "Возделанная земля"
-L['Right-click to drop the item.'] = "ПКМ для уничтожения предмета."
-L["We are sorry, but you can't do this now. Try again after the end of this combat."] = "Извините, но Вы не можете этого сделать сейчас. Попробуйте снова после окончания текущего боя."
-
---Help--
-L["LINK_DESC"] = [[Сылки ниже ведуть на страницы Shadow & Light на различных сайтах.]]
-L['About/Help'] = "Помощь/Информация"
-L['About'] = "Информация"
-L['Links'] = "Ссылки"
-L['GitLab Link / Report Errors'] = "Ссылка на GitLab / Сообщить об ошибке"
-
---Import Section
-L["SLE_IMPORTS"] = "|cffFF0000Важно:|r Используйте импортирование фильтров осторожно, так как они удалят ваши собственные фильтры!\nИмпортирование классового фильтра перезапишет любые изменения, которые Вы в него вносили."
-
---Loot--
-L["AUTOANNOUNCE_DESC"] = [[Этот модуль будет выводить список выпавшей добычи при открытии окна добычи.
-Вывод осуществляется только если Вы лидер, помощник или ответственный за добычу или при зажатии клавиши принудительного вывода.]]
-L["LOOTH_DESC"] = "Опции, задающие поведение окна истории добычи."
+L["Equip this set when switching to specialization %s."] = "Надеть этот комплект при переключении на специализацию %s."
+L["Equip this set for open world/general use."] = "Использовать этот комплект для открытого мира/общего назначения."
+L["Equip this set after entering dungeons or raids."] = "Использовать этот комплект после входа в подземелье или рейд."
+L["Equip this set after entering battlegrounds or arens."] = "Использовать этот комплект на полях боя или арене."
+L["Use a dedicated set for instances and raids."] = "Использовать отдельный комплект для подземелий и рейдов"
+L["Use a dedicated set for PvP situations."] = "Использовать отдельный комплект для пвп"
+L["Impossible to switch to appropriate equipment set in combat. Will switch after combat ends."] = "Невзможно переключиться на подходящий комплект в бою. Переключение произойдет после окончания боя."
+
+--Loot
 L["Loot Dropped:"] = "Список добычи:"
-L["Loot Roll History"] = "История добычи"
-L["Loot Quality"] = "Качество добычи"
-L["Automatically announce in selected chat channel."] = "Автоматически выводить список добычи в выбранный канал чата"
-L["Select chat channel to announce loot to."] = "Канал чата, для вывода сообщений."
-L["Sets the alpha of Loot Roll Histroy frame."] = "Устанавливает прозрачность окна истории добычи"
-L["Sets the minimum loot threshold to announce."] = "Минимальное качество предмета, для вывода в чате."
-L["Auto Announce"] = "Авто оповещение"
-L["Automaticaly hides Loot Roll Histroy frame when leaving the instance."] = "Автоматически скрывать окно истории добычи Blizzard при выходе из подземелья."
-L['Loot Announcer'] = "Оповещение о добыче"
 L["Loot Auto Roll"] = "Автоматические броски"
 L["LOOT_AUTO_DESC"] = "Автоматически выбирает вариант при розыгрыше добычи, основываясь на заданных настройках."
-L["Auto hide"] = "Автоматически скрывать"
-L["Manual Override"] = "Принудительно"
-L["Sets the button for manual override."] = "Задает кнопку, при зажатии которой добыча будет анонсироватья."
 L["Auto Confirm"] = "Автоматически подтвердить"
 L["Automatically click OK on BOP items"] = "Автоматически подтверждать поднятие/разрушение ПпП вещей"
 L["Auto Greed"] = "Авто. не откажусь"
 L["Automatically greed uncommon (green) quality items at max level"] = "Автоматически нажимать \"не откажусь\" на предметы зеленого качества на максимальном уровне."
 L["Auto Disenchant"] = "Авто. распыление"
 L["Automatically disenchant uncommon (green) quality items at max level"] = "Автоматически нажимать \"распылить\" на вещи зеленого качества на максимальном уровне."
+L["Loot Quality"] = "Качество добычи"
 L["Sets the auto greed/disenchant quality\n\nUncommon: Rolls on Uncommon only\nRare: Rolls on Rares & Uncommon"] = "Устанавливает качество предмета для автоматических бросков.\n\nНеобычное: разыгрывает только зеленые\nРедкие: разыгрывает синие и зеленые."
 L["Roll based on level."] = "Уровень розыгрыша"
 L["This will auto-roll if you are above the given level if: You cannot equip the item being rolled on, or the ilevel of your equipped item is higher than the item being rolled on or you have an heirloom equipped in that slot"] = "Автоматически разыгрывать добычу после установленного уровня, если: вы не можете надеть предмет, или надетый на вас предмет выше уровнем, или в этом слоте у вас фамильный предмет"
 L["Level to start auto-rolling from"] = "Минимальный уровень розыгрыша"
+L["Loot Announcer"] = "Оповещение о добыче"
+L["AUTOANNOUNCE_DESC"] = "When enabled, will automatically announce the loot when the loot window opens.\n\n|cffFF0000Note:|r Raid Lead, Assist, & Master Looter Only."
+L["Auto Announce"] = "Авто оповещение"
+L["Manual Override"] = "Принудительно"
+L["Sets the button for manual override."] = "Задает кнопку, при зажатии которой добыча будет анонсироватья."
+L["No Override"] = "Нет принудительного"
+L["Automatic Override"] = "Автоматически"
+L["Sets the alpha of Loot Roll Histroy frame."] = "Устанавливает прозрачность окна истории добычи"
+L["Sets the minimum loot threshold to announce."] = "Минимальное качество предмета, для вывода в чате."
+L["Select chat channel to announce loot to."] = "Канал чата, для вывода сообщений."
+L["Loot Roll History"] = "История добычи"
+L["LOOTH_DESC"] = "Опции, задающие поведение окна истории добычи."
+L["Auto hide"] = "Автоматически скрывать"
+L["Automaticaly hides Loot Roll Histroy frame when leaving the instance."] = "Автоматически скрывать окно истории добычи Blizzard при выходе из подземелья."
+L["Channels"] = "Каналы"
+L["Private channels"] = "Личные сообщения"
+L["Incoming"] = "Входящие"
+L["Outgoing"] = "Исходящие"
+
+--Media
+L["SLE_MEDIA_ZONES"] = {
+	"Москва",
+	"Луна",
+	"BlizzCon",
+	"Деревня Гадюкино",
+	"Нижние Балбуки",
+	"Светлое Будущее",
+}
+L["SLE_MEDIA_PVP"] = {
+	"(Территория Орды)",
+	"(Территория Альянса)",
+	"(Спорная территори)",
+	"(Территория пришельцев)",
+	"(Курилка)",
+	"(Зана отдыха)",
+}
+L["SLE_MEDIA_SUBZONES"] = {
+	"Администрация",
+	"Склад водки",
+	"Пожарный выход",
+	"Кабинет директора",
+}
+L["SLE_MEDIA_PVPARENA"] = {
+	"(PvP)",
+	"Не курить!",
+	"Самый низки наалог на доходы",
+	"Свободная зона",
+	"Идет самоуничтожение",
+}
+L["SLE_MEDIA"] = "Опции для изменения внешнего вида некоторых элементов интерфейса."
+L["Zone Text"] = "Текст локации"
+L["Subzone Text"] = "Название сублокации"
+L["PvP Status Text"] = "PvP статус"
+L["Misc Texts"] = "Прочие тексты"
+L["Mail Text"] = "Текст письма"
+L["Chat Editbox Text"] = "Текст поля ввода"
+L["Gossip and Quest Frames Text"] = "Текст окон заданий и диалогов"

---Nameplates--
-L["Target Count"] = "Число выделений"
-L["Display the number of party / raid members targetting the nameplate unit."] = "Показывать количество членов группы/рейда, выбравших в цель этот юнит."
-L["Threat Text"] = "Текст угрозы"
-L["Display threat level as text on targeted, boss or mouseover nameplate."] = "Отображает текст угрозы на индикаторе цели, босса или юнита под курсором."
-
---Minimap--
+--Minimap
 L["Minimap Options"] = "Опции миникарты"
-L['Hide minimap in combat.'] = "Скрыть миникарту в бою"
-L['MINIMAP_DESC'] = "Эти опции влияют на различные функции миникарты.  Некоторые опции погут не работать, если вы отключите миникарты в основных настройках ElvUI."
+L["MINIMAP_DESC"] = "Эти опции влияют на различные функции миникарты.  Некоторые опции погут не работать, если вы отключите миникарты в основных настройках ElvUI."
+L["Hide minimap in combat."] = "Скрыть миникарту в бою"
+L["Minimap Alpha"] = "Прозрачность миникарты"
 L["Minimap Coordinates"] = "Координаты на миникарте"
-L['Enable/Disable Square Minimap Coords.'] = "Включить/выключить координаты на миникарте."
-L['Coords Display'] = "Отображение координат"
-L['Change settings for the display of the coordinates that are on the minimap.'] = "Укажите условие отображения координат на миникарте."
+L["Enable/Disable Square Minimap Coords."] = "Включить/выключить координаты на миникарте."
+L["Coords Display"] = "Отображение координат"
+L["Change settings for the display of the coordinates that are on the minimap."] = "Укажите условие отображения координат на миникарте."
 L["Coords Location"] = "Позиция координат"
-L['This will determine where the coords are shown on the minimap.'] = "Определяет место, в котором будут отображаться координаты на миникарте"
-L['Bottom Corners'] = "Нижние углы"
-L['Bottom Center'] = "Внизу по центру"
-L['Enable/Disable Square Minimap Buttons.'] = "Включить/выключить квадратные иконки у миникарты."
+L["This will determine where the coords are shown on the minimap."] = "Определяет место, в котором будут отображаться координаты на миникарте"
+L["Bottom Corners"] = "Нижние углы"
+L["Bottom Center"] = "Внизу по центру"
+L["Minimap Buttons"] = "Кнопки на миникарте"
+L["Enable/Disable Square Minimap Buttons."] = "Включить/выключить квадратные иконки у миникарты."
 L["Bar Enable"] = "Включить полосу"
-L['Enable/Disable Square Minimap Bar.'] = "Включить/выключить панель для иконок миникарты."
-L['Skin Dungeon'] = "Иконка поиска"
-L['Skin dungeon icon.'] = "Забирать иконку поиска группы."
-L['Skin Mail'] = "Иконка почты"
-L['Skin mail icon.'] = "Забирать иконку письма."
-L['Icons Per Row'] = "Иконок в ряду"
-L['The number of icons per row for Square Minimap Bar.'] = "Кол-во иконок в ряду на полосе иконок."
-L['Anchor Setting'] = "Настрокий расположения"
-L['Anchor mode for displaying the minimap buttons are skinned.'] = "Место расположения иконок аддонов, когда они стилизованы."
-L['Horizontal Bar'] = "Горизонтальная панель"
-L['Vertical Bar'] = "Вертикальная панель"
-L['The size of the minimap buttons when not anchored to the minimap.'] = "Размер иконок миникарты, когда они находятся на полосе."
-L['Show minimap buttons on mouseover.'] = "Отображать иконки при наведении мыши."
+L["Enable/Disable Square Minimap Bar."] = "Включить/выключить панель для иконок миникарты."
+L["Skin Dungeon"] = "Иконка поиска"
+L["Skin dungeon icon."] = "Забирать иконку поиска группы."
+L["Skin Mail"] = "Иконка почты"
+L["Skin mail icon."] = "Забирать иконку письма."
+L["The size of the minimap buttons when not anchored to the minimap."] = "Размер конопок миникарты, когда они не прикреплены к нейй."
+L["Icons Per Row"] = "Иконок в ряду"
+L["Anchor mode for displaying the minimap buttons are skinned."] = "Место расположения иконок аддонов, когда они стилизованы."
+L["Show minimap buttons on mouseover."] = "Отображать иконки при наведении мыши."
 L["Instance indication"] = "Индикатор подземелья"
-L['Show instance difficulty info as text.'] = "Показывать информацию о сложности подземелья в виде текста"
-L['Sets the colors for difficulty abbreviation'] = "Устанавливает цвета для аббревиатур уровней сложности."
-L['Show texture'] = "Показывать текстуру"
-L['Show instance difficulty info as default texture.'] = "Показывать информацию о сложности подземелья в виде стандартной текстуры"
-L['Minimap Alpha'] = "Прозрачность миникарты"
-L['Decimals'] = "Десятые доли"
-
---Tooltip--
-L["TTOFFSET_DESC"] = "Добавляет возможность сделать отступ подсказки от курсора. Работает только при включенной опции \"Около курсора\" в ElvUI."
-L["Tooltip enhancements"] = "Дополнительные опции подсказки"
+L["Show instance difficulty info as text."] = "Показывать информацию о сложности подземелья в виде текста"
+L["Show texture"] = "Показывать текстуру"
+L["Show instance difficulty info as default texture."] = "Показывать информацию о сложности подземелья в виде стандартной текстуры"
+L["Sets the colors for difficulty abbreviation"] = "Устанавливает цвета для аббревиатур уровней сложности."
+L["Location Panel"] = "Панель локации"
+L["Update Throttle"] = "Частота обновления"
+L["The frequency of coordinates and zonetext updates. Check will be done more often with lower values."] = "Частота обновления координат и текста локации. Проверка проводится чаще с более низким значением."
+L["Full Location"] = "Полный текст"
+L["Color Type"] = "Тип окрашивания"
+L["Reaction"] = "Отношение"
+L["Teleports"] = "Телепорты"
+L["Portals"] = "Порталы"
+L["Link Position"] = "Сообщать координаты"
+L["Allow pasting of your coordinates in chat editbox via holding shift and clicking on the location name."] = "Разрешить отправку ваших координат в поле ввода чата при нажатии shift+ПКМ на названии зоны."
+L["Relocation Menu"] = "Меню переещений"
+L["Right click on the location panel will bring up a menu with available options for relocating your character (e.g. Hearthstones, Portals, etc)."] = "ПКМ на панели локалии откроет меню с доступными вариантами перемещени (камни, порталы и т.д.)"
+L["Custom Width"] = "Своя ширина"
+L["By default menu's width will be equal to the location panel width. Checking this option will allow you to set own width."] = "По умолчанию ширина меню будет равна ширине панели. Включение данной опции позволит установить свою ширину."
+L["Justify Text"] = "Выравнивание тектса"
+
+
+--Miscs
+L["Error Frame"] = "Фрейм ошибок"
+L["Ghost Frame"] = "Кнопка призрака"
+L["Raid Utility Mouse Over"] = "Управление рейдом при наведении"
+L["Set the width of Error Frame. Too narrow frame may cause messages to be split in several lines"] = "Устанавливает ширину фрейма ошибок. Если фрейм окажется слишком узким, текст будет разделен на несколько строк."
+L["Set the height of Error Frame. Higher frame can show more lines at once."] = "Устанавливает высоту фрейма ошибок. Чем выше фрейм, тем больше строк может быть показано одновременно."
+L["Enabling mouse over will make ElvUI's raid utility show on mouse over instead of always showing."] = "Включение позволит отображать кнопку управления рейдом только при наведении курсора."
+L["Adjust the position of the threat bar to any of the datatext panels in ElvUI & S&L."] = "Позволяет поместить полосу угрозы на любой панели инфо-текстов."
+L["Enhanced Vehicle Bar"] = "Улучшенный контроль машин"
+L["A different look/feel vehicle bar"] = "Измененный вид панели техники"
+
+--Nameplates
+L["Target Count"] = "Число выделений"
+L["Display the number of party / raid members targetting the nameplate unit."] = "Показывать количество членов группы/рейда, выбравших в цель этот юнит."
+L["Threat Text"] = "Текст угрозы"
+L["Display threat level as text on targeted, boss or mouseover nameplate."] = "Отображает текст угрозы на индикаторе цели, босса или юнита под курсором."
+
+--Professions
+L['Scroll'] = "Свиток"
+
+--PvP
+L["Functions dedicated to player versus player modes."] = "Функции для режима игрок Против Игрока."
+L["PvP Auto Release"] = "Автоматический выход из тела"
+L["Automatically release body when killed inside a battleground."] = "Автоматически выходить из тела на полях боя."
+L["Check for rebirth mechanics"] = "Проверять перерождение"
+L["Do not release if reincarnation or soulstone is up."] = "Не выходить из тела, если доступна реинкарнация или камень души."
+L["SLE_DuelCancel_REGULAR"] = "Запрос дуэли от %s отклонен."
+L["SLE_DuelCancel_PET"] = "Запрос дуэли питомцев от %s отклонен."
+L["Automatically cancel PvP duel requests."] = "Автоматически отклонять вызовы на бой"
+L["Automatically cancel pet battles duel requests."] = "Автоматически отклонять вызовы на бой питомцев"
+L["Announce"] = "Сообщать"
+L["Announce in chat if duel was rejected."] = "Сообщать в чат, когда запрос был отклонен."
+L["Show your PvP killing blows as a popup."] = "Отображать смертельные удары в пвп всплывающим окном."
+L["KB Sound"] = "Звук"
+L["Play sound when Kkilling blows popup is shown."] = "Проигрывать звук при нанесении смертельного удара."
+
+--Quests
+L["Rested"] = "Отдых"
+L["Auto Reward"] = "Автоматическая награда"
+L["Automatically selects areward with higherst selling price when quest is completed. Does not really finish the quest."] = "Автоматическивыбирать награду с наивысшей стоимостью при сдаче квеста."
+
+--Raid Marks
+L["Raid Markers"] = "Рейдовые Метки"
+L["Click to clear the mark."] = "Снять метку"
+L["Click to mark the target."] = "Повесить метку"
+L["%sClick to remove all worldmarkers."] = "%s+ЛКМ для удаления всех меток на земле."
+L["%sClick to place a worldmarker."] = "%s+ЛКМ для установки метки на землю."
+L["Raid Marker Bar"] = "Полоса меток"
+L["Options for panels providing fast access to raid markers and flares."] = "Опции панелей, предоставляющих быстрый доступ к рейдовым меткам и маркерам на земле."
+L["Show/Hide raid marks."] = "Показать/скрыть фрейм рейдовых меток."
+L["Reverse"] = "Обратный порядок"
+L["Modifier Key"] = "Модификатор"
+L["Set the modifier key for placing world markers."] = "Модификатор для установки меток на земле."
+L["Visibility State"] = "Видимость"
+
+--Raidroles
+L["Options for customizing Blizzard Raid Manager \"O - > Raid\""] = "Опции настройки менеджера рейда \"О -> Рейд\""
+L["Show role icons"] = "Показывать иконки роли"
+L["Show level"] = "Показывать уровень"
+
+--Skins
+L["SLE_SKINS_DESC"] = [[Эта секция предназанчена для модификации существующий в ElvUI скионв.
+
+Некоторые опции могут быть недоступны, если отключен соответствующий скин в настройках ElvUI.]]
+L["Pet Battle Status"] = "Статус битвы питомцев"
+L["Pet Battle AB"] = "Панель команд битв питомцев"
+L["Sets the texture for statusbars in quest tracker, e.g. bonus objectives/timers."] = "Устанавливает текстуру для полос состояния в списке заданий (бонусные миссии/таймеры)"
+L["Statusbar Color"] = "Цвет полос состояния"
+L["Class Colored Statusbars"] = "Полоса состояния по классу"
+L["Underline"] = "Подчеркивание"
+L["Creates a cosmetic line under objective headers."] = "Создает косметическую полосу под заголовками"
+L["Underline Color"] = "Цвет подчеркивания"
+L["Class Colored Underline"] = "По классу"
+L["Underline Height"] = "Высота полосы"
+L["Header Text Color"] = "Цвет текста заголовка"
+L["Class Colored Header Text"] = "По классу"
+L["Subpages"] = "Субстраницы"
+L["Subpages are blocks of 10 items. This option set how many of subpages will be shown on a single page."] = "Субстраницы это блоки из 10 предметов. Эта опция показывает сколько субстраниц будет показано на одной странице."
+-- L["SLE_SKINS_QUESTKING_DESC"] = [[Following options controls additional features for Quest King addon. Settings are character based.
+-- Due to the way of how that addon works it is mostly impossible to hook into its functions.
+-- Affected options are:
+-- - Tooltip positioning and scale
+-- - Clicks processing
+-- - Quest tagging
+-- - Award frame is now following Objective tracker opions of ElvUI
+-- - Quest names are following header settings from S&L's objective tracker skin
+-- - Quest King's position is now controlled by ElvUI's objectives mover
+-- - A lot of lines are now pulled from the client instead of being hardcoded
+-- - Tracked quest icon is larger]]
+-- L["Tooltip Anchor"] = true
+-- L["Tooltip Scale"] = true
+-- L["Quest Type Indications"] = true
+-- L["Clicks Registration"] = true
+-- L["SLE_SKINS_QUESTKING_TEMPLATE_DESC"] = [[|cff9482c9Quest King|r
+-- Original Quest King's controls:
+-- Left Click to open quest info
+-- Alt + Right Click to untrack
+-- Alt + Left Click to collapce quest
+-- Right Click to set quest watch
+
+-- |cff9482c9Blizzlike|r
+-- Controls of standart Blizzard quest log:
+-- Left Click to open quest info
+-- Shift + Left Click to untrack
+-- Right Click to set uest follow
+-- Ctrl + Left Click to collapce]]
+-- L["SLE_QUESTKING_Required"] = "  Required: "
+L["ElvUI Objective Tracker"] = "Список задач ElvUI"
+L["ElvUI Skins"] = "Скины ElvUI"
+
+--Toolbars
+L["We are sorry, but you can't do this now. Try again after the end of this combat."] = "Извините, но Вы не можете этого сделать сейчас. Попробуйте снова после окончания текущего боя."
+L["Right-click to drop the item."] = "ПКМ для уничтожения предмета."
+L["Button Size"] = "Размер кнопок"
+L["Only active buttons"] = "Только активные"
+--Farm
+L["Tilled Soil"] = "Возделанная земля"
+L["Farm Seed Bars"] = "Панели семян"
+L["Farm Tool Bar"] = "Панель инструментов"
+L["Farm Portal Bar"] = "Панель порталов"
+L["Farm"] = "Ферма"
+L["Only show the buttons for the seeds, portals, tools you have in your bags."] = "Отображать только кнопки для тех семян/инструментов/порталов, которые есть у Вас в сумках."
+L["Auto Planting"] = "Автоматическая посадка"
+L["Automatically plant seeds to the nearest tilled soil if one is not already selected."] = "Автоматически высаживать указанное растение на ближайшую возделанную землю, если не выбрана другая."
+L["Quest Glow"] = "Свечение заданий"
+L["Show glowing border on seeds needed for any quest in your log."] = "Показывать светящуюся границу на семенах, необходимых на какое-либо из взятых заданий из Вашего журнала."
+L["Dock Buttons To"] = "Прикрепить кнопки к"
+L["Change the position from where seed bars will grow."] = "Изменить сторону, с которой будут расти панели семян."
+--Garrison
+L["Garrison Tools Bar"] = "Панель гарнизона"
+L["Auto Work Orders"] = "Автоматические заказы"
+L["Automatically queue maximum number of work orders available when visitin respected NPC."] = "Автоматически делать максимально возможное количество заказов при открытии соответствующего диалога."
+L["Auto Work Orders for Warmill"] = "Авто. заказы на фабрике"
+L["Automatically queue maximum number of work orders available for Warmill/Dwarven Bunker."] = "Автоматически делать максимальное количество заказов для военной фабрики/дворфийского бункера."
+L["Auto Work Orders for Trading Post"] = "Авто. заказы в торговой лавке"
+L["Automatically queue maximum number of work orders available for Trading Post."] = "Автоматически делать максимальное количество заказов для торговой лавки."
+L["Auto Work Orders for Shipyard"] = "Авто. заказы на верфи"
+L["Automatically queue maximum number of work orders available for Shipyard."] = "Автоматически делать максимальное количество заказов для верфи."
+
+--Tooltip
 L["Faction Icon"] = "Иконка фракции"
-L["Tooltip Cursor Offset"] = "Смещение подсказки"
 L["Show faction icon to the left of player's name on tooltip."] = "Отображать иконку фракции около имени игроков в подсказках"
+L["TTOFFSET_DESC"] = "Добавляет возможность сделать отступ подсказки от курсора. Работает только при включенной опции \"Около курсора\" в ElvUI."
 L["Tooltip X-offset"] = "Смещение подсказки по X"
 L["Offset the tooltip on the X-axis."] = "Смещает подсказку по оси X относительно выбранной точки крепления."
 L["Tooltip Y-offset"] = "Смещение подсказки по Y"
 L["Offset the tooltip on the Y-axis."] = "Смещает подсказку по оси Y относительно выбранной точки крепления."
+L["RAID_HFC"] = "ЦАП"
+L["RAID_BRF"] = "ЛКЧГ"
+L["RAID_HM"] = "ВМ"
+L["Raid Progression"] = "Рейдовый прогресс"
+L["Show raid experience of character in tooltip (requires holding shift)."] = "Отображает рейдовый опыт данного персонажа (требуется зажатый shift)"

---UI buttons--
+--UI Buttons
 L["S&L UI Buttons"] = "Меню S&L"
 L["UB_DESC"] = "Добавляет небольшую полосу с кнопками, дающими доступ к набору полезных функций."
-L["Click to reload your interface"] = "Нажмите для перезагрузки интерфейса"
-L["Click to toggle config window"] = "Нажмите для отображения окна настроек"
-L["Click to toggle the AddOn Manager frame."] = "Нажмите для отображения окна менеджера аддонов."
-L["Click to toggle the Configuration/Option Window from the Bossmod you have enabled."] = "Нажмите для отображения окна настроек включенного босс мода."
-L["Click to unlock moving ElvUI elements"] = "Нажмите для входа в режим перемещения элементов"
+L["Custom roll limits are set incorrectly! Minimum should be smaller then or equial to maximum."] = "Пределы для броска указаны некорректно! Минимальное значение должно быть меньше максимального."
 L["ElvUI Config"] = "Настройка ElvUI"
 L["Move UI"] = "Разблокировать элементы"
 L["Reload UI"] = "Перезагрузить интерфейс"
@@ -446,71 +673,73 @@ L["AddOns Manager"] = "Менеджер аддонов"
 L["Boss Mod"] = "Босс мод"
 L["AddOns"] = "Аддоны"
 L["S&L Config"] = "Настройки Shadow & Light"
+L["Click to toggle config window"] = "Нажмите для отображения окна настроек"
 L["Click to toggle Shadow & Light config group"] = "Нажмите, чтобы открыть группу настроек Shadow & Light"
-L["Do a roll with custom limits. Those limits can be set in S&L config."] = "Сделать бросок с собственными пределами. Они могут быть выставлены в настройках S&L."
+L["Click to reload your interface"] = "Нажмите для перезагрузки интерфейса"
+L["Click to unlock moving ElvUI elements"] = "Нажмите для входа в режим перемещения элементов"
+L["Click to toggle the AddOn Manager frame."] = "Нажмите для отображения окна менеджера аддонов."
+L["Click to toggle the Configuration/Option Window from the Bossmod you have enabled."] = "Нажмите для отображения окна настроек включенного босс мода."
+L["Custom"] = "Свое"
 L["Minimum Roll Value"] = "Минимальное значение броска"
 L["The lower limit for custom roll button."] = "Нижняя граница броска при использовании собственных установок."
 L["Maximum Roll Value"] = "Масимальное значение броска"
 L["The higher limit for custom roll button."] = "Верхняя граница броска при использовании собственных установок."
-L["Custom roll limits are set incorrectly! Minimum should be smaller then or equial to maximum."] = "Пределы для броска указаны некорректно! Минимальное значение должно быть меньше максимального."
 L["Quick Action"] = "Быстрое действие"
 L["Use quick access (on right click) for this button."] = "Функция для быстрого действия. Вызывается нажатием ПКМ на кнопке открытия списка."
-L["UI Buttons Style"] = "Стиль меню"
-L['Dropdown'] = "Выпадающий список"
 L["Function"] = "Функция"
-L["Function called by quick access."] = "Функция, вызываемая быстрым доступом"
+L["Function called by quick access."] = "Функция для вызова быстрым действием"

---Unitframes--
+--Unitframes
 L["Options for customizing unit frames. Please don't change these setting when ElvUI's testing frames for bosses and arena teams are shown. That will make them invisible until retoggling."] = "Опции для дополнительной настройки рамок юнитов. Пожалуйста, не изменяйте эти настройки в то же время, кода включен тестовый режим рамок боссов и арены в ElvUI. Это сделает их невидимыми до повторного включения."
 L["Player Frame Indicators"] = "Индикаторы игрока"
 L["Combat Icon"] = "Иконка боя"
-L["Show/Hide combat icon on player frame."] = "Отображать/скрывать иконку в бою."
-L["Combat Position"] = "Позиция иконки боя"
-L["Set the point to show combat icon"] = "Устанавливает позицию индикатора боя."
-L["Classbar Energy"] = "Текст энергии полосы класса"
-L["Show/hide the text with exact number of energy (Solar/Lunar or Demonic Fury) on your Classbar."] = "Показать/скрыть текст с точным значением энергии (Лунной/Солнечной или Демонической Ярости) на полосе класса."
-L["Classbar Offset"] = "Отступ полосы класса"
-L["This options will allow you to detach your classbar from player's frame and move it in other location."] = "Эти опции позволят вам открепить полосу класса от рамки игрока и передвинуть ее в другое место."
-L["Power Text Position"] = "Позиция текста ресурса"
-L["Position power text on this bar of chosen frame"] = "Позиционировать текст ресурса относительно выбранной полосы на каждой рамке"
+L["LFG Icons"] = "Иконки ЛФГ"
 L["Choose what icon set will unitframes and chat use."] = "Набор иконок для использования на рамках юнитов и в чате."
-
---Raid Manager--
-L["Options for customizing Blizzard Raid Manager \"O - > Raid\""] = "Опции настройки менеджера рейда \"О -> Рейд\""
-L["Show role icons"] = "Показывать иконки роли"
-L["Show level"] = "Показывать уровень"
-
-L["Enhanced Vehicle Bar"] = "Улучшенный контроль машин"
-L["A different look/feel vehicle bar based on work by Azilroka"] = "Использовать улучшенную панель управления средствами передвижения, основанную на коде Azilroka"
-
---Garrison--
-L["Auto Work Orders"] = "Автоматические заказы"
-L["Automatically queue maximum number of work orders available when visitin respected NPC."] = "Автоматически делать максимально возможное количество заказов при открытии соответствующего диалога."
-L["Auto Work Orders for Warmill"] = "Авто. заказы на фабрике"
-L["Automatically queue maximum number of work orders available for Warmill/Dwarven Bunker."] = "Автоматически делать максимальное количество заказов для военной фабрики/дворфийского бункера."
-L["Auto Work Orders for Trading Post"] = "Авто. заказы в торговой лавке"
-L["Automatically queue maximum number of work orders available for Trading Post."] = "Автоматически делать максимальное количество заказов для торговой лавки."
-L["Auto Work Orders for Shipyard"] = "Авто. заказы на верфи"
-L["Automatically queue maximum number of work orders available for Shipyard."] = "Автоматически делать максимальное количество заказов для верфи."
-
---Error Frame--
-L["Error Frame"] = "Фрейм ошибок"
-L["Set the width of Error Frame. Too narrow frame may cause messages to be split in several lines"] = "Устанавливает ширину фрейма ошибок. Если фрейм окажется слишком узким, текст будет разделен на несколько строк."
-L["Set the height of Error Frame. Higher frame can show more lines at once."] = "Устанавливает высоту фрейма ошибок. Чем выше фрейм, тем больше строк может быть показано одновременно."
-
---Quests--
-L["Rested"] = "Отдых"
+L["Offline Indicator"] = "Не в сети"
+L["Shows an icon on party or raid unitframes for people that are offline."] = "Показывает иконку на рамках членов группы или рейда, которые находятся не в сети"
+L["Texture"] = "Текстура"
+L["Statusbars"] = "Полосы состояния"
+L["Power Texture"] = "Текстура ресурса"
+L["Castbar Texture"] = "Текстура полосы заклинаний"
+L["Red Icon"] = "Красная иконка"
+L["Aura Bars Texture"] = "Текстура полос аур"
+L["Higher Overlay Portrait"] = "Наложение портрета над рамкой"
+L["Makes frame portrait visible regardles of health level when overlay portrait is set."] = "Делает портрет на этой рамке видимым не зависимо от кол-ва оставшегося здоровья при наложении."
+L["Classbar Texture"] = "Текстура классовой полосы"
+L["Resize Health Prediction"] = "Подогнать входящее исцеление"
+L["Slightly chages size of health prediction bars."] = "Немного изменяет размер полос входящего исцеления."
+
+
+--Viewport
+L["Viewport"] = true
+L["Left Offset"] = "Отступ слева"
+L["Set the offset from the left border of the screen."] = "Устаназвивает отступ от левого края экрана."
+L["Right Offset"] = "Отступ справа"
+L["Set the offset from the right border of the screen."] = "Устаназвивает отступ от правого края экрана."
+L["Top Offset"] = "Отступ сверху"
+L["Set the offset from the top border of the screen."] = "Устаназвивает отступ от верхнего края экрана."
+L["Bottom Offset"] = "Отступ снизу"
+L["Set the offset from the bottom border of the screen."] = "Устаназвивает отступ от нижнего края экрана."
+
+--Help
+L["SLE_DESC"] = [=[|cff9482c9Shadow & Light|r это расширение для ElvUI. Оно добавляет:
+- много новых функций
+- больше вариантов настройки для существующих опций
+
+|cff3cbf27Внимание:|r Оно совместимо с большинством существующих плагинов для ElvUI. Однако некоторые функции могут оказаться недоступными для избежания конфликтов.]=]
+L["Links"] = "ССылки"
+L["LINK_DESC"] = [[Ниже представлены ссылки на страницы Shadow & Light на нескольких сайтах.]]

 --FAQ--
-L["FAQ_DESC"] = "В этой секции представлены некоторые вопросы вопросы о ElvUI и Shadow & Light."
+L["FAQ_DESC"] = "Эта секция содержит некоторые вопросы о ElvUI и Shadow & Light."
 L["FAQ_Elv_1"] = [[|cff30ee30В: Где я могу получить поддержку по ElvUI?|r
-|cff9482c9О:|r Лучшим местом, чтобы задать вопрос или попросить о помощи, будет официальный форум - tukui.org/forums/
-Для сообщения об ошибке можно также воспользоваться тикет системой - git.tukui.org/Elv/elvui/issues]]
-L["FAQ_Elv_2"] = [[|cff30ee30В: Обязательно ли для этого знать английский?|r
-|cff9482c9О:|r Большая часть сообщений (включая гайды и ответы на вопросы) на форумах написаны на английском. Это официальный язык данного форума.
-Однако это не значит, что англйский - единственный используемый там язык: при желании можно найти сообщения на испанском, французском, немецком, русском, итальянском и т.д.
-При соблюдении простых правил приличия, никто не скажет слова против написания сообщений на вашем родном языке. Например, в заголовке темы тем или иным способом нужно указать язык самого сообщения.
-Тем не менее, ответ вам может все же поступить на английском, если текущий отвечающий не знаком в вашим собственным.]]
+|cff9482c9О:|r Лучше всего на официальном форуме - tukui.org/forums/
+Для сообщения об ошибках лучше использовать тикет треккер - git.tukui.org/Elv/elvui/issues]]
+L["FAQ_Elv_2"] = [[|cff30ee30В: Нужно ли мне для этого знать английский?|r
+|cff9482c9О:|r Английский является официальным языком на форумах tukui.org, так что большинство сообщений написано на нем.
+Но это не значит, что это единственный дозволенный язык. Вы можете найти сообщения на испанском, французском, немецком, русском, итальянском и других языках.
+Пока вы придерживаетесь простых правил приличия, никто не будет против сообщений на вашем родном языке. Например, вы можете указать язык сообщения в названии темы.
+Имейте ввиду, что вы все равно можете получить ответ на английском, т.к. отвечающи может не знать вашего языка.]]
 L["FAQ_Elv_3"] = [[|cff30ee30В: Что нужно указать при сообщении об ошибке?|r
 |cff9482c9О:|r Прежде всего убедитесь, что ошибка вызвана самим ElvUI.
 Для этого отключите все аддоны, кроме ElvUI и ElvUI_Config.
@@ -520,6 +749,16 @@ L["FAQ_Elv_3"] = [[|cff30ee30В: Что нужно указать при соо
 L["FAQ_Elv_4"] = [[|cff30ee30В: Почему некоторые опции не применяются на других персонажах, использующих тот же профиль?|r
 |cff9482c9О:|r В ElvUI есть несколько типов опций. Первые (profile) храняться в профиле, вторые (private) применимы только для текущего персонажа, третьи (global) применяются для всех персонажей не зависимо от профиля.
 Скорее всего в данном случае речь идет об опции второго типа.]]
+L["FAQ_Elv_5"] = [[|cff30ee30В: Какие команды чата есть в ElvUI?|r
+|cff9482c9О:|r У ElvUI есть множество команд с разным назначением. Напрмиер:
+/ec или /elvui - открывает окно настроек
+/bgstats - отображает специальные инфо-тексты полей боя, если вы на нем и уже успели скрыть их
+/hellokitty - Хотите няшный розовый интерфейс? Получите, распишитесь!
+/harlemshake - Нужна встряска? Да не вопрос!
+/luaerror - перегружает интерфейс в тестовый режим, предназначенный для адекватного сообщения об ошибках (см. вопрос 3)
+/egrid - Устанавливает размер сетки в режиме показа фиксаторов
+/moveui - Дает вам двигать элементы
+/resetui - Сбрасывает интерфейс на умолчания]]
 L["FAQ_sle_1"] = [[|cff30ee30В: Что делать, если я получаю сообщения об ошибках в Shadow & Light?|r
 |cff9482c9О:|r Примерно то же самое, что и для ElvUI (см. другой раздел справки).
 Только теперь понадобится еще и указать версию S&L.]]
@@ -534,10 +773,8 @@ L["FAQ_sle_5"] = [[|cff30ee30В: Как я могу связаться с авт
 |cff9482c9О:|r По очевидным причинам мы не раздаем свои контакты всем желающим. Так что лучшим методом являются форумы tukui.org.]]

 --Credits--
-L["Submodules and Coding:"] = "Субмодули и помощь с кодом:"
-L["Other Support:"] = "Прочая поддержка:"
-L["ELVUI_SLE_CREDITS"] = "Мы бы хотели отметить следующих людей, которые помогли нас сделать этот аддон посредством тестирования, кода и прочего."
-L["ELVUI_SLE_MISC"] = [=[BuG - за то, что он француз :D
+L["ELVUI_SLE_CREDITS"] = "Мы хотели бы отметить и поблагодарить следующих людей за помощь в создании этого аддона."
+L["ELVUI_SLE_MISC"] = [=[BuG - за постоянные и ржачные методы сломать все и вся
 TheSamaKutra
-Сообщество TukUI
+Сообщество Tukui
 ]=]
diff --git a/ElvUI_SLE/media/fonts/KellySlab.ttf b/ElvUI_SLE/media/fonts/KellySlab.ttf
new file mode 100644
index 0000000..2f0bd3d
Binary files /dev/null and b/ElvUI_SLE/media/fonts/KellySlab.ttf differ
diff --git a/ElvUI_SLE/media/fonts/Lobster.ttf b/ElvUI_SLE/media/fonts/Lobster.ttf
new file mode 100644
index 0000000..5e848bb
Binary files /dev/null and b/ElvUI_SLE/media/fonts/Lobster.ttf differ
diff --git a/ElvUI_SLE/media/fonts/Neucha.ttf b/ElvUI_SLE/media/fonts/Neucha.ttf
new file mode 100644
index 0000000..d495d83
Binary files /dev/null and b/ElvUI_SLE/media/fonts/Neucha.ttf differ
diff --git a/ElvUI_SLE/media/fonts/RussoOne.ttf b/ElvUI_SLE/media/fonts/RussoOne.ttf
new file mode 100644
index 0000000..ba83727
Binary files /dev/null and b/ElvUI_SLE/media/fonts/RussoOne.ttf differ
diff --git a/ElvUI_SLE/media/fonts/StalinistOne.ttf b/ElvUI_SLE/media/fonts/StalinistOne.ttf
new file mode 100644
index 0000000..86fc968
Binary files /dev/null and b/ElvUI_SLE/media/fonts/StalinistOne.ttf differ
diff --git a/ElvUI_SLE/media/fonts/UbuntuCondensed.ttf b/ElvUI_SLE/media/fonts/UbuntuCondensed.ttf
new file mode 100644
index 0000000..602a3ee
Binary files /dev/null and b/ElvUI_SLE/media/fonts/UbuntuCondensed.ttf differ
diff --git a/ElvUI_SLE/media/sharedmedia.lua b/ElvUI_SLE/media/sharedmedia.lua
index 2879bc0..9d7986e 100644
--- a/ElvUI_SLE/media/sharedmedia.lua
+++ b/ElvUI_SLE/media/sharedmedia.lua
@@ -11,10 +11,22 @@ LSM:Register("sound", "Sheep", [[Interface\AddOns\ElvUI_SLE\media\sounds\sheep.m

 --Darth's additions
 LSM:Register("font", "Buffet Script", [[Interface\AddOns\ElvUI_SLE\media\fonts\Buffet_Script.ttf]])
-LSM:Register("font", "Old Cyrillic", [[Interface\AddOns\ElvUI_SLE\media\fonts\cyrillic_old.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
 LSM:Register("font", "Durandal Light", [[Interface\AddOns\ElvUI_SLE\media\fonts\Durandal_Light.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
-LSM:Register("font", "Trafaret", [[Interface\AddOns\ElvUI_SLE\media\fonts\Trafaret.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
 LSM:Register("font", "Intro Black", [[Interface\AddOns\ElvUI_SLE\media\fonts\Intro_Black.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
-LSM:Register("font", "Univers", [[Interface\AddOns\ElvUI_SLE\media\fonts\Univers.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
+LSM:Register("font", "KellySlab", [[Interface\AddOns\ElvUI_SLE\media\fonts\KellySlab.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
+LSM:Register("font", "Lobster", [[Interface\AddOns\ElvUI_SLE\media\fonts\Lobster.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
+LSM:Register("font", "Neucha", [[Interface\AddOns\ElvUI_SLE\media\fonts\Neucha.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
+LSM:Register("font", "Old Cyrillic", [[Interface\AddOns\ElvUI_SLE\media\fonts\cyrillic_old.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
 LSM:Register("font", "Rubino", [[Interface\AddOns\ElvUI_SLE\media\fonts\Rubino_Plain.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
-LSM:Register("sound", "It's The Gri...", [[Interface\AddOns\ElvUI_SLE\media\sounds\TheGrCorpus.mp3]])
\ No newline at end of file
+LSM:Register("font", "RussoOne", [[Interface\AddOns\ElvUI_SLE\media\fonts\RussoOne.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
+LSM:Register("font", "StalinistOne", [[Interface\AddOns\ElvUI_SLE\media\fonts\StalinistOne.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
+LSM:Register("font", "Trafaret", [[Interface\AddOns\ElvUI_SLE\media\fonts\Trafaret.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
+LSM:Register("font", "UbuntuCondensed", [[Interface\AddOns\ElvUI_SLE\media\fonts\UbuntuCondensed.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
+LSM:Register("font", "Univers", [[Interface\AddOns\ElvUI_SLE\media\fonts\Univers.ttf]], LSM.LOCALE_BIT_ruRU + LSM.LOCALE_BIT_western)
+LSM:Register("sound", "It's The Gri...", [[Interface\AddOns\ElvUI_SLE\media\sounds\TheGrCorpus.mp3]])
+LSM:Register('statusbar','BuiOnePixel', [[Interface\AddOns\ElvUI_SLE\media\textures\BuiOnePixel.tga]])
+LSM:Register('statusbar','Ohi Dragon', [[Interface\AddOns\ElvUI_SLE\media\textures\Ohi_Dragon.blp]])
+LSM:Register('statusbar','Ohi Dragon2', [[Interface\AddOns\ElvUI_SLE\media\textures\Ohi_Dragon2.blp]])
+LSM:Register('statusbar','Ohi MetalPlate', [[Interface\AddOns\ElvUI_SLE\media\textures\Ohi_MetalPlate.blp]])
+LSM:Register('statusbar','Ohi MetalSheet', [[Interface\AddOns\ElvUI_SLE\media\textures\Ohi_MetalSheet.blp]])
+LSM:Register('statusbar','Ohi Tribal4', [[Interface\AddOns\ElvUI_SLE\media\textures\Ohi_Tribal4.blp]])
\ No newline at end of file
diff --git a/ElvUI_SLE/media/textures/Achievement_small.blp b/ElvUI_SLE/media/textures/Achievement_small.blp
new file mode 100644
index 0000000..25fc489
Binary files /dev/null and b/ElvUI_SLE/media/textures/Achievement_small.blp differ
diff --git a/ElvUI_SLE/media/textures/BuiOnePixel.tga b/ElvUI_SLE/media/textures/BuiOnePixel.tga
new file mode 100644
index 0000000..6f04d3d
Binary files /dev/null and b/ElvUI_SLE/media/textures/BuiOnePixel.tga differ
diff --git a/ElvUI_SLE/media/textures/Chat_RPG.blp b/ElvUI_SLE/media/textures/Chat_RPG.blp
deleted file mode 100644
index dd14dce..0000000
Binary files a/ElvUI_SLE/media/textures/Chat_RPG.blp and /dev/null differ
diff --git a/ElvUI_SLE/media/textures/Daily.blp b/ElvUI_SLE/media/textures/Daily.blp
new file mode 100644
index 0000000..e57de48
Binary files /dev/null and b/ElvUI_SLE/media/textures/Daily.blp differ
diff --git a/ElvUI_SLE/media/textures/Factions.blp b/ElvUI_SLE/media/textures/Factions.blp
new file mode 100644
index 0000000..2474372
Binary files /dev/null and b/ElvUI_SLE/media/textures/Factions.blp differ
diff --git a/ElvUI_SLE/media/textures/Flightmaster.blp b/ElvUI_SLE/media/textures/Flightmaster.blp
new file mode 100644
index 0000000..d319c2a
Binary files /dev/null and b/ElvUI_SLE/media/textures/Flightmaster.blp differ
diff --git a/ElvUI_SLE/media/textures/Legendary.blp b/ElvUI_SLE/media/textures/Legendary.blp
new file mode 100644
index 0000000..102834a
Binary files /dev/null and b/ElvUI_SLE/media/textures/Legendary.blp differ
diff --git a/ElvUI_SLE/media/textures/NewQuestMinimize.blp b/ElvUI_SLE/media/textures/NewQuestMinimize.blp
new file mode 100644
index 0000000..6add25d
Binary files /dev/null and b/ElvUI_SLE/media/textures/NewQuestMinimize.blp differ
diff --git a/ElvUI_SLE/media/textures/Ohi_Dragon.blp b/ElvUI_SLE/media/textures/Ohi_Dragon.blp
new file mode 100644
index 0000000..478a75e
Binary files /dev/null and b/ElvUI_SLE/media/textures/Ohi_Dragon.blp differ
diff --git a/ElvUI_SLE/media/textures/Ohi_Dragon2.blp b/ElvUI_SLE/media/textures/Ohi_Dragon2.blp
new file mode 100644
index 0000000..0391e52
Binary files /dev/null and b/ElvUI_SLE/media/textures/Ohi_Dragon2.blp differ
diff --git a/ElvUI_SLE/media/textures/Ohi_MetalPlate.blp b/ElvUI_SLE/media/textures/Ohi_MetalPlate.blp
new file mode 100644
index 0000000..3033196
Binary files /dev/null and b/ElvUI_SLE/media/textures/Ohi_MetalPlate.blp differ
diff --git a/ElvUI_SLE/media/textures/Ohi_MetalSheet.blp b/ElvUI_SLE/media/textures/Ohi_MetalSheet.blp
new file mode 100644
index 0000000..252863f
Binary files /dev/null and b/ElvUI_SLE/media/textures/Ohi_MetalSheet.blp differ
diff --git a/ElvUI_SLE/media/textures/Ohi_Tribal4.blp b/ElvUI_SLE/media/textures/Ohi_Tribal4.blp
new file mode 100644
index 0000000..f6175fc
Binary files /dev/null and b/ElvUI_SLE/media/textures/Ohi_Tribal4.blp differ
diff --git a/ElvUI_SLE/media/textures/Portal_Blue.blp b/ElvUI_SLE/media/textures/Portal_Blue.blp
new file mode 100644
index 0000000..87b9a57
Binary files /dev/null and b/ElvUI_SLE/media/textures/Portal_Blue.blp differ
diff --git a/ElvUI_SLE/media/textures/Portal_Red.blp b/ElvUI_SLE/media/textures/Portal_Red.blp
new file mode 100644
index 0000000..ce0daa8
Binary files /dev/null and b/ElvUI_SLE/media/textures/Portal_Red.blp differ
diff --git a/ElvUI_SLE/media/textures/Quest.blp b/ElvUI_SLE/media/textures/Quest.blp
new file mode 100644
index 0000000..1c348d5
Binary files /dev/null and b/ElvUI_SLE/media/textures/Quest.blp differ
diff --git a/ElvUI_SLE/media/textures/SVUI-StateIcon.blp b/ElvUI_SLE/media/textures/SVUI-StateIcon.blp
new file mode 100644
index 0000000..feadfb4
Binary files /dev/null and b/ElvUI_SLE/media/textures/SVUI-StateIcon.blp differ
diff --git a/ElvUI_SLE/media/textures/Skull.blp b/ElvUI_SLE/media/textures/Skull.blp
new file mode 100644
index 0000000..7457846
Binary files /dev/null and b/ElvUI_SLE/media/textures/Skull.blp differ
diff --git a/ElvUI_SLE/media/textures/Skull_Event.blp b/ElvUI_SLE/media/textures/Skull_Event.blp
new file mode 100644
index 0000000..a31397c
Binary files /dev/null and b/ElvUI_SLE/media/textures/Skull_Event.blp differ
diff --git a/ElvUI_SLE/media/textures/Swords.blp b/ElvUI_SLE/media/textures/Swords.blp
new file mode 100644
index 0000000..cc142d2
Binary files /dev/null and b/ElvUI_SLE/media/textures/Swords.blp differ
diff --git a/ElvUI_SLE/media/textures/Swords_Event.blp b/ElvUI_SLE/media/textures/Swords_Event.blp
new file mode 100644
index 0000000..58e7e62
Binary files /dev/null and b/ElvUI_SLE/media/textures/Swords_Event.blp differ
diff --git a/ElvUI_SLE/media/textures/WH.blp b/ElvUI_SLE/media/textures/WH.blp
deleted file mode 100644
index 1771156..0000000
Binary files a/ElvUI_SLE/media/textures/WH.blp and /dev/null differ
diff --git a/ElvUI_SLE/media/textures/Weekly.blp b/ElvUI_SLE/media/textures/Weekly.blp
new file mode 100644
index 0000000..7a08e12
Binary files /dev/null and b/ElvUI_SLE/media/textures/Weekly.blp differ
diff --git a/ElvUI_SLE/media/textures/adapt.blp b/ElvUI_SLE/media/textures/adapt.blp
deleted file mode 100644
index 0fd4e13..0000000
Binary files a/ElvUI_SLE/media/textures/adapt.blp and /dev/null differ
diff --git a/ElvUI_SLE/media/textures/bl_logo.blp b/ElvUI_SLE/media/textures/bl_logo.blp
deleted file mode 100644
index cab0b43..0000000
Binary files a/ElvUI_SLE/media/textures/bl_logo.blp and /dev/null differ
diff --git a/ElvUI_SLE/media/textures/chat_1.blp b/ElvUI_SLE/media/textures/chat_1.blp
deleted file mode 100644
index 27824a9..0000000
Binary files a/ElvUI_SLE/media/textures/chat_1.blp and /dev/null differ
diff --git a/ElvUI_SLE/media/textures/outfitter.blp b/ElvUI_SLE/media/textures/outfitter.blp
deleted file mode 100644
index 275818a..0000000
Binary files a/ElvUI_SLE/media/textures/outfitter.blp and /dev/null differ
diff --git a/ElvUI_SLE/modules/AddOnSkins.lua b/ElvUI_SLE/modules/AddOnSkins.lua
index 008ac55..f3644a4 100644
--- a/ElvUI_SLE/modules/AddOnSkins.lua
+++ b/ElvUI_SLE/modules/AddOnSkins.lua
@@ -1,36 +1,41 @@
 if not AddOnSkins then return end
 local AS = unpack(AddOnSkins)
 local E = unpack(ElvUI)
+local _G = _G
+local floor = floor
+local UnitAffectingCombat = UnitAffectingCombat
+local IsAddOnLoaded = IsAddOnLoaded
+local select = select

 function AS:EmbedSystem_WindowResize()
 	if UnitAffectingCombat('player') or not AS.EmbedSystemCreated then return end
-	local ChatPanel = AS:CheckOption('EmbedRightChat') and RightChatPanel or LeftChatPanel
-	local ChatTab = AS:CheckOption('EmbedRightChat') and RightChatTab or LeftChatTab
-	local ChatData = AS:CheckOption('EmbedRightChat') and RightChatDataPanel or LeftChatDataPanel
-	local TopLeft = ChatData == RightChatDataPanel and (E.db.datatexts.rightChatPanel and 'TOPLEFT' or 'BOTTOMLEFT') or ChatData == LeftChatDataPanel and (E.db.datatexts.leftChatPanel and 'TOPLEFT' or 'BOTTOMLEFT')
-	local yOffset = (ChatData == RightChatDataPanel and E.db.datatexts.rightChatPanel and (E.PixelMode and 1 or 0)) or (ChatData == LeftChatDataPanel and E.db.datatexts.leftChatPanel and (E.PixelMode and 1 or 0)) or (E.PixelMode and 0 or -1)
+	local ChatPanel = AS:CheckOption('EmbedRightChat') and _G["RightChatPanel"] or _G["LeftChatPanel"]
+	local ChatTab = AS:CheckOption('EmbedRightChat') and _G["RightChatTab"] or _G["LeftChatTab"]
+	local ChatData = AS:CheckOption('EmbedRightChat') and _G["RightChatDataPanel"] or _G["LeftChatDataPanel"]
+	local TopLeft = ChatData == _G["RightChatDataPanel"] and (E.db.datatexts.rightChatPanel and 'TOPLEFT' or 'BOTTOMLEFT') or ChatData == _G["LeftChatDataPanel"] and (E.db.datatexts.leftChatPanel and 'TOPLEFT' or 'BOTTOMLEFT')
+	local yOffset = (ChatData == _G["RightChatDataPanel"] and E.db.datatexts.rightChatPanel and (1 - E.Spacing)) or (ChatData == _G["LeftChatDataPanel"] and E.db.datatexts.leftChatPanel and (1 - E.Spacing)) or (-E.Spacing)

-	EmbedSystem_MainWindow:SetParent(ChatPanel)
-	EmbedSystem_MainWindow:ClearAllPoints()
+	_G["EmbedSystem_MainWindow"]:SetParent(ChatPanel)
+	_G["EmbedSystem_MainWindow"]:ClearAllPoints()

-	if E.db.sle.datatext.chathandle then
+	if E.db.sle.datatexts.chathandle then
 		local xOffset, yOffset = select(4, ChatTab:GetPoint())
-		EmbedSystem_MainWindow:SetPoint('BOTTOMLEFT', ChatPanel, 'BOTTOMLEFT', -xOffset, -yOffset)
+		_G["EmbedSystem_MainWindow"]:SetPoint('BOTTOMLEFT', ChatPanel, 'BOTTOMLEFT', -xOffset, -yOffset)
 	else
-		EmbedSystem_MainWindow:SetPoint('BOTTOMLEFT', ChatData, TopLeft, 0, yOffset)
+		_G["EmbedSystem_MainWindow"]:SetPoint('BOTTOMLEFT', ChatData, TopLeft, 0, yOffset)
 	end

-	EmbedSystem_MainWindow:SetPoint('TOPRIGHT', ChatTab, AS:CheckOption('EmbedBelowTop') and 'BOTTOMRIGHT' or 'TOPRIGHT', 0, AS:CheckOption('EmbedBelowTop') and -1 or 0)
+	_G["EmbedSystem_MainWindow"]:SetPoint('TOPRIGHT', ChatTab, AS:CheckOption('EmbedBelowTop') and 'BOTTOMRIGHT' or 'TOPRIGHT', 0, AS:CheckOption('EmbedBelowTop') and -1 or 0)

-	EmbedSystem_LeftWindow:SetSize(AS:CheckOption('EmbedLeftWidth'), EmbedSystem_MainWindow:GetHeight())
-	EmbedSystem_RightWindow:SetSize((EmbedSystem_MainWindow:GetWidth() - AS:CheckOption('EmbedLeftWidth')) - 1, EmbedSystem_MainWindow:GetHeight())
+	_G["EmbedSystem_LeftWindow"]:SetSize(AS:CheckOption('EmbedLeftWidth'), _G["EmbedSystem_MainWindow"]:GetHeight())
+	_G["EmbedSystem_RightWindow"]:SetSize((_G["EmbedSystem_MainWindow"]:GetWidth() - AS:CheckOption('EmbedLeftWidth')) - 1, _G["EmbedSystem_MainWindow"]:GetHeight())

-	EmbedSystem_LeftWindow:SetPoint('LEFT', EmbedSystem_MainWindow, 'LEFT', 0, 0)
-	EmbedSystem_RightWindow:SetPoint('RIGHT', EmbedSystem_MainWindow, 'RIGHT', 0, 0)
+	_G["EmbedSystem_LeftWindow"]:SetPoint('LEFT', _G["EmbedSystem_MainWindow"], 'LEFT', 0, 0)
+	_G["EmbedSystem_RightWindow"]:SetPoint('RIGHT', _G["EmbedSystem_MainWindow"], 'RIGHT', 0, 0)

 	-- Dynamic Range
 	if IsAddOnLoaded('ElvUI_Config') then
-		E.Options.args.addonskins.args.embed.args.EmbedLeftWidth.min = floor(EmbedSystem_MainWindow:GetWidth() * .25)
-		E.Options.args.addonskins.args.embed.args.EmbedLeftWidth.max = floor(EmbedSystem_MainWindow:GetWidth() * .75)
+		E.Options.args.addonskins.args.embed.args.EmbedLeftWidth.min = floor(_G["EmbedSystem_MainWindow"]:GetWidth() * .25)
+		E.Options.args.addonskins.args.embed.args.EmbedLeftWidth.max = floor(_G["EmbedSystem_MainWindow"]:GetWidth() * .75)
 	end
 end
diff --git a/ElvUI_SLE/modules/Armory/CharacterArmory/CharacterArmory.lua b/ElvUI_SLE/modules/Armory/CharacterArmory/CharacterArmory.lua
index 802d284..5244839 100644
--- a/ElvUI_SLE/modules/Armory/CharacterArmory/CharacterArmory.lua
+++ b/ElvUI_SLE/modules/Armory/CharacterArmory/CharacterArmory.lua
@@ -2,16 +2,43 @@ if select(2, GetAddOnInfo('ElvUI_KnightFrame')) and IsAddOnLoaded('ElvUI_KnightF

 local E, L, V, P, G = unpack(ElvUI)
 local KF, Info, Timer = unpack(ElvUI_KnightFrame)
+local _G = _G
+
+local format = format

 --------------------------------------------------------------------------------
 --<< KnightFrame : Upgrade Character Frame's Item Info like Wow-Armory		>>--
 --------------------------------------------------------------------------------
 local CA = CharacterArmory or CreateFrame('Frame', 'CharacterArmory', PaperDollFrame)

-local IsGemType = select(8, GetAuctionItemClasses())
+local IsGemType = LE_ITEM_CLASS_GEM
 local SlotIDList = {}
 local InsetDefaultPoint = { CharacterFrameInsetRight:GetPoint() }
-local ExpandButtonDefaultPoint = { CharacterFrameExpandButton:GetPoint() }
+
+local linkCache = {};
+
+function GetInventoryItemGems(slot)
+	local link = GetInventoryItemLink("player", slot);
+
+	if (link and linkCache[link]) then
+		return unpack(linkCache[link]);
+	end
+
+	local gem1, gem2, gem3, gem4;
+
+	if (link) then
+		gem1, gem2, gem3, gem4 = select(7, string.find(link, "|?c?f?f?(%x*)|?H?([^:]*):?(%d+):?(%d*):?(%d*):?(%d*):?(%d*):?(%d*):?(%-?%d*):?(%-?%d*):?(%d*):?(%d*)|?h?%[?([^%[%]]*)%]?|?h?|?r?"));
+		if (gem1 == "") then gem1 = nil; end
+		if (gem2 == "") then gem2 = nil; end
+		if (gem3 == "") then gem3 = nil; end
+		if (gem4 == "") then gem4 = nil; end
+		linkCache[link] = {gem1, gem2, gem3, gem4};
+	end
+
+
+
+	return gem1, gem2, gem3, gem4;
+end

 do --<< Button Script >>--
 	function CA:OnEnter()
@@ -59,11 +86,11 @@ do --<< Button Script >>--
 				end
 			else
 				GameTooltip:ClearLines()
-				GameTooltip:AddLine('|cffffffff'..Parent.GemItemID)
+				GameTooltip:AddLine("|cffffffff"..Parent.GemItemID)
 			end
 		elseif Parent.GemType then
 			GameTooltip:ClearLines()
-			GameTooltip:AddLine('|cffffffff'.._G['EMPTY_SOCKET_'..Parent.GemType])
+			GameTooltip:AddLine("|cffffffff".._G["EMPTY_SOCKET_"..Parent.GemType])
 		end

 		GameTooltip:Show()
@@ -182,10 +209,8 @@ function CA:Setup_CharacterArmory()
 			CharacterFrame:SetWidth(PANEL_DEFAULT_WIDTH)
 		elseif Info.CharacterArmory_Activate and frameType == 'PaperDollFrame' then
 			CharacterFrameInsetRight:SetPoint('TOPLEFT', CharacterFrameInset, 'TOPRIGHT', 110, 0)
-			CharacterFrameExpandButton:SetPoint('BOTTOMRIGHT', CharacterFrameInsetRight, 'BOTTOMLEFT', 0, 1)
 		else
 			CharacterFrameInsetRight:SetPoint(unpack(InsetDefaultPoint))
-			CharacterFrameExpandButton:SetPoint(unpack(ExpandButtonDefaultPoint))
 		end
 	end)
 	hooksecurefunc('PaperDollFrame_SetLevel', function()
@@ -207,8 +232,8 @@ function CA:Setup_CharacterArmory()

 	--<< Background >>--
 	self.BG = self:CreateTexture(nil, 'OVERLAY')
-	self.BG:SetPoint('TOPLEFT', self, -7, -20)
-	self.BG:SetPoint('BOTTOMRIGHT', self, 7, 2)
+	self.BG:SetPoint('TOPLEFT', self)
+	self.BG:SetPoint('BOTTOMRIGHT', self)
 	self:Update_BG()

 	--<< Change Model Frame's frameLevel >>--
@@ -217,7 +242,7 @@ function CA:Setup_CharacterArmory()
 	--<< Average Item Level >>--
 	KF:TextSetting(self, nil, { Tag = 'AverageItemLevel', FontSize = 12 }, 'BOTTOM', CharacterModelFrame, 'TOP', 0, 14)
 	local function ValueColorUpdate()
-		self.AverageItemLevel:SetText(KF:Color_Value(L['Average'])..' : '..format('%.2f', select(2, GetAverageItemLevel())))
+		self.AverageItemLevel:SetText(KF:Color_Value(L["Average"])..' : '..format('%.2f', select(2, GetAverageItemLevel())))
 	end
 	E.valueColorUpdateFuncs[ValueColorUpdate] = true

@@ -230,10 +255,10 @@ function CA:Setup_CharacterArmory()
 		Slot:SetFrameLevel(CharacterModelFrame:GetFrameLevel() + 1)
 		Slot.Direction = i%2 == 1 and 'LEFT' or 'RIGHT'
 		Slot.ID, Slot.EmptyTexture = GetInventorySlotInfo(SlotName)
-		Slot:Point(Slot.Direction, _G['Character'..SlotName], Slot.Direction == 'LEFT' and -1 or 1, 0)
+		Slot:Point(Slot.Direction, _G["Character"..SlotName], Slot.Direction == 'LEFT' and -1 or 1, 0)

 		-- Grow each equipment slot's frame level
-		_G['Character'..SlotName]:SetFrameLevel(Slot:GetFrameLevel() + 1)
+		_G["Character"..SlotName]:SetFrameLevel(Slot:GetFrameLevel() + 1)

 		-- Gradation
 		Slot.Gradation = Slot:CreateTexture(nil, 'OVERLAY')
@@ -256,7 +281,7 @@ function CA:Setup_CharacterArmory()
 				FontSize = E.db.sle.Armory.Character.Level.FontSize,
 				FontStyle = E.db.sle.Armory.Character.Level.FontStyle,
 				directionH = Slot.Direction
-			}, 'TOP'..Slot.Direction, _G['Character'..SlotName], 'TOP'..(Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 2 or -2, -1)
+			}, 'TOP'..Slot.Direction, _G["Character"..SlotName], 'TOP'..(Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 2 or -2, -1)

 			if E.db.sle.Armory.Character.Level.Display == 'Hide' then
 				Slot.ItemLevel:Hide()
@@ -268,7 +293,7 @@ function CA:Setup_CharacterArmory()
 				FontSize = E.db.sle.Armory.Character.Enchant.FontSize,
 				FontStyle = E.db.sle.Armory.Character.Enchant.FontStyle,
 				directionH = Slot.Direction
-			}, Slot.Direction, _G['Character'..SlotName], Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT', Slot.Direction == 'LEFT' and 2 or -2, 1)
+			}, Slot.Direction, _G["Character"..SlotName], Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT', Slot.Direction == 'LEFT' and 2 or -2, 1)

 			if E.db.sle.Armory.Character.Enchant.Display == 'Hide' then
 				Slot.ItemEnchant:Hide()
@@ -289,43 +314,43 @@ function CA:Setup_CharacterArmory()
 				FontSize = E.db.sle.Armory.Character.Durability.FontSize,
 				FontStyle = E.db.sle.Armory.Character.Durability.FontStyle,
 				directionH = Slot.Direction
-			}, 'BOTTOM'..Slot.Direction, _G['Character'..SlotName], 'BOTTOM'..(Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 2 or -2, 3)
+			}, 'BOTTOM'..Slot.Direction, _G["Character"..SlotName], 'BOTTOM'..(Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 2 or -2, 3)

 			-- Gem Socket
 			for i = 1, MAX_NUM_SOCKETS do
-				Slot['Socket'..i] = CreateFrame('Frame', nil, Slot)
-				Slot['Socket'..i]:Size(E.db.sle.Armory.Character.Gem.SocketSize)
-				Slot['Socket'..i]:SetBackdrop({
+				Slot["Socket"..i] = CreateFrame('Frame', nil, Slot)
+				Slot["Socket"..i]:Size(E.db.sle.Armory.Character.Gem.SocketSize)
+				Slot["Socket"..i]:SetBackdrop({
 					bgFile = E.media.blankTex,
 					edgeFile = E.media.blankTex,
 					tile = false, tileSize = 0, edgeSize = E.mult,
 					insets = { left = 0, right = 0, top = 0, bottom = 0}
 				})
-				Slot['Socket'..i]:SetBackdropColor(0, 0, 0, 1)
-				Slot['Socket'..i]:SetBackdropBorderColor(0, 0, 0)
-				Slot['Socket'..i]:SetFrameLevel(CharacterModelFrame:GetFrameLevel() + 1)
+				Slot["Socket"..i]:SetBackdropColor(0, 0, 0, 1)
+				Slot["Socket"..i]:SetBackdropBorderColor(0, 0, 0)
+				Slot["Socket"..i]:SetFrameLevel(CharacterModelFrame:GetFrameLevel() + 1)

-				Slot['Socket'..i].SlotName = SlotName
-				Slot['Socket'..i].SocketNumber = i
+				Slot["Socket"..i].SlotName = SlotName
+				Slot["Socket"..i].SocketNumber = i

-				Slot['Socket'..i].Socket = CreateFrame('Button', nil, Slot['Socket'..i])
-				Slot['Socket'..i].Socket:SetBackdrop({
+				Slot["Socket"..i].Socket = CreateFrame('Button', nil, Slot["Socket"..i])
+				Slot["Socket"..i].Socket:SetBackdrop({
 					bgFile = E.media.blankTex,
 					edgeFile = E.media.blankTex,
 					tile = false, tileSize = 0, edgeSize = E.mult,
 					insets = { left = 0, right = 0, top = 0, bottom = 0}
 				})
-				Slot['Socket'..i].Socket:SetInside()
-				Slot['Socket'..i].Socket:SetFrameLevel(Slot['Socket'..i]:GetFrameLevel() + 1)
-				Slot['Socket'..i].Socket:RegisterForClicks('AnyUp')
-				Slot['Socket'..i].Socket:SetScript('OnEnter', self.OnEnter)
-				Slot['Socket'..i].Socket:SetScript('OnLeave', self.OnLeave)
-				Slot['Socket'..i].Socket:SetScript('OnClick', self.GemSocket_OnClick)
-				Slot['Socket'..i].Socket:SetScript('OnReceiveDrag', self.GemSocket_OnRecieveDrag)
+				Slot["Socket"..i].Socket:SetInside()
+				Slot["Socket"..i].Socket:SetFrameLevel(Slot["Socket"..i]:GetFrameLevel() + 1)
+				Slot["Socket"..i].Socket:RegisterForClicks('AnyUp')
+				Slot["Socket"..i].Socket:SetScript('OnEnter', self.OnEnter)
+				Slot["Socket"..i].Socket:SetScript('OnLeave', self.OnLeave)
+				Slot["Socket"..i].Socket:SetScript('OnClick', self.GemSocket_OnClick)
+				Slot["Socket"..i].Socket:SetScript('OnReceiveDrag', self.GemSocket_OnRecieveDrag)

-				Slot['Socket'..i].Texture = Slot['Socket'..i].Socket:CreateTexture(nil, 'OVERLAY')
-				Slot['Socket'..i].Texture:SetTexCoord(.1, .9, .1, .9)
-				Slot['Socket'..i].Texture:SetInside()
+				Slot["Socket"..i].Texture = Slot["Socket"..i].Socket:CreateTexture(nil, 'OVERLAY')
+				Slot["Socket"..i].Texture:SetTexCoord(.1, .9, .1, .9)
+				Slot["Socket"..i].Texture:SetInside()
 			end
 			Slot.Socket2:Point(Slot.Direction, Slot.Socket1, Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT', Slot.Direction == 'LEFT' and 1 or -1, 0)
 			Slot.Socket3:Point(Slot.Direction, Slot.Socket2, Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT', Slot.Direction == 'LEFT' and 1 or -1, 0)
@@ -411,13 +436,13 @@ function CA:Update_Durability()
 			Slot.Durability:SetFormattedText("%s%.0f%%|r", E:RGBToHex(R, G, B), (CurrentDurability / MaxDurability) * 100)

 			if (E.db.sle.Armory.Character.Durability.Display == 'MouseoverOnly' and not Slot:IsMouseOver()) or E.db.sle.Armory.Character.Durability.Display == 'Hide' then
-				Slot.Socket1:Point('BOTTOM'..Slot.Direction, _G['Character'..SlotName], 'BOTTOM'..(Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 2 or -2, 2)
+				Slot.Socket1:Point('BOTTOM'..Slot.Direction, _G["Character"..SlotName], 'BOTTOM'..(Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 2 or -2, 2)
 			else
 				Slot.Socket1:Point('BOTTOM'..Slot.Direction, Slot.Durability, 'BOTTOM'..(Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Durability:GetText() and (Slot.Direction == 'LEFT' and 3 or -1) or 0, Slot.Durability:GetText() and -1 or 0)
 			end
 		elseif Slot.Durability then
 			Slot.Durability:SetText('')
-			Slot.Socket1:Point('BOTTOM'..Slot.Direction, _G['Character'..SlotName], 'BOTTOM'..(Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 3 or -3, 3)
+			Slot.Socket1:Point('BOTTOM'..Slot.Direction, _G["Character"..SlotName], 'BOTTOM'..(Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 3 or -3, 3)
 		end
 	end

@@ -465,11 +490,11 @@ function CA:Update_Gear()
 				Slot.IsEnchanted = nil
 				Slot.ItemEnchant:SetText(nil)
 				for i = 1, MAX_NUM_SOCKETS do
-					Slot['Socket'..i].Texture:SetTexture(nil)
-					Slot['Socket'..i].Socket.Link = nil
-					Slot['Socket'..i].GemItemID = nil
-					Slot['Socket'..i].GemType = nil
-					Slot['Socket'..i]:Hide()
+					Slot["Socket"..i].Texture:SetTexture(nil)
+					Slot["Socket"..i].Socket.Link = nil
+					Slot["Socket"..i].GemItemID = nil
+					Slot["Socket"..i].GemType = nil
+					Slot["Socket"..i]:Hide()
 				end
 				Slot.EnchantWarning:Hide()
 				Slot.EnchantWarning.Message = nil
@@ -501,11 +526,11 @@ function CA:Update_Gear()

 						-- First, Counting default gem sockets
 						for i = 1, MAX_NUM_SOCKETS do
-							ItemTexture = _G['Knight_CharacterArmory_ScanTTTexture'..i]:GetTexture()
+							ItemTexture = _G["Knight_CharacterArmory_ScanTTTexture"..i]:GetTexture()

 							if ItemTexture and ItemTexture:find('Interface\\ItemSocketingFrame\\') then
 								GemCount_Default = GemCount_Default + 1
-								Slot['Socket'..GemCount_Default].GemType = strupper(gsub(ItemTexture, 'Interface\\ItemSocketingFrame\\UI--EmptySocket--', ''))
+								Slot["Socket"..GemCount_Default].GemType = strupper(gsub(ItemTexture, 'Interface\\ItemSocketingFrame\\UI--EmptySocket--', ''))
 							end
 						end

@@ -516,7 +541,7 @@ function CA:Update_Gear()
 							((SlotName == 'WristSlot' or SlotName == 'HandsSlot') and self.PlayerProfession.BlackSmithing and self.PlayerProfession.BlackSmithing >= 550) then -- BlackSmith

 							GemCount_Enable = GemCount_Enable + 1
-							Slot['Socket'..GemCount_Enable].GemType = 'PRISMATIC'
+							Slot["Socket'..GemCount_Enable].GemType = 'PRISMATIC'
 						end
 						]]

@@ -525,34 +550,34 @@ function CA:Update_Gear()

 						-- Apply current item's gem setting
 						for i = 1, MAX_NUM_SOCKETS do
-							ItemTexture = _G['Knight_CharacterArmory_ScanTTTexture'..i]:GetTexture()
+							ItemTexture = _G["Knight_CharacterArmory_ScanTTTexture"..i]:GetTexture()
 							GemID = select(i, GetInventoryItemGems(Slot.ID))

-							if Slot['Socket'..i].GemType and Info.Armory_Constants.GemColor[Slot['Socket'..i].GemType] then
-								R, G, B = unpack(Info.Armory_Constants.GemColor[Slot['Socket'..i].GemType])
-								Slot['Socket'..i].Socket:SetBackdropColor(R, G, B, .5)
-								Slot['Socket'..i].Socket:SetBackdropBorderColor(R, G, B)
+							if Slot["Socket"..i].GemType and Info.Armory_Constants.GemColor[Slot["Socket"..i].GemType] then
+								R, G, B = unpack(Info.Armory_Constants.GemColor[Slot["Socket"..i].GemType])
+								Slot["Socket"..i].Socket:SetBackdropColor(R, G, B, .5)
+								Slot["Socket"..i].Socket:SetBackdropBorderColor(R, G, B)
 							else
-								Slot['Socket'..i].Socket:SetBackdropColor(1, 1, 1, .5)
-								Slot['Socket'..i].Socket:SetBackdropBorderColor(1, 1, 1)
+								Slot["Socket"..i].Socket:SetBackdropColor(1, 1, 1, .5)
+								Slot["Socket"..i].Socket:SetBackdropBorderColor(1, 1, 1)
 							end

 							if ItemTexture or GemID then
 								if E.db.sle.Armory.Character.Gem.Display == 'Always' or E.db.sle.Armory.Character.Gem.Display == 'MouseoverOnly' and Slot.Mouseovered or E.db.sle.Armory.Character.Gem.Display == 'MissingOnly' then
-									Slot['Socket'..i]:Show()
-									Slot.SocketWarning:Point(Slot.Direction, Slot['Socket'..i], (Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 3 or -3, 0)
+									Slot["Socket"..i]:Show()
+									Slot.SocketWarning:Point(Slot.Direction, Slot["Socket"..i], (Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 3 or -3, 0)
 								end

 								GemCount_Now = GemCount_Now + 1

 								if GemID then
 									GemCount = GemCount + 1
-									Slot['Socket'..i].GemItemID = GemID
+									Slot["Socket"..i].GemItemID = GemID

-									_, Slot['Socket'..i].Socket.Link, _, _, _, _, _, _, _, ItemTexture = GetItemInfo(GemID)
+									_, Slot["Socket"..i].Socket.Link, _, _, _, _, _, _, _, ItemTexture = GetItemInfo(GemID)

 									if ItemTexture then
-										Slot['Socket'..i].Texture:SetTexture(ItemTexture)
+										Slot["Socket"..i].Texture:SetTexture(ItemTexture)
 									else
 										NeedUpdate = true
 									end
@@ -569,14 +594,12 @@ function CA:Update_Gear()
 					_, _, ItemRarity, BasicItemLevel, _, _, _, _, ItemType, ItemTexture = GetItemInfo(ItemLink)
 					R, G, B = GetItemQualityColor(ItemRarity)

-					ItemUpgradeID = ItemLink:match(':(%d+)\124h%[')
-
+					ItemUpgradeID = ItemLink:match(":(%d+)\124h%[")
 					--<< Enchant Parts >>--
 					for i = 1, self.ScanTT:NumLines() do
-						CurrentLineText = _G['Knight_CharacterArmory_ScanTTTextLeft'..i]:GetText()
-
+						CurrentLineText = _G["Knight_CharacterArmory_ScanTTTextLeft"..i]:GetText()
 						if CurrentLineText:find(Info.Armory_Constants.ItemLevelKey_Alt) then
-							TrueItemLevel = tonumber(CurrentLineText:match(Info.Armory_Constants.ItemLevelKey_Alt))
+								TrueItemLevel = tonumber(CurrentLineText:match(Info.Armory_Constants.ItemLevelKey_Alt))
 						elseif CurrentLineText:find(Info.Armory_Constants.ItemLevelKey) then
 							TrueItemLevel = tonumber(CurrentLineText:match(Info.Armory_Constants.ItemLevelKey))
 						elseif CurrentLineText:find(Info.Armory_Constants.EnchantKey) then
@@ -610,7 +633,7 @@ function CA:Update_Gear()
 							UsableEffect = true
 						end
 					end
-
+
 					--<< ItemLevel Parts >>--
 					if BasicItemLevel then
 						if ItemUpgradeID then
@@ -632,12 +655,12 @@ function CA:Update_Gear()

 					if E.db.sle.Armory.Character.NoticeMissing ~= false then
 						if not Slot.IsEnchanted and Info.Armory_Constants.EnchantableSlots[SlotName] then
-							if (SlotName == 'SecondaryHandSlot' and ItemType ~= 'INVTYPE_SHIELD' and ItemType ~= 'INVTYPE_HOLDABLE' and ItemType ~= 'INVTYPE_WEAPONOFFHAND' and ItemType ~= 'INVTYPE_RANGEDRIGHT') or SlotName ~= 'SecondaryHandSlot' then
+							if SlotName ~= 'SecondaryHandSlot' then
 								ErrorDetected = true
 								Slot.EnchantWarning:Show()

 								if not E.db.sle.Armory.Character.Enchant.WarningIconOnly then
-									Slot.ItemEnchant:SetText('|cffff0000'..L['Not Enchanted'])
+									Slot.ItemEnchant:SetText('|cffff0000'..L["Not Enchanted"])
 								end
 							end
 						end
@@ -646,7 +669,7 @@ function CA:Update_Gear()
 							ErrorDetected = true

 							Slot.SocketWarning:Show()
-							Slot.SocketWarning.Message = '|cffff5678'..(GemCount_Now - GemCount)..'|r '..L['Empty Socket']
+							Slot.SocketWarning.Message = '|cffff5678'..(GemCount_Now - GemCount)..'|r '..L["Empty Socket"]
 						end
 						if E.db.sle.Armory.Character.MissingIcon then
 							Slot.EnchantWarning.Texture:Show()
@@ -659,10 +682,10 @@ function CA:Update_Gear()

 					--<< Transmogrify Parts >>--
 					if Slot.TransmogrifyAnchor then
-						IsTransmogrified, _, _, _, _, TransmogrifyItemID = GetTransmogrifySlotInfo(Slot.ID)
+						IsTransmogrified = C_Transmog.GetSlotInfo(Slot.ID, LE_TRANSMOG_TYPE_APPEARANCE);

 						if IsTransmogrified then
-							_, Slot.TransmogrifyAnchor.Link = GetItemInfo(TransmogrifyItemID)
+							Slot.TransmogrifyAnchor.Link = select(6, C_TransmogCollection.GetAppearanceSourceInfo(select(3, C_Transmog.GetSlotVisualInfo(Slot.ID, LE_TRANSMOG_TYPE_APPEARANCE))));
 							Slot.TransmogrifyAnchor:Show()
 						end
 					end
@@ -743,7 +766,7 @@ function CA:Update_Display(Force)

 					if Slot.Socket1 then
 						if Slot.Durability:GetText() == '' or E.db.sle.Armory.Character.Durability.Display == 'MouseoverOnly' and not Mouseover then
-							Slot.Socket1:Point('BOTTOM'..Slot.Direction, _G['Character'..SlotName], 'BOTTOM'..(Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 2 or -2, 2)
+							Slot.Socket1:Point('BOTTOM'..Slot.Direction, _G["Character"..SlotName], 'BOTTOM'..(Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 2 or -2, 2)
 						else
 							Slot.Socket1:Point('BOTTOM'..Slot.Direction, Slot.Durability, 'BOTTOM'..(Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Durability:GetText() and (Slot.Direction == 'LEFT' and 3 or -1) or 0, Slot.Durability:GetText() and -1 or 0)
 						end
@@ -751,7 +774,7 @@ function CA:Update_Display(Force)
 				else
 					Slot.Durability:Hide()

-					Slot.Socket1:Point('BOTTOM'..Slot.Direction, _G['Character'..SlotName], 'BOTTOM'..(Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 2 or -2, 2)
+					Slot.Socket1:Point('BOTTOM'..Slot.Direction, _G["Character"..SlotName], 'BOTTOM'..(Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 2 or -2, 2)
 				end
 			end

@@ -761,16 +784,16 @@ function CA:Update_Display(Force)
 			if Slot.Socket1 then
 				for i = 1, MAX_NUM_SOCKETS do
 					if E.db.sle.Armory.Character.Gem.Display == 'Always' or Mouseover and E.db.sle.Armory.Character.Gem.Display == 'MouseoverOnly' then
-						if Slot['Socket'..i].GemType then
-							Slot['Socket'..i]:Show()
-							Slot.SocketWarning:Point(Slot.Direction, Slot['Socket'..i], (Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 3 or -3, 0)
+						if Slot["Socket"..i].GemType then
+							Slot["Socket"..i]:Show()
+							Slot.SocketWarning:Point(Slot.Direction, Slot["Socket"..i], (Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 3 or -3, 0)
 						end
 					else
 						if SocketVisible == nil then
 							SocketVisible = false
 						end

-						if Slot['Socket'..i].GemType and E.db.sle.Armory.Character.NoticeMissing and not Slot['Socket'..i].GemItemID then
+						if Slot["Socket"..i].GemType and E.db.sle.Armory.Character.NoticeMissing and not Slot["Socket"..i].GemItemID then
 							SocketVisible = true
 						end
 					end
@@ -778,14 +801,14 @@ function CA:Update_Display(Force)

 				if SocketVisible then
 					for i = 1, MAX_NUM_SOCKETS do
-						if Slot['Socket'..i].GemType then
-							Slot['Socket'..i]:Show()
-							Slot.SocketWarning:Point(Slot.Direction, Slot['Socket'..i], (Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 3 or -3, 0)
+						if Slot["Socket"..i].GemType then
+							Slot["Socket"..i]:Show()
+							Slot.SocketWarning:Point(Slot.Direction, Slot["Socket"..i], (Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 3 or -3, 0)
 						end
 					end
 				elseif SocketVisible == false then
 					for i = 1, MAX_NUM_SOCKETS do
-						Slot['Socket'..i]:Hide()
+						Slot["Socket"..i]:Hide()
 					end

 					Slot.SocketWarning:Point(Slot.Direction, Slot.Socket1)
@@ -835,7 +858,6 @@ KF.Modules.CharacterArmory = function()
 		if PaperDollFrame:IsShown() then
 			CharacterFrame:SetWidth(CharacterFrame.Expanded and 650 or 444)
 			CharacterFrameInsetRight:SetPoint('TOPLEFT', CharacterFrameInset, 'TOPRIGHT', 110, 0)
-			CharacterFrameExpandButton:SetPoint('BOTTOMRIGHT', CharacterFrameInsetRight, 'BOTTOMLEFT', -3, 7)
 		end

 		-- Run KnightArmory
@@ -861,7 +883,6 @@ KF.Modules.CharacterArmory = function()
 		CharacterFrame:SetHeight(424)
 		CharacterFrame:SetWidth(PaperDollFrame:IsShown() and CharacterFrame.Expanded and CHARACTERFRAME_EXPANDED_WIDTH or PANEL_DEFAULT_WIDTH)
 		CharacterFrameInsetRight:SetPoint(unpack(InsetDefaultPoint))
-		CharacterFrameExpandButton:SetPoint(unpack(ExpandButtonDefaultPoint))

 		-- Move rightside equipment slots to default position
 		CharacterHandsSlot:SetPoint('TOPRIGHT', CharacterFrameInset, 'TOPRIGHT', -4, -2)
diff --git a/ElvUI_SLE/modules/Armory/Config.lua b/ElvUI_SLE/modules/Armory/Config.lua
index 85c8574..404c97e 100644
--- a/ElvUI_SLE/modules/Armory/Config.lua
+++ b/ElvUI_SLE/modules/Armory/Config.lua
@@ -1,6 +1,6 @@
 if select(2, GetAddOnInfo('ElvUI_KnightFrame')) and IsAddOnLoaded('ElvUI_KnightFrame') then return end

-local E, L, V, P, G = unpack(ElvUI)
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local KF, Info, Timer = unpack(ElvUI_KnightFrame)

 if not (KF and KF.Modules and (KF.Modules.CharacterArmory or KF.Modules.InspectArmory)) then return end
@@ -13,15 +13,15 @@ local EnchantStringName, EnchantString_Old, EnchantString_New = '', '', ''
 local SelectedEnchantString

 local function LoadArmoryConfigTable()
-	E.Options.args.sle.args.Armory = {
+	E.Options.args.sle.args.modules.args.Armory = {
 		type = 'group',
 		name = L["Armory Mode"],
-		order = 6,
+		order = 3,
 		childGroups = 'tab',
 		args = {
 			EnchantString = {
 				type = 'group',
-				name = L['Enchant String'],
+				name = L["Enchant String"],
 				order = 300,
 				args = {
 					Space = {
@@ -31,7 +31,7 @@ local function LoadArmoryConfigTable()
 					},
 					ConfigSpace = {
 						type = 'group',
-						name = L['String Replacement'],
+						name = L["String Replacement"],
 						order = 2,
 						guiInline = true,
 						args = {
@@ -64,16 +64,16 @@ local function LoadArmoryConfigTable()
 							},
 							List = {
 								type = 'select',
-								name = L['List of Strings'],
+								name = L["List of Strings"],
 								order = 4,
 								get = function() return SelectedEnchantString end,
 								set = function(_, value)
 									SelectedEnchantString = value
-									E.Options.args.sle.args.Armory.args.EnchantString.args.ConfigSpace.args.StringGroup.name = L['List of Strings']..":  "..value
+									E.Options.args.sle.args.modules.args.Armory.args.EnchantString.args.ConfigSpace.args.StringGroup.name = L["List of Strings"]..":  "..value
 								end,
 								values = function()
 									local List = {}
-									List[''] = NONE
+									List[""] = NONE
 									for Name, _ in pairs(SLE_ArmoryDB.EnchantString) do
 										List[Name] = Name
 									end
@@ -101,7 +101,7 @@ local function LoadArmoryConfigTable()
 								args = {
 									TargetString = {
 										type = 'input',
-										name = L['Original String'],
+										name = L["Original String"],
 										order = 1,
 										desc = '',
 										width = "full",
@@ -121,7 +121,7 @@ local function LoadArmoryConfigTable()
 									},
 									NewString = {
 										type = 'input',
-										name = L['New String'],
+										name = L["New String"],
 										order = 2,
 										desc = '',
 										width = "full",
@@ -186,34 +186,34 @@ local function LoadArmoryConfigTable()


 	local BackdropKeyTable = {
-		['0'] = 'HIDE',
-		['1'] = 'CUSTOM',
-		['2'] = 'Space',
-		['3'] = 'TheEmpire',
-		['4'] = 'Castle',
-		['5'] = 'Alliance-text',
-		['6'] = 'Horde-text',
-		['7'] = 'Alliance-bliz',
-		['8'] = 'Horde-bliz',
-		['9'] = 'Arena-bliz'
+		["0"] = 'HIDE',
+		["1"] = 'CUSTOM',
+		["2"] = 'Space',
+		["3"] = 'TheEmpire',
+		["4"] = 'Castle',
+		["5"] = 'Alliance-text',
+		["6"] = 'Horde-text',
+		["7"] = 'Alliance-bliz',
+		["8"] = 'Horde-bliz',
+		["9"] = 'Arena-bliz'
 	}

 	local BackgroundList = {
-		['0'] = HIDE,
-		['1'] = L['Custom'],
-		['2'] = "Space",
-		['3'] = "The Empire",
-		['4'] = "Castle",
-		['5'] = FACTION_ALLIANCE,
-		['6'] = FACTION_HORDE,
-		['7'] = FACTION_ALLIANCE..' 2',
-		['8'] = FACTION_HORDE..' 2',
-		['9'] = ARENA
+		["0"] = HIDE,
+		["1"] = L["Custom"],
+		["2"] = "Space",
+		["3"] = "The Empire",
+		["4"] = "Castle",
+		["5"] = FACTION_ALLIANCE,
+		["6"] = FACTION_HORDE,
+		["7"] = FACTION_ALLIANCE..' 2',
+		["8"] = FACTION_HORDE..' 2',
+		["9"] = ARENA
 	}

 	local DisplayMethodList = {
-		Always = L['Always Display'],
-		MouseoverOnly = L['Mouseover'],
+		Always = L["Always Display"],
+		MouseoverOnly = L["Mouseover"],
 		Hide = HIDE
 	}

@@ -230,9 +230,9 @@ local function LoadArmoryConfigTable()
 			return E.db.sle.Armory.Character.Enable ~= false and (TrueColor == '' and '' or TrueColor and '|c'..TrueColor or KF:Color_Value()) or FalseColor and '|c'..FalseColor or ''
 		end

-		E.Options.args.sle.args.Armory.args.CAEnable = {
+		E.Options.args.sle.args.modules.args.Armory.args.CAEnable = {
 			type = 'toggle',
-			name = L['Character Armory'],
+			name = L["Character Armory"],
 			order = 1,
 			desc = '',
 			get = function() return E.db.sle.Armory.Character.Enable end,
@@ -244,14 +244,14 @@ local function LoadArmoryConfigTable()
 		}

 		local SelectedCABG
-		E.Options.args.sle.args.Armory.args.Character = {
+		E.Options.args.sle.args.modules.args.Armory.args.Character = {
 			type = 'group',
-			name = L['Character Armory'],
+			name = L["Character Armory"],
 			order = 400,
 			args = {
 				NoticeMissing = {
 					type = 'toggle',
-					name = L['Show Missing Enchants or Gems'],
+					name = L["Show Missing Enchants or Gems"],
 					order = 1,
 					desc = '',
 					get = function() return E.db.sle.Armory.Character.NoticeMissing end,
@@ -265,7 +265,7 @@ local function LoadArmoryConfigTable()
 				},
 				MissingIcon = {
 					type = 'toggle',
-					name = L['Show Warning Icon'],
+					name = L["Show Warning Icon"],
 					order = 2,
 					desc = '',
 					get = function() return E.db.sle.Armory.Character.MissingIcon end,
@@ -279,13 +279,13 @@ local function LoadArmoryConfigTable()
 				},
 				Backdrop = {
 					type = 'group',
-					name = L['Backdrop'],
+					name = L["Backdrop"],
 					order = 3,
 					guiInline = true,
 					args = {
 						SelectedBG = {
 							type = 'select',
-							name = L['Select Image'],
+							name = L["Select Image"],
 							order = 1,
 							get = function()
 								for Index, Key in pairs(BackdropKeyTable) do
@@ -306,7 +306,7 @@ local function LoadArmoryConfigTable()
 						},
 						CustomAddress = {
 							type = 'input',
-							name = L['Custom Image Path'],
+							name = L["Custom Image Path"],
 							order = 2,
 							desc = '',
 							get = function() return E.db.sle.Armory.Character.Backdrop.CustomAddress end,
@@ -328,13 +328,13 @@ local function LoadArmoryConfigTable()
 				},
 				Gradation = {
 					type = 'group',
-					name = L['Gradient'],
+					name = L["Gradient"],
 					order = 5,
 					guiInline = true,
 					args = {
 						Display = {
 							type = 'toggle',
-							name = L['Enable'],
+							name = L["Enable"],
 							order = 1,
 							get = function() return E.db.sle.Armory.Character.Gradation.Display end,
 							set = function(_, value)
@@ -346,7 +346,7 @@ local function LoadArmoryConfigTable()
 						},
 						Color = {
 							type = 'color',
-							name = L['Gradient Texture Color'],
+							name = L["Gradient Texture Color"],
 							order = 2,
 							get = function()
 								return E.db.sle.Armory.Character.Gradation.Color[1],
@@ -370,7 +370,7 @@ local function LoadArmoryConfigTable()
 				},
 				Level = {
 					type = 'group',
-					name = L['Item Level'],
+					name = L["Item Level"],
 					order = 7,
 					guiInline = true,
 					get = function(info) return E.db.sle.Armory.Character[(info[#info - 1])][(info[#info])] end,
@@ -392,7 +392,7 @@ local function LoadArmoryConfigTable()
 					args = {
 						Display = {
 							type = 'select',
-							name = L['Visibility'],
+							name = L["Visibility"],
 							order = 1,
 							set = function(info, value)
 								E.db.sle.Armory.Character[(info[#info - 1])][(info[#info])] = value
@@ -405,7 +405,7 @@ local function LoadArmoryConfigTable()
 						},
 						ShowUpgradeLevel = {
 							type = 'toggle',
-							name = L['Upgrade Level'],
+							name = L["Upgrade Level"],
 							order = 2,
 							set = function(_, value)
 								E.db.sle.Armory.Character.Level.ShowUpgradeLevel = value
@@ -421,7 +421,7 @@ local function LoadArmoryConfigTable()
 						},
 						Font = {
 							type = 'select', dialogControl = 'LSM30_Font',
-							name = L['Font'],
+							name = L["Font"],
 							order = 4,
 							values = function()
 								return AceGUIWidgetLSMlists and AceGUIWidgetLSMlists.font or {}
@@ -430,7 +430,7 @@ local function LoadArmoryConfigTable()
 						},
 						FontSize = {
 							type = 'range',
-							name = L['Font Size'],
+							name = L["Font Size"],
 							order = 5,
 							desc = '',
 							min = 6,
@@ -440,7 +440,7 @@ local function LoadArmoryConfigTable()
 						},
 						FontStyle = {
 							type = 'select',
-							name = L['Font Outline'],
+							name = L["Font Outline"],
 							order = 6,
 							desc = '',
 							values = FontStyleList,
@@ -455,7 +455,7 @@ local function LoadArmoryConfigTable()
 				},
 				Enchant = {
 					type = 'group',
-					name = L['Enchant String'],
+					name = L["Enchant String"],
 					order = 9,
 					guiInline = true,
 					get = function(info) return E.db.sle.Armory.Character[(info[#info - 1])][(info[#info])] end,
@@ -477,7 +477,7 @@ local function LoadArmoryConfigTable()
 					args = {
 						Display = {
 							type = 'select',
-							name = L['Visibility'],
+							name = L["Visibility"],
 							order = 1,
 							set = function(info, value)
 								E.db.sle.Armory.Character[(info[#info - 1])][(info[#info])] = value
@@ -490,7 +490,7 @@ local function LoadArmoryConfigTable()
 						},
 						WarningSize = {
 							type = 'range',
-							name = L['Warning Size'],
+							name = L["Warning Size"],
 							order = 2,
 							set = function(_, value)
 								E.db.sle.Armory.Character.Enchant.WarningSize = value
@@ -508,7 +508,7 @@ local function LoadArmoryConfigTable()
 						},
 						WarningIconOnly = {
 							type = 'toggle',
-							name = L['Warning Only As Icons'],
+							name = L["Warning Only As Icons"],
 							order = 3,
 							set = function(_, value)
 								E.db.sle.Armory.Character.Enchant.WarningIconOnly = value
@@ -524,7 +524,7 @@ local function LoadArmoryConfigTable()
 						},
 						Font = {
 							type = 'select', dialogControl = 'LSM30_Font',
-							name = L['Font'],
+							name = L["Font"],
 							order = 5,
 							values = function()
 								return AceGUIWidgetLSMlists and AceGUIWidgetLSMlists.font or {}
@@ -533,7 +533,7 @@ local function LoadArmoryConfigTable()
 						},
 						FontSize = {
 							type = 'range',
-							name = L['Font Size'],
+							name = L["Font Size"],
 							order = 6,
 							desc = '',
 							min = 6,
@@ -543,7 +543,7 @@ local function LoadArmoryConfigTable()
 						},
 						FontStyle = {
 							type = 'select',
-							name = L['Font Outline'],
+							name = L["Font Outline"],
 							order = 7,
 							desc = '',
 							values = FontStyleList,
@@ -580,7 +580,7 @@ local function LoadArmoryConfigTable()
 					args = {
 						Display = {
 							type = 'select',
-							name = L['Visibility'],
+							name = L["Visibility"],
 							order = 1,
 							set = function(info, value)
 								E.db.sle.Armory.Character[(info[#info - 1])][(info[#info])] = value
@@ -589,9 +589,9 @@ local function LoadArmoryConfigTable()
 								CharacterArmory:Update_Display(true)
 							end,
 							values = {
-								Always = L['Always Display'],
-								DamagedOnly = L['Only Damaged'],
-								MouseoverOnly = L['Mouseover'],
+								Always = L["Always Display"],
+								DamagedOnly = L["Only Damaged"],
+								MouseoverOnly = L["Mouseover"],
 								Hide = HIDE
 							},
 							disabled = function() return E.db.sle.Armory.Character.Enable == false end
@@ -603,7 +603,7 @@ local function LoadArmoryConfigTable()
 						},
 						Font = {
 							type = 'select', dialogControl = 'LSM30_Font',
-							name = L['Font'],
+							name = L["Font"],
 							order = 3,
 							values = function()
 								return AceGUIWidgetLSMlists and AceGUIWidgetLSMlists.font or {}
@@ -612,7 +612,7 @@ local function LoadArmoryConfigTable()
 						},
 						FontSize = {
 							type = 'range',
-							name = L['Font Size'],
+							name = L["Font Size"],
 							order = 4,
 							desc = '',
 							min = 6,
@@ -622,7 +622,7 @@ local function LoadArmoryConfigTable()
 						},
 						FontStyle = {
 							type = 'select',
-							name = L['Font Outline'],
+							name = L["Font Outline"],
 							order = 5,
 							desc = '',
 							values = FontStyleList,
@@ -637,14 +637,14 @@ local function LoadArmoryConfigTable()
 				},
 				Gem = {
 					type = 'group',
-					name = L['Gem Sockets'],
+					name = L["Gem Sockets"],
 					order = 13,
 					guiInline = true,
 					get = function(Info) return E.db.sle.Armory.Character[(Info[#Info - 1])][(Info[#Info])] end,
 					args = {
 						Display = {
 							type = 'select',
-							name = L['Visibility'],
+							name = L["Visibility"],
 							order = 1,
 							set = function(Info, value)
 								E.db.sle.Armory.Character[(Info[#Info - 1])][(Info[#Info])] = value
@@ -657,15 +657,15 @@ local function LoadArmoryConfigTable()
 						},
 						SocketSize = {
 							type = 'range',
-							name = L['Socket Size'],
+							name = L["Socket Size"],
 							order = 2,
 							set = function(_, value)
 								E.db.sle.Armory.Character.Gem.SocketSize = value

 								for _, SlotName in pairs(Info.Armory_Constants.GearList) do
 									for i = 1, MAX_NUM_SOCKETS do
-										if CharacterArmory[SlotName] and CharacterArmory[SlotName]['Socket'..i] then
-											CharacterArmory[SlotName]['Socket'..i]:Size(value)
+										if CharacterArmory[SlotName] and CharacterArmory[SlotName]["Socket"..i] then
+											CharacterArmory[SlotName]["Socket"..i]:Size(value)
 										else
 											break
 										end
@@ -679,7 +679,7 @@ local function LoadArmoryConfigTable()
 						},
 						WarningSize = {
 							type = 'range',
-							name = L['Warning Size'],
+							name = L["Warning Size"],
 							order = 3,
 							set = function(_, value)
 								E.db.sle.Armory.Character.Gem.WarningSize = value
@@ -717,9 +717,9 @@ local function LoadArmoryConfigTable()
 			return E.db.sle.Armory.Inspect.Enable ~= false and (TrueColor == '' and '' or TrueColor and '|c'..TrueColor or KF:Color_Value()) or FalseColor and '|c'..FalseColor or ''
 		end

-		E.Options.args.sle.args.Armory.args.IAEnable = {
+		E.Options.args.sle.args.modules.args.Armory.args.IAEnable = {
 			type = 'toggle',
-			name = L['Inspect Armory'],
+			name = L["Inspect Armory"],
 			order = 2,
 			desc = '',
 			get = function() return E.db.sle.Armory.Inspect.Enable end,
@@ -730,14 +730,14 @@ local function LoadArmoryConfigTable()
 			end
 		}

-		E.Options.args.sle.args.Armory.args.Inspect = {
+		E.Options.args.sle.args.modules.args.Armory.args.Inspect = {
 			type = 'group',
-			name = L['Inspect Armory'],
+			name = L["Inspect Armory"],
 			order = 500,
 			args = {
 				NoticeMissing = {
 					type = 'toggle',
-					name = L['Show Missing Enchants or Gems'],
+					name = L["Show Missing Enchants or Gems"],
 					order = 1,
 					desc = '',
 					get = function() return E.db.sle.Armory.Inspect.NoticeMissing end,
@@ -753,7 +753,7 @@ local function LoadArmoryConfigTable()
 				},
 				MissingIcon = {
 					type = 'toggle',
-					name = L['Show Warning Icon'],
+					name = L["Show Warning Icon"],
 					order = 2,
 					desc = '',
 					get = function() return E.db.sle.Armory.Inspect.MissingIcon end,
@@ -769,13 +769,13 @@ local function LoadArmoryConfigTable()
 				},
 				Backdrop = {
 					type = 'group',
-					name = L['Backdrop'],
+					name = L["Backdrop"],
 					order = 3,
 					guiInline = true,
 					args = {
 						SelectedBG = {
 							type = 'select',
-							name = L['Select Image'],
+							name = L["Select Image"],
 							order = 1,
 							get = function()
 								for Index, Key in pairs(BackdropKeyTable) do
@@ -796,7 +796,7 @@ local function LoadArmoryConfigTable()
 						},
 						CustomAddress = {
 							type = 'input',
-							name = L['Custom Image Path'],
+							name = L["Custom Image Path"],
 							order = 2,
 							desc = '',
 							get = function() return E.db.sle.Armory.Inspect.Backdrop.CustomAddress end,
@@ -818,13 +818,13 @@ local function LoadArmoryConfigTable()
 				},
 				Gradation = {
 					type = 'group',
-					name = L['Gradient'],
+					name = L["Gradient"],
 					order = 5,
 					guiInline = true,
 					args = {
 						Display = {
 							type = 'toggle',
-							name = L['Enable'],
+							name = L["Enable"],
 							order = 1,
 							get = function() return E.db.sle.Armory.Inspect.Gradation.Display end,
 							set = function(_, value)
@@ -838,7 +838,7 @@ local function LoadArmoryConfigTable()
 						},
 						Color = {
 							type = 'color',
-							name = L['Gradient Texture Color'],
+							name = L["Gradient Texture Color"],
 							order = 2,
 							get = function()
 								return E.db.sle.Armory.Inspect.Gradation.Color[1],
@@ -864,7 +864,7 @@ local function LoadArmoryConfigTable()
 				},
 				Level = {
 					type = 'group',
-					name = L['Item Level'],
+					name = L["Item Level"],
 					order = 7,
 					guiInline = true,
 					get = function(info) return E.db.sle.Armory.Inspect[(info[#info - 1])][(info[#info])] end,
@@ -886,7 +886,7 @@ local function LoadArmoryConfigTable()
 					args = {
 						Display = {
 							type = 'select',
-							name = L['Visibility'],
+							name = L["Visibility"],
 							order = 1,
 							set = function(info, value)
 								E.db.sle.Armory.Inspect[(info[#info - 1])][(info[#info])] = value
@@ -901,7 +901,7 @@ local function LoadArmoryConfigTable()
 						},
 						ShowUpgradeLevel = {
 							type = 'toggle',
-							name = L['Upgrade Level'],
+							name = L["Upgrade Level"],
 							order = 2,
 							set = function(_, value)
 								E.db.sle.Armory.Inspect.Level.ShowUpgradeLevel = value
@@ -919,7 +919,7 @@ local function LoadArmoryConfigTable()
 						},
 						Font = {
 							type = 'select', dialogControl = 'LSM30_Font',
-							name = L['Font'],
+							name = L["Font"],
 							order = 4,
 							values = function()
 								return AceGUIWidgetLSMlists and AceGUIWidgetLSMlists.font or {}
@@ -928,7 +928,7 @@ local function LoadArmoryConfigTable()
 						},
 						FontSize = {
 							type = 'range',
-							name = L['Font Size'],
+							name = L["Font Size"],
 							order = 5,
 							desc = '',
 							min = 6,
@@ -938,7 +938,7 @@ local function LoadArmoryConfigTable()
 						},
 						FontStyle = {
 							type = 'select',
-							name = L['Font Outline'],
+							name = L["Font Outline"],
 							order = 6,
 							desc = '',
 							values = FontStyleList,
@@ -953,7 +953,7 @@ local function LoadArmoryConfigTable()
 				},
 				Enchant = {
 					type = 'group',
-					name = L['Enchant String'],
+					name = L["Enchant String"],
 					order = 9,
 					guiInline = true,
 					get = function(info) return E.db.sle.Armory.Inspect[(info[#info - 1])][(info[#info])] end,
@@ -975,7 +975,7 @@ local function LoadArmoryConfigTable()
 					args = {
 						Display = {
 							type = 'select',
-							name = L['Visibility'],
+							name = L["Visibility"],
 							order = 1,
 							set = function(info, value)
 								E.db.sle.Armory.Inspect[(info[#info - 1])][(info[#info])] = value
@@ -990,7 +990,7 @@ local function LoadArmoryConfigTable()
 						},
 						WarningSize = {
 							type = 'range',
-							name = L['Warning Size'],
+							name = L["Warning Size"],
 							order = 2,
 							set = function(_, value)
 								E.db.sle.Armory.Inspect.Enchant.WarningSize = value
@@ -1008,7 +1008,7 @@ local function LoadArmoryConfigTable()
 						},
 						WarningIconOnly = {
 							type = 'toggle',
-							name = L['Warning Only As Icons'],
+							name = L["Warning Only As Icons"],
 							order = 3,
 							set = function(_, value)
 								E.db.sle.Armory.Inspect.Enchant.WarningIconOnly = value
@@ -1026,7 +1026,7 @@ local function LoadArmoryConfigTable()
 						},
 						Font = {
 							type = 'select', dialogControl = 'LSM30_Font',
-							name = L['Font'],
+							name = L["Font"],
 							order = 5,
 							values = function()
 								return AceGUIWidgetLSMlists and AceGUIWidgetLSMlists.font or {}
@@ -1035,7 +1035,7 @@ local function LoadArmoryConfigTable()
 						},
 						FontSize = {
 							type = 'range',
-							name = L['Font Size'],
+							name = L["Font Size"],
 							order = 6,
 							desc = '',
 							min = 6,
@@ -1045,7 +1045,7 @@ local function LoadArmoryConfigTable()
 						},
 						FontStyle = {
 							type = 'select',
-							name = L['Font Outline'],
+							name = L["Font Outline"],
 							order = 7,
 							desc = '',
 							values = FontStyleList,
@@ -1060,14 +1060,14 @@ local function LoadArmoryConfigTable()
 				},
 				Gem = {
 					type = 'group',
-					name = L['Gem Sockets'],
+					name = L["Gem Sockets"],
 					order = 11,
 					guiInline = true,
 					get = function(Info) return E.db.sle.Armory.Inspect[(Info[#Info - 1])][(Info[#Info])] end,
 					args = {
 						Display = {
 							type = 'select',
-							name = L['Visibility'],
+							name = L["Visibility"],
 							order = 1,
 							set = function(Info, value)
 								E.db.sle.Armory.Inspect[(Info[#Info - 1])][(Info[#Info])] = value
@@ -1082,15 +1082,15 @@ local function LoadArmoryConfigTable()
 						},
 						SocketSize = {
 							type = 'range',
-							name = L['Socket Size'],
+							name = L["Socket Size"],
 							order = 2,
 							set = function(_, value)
 								E.db.sle.Armory.Inspect.Gem.SocketSize = value

 								for _, SlotName in pairs(Info.Armory_Constants.GearList) do
 									for i = 1, MAX_NUM_SOCKETS do
-										if InspectArmory[SlotName] and InspectArmory[SlotName]['Socket'..i] then
-											InspectArmory[SlotName]['Socket'..i]:Size(value)
+										if InspectArmory[SlotName] and InspectArmory[SlotName]["Socket"..i] then
+											InspectArmory[SlotName]["Socket"..i]:Size(value)
 										else
 											break
 										end
@@ -1104,7 +1104,7 @@ local function LoadArmoryConfigTable()
 						},
 						WarningSize = {
 							type = 'range',
-							name = L['Warning Size'],
+							name = L["Warning Size"],
 							order = 3,
 							set = function(_, value)
 								E.db.sle.Armory.Inspect.Gem.WarningSize = value
@@ -1137,4 +1137,4 @@ local function LoadArmoryConfigTable()
 	end
 end

-table.insert(E.SLEConfigs, 9, LoadArmoryConfigTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, 9, LoadArmoryConfigTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/Armory/Constants.lua b/ElvUI_SLE/modules/Armory/Constants.lua
index aa8ddd4..4946485 100644
--- a/ElvUI_SLE/modules/Armory/Constants.lua
+++ b/ElvUI_SLE/modules/Armory/Constants.lua
@@ -16,7 +16,7 @@ Info.Armory_Constants = {
 	},

 	EnchantableSlots = {
-		NeckSlot = true, BackSlot = true, Finger0Slot = true, Finger1Slot = true, MainHandSlot = true, SecondaryHandSlot = true
+		NeckSlot = true, BackSlot = true, Finger0Slot = true, Finger1Slot = true
 	},

 	UpgradeColor = {
@@ -58,9 +58,9 @@ Info.Armory_Constants = {
 	ProfessionList = {},

 	BlizzardBackdropList = {
-		['Alliance-bliz'] = [[Interface\LFGFrame\UI-PVP-BACKGROUND-Alliance]],
-		['Horde-bliz'] = [[Interface\LFGFrame\UI-PVP-BACKGROUND-Horde]],
-		['Arena-bliz'] = [[Interface\PVPFrame\PvpBg-NagrandArena-ToastBG]]
+		["Alliance-bliz"] = [[Interface\LFGFrame\UI-PVP-BACKGROUND-Alliance]],
+		["Horde-bliz"] = [[Interface\LFGFrame\UI-PVP-BACKGROUND-Horde]],
+		["Arena-bliz"] = [[Interface\PVPFrame\PvpBg-NagrandArena-ToastBG]]
 	}
 }

diff --git a/ElvUI_SLE/modules/Armory/InspectArmory/Communication.lua b/ElvUI_SLE/modules/Armory/InspectArmory/Communication.lua
index 9921f85..2fa75a7 100644
--- a/ElvUI_SLE/modules/Armory/InspectArmory/Communication.lua
+++ b/ElvUI_SLE/modules/Armory/InspectArmory/Communication.lua
@@ -2,7 +2,8 @@
 --<< AISM : Armory Support Module for AddOn Communication Inspecting		>>--
 --------------------------------------------------------------------------------
 local Revision = 1.2
-local AISM = _G['Armory_InspectSupportModule'] or CreateFrame('Frame', 'Armory_InspectSupportModule', UIParent)
+local _G = _G
+local AISM = _G["Armory_InspectSupportModule"] or CreateFrame('Frame', 'Armory_InspectSupportModule', UIParent)

 if not AISM.Revision or AISM.Revision < Revision then
 	local ItemSetBonusKey = ITEM_SET_BONUS:gsub('%%s', '(.+)')
@@ -18,15 +19,14 @@ if not AISM.Revision or AISM.Revision < Revision then
 	local playerRace, playerRaceID = UnitRace('player')
 	local playerSex = UnitSex('player')
 	local playerNumSpecGroup = GetNumSpecGroups()
-	local isHelmDisplayed, isCloakDisplayed


 	--<< Create Core >>--
 	AISM.Revision = Revision

-	AISM.Tooltip = _G['AISM_Tooltip'] or AISM.Tooltip or CreateFrame('GameTooltip', 'AISM_Tooltip', nil, 'GameTooltipTemplate')
+	AISM.Tooltip = _G["AISM_Tooltip"] or AISM.Tooltip or CreateFrame('GameTooltip', 'AISM_Tooltip', nil, 'GameTooltipTemplate')
 	AISM.Tooltip:SetOwner(UIParent, 'ANCHOR_NONE')
-	AISM.Updater = _G['AISM_Updater'] or AISM.Updater or CreateFrame('Frame', 'AISM_Updater', UIParent)
+	AISM.Updater = _G["AISM_Updater"] or AISM.Updater or CreateFrame('Frame', 'AISM_Updater', UIParent)
 	AISM.Updater.elapsed = 0

 	AISM.Delay = 2
@@ -106,8 +106,7 @@ if not AISM.Revision or AISM.Revision < Revision then
 		Profession2 = false
 	}
 	for groupNum = 1, MAX_TALENT_GROUPS do
-		AISM.DataTypeTable['GL'..groupNum] = 'Glyph'
-		AISM.DataTypeTable['SP'..groupNum] = 'Specialization'
+		AISM.DataTypeTable["SP"..groupNum] = 'Specialization'
 	end
 	for slotName, keyName in pairs(AISM.GearList) do
 		AISM.DataTypeTable[keyName] = 'Gear'
@@ -134,10 +133,6 @@ if not AISM.Revision or AISM.Revision < Revision then
 				needUpdate = AISM:GetPlayerSpecSetting() or needUpdate
 			end

-			if not self.GlyphUpdated then
-				needUpdate = AISM:GetPlayerGlyphString() or needUpdate
-			end
-
 			if self.GearUpdated ~= true then
 				needUpdate = AISM:GetPlayerGearString() or needUpdate
 			end
@@ -188,9 +183,6 @@ if not AISM.Revision or AISM.Revision < Revision then
 		elseif Event == 'ACTIVE_TALENT_GROUP_CHANGED' or Event == 'PLAYER_SPECIALIZATION_CHANGED' then
 			self.SpecUpdated = nil
 			self:Show()
-		elseif Event == 'GLYPH_ADDED' or Event == 'GLYPH_REMOVED' or Event == 'GLYPH_UPDATED' then
-			self.GlyphUpdated = nil
-			self:Show()
 		elseif Event == 'PLAYER_TALENT_UPDATE' then
 			local args = GetNumSpecGroups()

@@ -210,21 +202,6 @@ if not AISM.Revision or AISM.Revision < Revision then
 		AISM.Updater:RegisterEvent('PLAYER_TALENT_UPDATE')
 	end

-	function AISM:UpdateHelmDisplaying(value)
-		isHelmDisplayed = value
-		AISM.Updater.GearUpdated = nil
-		AISM.Updater:Show()
-	end
-	hooksecurefunc('ShowHelm', function(value) AISM:UpdateHelmDisplaying(value) end)
-
-	function AISM:UpdateCloakDisplaying(value)
-		isCloakDisplayed = value
-		AISM.Updater.GearUpdated = nil
-		AISM.Updater:Show()
-	end
-	hooksecurefunc('ShowCloak', function(value) AISM:UpdateCloakDisplaying(value) end)
-
-
 	--<< Profession String >>--
 	function AISM:GetPlayerProfessionSetting()
 		local Profession1, Profession2 = GetProfessions()
@@ -303,8 +280,8 @@ if not AISM.Revision or AISM.Revision < Revision then
 			Spec = GetSpecialization(nil, nil, Group)
 			Spec = Spec and GetSpecializationInfo(Spec) or '0'

-			if not SpecTable['Spec'..Step] or SpecTable['Spec'..Step] ~= Spec then
-				SpecTable['Spec'..Step] = Spec
+			if not SpecTable["Spec"..Step] or SpecTable["Spec"..Step] ~= Spec then
+				SpecTable["Spec"..Step] = Spec
 				DataString = Spec
 			end

@@ -316,20 +293,20 @@ if not AISM.Revision or AISM.Revision < Revision then

 					Spec = Spec..'/'..Talent

-					if not SpecTable['Spec'..Step..'_Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)] or SpecTable['Spec'..Step..'_Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)] ~= Talent then
-						SpecTable['Spec'..Step..'_Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)] = Talent
+					if not SpecTable["Spec"..Step..'_Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)] or SpecTable["Spec"..Step..'_Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)] ~= Talent then
+						SpecTable["Spec"..Step..'_Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)] = Talent
 						DataString = (DataString and DataString..'/' or '')..Talent
 					end
 				end
 			end

-			if not self.PlayerData['Spec'..Step] or self.PlayerData['Spec'..Step] ~= Spec then
-				self.PlayerData['Spec'..Step] = Spec
-				self.PlayerData_ShortString['Spec'..Step] = Spec
-				self.UpdatedData['Spec'..Step] = DataString
+			if not self.PlayerData["Spec"..Step] or self.PlayerData["Spec"..Step] ~= Spec then
+				self.PlayerData["Spec"..Step] = Spec
+				self.PlayerData_ShortString["Spec"..Step] = Spec
+				self.UpdatedData["Spec"..Step] = DataString

 				if Step > 1 then
-					self.UncheckableDataList['Spec'..Step] = Spec
+					self.UncheckableDataList["Spec"..Step] = Spec
 				end
 			end
 		end
@@ -339,41 +316,6 @@ if not AISM.Revision or AISM.Revision < Revision then
 	AISM.Updater:RegisterEvent('ACTIVE_TALENT_GROUP_CHANGED')
 	AISM.Updater:RegisterEvent('PLAYER_SPECIALIZATION_CHANGED')

-
-	--<< Glyph String >>--
-	function AISM:GetPlayerGlyphString()
-		local ShortString, FullString, SpellID, GlyphID
-
-		for Step, Group in pairs(GroupArray) do
-			ShortString, FullString = '', ''
-
-			for SlotNum = 1, NUM_GLYPH_SLOTS do
-				_, _, _, SpellID, _, GlyphID = GetGlyphSocketInfo(SlotNum, Group)
-
-				ShortString = ShortString..(SpellID or '0')..(SlotNum ~= NUM_GLYPH_SLOTS and '/' or '')
-				FullString = FullString..(SpellID or '0')..'_'..(GlyphID or '0')..(SlotNum ~= NUM_GLYPH_SLOTS and '/' or '')
-			end
-
-			if self.PlayerData['Glyph'..Step] ~= FullString then
-				self.PlayerData['Glyph'..Step] = FullString
-
-				if Step > 1 then
-					self.UncheckableDataList['Glyph'..Step] = FullString
-				end
-			end
-
-			if Step == 1 and self.PlayerData_ShortString.Glyph1 ~= ShortString then
-				self.PlayerData_ShortString.Glyph1 = ShortString
-				self.UpdatedData.Glyph1 = ShortString
-			end
-		end
-
-		self.Updater.GlyphUpdated = true
-	end
-	AISM.Updater:RegisterEvent('GLYPH_ADDED')
-	AISM.Updater:RegisterEvent('GLYPH_REMOVED')
-	AISM.Updater:RegisterEvent('GLYPH_UPDATED')
-
 	--<< Gear String >>--
 	function AISM:GetPlayerGearString()
 		local ShortString, FullString, needUpdate, needUpdateList
@@ -392,7 +334,15 @@ if not AISM.Revision or AISM.Revision < Revision then
 				needUpdate = true
 			else
 				if slotLink and self.CanTransmogrifySlot[slotName] then
-					isTransmogrified, _, _, _, _, transmogrifiedItemID = GetTransmogrifySlotInfo(slotID)
+					isTransmogrified = C_Transmog.GetSlotInfo(slotID, LE_TRANSMOG_TYPE_APPEARANCE);
+					if (isTransmogrified) then
+						local transmogLink = select(6, C_TransmogCollection.GetAppearanceSourceInfo(select(3, C_Transmog.GetSlotVisualInfo(slotID, LE_TRANSMOG_TYPE_APPEARANCE))));
+						if (transmogLink) then
+							transmogrifiedItemID = select(2, strsplit(':', string.match(slotLink, 'item[%-?%d:]+')));
+						else
+							isTransmogrified = nil
+						end
+					end
 				else
 					isTransmogrified = nil
 				end
@@ -401,7 +351,7 @@ if not AISM.Revision or AISM.Revision < Revision then
 				FullString = slotLink or 'F'

 				if slotLink then
-					self.UncheckableDataList[slotName] = slotName == 'HeadSlot' and not isHelmDisplayed and 'ND' or slotName == 'BackSlot' and not isCloakDisplayed and 'ND' or isTransmogrified and transmogrifiedItemID or '0'
+					self.UncheckableDataList[slotName] = slotName == 'HeadSlot' and 'ND' or slotName == 'BackSlot' and 'ND' or isTransmogrified and transmogrifiedItemID or '0'

 					for i = 1, MAX_NUM_SOCKETS do
 						self.UncheckableDataList[slotName] = self.UncheckableDataList[slotName]..'/'..(select(i, GetInventoryItemGems(slotID)) or 0)
@@ -427,7 +377,7 @@ if not AISM.Revision or AISM.Revision < Revision then
 					SetOptionCount = 1

 					for i = 1, self.Tooltip:NumLines() do
-						SetName, SetItemCount, SetItemMax = _G['AISM_TooltipTextLeft'..i]:GetText():match('^(.+) %((%d)/(%d)%)$') -- find string likes 'SetName (0/5)'
+						SetName, SetItemCount, SetItemMax = _G["AISM_TooltipTextLeft"..i]:GetText():match('^(.+) %((%d)/(%d)%)$') -- find string likes 'SetName (0/5)'

 						if SetName then
 							SetItemCount = tonumber(SetItemCount)
@@ -447,14 +397,14 @@ if not AISM.Revision or AISM.Revision < Revision then
 								FullString = ''

 								for k = 1, self.Tooltip:NumLines() do
-									tooltipText = _G['AISM_TooltipTextLeft'..(i+k)]:GetText()
+									tooltipText = _G["AISM_TooltipTextLeft"..(i+k)]:GetText()

 									if tooltipText == ' ' then
 										checkSpace = checkSpace - 1

 										if checkSpace == 0 then break end
 									elseif checkSpace == 2 then
-										colorR, colorG, colorB = _G['AISM_TooltipTextLeft'..(i+k)]:GetTextColor()
+										colorR, colorG, colorB = _G["AISM_TooltipTextLeft"..(i+k)]:GetTextColor()

 										if colorR > LIGHTYELLOW_FONT_COLOR.r - .01 and colorR < LIGHTYELLOW_FONT_COLOR.r + .01 and colorG > LIGHTYELLOW_FONT_COLOR.g - .01 and colorG < LIGHTYELLOW_FONT_COLOR.g + .01 and colorB > LIGHTYELLOW_FONT_COLOR.b - .01 and colorB < LIGHTYELLOW_FONT_COLOR.b + .01 then
 											ShortString = ShortString + 1
@@ -472,11 +422,11 @@ if not AISM.Revision or AISM.Revision < Revision then
 									elseif tooltipText:find(ItemSetBonusKey) then
 										tooltipText = tooltipText:match("^%((%d)%)%s.+:%s.+$") or 'T'

-										if CurrentSetItem[SetName]['SetOption'..SetOptionCount] and CurrentSetItem[SetName]['SetOption'..SetOptionCount] ~= tooltipText then
+										if CurrentSetItem[SetName]["SetOption"..SetOptionCount] and CurrentSetItem[SetName]["SetOption"..SetOptionCount] ~= tooltipText then
 											needUpdate = true
 										end

-										CurrentSetItem[SetName]['SetOption'..SetOptionCount] = tooltipText
+										CurrentSetItem[SetName]["SetOption"..SetOptionCount] = tooltipText
 										FullString = FullString..'/'..tooltipText

 										SetOptionCount = SetOptionCount + 1
@@ -594,12 +544,8 @@ if not AISM.Revision or AISM.Revision < Revision then
 		end

 		for groupNum = 1, MAX_TALENT_GROUPS do
-			if InputData['Spec'..groupNum] then
-				Data[#Data + 1] = 'SP'..groupNum..':'..InputData['Spec'..groupNum]
-			end
-
-			if InputData['Glyph'..groupNum] then
-				Data[#Data + 1] = 'GL'..groupNum..':'..InputData['Glyph'..groupNum]
+			if InputData["Spec"..groupNum] then
+				Data[#Data + 1] = 'SP'..groupNum..':'..InputData["Spec"..groupNum]
 			end
 		end

@@ -710,7 +656,7 @@ if not AISM.Revision or AISM.Revision < Revision then
 			self.SendDataGroupUpdated = nil
 		end

-		if needSendData and self.Updater.SpecUpdated and self.Updater.GlyphUpdated and self.Updater.GearUpdated then
+		if needSendData and self.Updater.SpecUpdated and self.Updater.GearUpdated then
 			needSendData = nil
 			self.SendDataGroupUpdated = nil

@@ -748,7 +694,7 @@ if not AISM.Revision or AISM.Revision < Revision then
 		SenderRealm = SenderRealm and gsub(SenderRealm,'[%s%-]','') or nil
 		Sender = Sender..(SenderRealm and SenderRealm ~= '' and SenderRealm ~= playerRealm and '-'..SenderRealm or '')

-		--print('|cffceff00['..Channel..']|r|cff2eb7e4['..Prefix..']|r '..Sender..' : ')
+		--print('|cffceff00["..Channel.."]|r|cff2eb7e4["..Prefix.."]|r '..Sender..' : ')
 		--print(Message)

 		if Message:find('AISM_') then
@@ -850,20 +796,12 @@ if not AISM.Revision or AISM.Revision < Revision then
 								if not Talent then
 									TableToSave.Specialization[Group].SpecializationID = stringTable[1]
 								else
-									TableToSave.Specialization[Group]['Talent'..Spec] = { Talent, isSelected and true or false }
+									TableToSave.Specialization[Group]["Talent"..Spec] = { Talent, isSelected and true or false }
 								end
 							end
 						elseif self.DataTypeTable[DataType] == 'ActiveSpec' then
 							TableToSave.Specialization = TableToSave.Specialization or {}
 							TableToSave.Specialization.ActiveSpec = tonumber(DataString)
-						elseif self.DataTypeTable[DataType] == 'Glyph' then
-							local SpellID, GlyphID
-							for i = 1, #stringTable do
-								SpellID, GlyphID = strsplit('_', stringTable[i])
-
-								TableToSave.Glyph[Group]['Glyph'..i..'SpellID'] = tonumber(SpellID)
-								TableToSave.Glyph[Group]['Glyph'..i..'ID'] = tonumber(GlyphID)
-							end
 						elseif self.DataTypeTable[DataType] == 'Gear' then
 							TableToSave.Gear = TableToSave.Gear or {}

@@ -881,7 +819,7 @@ if not AISM.Revision or AISM.Revision < Revision then
 								}

 								for i = 1, MAX_NUM_SOCKETS do
-									TableToSave.Gear[DataType]['Gem'..i] = stringTable[i + 2] ~= 0 and stringTable[i + 2] or nil
+									TableToSave.Gear[DataType]["Gem"..i] = stringTable[i + 2] ~= 0 and stringTable[i + 2] or nil
 								end
 							else
 								TableToSave.Gear[DataType] = {
@@ -889,7 +827,7 @@ if not AISM.Revision or AISM.Revision < Revision then
 								}

 								for i = 1, MAX_NUM_SOCKETS do
-									TableToSave.Gear[DataType]['Gem'..i] = stringTable[i + 1] ~= 0 and stringTable[i + 1] or nil
+									TableToSave.Gear[DataType]["Gem"..i] = stringTable[i + 1] ~= 0 and stringTable[i + 1] or nil
 								end
 							end
 						elseif self.DataTypeTable[DataType] == 'SetItemData' then
@@ -906,7 +844,7 @@ if not AISM.Revision or AISM.Revision < Revision then
 											TableToSave.SetItem[(stringTable[1])][i - 1] = stringTable[i]
 										else
 											for k = 1, #stringTable - i + 1 do
-												TableToSave.SetItem[(stringTable[1])]['SetOption'..k] = stringTable[i + k - 1] == 'T' or stringTable[i + k - 1]
+												TableToSave.SetItem[(stringTable[1])]["SetOption"..k] = stringTable[i + k - 1] == 'T' or stringTable[i + k - 1]
 											end
 											break
 										end
@@ -1008,12 +946,7 @@ if not AISM.Revision or AISM.Revision < Revision then
 		elseif Event == 'GROUP_ROSTER_UPDATE' then
 			self:GetPlayerCurrentGroupMode()
 			self:Show()
-		elseif Event == 'PLAYER_ENTERING_WORLD' or Event == 'ZONE_CHANGED_NEW_AREA' then
-			if not (isHelmDisplayed and isCloakDisplayed) then
-				isHelmDisplayed = ShowingHelm()
-				isCloakDisplayed = ShowingCloak()
-			end
-
+		elseif Event == 'PLAYER_ENTERING_WORLD' or Event == 'ZONE_CHANGED_NEW_AREA' then
 			self:GetCurrentInstanceType()
 			self:Show()
 		end
diff --git a/ElvUI_SLE/modules/Armory/InspectArmory/InspectArmory.lua b/ElvUI_SLE/modules/Armory/InspectArmory/InspectArmory.lua
index 41b89d8..e8b3e18 100644
--- a/ElvUI_SLE/modules/Armory/InspectArmory/InspectArmory.lua
+++ b/ElvUI_SLE/modules/Armory/InspectArmory/InspectArmory.lua
@@ -3,13 +3,16 @@
 local E, L, V, P, G = unpack(ElvUI)
 local KF, Info, Timer = unpack(ElvUI_KnightFrame)

+local format = format
+
 --------------------------------------------------------------------------------
 --<< KnightFrame : Upgrade Inspect Frame like Wow-Armory					>>--
 --------------------------------------------------------------------------------
 local IA = InspectArmory or CreateFrame('Frame', 'InspectArmory', E.UIParent)
-local ENI = _G['EnhancedNotifyInspect'] or { CancelInspect = function() end }
-local AISM = _G['Armory_InspectSupportModule']
-local ButtonName = INSPECT --L['Knight Inspect']
+local _G = _G
+local ENI = _G["EnhancedNotifyInspect"] or { CancelInspect = function() end }
+local AISM = _G["Armory_InspectSupportModule"]
+local ButtonName = INSPECT --L["Knight Inspect"]

 local CORE_FRAME_LEVEL = 10
 local SLOT_SIZE = 37
@@ -18,7 +21,6 @@ local SIDE_BUTTON_WIDTH = 16
 local SPACING = 3
 local INFO_TAB_SIZE = 22
 local TALENT_SLOT_SIZE = 26
-local GLYPH_SLOT_HEIGHT = 22

 local HeadSlotItem = 99568
 local BackSlotItem = 102246
@@ -54,13 +56,11 @@ IA.Default_CurrentInspectData = {
 	},
 	SetItem = {},
 	Specialization = {},
-	Glyph = {},
 	Profession = { [1] = {}, [2] = {} },
 	PvP = {}
 }
 for i = 1, MAX_TALENT_GROUPS do
 	IA.Default_CurrentInspectData.Specialization[i] = {}
-	IA.Default_CurrentInspectData.Glyph[i] = {}
 end


@@ -68,28 +68,28 @@ IA.MainStats = {	-- STR, INT, AGI,
 	WARRIOR = STR,
 	HUNTER = AGI,
 	SHAMAN = {
-		[(L['Spec_Shaman_Elemental'])] = INT,
-		[(L['Spec_Shaman_Enhancement'])] = AGI,
-		[(L['Spec_Shaman_Restoration'])] = INT
+		[(L["Spec_Shaman_Elemental"])] = INT,
+		[(L["Spec_Shaman_Enhancement"])] = AGI,
+		[(L["Spec_Shaman_Restoration"])] = INT
 	},
 	MONK = {
-		[(L['Spec_Monk_Brewmaster'])] = AGI,
-		[(L['Spec_Monk_Mistweaver'])] = INT,
-		[(L['Spec_Monk_Windwalker'])] = AGI
+		[(L["Spec_Monk_Brewmaster"])] = AGI,
+		[(L["Spec_Monk_Mistweaver"])] = INT,
+		[(L["Spec_Monk_Windwalker"])] = AGI
 	},
 	ROGUE = AGI,
 	DEATHKNIGHT = STR,
 	MAGE = INT,
 	DRUID = {
-		[(L['Spec_Druid_Balance'])] = INT,
-		[(L['Spec_Druid_Feral'])] = AGI,
-		[(L['Spec_Druid_Guardian'])] = AGI,
-		[(L['Spec_Druid_Restoration'])] = INT
+		[(L["Spec_Druid_Balance"])] = INT,
+		[(L["Spec_Druid_Feral"])] = AGI,
+		[(L["Spec_Druid_Guardian"])] = AGI,
+		[(L["Spec_Druid_Restoration"])] = INT
 	},
 	PALADIN = {
-		[(L['Spec_Paladin_Holy'])] = INT,
-		[(L['Spec_Paladin_Protection'])] = STR,
-		[(L['Spec_Paladin_Retribution'])] = STR
+		[(L["Spec_Paladin_Holy"])] = INT,
+		[(L["Spec_Paladin_Protection"])] = STR,
+		[(L["Spec_Paladin_Retribution"])] = STR
 	},
 	PRIEST = INT,
 	WARLOCK = INT
@@ -167,7 +167,7 @@ do --<< Button Script >>--

 			local CurrentLineText, SetName
 			for i = 1, GameTooltip:NumLines() do
-				CurrentLineText = _G['GameTooltipTextLeft'..i]:GetText()
+				CurrentLineText = _G["GameTooltipTextLeft"..i]:GetText()

 				SetName = CurrentLineText:match('^(.+) %((%d)/(%d)%)$')

@@ -179,17 +179,17 @@ do --<< Button Script >>--
 							if type(dataType) == 'string' then -- Means SetOption Data


-								_G['GameTooltipTextLeft'..(i + #IA.SetItem[SetName] + 1 + dataType:match('^.+(%d)$'))]:SetText(Data)
+								_G["GameTooltipTextLeft"..(i + #IA.SetItem[SetName] + 1 + dataType:match('^.+(%d)$'))]:SetText(Data)
 								--[[
 								local CurrentLineNum = i + #IA.SetItem[SetName] + 1 + dataType:match('^.+(%d)$')
-								local CurrentText = _G['GameTooltipTextLeft'..CurrentLineNum]:GetText()
+								local CurrentText = _G["GameTooltipTextLeft'..CurrentLineNum]:GetText()
 								local CurrentTextType = CurrentText:match("^%((%d)%)%s.+:%s.+$") or true

 								if Data ~= CurrentTextType then
 									if Data == true and CurrentTextType ~= true then
-										_G['GameTooltipTextLeft'..CurrentLineNum]:SetText(GREEN_FONT_COLOR_CODE..(strsub(CurrentText, (strlen(CurrentTextType) + 4))))
+										_G["GameTooltipTextLeft'..CurrentLineNum]:SetText(GREEN_FONT_COLOR_CODE..(strsub(CurrentText, (strlen(CurrentTextType) + 4))))
 									else
-										_G['GameTooltipTextLeft'..CurrentLineNum]:SetText(GRAY_FONT_COLOR_CODE..'('..Data..') '..CurrentText)
+										_G["GameTooltipTextLeft'..CurrentLineNum]:SetText(GRAY_FONT_COLOR_CODE..'('..Data..') '..CurrentText)
 									end
 								end
 								]]
@@ -198,16 +198,16 @@ do --<< Button Script >>--
 									SetCount = SetCount + 1
 								end

-								_G['GameTooltipTextLeft'..(i + dataType)]:SetText(Data)
+								_G["GameTooltipTextLeft"..(i + dataType)]:SetText(Data)
 							end
 						end

-						_G['GameTooltipTextLeft'..i]:SetText(string.gsub(CurrentLineText, ' %(%d/', ' %('..SetCount..'/', 1))
+						_G["GameTooltipTextLeft"..i]:SetText(string.gsub(CurrentLineText, ' %(%d/', ' %('..SetCount..'/', 1))
 					end

 					break
 				elseif Info.Armory_Constants.CanTransmogrifySlot[self.SlotName] and Info.Armory_Constants.ItemBindString[CurrentLineText] and self.TransmogrifyAnchor.Link then
-					_G['GameTooltipTextLeft'..i]:SetText(E:RGBToHex(1, .5, 1)..TRANSMOGRIFIED_HEADER..'|n'..(GetItemInfo(self.TransmogrifyAnchor.Link) or self.TransmogrifyAnchor.Link)..'|r|n'..CurrentLineText)
+					_G["GameTooltipTextLeft"..i]:SetText(E:RGBToHex(1, .5, 1)..TRANSMOGRIFIED_HEADER..'|n'..(GetItemInfo(self.TransmogrifyAnchor.Link) or self.TransmogrifyAnchor.Link)..'|r|n'..CurrentLineText)
 				end
 			end

@@ -272,7 +272,7 @@ do --<< Button Script >>--
 			end
 		elseif Parent.GemType then
 			GameTooltip:ClearLines()
-			GameTooltip:AddLine('|cffffffff'.._G['EMPTY_SOCKET_'..Parent.GemType])
+			GameTooltip:AddLine('|cffffffff'.._G["EMPTY_SOCKET_"..Parent.GemType])
 		end

 		GameTooltip:Show()
@@ -578,15 +578,15 @@ function IA:CreateInspectFrame()

 	do --<< Class, Specialization Icon >>--
 		for _, FrameName in pairs({ 'SpecIcon', 'ClassIcon', }) do
-			self[FrameName..'Slot'] = CreateFrame('Frame', nil, self)
-			self[FrameName..'Slot']:Size(24)
-			self[FrameName..'Slot']:SetBackdrop({
+			self[FrameName.."Slot"] = CreateFrame('Frame', nil, self)
+			self[FrameName.."Slot"]:Size(24)
+			self[FrameName.."Slot"]:SetBackdrop({
 				bgFile = E.media.blankTex,
 				edgeFile = E.media.blankTex,
 				tile = false, tileSize = 0, edgeSize = E.mult,
 				insets = { left = 0, right = 0, top = 0, bottom = 0}
 			})
-			self[FrameName] = self[FrameName..'Slot']:CreateTexture(nil, 'OVERLAY')
+			self[FrameName] = self[FrameName.."Slot"]:CreateTexture(nil, 'OVERLAY')
 			self[FrameName]:SetTexCoord(unpack(E.TexCoords))
 			self[FrameName]:SetInside()
 		end
@@ -595,7 +595,7 @@ function IA:CreateInspectFrame()
 	end

 	do --<< Player Model >>--
-		self.Model = CreateFrame('DressUpModel', nil, UIParent)
+		self.Model = CreateFrame('DressUpModel', nil, self)
 		self.Model:SetFrameStrata('DIALOG')
 		self.Model:SetFrameLevel(CORE_FRAME_LEVEL + 1)
 		self.Model:EnableMouse(1)
@@ -731,34 +731,34 @@ function IA:CreateInspectFrame()

 				-- Gem Socket
 				for i = 1, MAX_NUM_SOCKETS do
-					Slot['Socket'..i] = CreateFrame('Frame', nil, Slot.Gradation)
-					Slot['Socket'..i]:Size(E.db.sle.Armory.Inspect.Gem.SocketSize)
-					Slot['Socket'..i]:SetBackdrop({
+					Slot["Socket"..i] = CreateFrame('Frame', nil, Slot.Gradation)
+					Slot["Socket"..i]:Size(E.db.sle.Armory.Inspect.Gem.SocketSize)
+					Slot["Socket"..i]:SetBackdrop({
 						bgFile = E.media.blankTex,
 						edgeFile = E.media.blankTex,
 						tile = false, tileSize = 0, edgeSize = E.mult,
 						insets = { left = 0, right = 0, top = 0, bottom = 0}
 					})
-					Slot['Socket'..i]:SetBackdropColor(0, 0, 0, 1)
-					Slot['Socket'..i]:SetBackdropBorderColor(0, 0, 0)
-					Slot['Socket'..i]:SetFrameLevel(CORE_FRAME_LEVEL + 3)
+					Slot["Socket"..i]:SetBackdropColor(0, 0, 0, 1)
+					Slot["Socket"..i]:SetBackdropBorderColor(0, 0, 0)
+					Slot["Socket"..i]:SetFrameLevel(CORE_FRAME_LEVEL + 3)

-					Slot['Socket'..i].Socket = CreateFrame('Button', nil, Slot['Socket'..i])
-					Slot['Socket'..i].Socket:SetBackdrop({
+					Slot["Socket"..i].Socket = CreateFrame('Button', nil, Slot["Socket"..i])
+					Slot["Socket"..i].Socket:SetBackdrop({
 						bgFile = E.media.blankTex,
 						edgeFile = E.media.blankTex,
 						tile = false, tileSize = 0, edgeSize = E.mult,
 						insets = { left = 0, right = 0, top = 0, bottom = 0}
 					})
-					Slot['Socket'..i].Socket:SetInside()
-					Slot['Socket'..i].Socket:SetFrameLevel(CORE_FRAME_LEVEL + 4)
-					Slot['Socket'..i].Socket:SetScript('OnEnter', self.GemSocket_OnEnter)
-					Slot['Socket'..i].Socket:SetScript('OnLeave', self.OnLeave)
-					Slot['Socket'..i].Socket:SetScript('OnClick', self.GemSocket_OnClick)
+					Slot["Socket"..i].Socket:SetInside()
+					Slot["Socket"..i].Socket:SetFrameLevel(CORE_FRAME_LEVEL + 4)
+					Slot["Socket"..i].Socket:SetScript('OnEnter', self.GemSocket_OnEnter)
+					Slot["Socket"..i].Socket:SetScript('OnLeave', self.OnLeave)
+					Slot["Socket"..i].Socket:SetScript('OnClick', self.GemSocket_OnClick)

-					Slot['Socket'..i].Texture = Slot['Socket'..i].Socket:CreateTexture(nil, 'OVERLAY')
-					Slot['Socket'..i].Texture:SetTexCoord(.1, .9, .1, .9)
-					Slot['Socket'..i].Texture:SetInside()
+					Slot["Socket"..i].Texture = Slot["Socket"..i].Socket:CreateTexture(nil, 'OVERLAY')
+					Slot["Socket"..i].Texture:SetTexCoord(.1, .9, .1, .9)
+					Slot["Socket"..i].Texture:SetInside()
 				end
 				Slot.Socket1:Point('BOTTOM'..Slot.Direction, Slot, 'BOTTOM'..(Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 3 or -3, 2)
 				Slot.Socket2:Point(Slot.Direction, Slot.Socket1, Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT', Slot.Direction == 'LEFT' and 1 or -1, 0)
@@ -911,43 +911,43 @@ function IA:CreateInspectFrame()
 			self.Info.Profession.Icon:SetTexture('Interface\\Icons\\Trade_BlackSmithing')

 			for i = 1, 2 do
-				self.Info.Profession['Prof'..i] = CreateFrame('Frame', nil, self.Info.Profession.Page)
-				self.Info.Profession['Prof'..i]:Size(20)
-				self.Info.Profession['Prof'..i]:SetBackdrop({
+				self.Info.Profession["Prof"..i] = CreateFrame('Frame', nil, self.Info.Profession.Page)
+				self.Info.Profession["Prof"..i]:Size(20)
+				self.Info.Profession["Prof"..i]:SetBackdrop({
 					bgFile = E.media.blankTex,
 					edgeFile = E.media.blankTex,
 					tile = false, tileSize = 0, edgeSize = E.mult,
 					insets = { left = 0, right = 0, top = 0, bottom = 0}
 				})
-				self.Info.Profession['Prof'..i]:SetBackdropBorderColor(0, 0, 0)
+				self.Info.Profession["Prof"..i]:SetBackdropBorderColor(0, 0, 0)

-				self.Info.Profession['Prof'..i].Icon = self.Info.Profession['Prof'..i]:CreateTexture(nil, 'OVERLAY')
-				self.Info.Profession['Prof'..i].Icon:SetTexCoord(unpack(E.TexCoords))
-				self.Info.Profession['Prof'..i].Icon:SetInside()
+				self.Info.Profession["Prof"..i].Icon = self.Info.Profession["Prof"..i]:CreateTexture(nil, 'OVERLAY')
+				self.Info.Profession["Prof"..i].Icon:SetTexCoord(unpack(E.TexCoords))
+				self.Info.Profession["Prof"..i].Icon:SetInside()

-				self.Info.Profession['Prof'..i].BarFrame = CreateFrame('Frame', nil, self.Info.Profession['Prof'..i])
-				self.Info.Profession['Prof'..i].BarFrame:Size(136, 5)
-				self.Info.Profession['Prof'..i].BarFrame:SetBackdrop({
+				self.Info.Profession["Prof"..i].BarFrame = CreateFrame('Frame', nil, self.Info.Profession["Prof"..i])
+				self.Info.Profession["Prof"..i].BarFrame:Size(136, 5)
+				self.Info.Profession["Prof"..i].BarFrame:SetBackdrop({
 					bgFile = E.media.blankTex,
 					edgeFile = E.media.blankTex,
 					tile = false, tileSize = 0, edgeSize = E.mult,
 					insets = { left = 0, right = 0, top = 0, bottom = 0}
 				})
-				self.Info.Profession['Prof'..i].BarFrame:SetBackdropColor(0, 0, 0)
-				self.Info.Profession['Prof'..i].BarFrame:SetBackdropBorderColor(0, 0, 0)
-				self.Info.Profession['Prof'..i].BarFrame:Point('BOTTOMLEFT', self.Info.Profession['Prof'..i], 'BOTTOMRIGHT', SPACING, 0)
+				self.Info.Profession["Prof"..i].BarFrame:SetBackdropColor(0, 0, 0)
+				self.Info.Profession["Prof"..i].BarFrame:SetBackdropBorderColor(0, 0, 0)
+				self.Info.Profession["Prof"..i].BarFrame:Point('BOTTOMLEFT', self.Info.Profession["Prof"..i], 'BOTTOMRIGHT', SPACING, 0)

-				self.Info.Profession['Prof'..i].Bar = CreateFrame('StatusBar', nil, self.Info.Profession['Prof'..i].BarFrame)
-				self.Info.Profession['Prof'..i].Bar:SetInside()
-				self.Info.Profession['Prof'..i].Bar:SetStatusBarTexture(E.media.normTex)
-				self.Info.Profession['Prof'..i].Bar:SetMinMaxValues(0, 600)
+				self.Info.Profession["Prof"..i].Bar = CreateFrame('StatusBar', nil, self.Info.Profession["Prof"..i].BarFrame)
+				self.Info.Profession["Prof"..i].Bar:SetInside()
+				self.Info.Profession["Prof"..i].Bar:SetStatusBarTexture(E.media.normTex)
+				self.Info.Profession["Prof"..i].Bar:SetMinMaxValues(0, 600)

-				KF:TextSetting(self.Info.Profession['Prof'..i], nil, { Tag = 'Level', FontSize = 10 }, 'TOP', self.Info.Profession['Prof'..i].Icon)
-				self.Info.Profession['Prof'..i].Level:Point('RIGHT', self.Info.Profession['Prof'..i].Bar)
+				KF:TextSetting(self.Info.Profession["Prof"..i], nil, { Tag = 'Level', FontSize = 10 }, 'TOP', self.Info.Profession["Prof"..i].Icon)
+				self.Info.Profession["Prof"..i].Level:Point('RIGHT', self.Info.Profession["Prof"..i].Bar)

-				KF:TextSetting(self.Info.Profession['Prof'..i], nil, { Tag = 'Name', FontSize = 10, directionH = 'LEFT' }, 'TOP', self.Info.Profession['Prof'..i].Icon)
-				self.Info.Profession['Prof'..i].Name:Point('LEFT', self.Info.Profession['Prof'..i].Bar)
-				self.Info.Profession['Prof'..i].Name:Point('RIGHT', self.Info.Profession['Prof'..i].Level, 'LEFT', -SPACING, 0)
+				KF:TextSetting(self.Info.Profession["Prof"..i], nil, { Tag = 'Name', FontSize = 10, directionH = 'LEFT' }, 'TOP', self.Info.Profession["Prof"..i].Icon)
+				self.Info.Profession["Prof"..i].Name:Point('LEFT', self.Info.Profession["Prof"..i].Bar)
+				self.Info.Profession["Prof"..i].Name:Point('RIGHT', self.Info.Profession["Prof"..i].Level, 'LEFT', -SPACING, 0)
 			end

 			self.Info.Profession.Prof1:Point('TOPLEFT', self.Info.Profession.Page, 6, -7)
@@ -971,9 +971,9 @@ function IA:CreateInspectFrame()
 			self.Info.PvP.PageRight:SetFrameLevel(CORE_FRAME_LEVEL + 4)

 			for i = 1, 3 do
-				self.Info.PvP['Bar'..i] = self.Info.PvP.Page:CreateTexture(nil, 'OVERLAY')
-				self.Info.PvP['Bar'..i]:SetTexture(0, 0, 0)
-				self.Info.PvP['Bar'..i]:Width(2)
+				self.Info.PvP["Bar"..i] = self.Info.PvP.Page:CreateTexture(nil, 'OVERLAY')
+				self.Info.PvP["Bar"..i]:SetTexture(0, 0, 0)
+				self.Info.PvP["Bar"..i]:Width(2)
 			end
 			self.Info.PvP.Bar1:Point('TOP', self.Info.PvP.PageLeft, 0, -SPACING * 2)
 			self.Info.PvP.Bar1:Point('BOTTOM', self.Info.PvP.PageLeft, 0, SPACING * 2)
@@ -1012,18 +1012,18 @@ function IA:CreateInspectFrame()
 				KF:TextSetting(self.Info.PvP[Type], nil, { Tag = 'Rating', FontSize = 22, FontStyle = 'OUTLINE' }, 'CENTER', self.Info.PvP[Type].Rank, 0, 3)
 				KF:TextSetting(self.Info.PvP[Type], nil, { Tag = 'Record', FontSize = 10, FontStyle = 'OUTLINE' }, 'TOP', self.Info.PvP[Type].Rank, 'BOTTOM', 0, 12)
 			end
-			self.Info.PvP['2vs2']:Point('TOP', self.Info.PvP.Bar1)
-			self.Info.PvP['2vs2']:Point('LEFT', self.Info.PvP.Page)
-			self.Info.PvP['2vs2']:Point('BOTTOMRIGHT', self.Info.PvP.Bar1, 'BOTTOMLEFT', -SPACING, 0)
-			self.Info.PvP['2vs2'].Type:SetText(ARENA_2V2)
+			self.Info.PvP["2vs2"]:Point('TOP', self.Info.PvP.Bar1)
+			self.Info.PvP["2vs2"]:Point('LEFT', self.Info.PvP.Page)
+			self.Info.PvP["2vs2"]:Point('BOTTOMRIGHT', self.Info.PvP.Bar1, 'BOTTOMLEFT', -SPACING, 0)
+			self.Info.PvP["2vs2"].Type:SetText(ARENA_2V2)

-			self.Info.PvP['3vs3']:Point('TOPLEFT', self.Info.PvP.Bar1, 'TOPRIGHT', SPACING, 0)
-			self.Info.PvP['3vs3']:Point('BOTTOMRIGHT', self.Info.PvP.Bar2, 'BOTTOMLEFT', -SPACING, 0)
-			self.Info.PvP['3vs3'].Type:SetText(ARENA_3V3)
+			self.Info.PvP["3vs3"]:Point('TOPLEFT', self.Info.PvP.Bar1, 'TOPRIGHT', SPACING, 0)
+			self.Info.PvP["3vs3"]:Point('BOTTOMRIGHT', self.Info.PvP.Bar2, 'BOTTOMLEFT', -SPACING, 0)
+			self.Info.PvP["3vs3"].Type:SetText(ARENA_3V3)

-			self.Info.PvP['5vs5']:Point('TOPLEFT', self.Info.PvP.Bar2, 'TOPRIGHT', SPACING, 0)
-			self.Info.PvP['5vs5']:Point('BOTTOMRIGHT', self.Info.PvP.Bar3, 'BOTTOMLEFT', -SPACING, 0)
-			self.Info.PvP['5vs5'].Type:SetText(ARENA_5V5)
+			self.Info.PvP["5vs5"]:Point('TOPLEFT', self.Info.PvP.Bar2, 'TOPRIGHT', SPACING, 0)
+			self.Info.PvP["5vs5"]:Point('BOTTOMRIGHT', self.Info.PvP.Bar3, 'BOTTOMLEFT', -SPACING, 0)
+			self.Info.PvP["5vs5"].Type:SetText(ARENA_5V5)

 			self.Info.PvP.RB:Point('TOP', self.Info.PvP.Bar3)
 			self.Info.PvP.RB:Point('RIGHT', self.Info.PvP.Page)
@@ -1085,7 +1085,7 @@ function IA:CreateInspectFrame()
 		self.Spec.Page:SetFrameLevel(CORE_FRAME_LEVEL + 3)
 		self.Spec.Page:Point('TOPLEFT', self.Spec)
 		self.Spec.Page:Point('TOPRIGHT', self.Spec)
-		self.Spec.Page:Height((TALENT_SLOT_SIZE + SPACING * 3) * MAX_TALENT_TIERS + (SPACING + GLYPH_SLOT_HEIGHT) * 3 + 18)
+		self.Spec.Page:Height((TALENT_SLOT_SIZE + SPACING * 3) * MAX_TALENT_TIERS + 18)

 		self.Spec.BottomBorder = self.Spec:CreateTexture(nil, 'OVERLAY')
 		self.Spec.BottomBorder:Point('TOPLEFT', self.Spec.BG, 'BOTTOMLEFT', 0, E.mult)
@@ -1101,195 +1101,120 @@ function IA:CreateInspectFrame()

 		do -- Specialization Tab
 			for i = 1, MAX_TALENT_GROUPS do
-				self.Spec['Spec'..i] = CreateFrame('Button', nil, self.Spec)
-				self.Spec['Spec'..i]:Size(150, 28)
-				self.Spec['Spec'..i]:SetScript('OnClick', function() self:ToggleSpecializationTab(i, self.CurrentInspectData) end)
+				self.Spec["Spec"..i] = CreateFrame('Button', nil, self.Spec)
+				self.Spec["Spec"..i]:Size(150, 28)
+				self.Spec["Spec"..i]:SetScript('OnClick', function() self:ToggleSpecializationTab(i, self.CurrentInspectData) end)

-				self.Spec['Spec'..i].Tab = CreateFrame('Frame', nil, self.Spec['Spec'..i])
-				self.Spec['Spec'..i].Tab:Size(120, 28)
-				self.Spec['Spec'..i].Tab:SetBackdrop({
+				self.Spec["Spec"..i].Tab = CreateFrame('Frame', nil, self.Spec["Spec"..i])
+				self.Spec["Spec"..i].Tab:Size(120, 28)
+				self.Spec["Spec"..i].Tab:SetBackdrop({
 					bgFile = E.media.blankTex,
 					edgeFile = E.media.blankTex,
 					tile = false, tileSize = 0, edgeSize = 0,
 					insets = { left = 0, right = 0, top = 0, bottom = 0}
 				})
-				self.Spec['Spec'..i].Tab:SetBackdropColor(0, 0, 0, .7)
-				self.Spec['Spec'..i].Tab:SetBackdropBorderColor(0, 0, 0, 0)
-				self.Spec['Spec'..i].Tab:Point('TOPRIGHT', self.Spec['Spec'..i])
-				KF:TextSetting(self.Spec['Spec'..i].Tab, nil, { FontSize = 10, FontStyle = 'OUTLINE' }, 'TOPLEFT', 0, 0)
-				self.Spec['Spec'..i].Tab.text:Point('BOTTOMRIGHT', 0, -4)
+				self.Spec["Spec"..i].Tab:SetBackdropColor(0, 0, 0, .7)
+				self.Spec["Spec"..i].Tab:SetBackdropBorderColor(0, 0, 0, 0)
+				self.Spec["Spec"..i].Tab:Point('TOPRIGHT', self.Spec["Spec"..i])
+				KF:TextSetting(self.Spec["Spec"..i].Tab, nil, { FontSize = 10, FontStyle = 'OUTLINE' }, 'TOPLEFT', 0, 0)
+				self.Spec["Spec"..i].Tab.text:Point('BOTTOMRIGHT', 0, -4)

-				self.Spec['Spec'..i].Icon = CreateFrame('Frame', nil, self.Spec['Spec'..i].Tab)
-				self.Spec['Spec'..i].Icon:Size(27, 24)
-				self.Spec['Spec'..i].Icon:SetBackdrop({
+				self.Spec["Spec"..i].Icon = CreateFrame('Frame', nil, self.Spec["Spec"..i].Tab)
+				self.Spec["Spec"..i].Icon:Size(27, 24)
+				self.Spec["Spec"..i].Icon:SetBackdrop({
 					bgFile = E.media.blankTex,
 					edgeFile = E.media.blankTex,
 					tile = false, tileSize = 0, edgeSize = E.mult,
 					insets = { left = 0, right = 0, top = 0, bottom = 0}
 				})
-				self.Spec['Spec'..i].Icon:SetBackdropColor(0, 0, 0, .7)
-				self.Spec['Spec'..i].Icon:Point('TOPLEFT', self.Spec['Spec'..i])
+				self.Spec["Spec"..i].Icon:SetBackdropColor(0, 0, 0, .7)
+				self.Spec["Spec"..i].Icon:Point('TOPLEFT', self.Spec["Spec"..i])

-				self.Spec['Spec'..i].Texture = self.Spec['Spec'..i].Icon:CreateTexture(nil, 'OVERLAY')
-				self.Spec['Spec'..i].Texture:SetTexCoord(.08, .92, .16, .84)
-				self.Spec['Spec'..i].Texture:SetInside()
+				self.Spec["Spec"..i].Texture = self.Spec["Spec"..i].Icon:CreateTexture(nil, 'OVERLAY')
+				self.Spec["Spec"..i].Texture:SetTexCoord(.08, .92, .16, .84)
+				self.Spec["Spec"..i].Texture:SetInside()

-				self.Spec['Spec'..i].TopBorder = self.Spec['Spec'..i].Tab:CreateTexture(nil, 'OVERLAY')
-				self.Spec['Spec'..i].TopBorder:Point('TOPLEFT', self.Spec['Spec'..i].Tab)
-				self.Spec['Spec'..i].TopBorder:Point('BOTTOMRIGHT', self.Spec['Spec'..i].Tab, 'TOPRIGHT', 0, -E.mult)
+				self.Spec["Spec"..i].TopBorder = self.Spec["Spec"..i].Tab:CreateTexture(nil, 'OVERLAY')
+				self.Spec["Spec"..i].TopBorder:Point('TOPLEFT', self.Spec["Spec"..i].Tab)
+				self.Spec["Spec"..i].TopBorder:Point('BOTTOMRIGHT', self.Spec["Spec"..i].Tab, 'TOPRIGHT', 0, -E.mult)

-				self.Spec['Spec'..i].LeftBorder = self.Spec['Spec'..i].Tab:CreateTexture(nil, 'OVERLAY')
-				self.Spec['Spec'..i].LeftBorder:Point('TOPLEFT', self.Spec['Spec'..i].TopBorder, 'BOTTOMLEFT')
-				self.Spec['Spec'..i].LeftBorder:Point('BOTTOMRIGHT', self.Spec['Spec'..i].Tab, 'BOTTOMLEFT', E.mult, 0)
+				self.Spec["Spec"..i].LeftBorder = self.Spec["Spec"..i].Tab:CreateTexture(nil, 'OVERLAY')
+				self.Spec["Spec"..i].LeftBorder:Point('TOPLEFT', self.Spec["Spec"..i].TopBorder, 'BOTTOMLEFT')
+				self.Spec["Spec"..i].LeftBorder:Point('BOTTOMRIGHT', self.Spec["Spec"..i].Tab, 'BOTTOMLEFT', E.mult, 0)

-				self.Spec['Spec'..i].RightBorder = self.Spec['Spec'..i].Tab:CreateTexture(nil, 'OVERLAY')
-				self.Spec['Spec'..i].RightBorder:Point('TOPLEFT', self.Spec['Spec'..i].TopBorder, 'BOTTOMRIGHT', -E.mult, 0)
-				self.Spec['Spec'..i].RightBorder:Point('BOTTOMRIGHT', self.Spec['Spec'..i].Tab)
+				self.Spec["Spec"..i].RightBorder = self.Spec["Spec"..i].Tab:CreateTexture(nil, 'OVERLAY')
+				self.Spec["Spec"..i].RightBorder:Point('TOPLEFT', self.Spec["Spec"..i].TopBorder, 'BOTTOMRIGHT', -E.mult, 0)
+				self.Spec["Spec"..i].RightBorder:Point('BOTTOMRIGHT', self.Spec["Spec"..i].Tab)

-				self.Spec['Spec'..i].BottomLeftBorder = self.Spec['Spec'..i].Tab:CreateTexture(nil, 'OVERLAY')
-				self.Spec['Spec'..i].BottomLeftBorder:Point('TOPLEFT', self.Spec.BG, 0, E.mult)
-				self.Spec['Spec'..i].BottomLeftBorder:Point('BOTTOMRIGHT', self.Spec['Spec'..i].LeftBorder, 'BOTTOMLEFT')
+				self.Spec["Spec"..i].BottomLeftBorder = self.Spec["Spec"..i].Tab:CreateTexture(nil, 'OVERLAY')
+				self.Spec["Spec"..i].BottomLeftBorder:Point('TOPLEFT', self.Spec.BG, 0, E.mult)
+				self.Spec["Spec"..i].BottomLeftBorder:Point('BOTTOMRIGHT', self.Spec["Spec"..i].LeftBorder, 'BOTTOMLEFT')

-				self.Spec['Spec'..i].BottomRightBorder = self.Spec['Spec'..i].Tab:CreateTexture(nil, 'OVERLAY')
-				self.Spec['Spec'..i].BottomRightBorder:Point('TOPRIGHT', self.Spec.BG, 0, E.mult)
-				self.Spec['Spec'..i].BottomRightBorder:Point('BOTTOMLEFT', self.Spec['Spec'..i].RightBorder, 'BOTTOMRIGHT')
+				self.Spec["Spec"..i].BottomRightBorder = self.Spec["Spec"..i].Tab:CreateTexture(nil, 'OVERLAY')
+				self.Spec["Spec"..i].BottomRightBorder:Point('TOPRIGHT', self.Spec.BG, 0, E.mult)
+				self.Spec["Spec"..i].BottomRightBorder:Point('BOTTOMLEFT', self.Spec["Spec"..i].RightBorder, 'BOTTOMRIGHT')
 			end
 			self.Spec.Spec1:Point('BOTTOMLEFT', self.Spec.BG, 'TOPLEFT', 20, 0)
 			self.Spec.Spec2:Point('BOTTOMRIGHT', self.Spec.BG, 'TOPRIGHT', -20, 0)
 		end

 		for i = 1, MAX_TALENT_TIERS do
-			self.Spec['TalentTier'..i] = CreateFrame('Frame', nil, self.Spec.Page)
-			self.Spec['TalentTier'..i]:SetBackdrop({
+			self.Spec["TalentTier"..i] = CreateFrame('Frame', nil, self.Spec.Page)
+			self.Spec["TalentTier"..i]:SetBackdrop({
 				bgFile = E.media.blankTex,
 				edgeFile = E.media.blankTex,
 				tile = false, tileSize = 0, edgeSize = E.mult,
 				insets = { left = 0, right = 0, top = 0, bottom = 0}
 			})
-			self.Spec['TalentTier'..i]:SetBackdropColor(.08, .08, .08)
-			self.Spec['TalentTier'..i]:SetBackdropBorderColor(0, 0, 0)
-			self.Spec['TalentTier'..i]:SetFrameLevel(CORE_FRAME_LEVEL + 3)
-			self.Spec['TalentTier'..i]:Size(352, TALENT_SLOT_SIZE + SPACING * 2)
+			self.Spec["TalentTier"..i]:SetBackdropColor(.08, .08, .08)
+			self.Spec["TalentTier"..i]:SetBackdropBorderColor(0, 0, 0)
+			self.Spec["TalentTier"..i]:SetFrameLevel(CORE_FRAME_LEVEL + 3)
+			self.Spec["TalentTier"..i]:Size(352, TALENT_SLOT_SIZE + SPACING * 2)

 			for k = 1, NUM_TALENT_COLUMNS do
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)] = CreateFrame('Frame', nil, self.Spec['TalentTier'..i])
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)]:SetBackdrop({
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)] = CreateFrame('Frame', nil, self.Spec["TalentTier"..i])
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)]:SetBackdrop({
 					bgFile = E.media.blankTex,
 					edgeFile = E.media.blankTex,
 					tile = false, tileSize = 0, edgeSize = E.mult,
 					insets = { left = 0, right = 0, top = 0, bottom = 0}
 				})
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)]:SetFrameLevel(CORE_FRAME_LEVEL + 4)
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)]:Size(114, TALENT_SLOT_SIZE)
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon = CreateFrame('Frame', nil, self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)])
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon:Size(20)
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon:SetBackdrop({
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)]:SetFrameLevel(CORE_FRAME_LEVEL + 4)
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)]:Size(114, TALENT_SLOT_SIZE)
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon = CreateFrame('Frame', nil, self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)])
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon:Size(20)
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon:SetBackdrop({
 					bgFile = E.media.blankTex,
 					edgeFile = E.media.blankTex,
 					tile = false, tileSize = 0, edgeSize = E.mult,
 					insets = { left = 0, right = 0, top = 0, bottom = 0}
 				})
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon.Texture = self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon:CreateTexture(nil, 'OVERLAY')
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon.Texture:SetTexCoord(unpack(E.TexCoords))
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon.Texture:SetInside()
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon:Point('LEFT', self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)], SPACING, 0)
-				KF:TextSetting(self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)], nil, { FontSize = 9, directionH = 'LEFT' }, 'TOPLEFT', self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon, 'TOPRIGHT', SPACING, SPACING)
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].text:Point('BOTTOMLEFT', self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon, 'BOTTOMRIGHT', SPACING, -SPACING)
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].text:Point('RIGHT', -SPACING, 0)
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon.Texture = self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon:CreateTexture(nil, 'OVERLAY')
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon.Texture:SetTexCoord(unpack(E.TexCoords))
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon.Texture:SetInside()
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon:Point('LEFT', self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)], SPACING, 0)
+				KF:TextSetting(self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)], nil, { FontSize = 9, directionH = 'LEFT' }, 'TOPLEFT', self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon, 'TOPRIGHT', SPACING, SPACING)
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].text:Point('BOTTOMLEFT', self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon, 'BOTTOMRIGHT', SPACING, -SPACING)
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].text:Point('RIGHT', -SPACING, 0)

-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Tooltip = CreateFrame('Button', nil, self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)])
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Tooltip:SetFrameLevel(CORE_FRAME_LEVEL + 5)
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Tooltip:SetInside()
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Tooltip:SetScript('OnClick', self.OnClick)
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Tooltip:SetScript('OnEnter', self.OnEnter)
-				self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Tooltip:SetScript('OnLeave', self.OnLeave)
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Tooltip = CreateFrame('Button', nil, self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)])
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Tooltip:SetFrameLevel(CORE_FRAME_LEVEL + 5)
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Tooltip:SetInside()
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Tooltip:SetScript('OnClick', self.OnClick)
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Tooltip:SetScript('OnEnter', self.OnEnter)
+				self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Tooltip:SetScript('OnLeave', self.OnLeave)
 			end

-			self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + 1)]:Point('RIGHT', self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + 2)], 'LEFT', -2, 0)
-			self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + 2)]:Point('CENTER', self.Spec['TalentTier'..i])
-			self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + 3)]:Point('LEFT', self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + 2)], 'RIGHT', 2, 0)
+			self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + 1)]:Point('RIGHT', self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + 2)], 'LEFT', -2, 0)
+			self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + 2)]:Point('CENTER', self.Spec["TalentTier"..i])
+			self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + 3)]:Point('LEFT', self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + 2)], 'RIGHT', 2, 0)

 			if i > 1 then
-				self.Spec['TalentTier'..i]:Point('TOP', self.Spec['TalentTier'..(i - 1)], 'BOTTOM', 0, -SPACING)
+				self.Spec["TalentTier"..i]:Point('TOP', self.Spec["TalentTier"..(i - 1)], 'BOTTOM', 0, -SPACING)
 			end
 		end

-		self.Spec.TalentTier1:Point('TOP', self.Spec.Page)
-
-		for _, groupName in pairs({ 'MAJOR_GLYPH', 'MINOR_GLYPH' }) do
-			self.Spec['GLYPH_'..groupName] = CreateFrame('Frame', nil, self.Spec.Page)
-			self.Spec['GLYPH_'..groupName]:SetBackdrop({
-				bgFile = E.media.blankTex,
-				edgeFile = E.media.blankTex,
-				tile = false, tileSize = 0, edgeSize = E.mult,
-				insets = { left = 0, right = 0, top = 0, bottom = 0}
-			})
-			self.Spec['GLYPH_'..groupName]:SetBackdropColor(.08, .08, .08)
-			self.Spec['GLYPH_'..groupName]:SetBackdropBorderColor(0, 0, 0)
-			self.Spec['GLYPH_'..groupName]:Height(GLYPH_SLOT_HEIGHT * 3 + SPACING * 3 + 18)
-			KF:TextSetting(self.Spec['GLYPH_'..groupName], '|cffceff00<|r '.._G[groupName]..' |cffceff00>|r', { FontSize = 10 }, 'BOTTOM', self.Spec['GLYPH_'..groupName], 0, 4)
-		end
-
-		for i = 1, NUM_GLYPH_SLOTS do
-			self.Spec['Glyph'..i] = CreateFrame('Button', nil, self.Spec.Page)
-			self.Spec['Glyph'..i]:SetBackdrop({
-				bgFile = E.media.blankTex,
-				edgeFile = E.media.blankTex,
-				tile = false, tileSize = 0, edgeSize = E.mult,
-				insets = { left = 0, right = 0, top = 0, bottom = 0}
-			})
-			self.Spec['Glyph'..i]:SetFrameLevel(CORE_FRAME_LEVEL + 4)
-			self.Spec['Glyph'..i]:Height(GLYPH_SLOT_HEIGHT)
-
-			self.Spec['Glyph'..i].NeedLevel = (i == 1 or i == 2) and 25 or (i == 3 or i == 4) and 50 or 75
-
-			self.Spec['Glyph'..i].Icon = CreateFrame('Frame', nil, self.Spec['Glyph'..i])
-			self.Spec['Glyph'..i].Icon:Size(16)
-			self.Spec['Glyph'..i].Icon:SetBackdrop({
-				bgFile = E.media.blankTex,
-				edgeFile = E.media.blankTex,
-				tile = false, tileSize = 0, edgeSize = E.mult,
-				insets = { left = 0, right = 0, top = 0, bottom = 0}
-			})
-			self.Spec['Glyph'..i].Icon:SetBackdropColor(.15, .15, .15)
-			self.Spec['Glyph'..i].Icon:SetFrameLevel(CORE_FRAME_LEVEL + 5)
-			self.Spec['Glyph'..i].Icon.Texture = self.Spec['Glyph'..i].Icon:CreateTexture(nil, 'OVERLAY')
-			self.Spec['Glyph'..i].Icon.Texture:SetTexCoord(unpack(E.TexCoords))
-			self.Spec['Glyph'..i].Icon.Texture:SetInside()
-			self.Spec['Glyph'..i].Icon:Point('LEFT', self.Spec['Glyph'..i], SPACING, 0)
-
-			self.Spec['Glyph'..i].Tooltip = CreateFrame('Button', nil, self.Spec['Glyph'..i])
-			self.Spec['Glyph'..i].Tooltip:SetFrameLevel(CORE_FRAME_LEVEL + 6)
-			self.Spec['Glyph'..i].Tooltip:SetInside()
-			self.Spec['Glyph'..i].Tooltip:SetScript('OnClick', self.OnClick)
-			self.Spec['Glyph'..i].Tooltip:SetScript('OnEnter', self.OnEnter)
-			self.Spec['Glyph'..i].Tooltip:SetScript('OnLeave', self.OnLeave)
-			self.Spec['Glyph'..i].Tooltip.EnableAuctionSearch = true
-
-			KF:TextSetting(self.Spec['Glyph'..i], nil, { FontSize = 9, directionH = 'LEFT' }, 'LEFT', self.Spec['Glyph'..i].Icon, 'RIGHT', SPACING, 0)
-			self.Spec['Glyph'..i].text:Point('RIGHT', self.Spec['Glyph'..i], -SPACING, 0)
-		end
-
-		self.Spec.Glyph2:Point('TOP', self.Spec.GLYPH_MAJOR_GLYPH, 0, -SPACING)
-		self.Spec.Glyph2:Point('LEFT', self.Spec.GLYPH_MAJOR_GLYPH, SPACING, 0)
-		self.Spec.Glyph2:Point('RIGHT', self.Spec.GLYPH_MAJOR_GLYPH, -SPACING, 0)
-		self.Spec.Glyph4:Point('TOPLEFT', self.Spec.Glyph2, 'BOTTOMLEFT', 0, -SPACING)
-		self.Spec.Glyph4:Point('TOPRIGHT', self.Spec.Glyph2, 'BOTTOMRIGHT', 0, -SPACING)
-		self.Spec.Glyph6:Point('TOPLEFT', self.Spec.Glyph4, 'BOTTOMLEFT', 0, -SPACING)
-		self.Spec.Glyph6:Point('TOPRIGHT', self.Spec.Glyph4, 'BOTTOMRIGHT', 0, -SPACING)
-
-		self.Spec.Glyph1:Point('TOP', self.Spec.GLYPH_MINOR_GLYPH, 0, -SPACING)
-		self.Spec.Glyph1:Point('LEFT', self.Spec.GLYPH_MINOR_GLYPH, SPACING, 0)
-		self.Spec.Glyph1:Point('RIGHT', self.Spec.GLYPH_MINOR_GLYPH, -SPACING, 0)
-		self.Spec.Glyph3:Point('TOPLEFT', self.Spec.Glyph1, 'BOTTOMLEFT', 0, -SPACING)
-		self.Spec.Glyph3:Point('TOPRIGHT', self.Spec.Glyph1, 'BOTTOMRIGHT', 0, -SPACING)
-		self.Spec.Glyph5:Point('TOPLEFT', self.Spec.Glyph3, 'BOTTOMLEFT', 0, -SPACING)
-		self.Spec.Glyph5:Point('TOPRIGHT', self.Spec.Glyph3, 'BOTTOMRIGHT', 0, -SPACING)
-
-		self.Spec.GLYPH_MAJOR_GLYPH:Point('TOPLEFT', self.Spec['TalentTier'..MAX_TALENT_TIERS], 'BOTTOMLEFT', 0, -SPACING)
-		self.Spec.GLYPH_MAJOR_GLYPH:Point('TOPRIGHT', self.Spec['TalentTier'..MAX_TALENT_TIERS], 'BOTTOM', -2, -SPACING)
-		self.Spec.GLYPH_MINOR_GLYPH:Point('TOPLEFT', self.Spec['TalentTier'..MAX_TALENT_TIERS], 'BOTTOM', 2, -SPACING)
-		self.Spec.GLYPH_MINOR_GLYPH:Point('TOPRIGHT', self.Spec['TalentTier'..MAX_TALENT_TIERS], 'BOTTOMRIGHT', 0, -SPACING)
+		self.Spec.TalentTier1:Point('TOP', self.Spec.Page)
 	end

 	do --<< Scanning Tooltip >>--
@@ -1395,7 +1320,7 @@ function IA:CreateInspectFrame()
 				Button.notCheckable = 1
 				UIDropDownMenu_AddButton(Button)

-				Button = _G['DropDownList1Button'..DropDownList1.numButtons]
+				Button = _G["DropDownList1Button"..DropDownList1.numButtons]
 			end

 			Button.value = 'InspectArmory'
@@ -1432,8 +1357,8 @@ function IA:CreateInspectFrame()
 				end

 				for i = 1, DropDownList1.numButtons do
-					if _G['DropDownList1Button'..i].value == 'INSPECT' then
-						Button = _G['DropDownList1Button'..i]
+					if _G["DropDownList1Button"..i].value == 'INSPECT' then
+						Button = _G["DropDownList1Button"..i]
 						break
 					end
 				end
@@ -1561,11 +1486,11 @@ function IA:INSPECT_READY(InspectedUnitGUID)
 				SetOptionCount = 1

 				for i = 1, IA.ScanTTForInspecting:NumLines() do
-					TooltipText = _G['InspectArmoryScanTT_ITextLeft'..i]:GetText()
+					TooltipText = _G["InspectArmoryScanTT_ITextLeft"..i]:GetText()

 					if not TransmogrifiedItem and TooltipText:match(TRANSMOGRIFIED_HEADER) then -- TooltipText:match(Info.Armory_Constants.TransmogrifiedKey)
 						if type(IA.CurrentInspectData.Gear[SlotName].Transmogrify) ~= 'number' then
-							IA.CurrentInspectData.Gear[SlotName].Transmogrify = _G['InspectArmoryScanTT_ITextLeft'..(i + 1)]:GetText() --TooltipText:match(Info.Armory_Constants.TransmogrifiedKey)
+							IA.CurrentInspectData.Gear[SlotName].Transmogrify = _G["InspectArmoryScanTT_ITextLeft"..(i + 1)]:GetText() --TooltipText:match(Info.Armory_Constants.TransmogrifiedKey)
 						end

 						TransmogrifiedItem = true
@@ -1588,14 +1513,14 @@ function IA:INSPECT_READY(InspectedUnitGUID)
 							CurrentSetItem[SetName] = CurrentSetItem[SetName] or {}

 							for k = 1, IA.ScanTTForInspecting:NumLines() do
-								TooltipText = _G['InspectArmoryScanTT_ITextLeft'..(i+k)]:GetText()
+								TooltipText = _G["InspectArmoryScanTT_ITextLeft"..(i+k)]:GetText()

 								if TooltipText == ' ' then
 									CheckSpace = CheckSpace - 1

 									if CheckSpace == 0 then break end
 								elseif CheckSpace == 2 then
-									R, G, B = _G['InspectArmoryScanTT_ITextLeft'..(i+k)]:GetTextColor()
+									R, G, B = _G["InspectArmoryScanTT_ITextLeft"..(i+k)]:GetTextColor()

 									if R > LIGHTYELLOW_FONT_COLOR.r - .01 and R < LIGHTYELLOW_FONT_COLOR.r + .01 and G > LIGHTYELLOW_FONT_COLOR.g - .01 and G < LIGHTYELLOW_FONT_COLOR.g + .01 and B > LIGHTYELLOW_FONT_COLOR.b - .01 and B < LIGHTYELLOW_FONT_COLOR.b + .01 then
 										TooltipText = LIGHTYELLOW_FONT_COLOR_CODE..TooltipText
@@ -1609,14 +1534,14 @@ function IA:INSPECT_READY(InspectedUnitGUID)

 									CurrentSetItem[SetName][k] = TooltipText
 								elseif TooltipText:find(Info.Armory_Constants.ItemSetBonusKey) then
-									TooltipText = (E:RGBToHex(_G['InspectArmoryScanTT_ITextLeft'..(i+k)]:GetTextColor()))..TooltipText..'|r'
+									TooltipText = (E:RGBToHex(_G["InspectArmoryScanTT_ITextLeft"..(i+k)]:GetTextColor()))..TooltipText..'|r'
 									--TooltipText = TooltipText:match("^%((%d)%)%s.+:%s.+$") or true

-									if CurrentSetItem[SetName]['SetOption'..SetOptionCount] and CurrentSetItem[SetName]['SetOption'..SetOptionCount] ~= TooltipText then
+									if CurrentSetItem[SetName]["SetOption"..SetOptionCount] and CurrentSetItem[SetName]["SetOption"..SetOptionCount] ~= TooltipText then
 										NeedReinspect = true
 									end

-									CurrentSetItem[SetName]['SetOption'..SetOptionCount] = TooltipText
+									CurrentSetItem[SetName]["SetOption"..SetOptionCount] = TooltipText
 									SetOptionCount = SetOptionCount + 1
 								end
 							end
@@ -1647,19 +1572,10 @@ function IA:INSPECT_READY(InspectedUnitGUID)
 		for k = 1, NUM_TALENT_COLUMNS do
 			TalentID, _, _, isSelected = GetTalentInfo(i, k, 1, true, UnitID)

-			IA.CurrentInspectData.Specialization[1]['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)] = { TalentID, isSelected }
+			IA.CurrentInspectData.Specialization[1]["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)] = { TalentID, isSelected }
 		end
 	end

-	-- Glyph
-	local SpellID, GlyphID
-	for i = 1, NUM_GLYPH_SLOTS do
-		_, _, _, SpellID, _, GlyphID = GetGlyphSocketInfo(i, nil, true, UnitID)
-
-		IA.CurrentInspectData.Glyph[1]['Glyph'..i..'SpellID'] = SpellID or 0
-		IA.CurrentInspectData.Glyph[1]['Glyph'..i..'ID'] = GlyphID or 0
-	end
-
 	-- Guild
 	IA.CurrentInspectData.guildPoint, IA.CurrentInspectData.guildNumMembers = GetInspectGuildInfo(UnitID)
 	IA.CurrentInspectData.guildEmblem = { GetGuildLogoInfo(UnitID) }
@@ -1688,7 +1604,7 @@ IA.InspectUnit = function(UnitID, Properties)
 	if not UnitIsPlayer(UnitID) then
 		return
 	elseif UnitIsDeadOrGhost('player') then
-		print(L['KF']..' : '..L["You can't inspect while dead."])
+		print(L["KF"]..' : '..L["You can't inspect while dead."])
 		return
 	elseif not UnitIsVisible(UnitID) then

@@ -1772,10 +1688,10 @@ function IA:InspectFrame_DataSetting(DataTable)
 					Slot.Gradation.ItemLevel:SetText(nil)
 					Slot.Gradation.ItemEnchant:SetText(nil)
 					for i = 1, MAX_NUM_SOCKETS do
-						Slot['Socket'..i].Texture:SetTexture(nil)
-						Slot['Socket'..i].GemItemID = nil
-						Slot['Socket'..i].GemType = nil
-						Slot['Socket'..i]:Hide()
+						Slot["Socket"..i].Texture:SetTexture(nil)
+						Slot["Socket"..i].GemItemID = nil
+						Slot["Socket"..i].GemType = nil
+						Slot["Socket"..i]:Hide()
 					end
 					Slot.EnchantWarning:Hide()
 					Slot.EnchantWarning.Message = nil
@@ -1808,11 +1724,11 @@ function IA:InspectFrame_DataSetting(DataTable)

 							-- First, Counting default gem sockets
 							for i = 1, MAX_NUM_SOCKETS do
-								ItemTexture = _G['InspectArmoryScanTTTexture'..i]:GetTexture()
+								ItemTexture = _G["InspectArmoryScanTTTexture"..i]:GetTexture()

 								if ItemTexture and ItemTexture:find('Interface\\ItemSocketingFrame\\') then
 									GemCount_Default = GemCount_Default + 1
-									Slot['Socket'..GemCount_Default].GemType = strupper(gsub(ItemTexture, 'Interface\\ItemSocketingFrame\\UI--EmptySocket--', ''))
+									Slot["Socket"..GemCount_Default].GemType = strupper(gsub(ItemTexture, 'Interface\\ItemSocketingFrame\\UI--EmptySocket--', ''))
 								end
 							end

@@ -1823,7 +1739,7 @@ function IA:InspectFrame_DataSetting(DataTable)
 								((SlotName == 'WristSlot' or SlotName == 'HandsSlot') and (DataTable.Profession[1].Name == GetSpellInfo(110396) and DataTable.Profession[1].Level >= 550 or DataTable.Profession[2].Name == GetSpellInfo(110396) and DataTable.Profession[2].Level >= 550)) then -- BlackSmith

 								GemCount_Enable = GemCount_Enable + 1
-								Slot['Socket'..GemCount_Enable].GemType = 'PRISMATIC'
+								Slot["Socket'..GemCount_Enable].GemType = 'PRISMATIC'
 							end
 							]]

@@ -1832,36 +1748,36 @@ function IA:InspectFrame_DataSetting(DataTable)

 							-- Apply current item's gem setting
 							for i = 1, MAX_NUM_SOCKETS do
-								ItemTexture = _G['InspectArmoryScanTTTexture'..i]:GetTexture()
+								ItemTexture = _G["InspectArmoryScanTTTexture"..i]:GetTexture()

-								if Slot['Socket'..i].GemType and Info.Armory_Constants.GemColor[Slot['Socket'..i].GemType] then
-									R, G, B = unpack(Info.Armory_Constants.GemColor[Slot['Socket'..i].GemType])
-									Slot['Socket'..i].Socket:SetBackdropColor(R, G, B, 0.5)
-									Slot['Socket'..i].Socket:SetBackdropBorderColor(R, G, B)
+								if Slot["Socket"..i].GemType and Info.Armory_Constants.GemColor[Slot["Socket"..i].GemType] then
+									R, G, B = unpack(Info.Armory_Constants.GemColor[Slot["Socket"..i].GemType])
+									Slot["Socket"..i].Socket:SetBackdropColor(R, G, B, 0.5)
+									Slot["Socket"..i].Socket:SetBackdropBorderColor(R, G, B)
 								else
-									Slot['Socket'..i].Socket:SetBackdropColor(1, 1, 1, 0.5)
-									Slot['Socket'..i].Socket:SetBackdropBorderColor(1, 1, 1)
+									Slot["Socket"..i].Socket:SetBackdropColor(1, 1, 1, 0.5)
+									Slot["Socket"..i].Socket:SetBackdropBorderColor(1, 1, 1)
 								end

-								CurrentLineText = select(2, _G['InspectArmoryScanTTTexture'..i]:GetPoint())
-								CurrentLineText = DataTable.Gear[SlotName]['Gem'..i] or CurrentLineText ~= self.ScanTT and CurrentLineText.GetText and CurrentLineText:GetText():gsub('|cff......', ''):gsub('|r', '') or nil
+								CurrentLineText = select(2, _G["InspectArmoryScanTTTexture"..i]:GetPoint())
+								CurrentLineText = DataTable.Gear[SlotName]["Gem"..i] or CurrentLineText ~= self.ScanTT and CurrentLineText.GetText and CurrentLineText:GetText():gsub('|cff......', ''):gsub('|r', '') or nil

 								if CurrentLineText then
 									if E.db.sle.Armory.Inspect.Gem.Display == 'Always' or E.db.sle.Armory.Inspect.Gem.Display == 'MouseoverOnly' and Slot.Mouseovered or E.db.sle.Armory.Inspect.Gem.Display == 'MissingOnly' then
-										Slot['Socket'..i]:Show()
-										Slot.SocketWarning:Point(Slot.Direction, Slot['Socket'..i], (Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 3 or -3, 0)
+										Slot["Socket"..i]:Show()
+										Slot.SocketWarning:Point(Slot.Direction, Slot["Socket"..i], (Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 3 or -3, 0)
 									end

 									GemCount_Now = GemCount_Now + 1

-									ItemTexture = ItemTexture or DataTable.Gear[SlotName]['Gem'..i] and select(10, GetItemInfo(DataTable.Gear[SlotName]['Gem'..i])) or nil
+									ItemTexture = ItemTexture or DataTable.Gear[SlotName]["Gem"..i] and select(10, GetItemInfo(DataTable.Gear[SlotName]["Gem"..i])) or nil

 									if not ItemTexture then
 										NeedUpdate = true
 									elseif not Info.Armory_Constants.EmptySocketString[CurrentLineText] then
 										GemCount = GemCount + 1
-										Slot['Socket'..i].GemItemID = CurrentLineText
-										Slot['Socket'..i].Texture:SetTexture(ItemTexture)
+										Slot["Socket"..i].GemItemID = CurrentLineText
+										Slot["Socket"..i].Texture:SetTexture(ItemTexture)
 									end
 								end
 							end
@@ -1874,11 +1790,11 @@ function IA:InspectFrame_DataSetting(DataTable)
 						_, _, ItemRarity, BasicItemLevel, _, _, _, _, ItemType, ItemTexture = GetItemInfo(Slot.Link)
 						R, G, B = GetItemQualityColor(ItemRarity)

-						ItemUpgradeID = Slot.Link:match(':(%d+)\124h%[')
+						ItemUpgradeID = Slot.Link:match(":(%d+)\124h%[")

 						--<< Enchant Parts >>--
 						for i = 1, self.ScanTT:NumLines() do
-							CurrentLineText = _G['InspectArmoryScanTTTextLeft'..i]:GetText()
+							CurrentLineText = _G["InspectArmoryScanTTTextLeft"..i]:GetText()

 							if CurrentLineText:find(Info.Armory_Constants.ItemLevelKey_Alt) then
 								TrueItemLevel = tonumber(CurrentLineText:match(Info.Armory_Constants.ItemLevelKey_Alt))
@@ -1943,19 +1859,19 @@ function IA:InspectFrame_DataSetting(DataTable)
 						if (not Slot.IsEnchanted and Info.Armory_Constants.EnchantableSlots[SlotName]) or ((SlotName == 'Finger0Slot' or SlotName == 'Finger1Slot') and (DataTable.Profession[1].Name == GetSpellInfo(110400) and DataTable.Profession[1].Level >= 550 or DataTable.Profession[2].Name == GetSpellInfo(110400) and DataTable.Profession[2].Level >= 550) and not Slot.IsEnchanted) then
 							ErrorDetected = true
 							Slot.EnchantWarning:Show()
-							Slot.Gradation.ItemEnchant:SetText('|cffff0000'..L['Not Enchanted'])
+							Slot.Gradation.ItemEnchant:SetText('|cffff0000'..L["Not Enchanted"])
 						elseif SlotName == 'ShoulderSlot' and KF.Table.ItemEnchant_Profession_Inscription and (DataTable.Profession[1].Name == GetSpellInfo(110417) and DataTable.Profession[1].Level >= KF.Table.ItemEnchant_Profession_Inscription.NeedLevel or DataTable.Profession[2].Name == GetSpellInfo(110417) and DataTable.Profession[2].Level >= KF.Table.ItemEnchant_Profession_Inscription.NeedLevel) and not KF.Table.ItemEnchant_Profession_Inscription[enchantID] then
 							ErrorDetected = true
 							Slot.EnchantWarning:Show()
-							Slot.EnchantWarning.Message = '|cff71d5ff'..GetSpellInfo(110400)..'|r : '..L['This is not profession only.']
+							Slot.EnchantWarning.Message = '|cff71d5ff'..GetSpellInfo(110400)..'|r : '..L["This is not profession only."]
 						elseif SlotName == 'WristSlot' and KF.Table.ItemEnchant_Profession_LeatherWorking and (DataTable.Profession[1].Name == GetSpellInfo(110423) and DataTable.Profession[1].Level >= KF.Table.ItemEnchant_Profession_LeatherWorking.NeedLevel or DataTable.Profession[2].Name == GetSpellInfo(110423) and DataTable.Profession[2].Level >= KF.Table.ItemEnchant_Profession_LeatherWorking.NeedLevel) and not KF.Table.ItemEnchant_Profession_LeatherWorking[enchantID] then
 							ErrorDetected = true
 							Slot.EnchantWarning:Show()
-							Slot.EnchantWarning.Message = '|cff71d5ff'..GetSpellInfo(110423)..'|r : '..L['This is not profession only.']
+							Slot.EnchantWarning.Message = '|cff71d5ff'..GetSpellInfo(110423)..'|r : '..L["This is not profession only."]
 						elseif SlotName == 'BackSlot' and KF.Table.ItemEnchant_Profession_Tailoring and (DataTable.Profession[1].Name == GetSpellInfo(110426) and DataTable.Profession[1].Level >= KF.Table.ItemEnchant_Profession_Tailoring.NeedLevel or DataTable.Profession[2].Name == GetSpellInfo(110426) and DataTable.Profession[2].Level >= KF.Table.ItemEnchant_Profession_Tailoring.NeedLevel) and not KF.Table.ItemEnchant_Profession_Tailoring[enchantID] then
 							ErrorDetected = true
 							Slot.EnchantWarning:Show()
-							Slot.EnchantWarning.Message = '|cff71d5ff'..GetSpellInfo(110426)..'|r : '..L['This is not profession only.']
+							Slot.EnchantWarning.Message = '|cff71d5ff'..GetSpellInfo(110426)..'|r : '..L["This is not profession only."]
 						end
 						]]
 						if E.db.sle.Armory.Inspect.NoticeMissing ~= false then
@@ -1965,7 +1881,7 @@ function IA:InspectFrame_DataSetting(DataTable)
 									Slot.EnchantWarning:Show()

 									if not E.db.sle.Armory.Character.Enchant.WarningIconOnly then
-										Slot.ItemEnchant:SetText('|cffff0000'..L['Not Enchanted'])
+										Slot.ItemEnchant:SetText('|cffff0000'..L["Not Enchanted"])
 									end
 								end
 							end
@@ -1974,7 +1890,7 @@ function IA:InspectFrame_DataSetting(DataTable)
 								ErrorDetected = true

 								Slot.SocketWarning:Show()
-								Slot.SocketWarning.Message = '|cffff5678'..(GemCount_Now - GemCount)..'|r '..L['Empty Socket']
+								Slot.SocketWarning.Message = '|cffff5678'..(GemCount_Now - GemCount)..'|r '..L["Empty Socket"]
 							end
 							if E.db.sle.Armory.Inspect.MissingIcon then
 								Slot.EnchantWarning.Texture:Show()
@@ -2075,16 +1991,16 @@ function IA:InspectFrame_DataSetting(DataTable)
 			for i = 1, 2 do
 				if DataTable.Profession[i].Name then
 					self.Info.Profession:Show()
-					self.Info.Profession['Prof'..i].Bar:SetValue(DataTable.Profession[i].Level)
+					self.Info.Profession["Prof"..i].Bar:SetValue(DataTable.Profession[i].Level)

 					if Info.Armory_Constants.ProfessionList[DataTable.Profession[i].Name] then
-						self.Info.Profession['Prof'..i].Name:SetText('|cff77c0ff'..DataTable.Profession[i].Name)
-						self.Info.Profession['Prof'..i].Icon:SetTexture(Info.Armory_Constants.ProfessionList[DataTable.Profession[i].Name].Texture)
-						self.Info.Profession['Prof'..i].Level:SetText(DataTable.Profession[i].Level)
+						self.Info.Profession["Prof"..i].Name:SetText('|cff77c0ff'..DataTable.Profession[i].Name)
+						self.Info.Profession["Prof"..i].Icon:SetTexture(Info.Armory_Constants.ProfessionList[DataTable.Profession[i].Name].Texture)
+						self.Info.Profession["Prof"..i].Level:SetText(DataTable.Profession[i].Level)
 					else
-						self.Info.Profession['Prof'..i].Name:SetText('|cff808080'..DataTable.Profession[i].Name)
-						self.Info.Profession['Prof'..i].Icon:SetTexture('Interface\\ICONS\\INV_Misc_QuestionMark')
-						self.Info.Profession['Prof'..i].Level:SetText(nil)
+						self.Info.Profession["Prof"..i].Name:SetText('|cff808080'..DataTable.Profession[i].Name)
+						self.Info.Profession["Prof"..i].Icon:SetTexture('Interface\\ICONS\\INV_Misc_QuestionMark')
+						self.Info.Profession["Prof"..i].Level:SetText(nil)
 					end
 				else
 					self.Info.Profession:Hide()
@@ -2114,13 +2030,13 @@ function IA:InspectFrame_DataSetting(DataTable)
 			SpecGroup = DataTable.Specialization.ActiveSpec or 1

 			for i = 2, MAX_TALENT_GROUPS do
-				self.Spec['Spec'..i]:Show()
+				self.Spec["Spec"..i]:Show()
 			end
 		else
 			SpecGroup = 1

 			for i = 2, MAX_TALENT_GROUPS do
-				self.Spec['Spec'..i]:Hide()
+				self.Spec["Spec"..i]:Hide()
 			end
 		end

@@ -2144,19 +2060,19 @@ function IA:InspectFrame_DataSetting(DataTable)

 						Name = (SpecRole == 'Tank' and '|TInterface\\AddOns\\ElvUI\\media\\textures\\tank.tga:16:16:-3:0|t' or SpecRole == 'Healer' and '|TInterface\\AddOns\\ElvUI\\media\\textures\\healer.tga:16:16:-3:-1|t' or '|TInterface\\AddOns\\ElvUI\\media\\textures\\dps.tga:16:16:-2:-1|t')..Name
 					else
-						self.Spec.Message = L['Specialization data seems to be crashed. Please inspect again.']
+						self.Spec.Message = L["Specialization data seems to be crashed. Please inspect again."]
 					end
 				end
 			end

 			if not Name then
 				Texture, SpecRole = 'Interface\\ICONS\\INV_Misc_QuestionMark.blp', nil
-				Name = '|cff808080'..L['No Specialization']
+				Name = '|cff808080'..L["No Specialization"]
 			end

-			self.Spec['Spec'..groupNum].Tab.text:SetText(Color..Name)
-			self.Spec['Spec'..groupNum].Texture:SetTexture(Texture)
-			self.Spec['Spec'..groupNum].Texture:SetDesaturated(groupNum ~= SpecGroup)
+			self.Spec["Spec"..groupNum].Tab.text:SetText(Color..Name)
+			self.Spec["Spec"..groupNum].Texture:SetTexture(Texture)
+			self.Spec["Spec"..groupNum].Texture:SetDesaturated(groupNum ~= SpecGroup)
 		end
 	end

@@ -2182,7 +2098,7 @@ function IA:InspectFrame_DataSetting(DataTable)
 				end
 			end

-			self.Character.Message = L['Character model may differ because it was constructed by the inspect data.']
+			self.Character.Message = L["Character model may differ because it was constructed by the inspect data."]
 		end
 		self.NeedModelSetting = nil

@@ -2334,15 +2250,15 @@ function IA:ToggleSpecializationTab(Group, DataTable)

 	for i = 1, MAX_TALENT_GROUPS do
 		if i == Group then
-			self.Spec['Spec'..i].BottomLeftBorder:Show()
-			self.Spec['Spec'..i].BottomRightBorder:Show()
-			self.Spec['Spec'..i].Tab:SetFrameLevel(CORE_FRAME_LEVEL + 3)
-			self.Spec['Spec'..i].Tab.text:Point('BOTTOMRIGHT', 0, -10)
+			self.Spec["Spec"..i].BottomLeftBorder:Show()
+			self.Spec["Spec"..i].BottomRightBorder:Show()
+			self.Spec["Spec"..i].Tab:SetFrameLevel(CORE_FRAME_LEVEL + 3)
+			self.Spec["Spec"..i].Tab.text:Point('BOTTOMRIGHT', 0, -10)
 		else
-			self.Spec['Spec'..i].BottomLeftBorder:Hide()
-			self.Spec['Spec'..i].BottomRightBorder:Hide()
-			self.Spec['Spec'..i].Tab:SetFrameLevel(CORE_FRAME_LEVEL + 2)
-			self.Spec['Spec'..i].Tab.text:Point('BOTTOMRIGHT', 0, 0)
+			self.Spec["Spec"..i].BottomLeftBorder:Hide()
+			self.Spec["Spec"..i].BottomRightBorder:Hide()
+			self.Spec["Spec"..i].Tab:SetFrameLevel(CORE_FRAME_LEVEL + 2)
+			self.Spec["Spec"..i].Tab.text:Point('BOTTOMRIGHT', 0, 0)
 		end
 	end

@@ -2361,30 +2277,30 @@ function IA:ToggleSpecializationTab(Group, DataTable)
 	for i = 1, MAX_TALENT_TIERS do
 		for k = 1, NUM_TALENT_COLUMNS do
 			if DataTable.Specialization then
-				if DataTable.Specialization[Group]['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)][1] then
-					TalentID, Name, Texture = GetTalentInfoByID(DataTable.Specialization[Group]['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)][1], 1)
+				if DataTable.Specialization[Group]["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)][1] then
+					TalentID, Name, Texture = GetTalentInfoByID(DataTable.Specialization[Group]["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)][1], 1)
 				end
 				if TalentID and Name and Texture then
-					self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon.Texture:SetTexture(Texture)
-					self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].text:SetText(Name)
-					self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Tooltip.Link = GetTalentLink(TalentID)
+					self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon.Texture:SetTexture(Texture)
+					self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].text:SetText(Name)
+					self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Tooltip.Link = GetTalentLink(TalentID)

-					if DataTable.Specialization[Group]['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)][2] == true then
-						self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)]:SetBackdropColor(R, G, B, .3)
-						self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)]:SetBackdropBorderColor(R, G, B)
-						self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon:SetBackdropBorderColor(R, G, B)
-						self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon.Texture:SetDesaturated(false)
-						self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].text:SetTextColor(1, 1, 1)
+					if DataTable.Specialization[Group]["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)][2] == true then
+						self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)]:SetBackdropColor(R, G, B, .3)
+						self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)]:SetBackdropBorderColor(R, G, B)
+						self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon:SetBackdropBorderColor(R, G, B)
+						self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon.Texture:SetDesaturated(false)
+						self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].text:SetTextColor(1, 1, 1)
 					else
-						self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)]:SetBackdropColor(.1, .1, .1)
-						self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)]:SetBackdropBorderColor(0, 0, 0)
-						self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon:SetBackdropBorderColor(0, 0, 0)
-						self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon.Texture:SetDesaturated(true)
+						self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)]:SetBackdropColor(.1, .1, .1)
+						self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)]:SetBackdropBorderColor(0, 0, 0)
+						self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon:SetBackdropBorderColor(0, 0, 0)
+						self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].Icon.Texture:SetDesaturated(true)

 						if DataTable.Level < LevelTable[i] then
-							self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].text:SetTextColor(.7, .3, .3)
+							self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].text:SetTextColor(.7, .3, .3)
 						else
-							self.Spec['Talent'..((i - 1) * NUM_TALENT_COLUMNS + k)].text:SetTextColor(.5, .5, .5)
+							self.Spec["Talent"..((i - 1) * NUM_TALENT_COLUMNS + k)].text:SetTextColor(.5, .5, .5)
 						end
 					end
 				end
@@ -2393,29 +2309,6 @@ function IA:ToggleSpecializationTab(Group, DataTable)
 	end

 	local Name, Texture
-	for i = 1, NUM_GLYPH_SLOTS do
-		Name, _, Texture = GetSpellInfo(DataTable.Glyph[Group]['Glyph'..i..'SpellID'])
-
-		self.Spec['Glyph'..i].text:SetJustifyH('LEFT')
-		self.Spec['Glyph'..i].text:SetText(Name)
-		self.Spec['Glyph'..i].Icon.Texture:SetTexture(Texture)
-		self.Spec['Glyph'..i].Tooltip.Link = DataTable.Glyph[Group]['Glyph'..i..'ID'] ~= 0 and GetGlyphLinkByID(DataTable.Glyph[Group]['Glyph'..i..'ID'])
-
-		if DataTable.Glyph[Group]['Glyph'..i..'SpellID'] ~= 0 then
-			self.Spec['Glyph'..i]:SetBackdropColor(R, G, B, .3)
-			self.Spec['Glyph'..i]:SetBackdropBorderColor(R, G, B)
-			self.Spec['Glyph'..i].Icon:SetBackdropBorderColor(R, G, B)
-		else
-			self.Spec['Glyph'..i]:SetBackdropColor(.1, .1, .1)
-			self.Spec['Glyph'..i]:SetBackdropBorderColor(0, 0, 0)
-			self.Spec['Glyph'..i].Icon:SetBackdropBorderColor(0, 0, 0)
-
-			if self.Spec['Glyph'..i].NeedLevel > DataTable.Level then
-				self.Spec['Glyph'..i].text:SetJustifyH('CENTER')
-				self.Spec['Glyph'..i].text:SetText(E:RGBToHex(.7, .3, .3)..self.Spec['Glyph'..i].NeedLevel..' '..LEVEL)
-			end
-		end
-	end

 	for i = 1, MAX_TALENT_GROUPS do
 		if i == self.LastActiveSpec then
@@ -2424,12 +2317,12 @@ function IA:ToggleSpecializationTab(Group, DataTable)
 			R, G, B = .3, .3, .3
 		end

-		self.Spec['Spec'..i].TopBorder:SetTexture(R, G, B)
-		self.Spec['Spec'..i].LeftBorder:SetTexture(R, G, B)
-		self.Spec['Spec'..i].RightBorder:SetTexture(R, G, B)
-		self.Spec['Spec'..i].BottomLeftBorder:SetTexture(R, G, B)
-		self.Spec['Spec'..i].BottomRightBorder:SetTexture(R, G, B)
-		self.Spec['Spec'..i].Icon:SetBackdropBorderColor(R, G, B)
+		self.Spec["Spec"..i].TopBorder:SetTexture(R, G, B)
+		self.Spec["Spec"..i].LeftBorder:SetTexture(R, G, B)
+		self.Spec["Spec"..i].RightBorder:SetTexture(R, G, B)
+		self.Spec["Spec"..i].BottomLeftBorder:SetTexture(R, G, B)
+		self.Spec["Spec"..i].BottomRightBorder:SetTexture(R, G, B)
+		self.Spec["Spec"..i].Icon:SetBackdropBorderColor(R, G, B)
 	end
 end

@@ -2474,15 +2367,15 @@ function IA:Update_Display(Force)
 			if Slot.Socket1 then
 				for i = 1, MAX_NUM_SOCKETS do
 					if E.db.sle.Armory.Inspect.Gem.Display == 'Always' or Mouseover and E.db.sle.Armory.Inspect.Gem.Display == 'MouseoverOnly' then
-						if Slot['Socket'..i].GemType then
-							Slot['Socket'..i]:Show()
+						if Slot["Socket"..i].GemType then
+							Slot["Socket"..i]:Show()
 						end
 					else
 						if SocketVisible == nil then
 							SocketVisible = false
 						end

-						if Slot['Socket'..i].GemType and E.db.sle.Armory.Inspect.NoticeMissing and not Slot['Socket'..i].GemItemID then
+						if Slot["Socket"..i].GemType and E.db.sle.Armory.Inspect.NoticeMissing and not Slot["Socket"..i].GemItemID then
 							SocketVisible = true
 						end
 					end
@@ -2490,14 +2383,14 @@ function IA:Update_Display(Force)

 				if SocketVisible then
 					for i = 1, MAX_NUM_SOCKETS do
-						if Slot['Socket'..i].GemType then
-							Slot['Socket'..i]:Show()
-							Slot.SocketWarning:Point(Slot.Direction, Slot['Socket'..i], (Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 3 or -3, 0)
+						if Slot["Socket"..i].GemType then
+							Slot["Socket"..i]:Show()
+							Slot.SocketWarning:Point(Slot.Direction, Slot["Socket"..i], (Slot.Direction == 'LEFT' and 'RIGHT' or 'LEFT'), Slot.Direction == 'LEFT' and 3 or -3, 0)
 						end
 					end
 				elseif SocketVisible == false then
 					for i = 1, MAX_NUM_SOCKETS do
-						Slot['Socket'..i]:Hide()
+						Slot["Socket"..i]:Hide()
 					end

 					Slot.SocketWarning:Point(Slot.Direction, Slot.Socket1)
diff --git a/ElvUI_SLE/modules/Armory/InspectArmory/NotifyInspect.lua b/ElvUI_SLE/modules/Armory/InspectArmory/NotifyInspect.lua
index e962cd7..cd0a07d 100644
--- a/ElvUI_SLE/modules/Armory/InspectArmory/NotifyInspect.lua
+++ b/ElvUI_SLE/modules/Armory/InspectArmory/NotifyInspect.lua
@@ -1,5 +1,6 @@
 local Revision = 1.6
-local ENI = _G['EnhancedNotifyInspect'] or CreateFrame('Frame', 'EnhancedNotifyInspect', UIParent)
+local _G = _G
+local ENI = _G["EnhancedNotifyInspect"] or CreateFrame('Frame', 'EnhancedNotifyInspect', UIParent)

 if not ENI.Revision or ENI.Revision < Revision then
 	ENI.InspectList = {}
@@ -7,7 +8,7 @@ if not ENI.Revision or ENI.Revision < Revision then
 	ENI.UpdateInterval = 1

 	if not ENI.Original_BlizzardNotifyInspect then
-		local BlizNotifyInspect = _G['NotifyInspect']
+		local BlizNotifyInspect = _G["NotifyInspect"]
 		ENI.Original_BlizzardNotifyInspect = BlizNotifyInspect
 	end

diff --git a/ElvUI_SLE/modules/Armory/KnightFrame.lua b/ElvUI_SLE/modules/Armory/KnightFrame.lua
index 8d259af..b5bd3d2 100644
--- a/ElvUI_SLE/modules/Armory/KnightFrame.lua
+++ b/ElvUI_SLE/modules/Armory/KnightFrame.lua
@@ -1,4 +1,5 @@
 local E, L, V, P, G = unpack(ElvUI)
+local _G = _G

 if not (select(2, GetAddOnInfo('ElvUI_KnightFrame')) and IsAddOnLoaded('ElvUI_KnightFrame')) then
 	--<< INITIALIZE >>--
@@ -105,165 +106,165 @@ if not (select(2, GetAddOnInfo('ElvUI_KnightFrame')) and IsAddOnLoaded('ElvUI_Kn
 		L[ClassName] = KF:Color_Class(string.upper(ClassName), LOCALIZED_CLASS_NAMES_MALE[string.upper(ClassName)])

 		for Name, ID in pairs(SpecializationIDTable) do
-			_, L['Spec_'..ClassName..'_'..Name] = GetSpecializationInfoByID(ID)
+			_, L["Spec_"..ClassName.."_"..Name] = GetSpecializationInfoByID(ID)
 		end
 	end

 	Info.ClassRole = {
 		WARRIOR = {
-			[(L['Spec_Warrior_Arms'])] = { --무기
+			[(L["Spec_Warrior_Arms"])] = { --무기
 				Color = '|cff9a9a9a',
 				Role = 'Melee'
 			},
-			[(L['Spec_Warrior_Fury'])] = { --분노
+			[(L["Spec_Warrior_Fury"])] = { --분노
 				Color = '|cffb50000',
 				Role = 'Melee'
 			},
-			[(L['Spec_Warrior_Protection'])] = { --방어
+			[(L["Spec_Warrior_Protection"])] = { --방어
 				Color = '|cff088fdc',
 				Role = 'Tank'
 			}
 		},
 		HUNTER = {
-			[(L['Spec_Hunter_Beast'])] = { --야수
+			[(L["Spec_Hunter_Beast"])] = { --야수
 				Color = '|cffffdb00',
 				Role = 'Melee'
 			},
-			[(L['Spec_Hunter_Marksmanship'])] = { --사격
+			[(L["Spec_Hunter_Marksmanship"])] = { --사격
 				Color = '|cffea5455',
 				Role = 'Melee'
 			},
-			[(L['Spec_Hunter_Survival'])] = { --생존
+			[(L["Spec_Hunter_Survival"])] = { --생존
 				Color = '|cffbaf71d',
 				Role = 'Melee'
 			}
 		},
 		SHAMAN = {
-			[(L['Spec_Shaman_Elemental'])] = { --정기
+			[(L["Spec_Shaman_Elemental"])] = { --정기
 				Color = '|cff2be5fa',
 				Role = 'Caster'
 			},
-			[(L['Spec_Shaman_Enhancement'])] = { --고양
+			[(L["Spec_Shaman_Enhancement"])] = { --고양
 				Color = '|cffe60000',
 				Role = 'Melee'
 			},
-			[(L['Spec_Shaman_Restoration'])] = { --복원
+			[(L["Spec_Shaman_Restoration"])] = { --복원
 				Color = '|cff00ff0c',
 				Role = 'Healer'
 			}
 		},
 		MONK = {
-			[(L['Spec_Monk_Brewmaster'])] = { --양조
+			[(L["Spec_Monk_Brewmaster"])] = { --양조
 				Color = '|cffbcae6d',
 				Role = 'Tank'
 			},
-			[(L['Spec_Monk_Mistweaver'])] = { --운무
+			[(L["Spec_Monk_Mistweaver"])] = { --운무
 				Color = '|cffb6f1b7',
 				Role = 'Healer'
 			},
-			[(L['Spec_Monk_Windwalker'])] = { --풍운
+			[(L["Spec_Monk_Windwalker"])] = { --풍운
 				Color = '|cffb2c6de',
 				Role = 'Melee'
 			}
 		},
 		ROGUE = {
-			[(L['Spec_Rogue_Assassination'])] = { --암살
+			[(L["Spec_Rogue_Assassination"])] = { --암살
 				Color = '|cff129800',
 				Role = 'Melee'
 			},
-			[(L['Spec_Rogue_Combat'])] = { --전투
+			[(L["Spec_Rogue_Combat"])] = { --전투
 				Color = '|cffbc0001',
 				Role = 'Melee'
 			},
-			[(L['Spec_Rogue_Subtlety'])] = { --잠행
+			[(L["Spec_Rogue_Subtlety"])] = { --잠행
 				Color = '|cfff48cba',
 				Role = 'Melee'
 			}
 		},
 		DEATHKNIGHT = {
-			[(L['Spec_DeathKnight_Blood'])] = { --혈기
+			[(L["Spec_DeathKnight_Blood"])] = { --혈기
 				Color = '|cffbc0001',
 				Role = 'Tank'
 			},
-			[(L['Spec_DeathKnight_Frost'])] = { --냉기
+			[(L["Spec_DeathKnight_Frost"])] = { --냉기
 				Color = '|cff1784d1',
 				Role = 'Melee'
 			},
-			[(L['Spec_DeathKnight_Unholy'])] = { --부정
+			[(L["Spec_DeathKnight_Unholy"])] = { --부정
 				Color = '|cff00ff10',
 				Role = 'Melee'
 			}
 		},
 		MAGE = {
-			[(L['Spec_Mage_Arcane'])] = { --비전
+			[(L["Spec_Mage_Arcane"])] = { --비전
 				Color = '|cffdcb0fb',
 				Role = 'Caster'
 			},
-			[(L['Spec_Mage_Fire'])] = { --화염
+			[(L["Spec_Mage_Fire"])] = { --화염
 				Color = '|cffff3615',
 				Role = 'Caster'
 			},
-			[(L['Spec_Mage_Frost'])] = { --냉기
+			[(L["Spec_Mage_Frost"])] = { --냉기
 				Color = '|cff1784d1',
 				Role = 'Caster'
 			}
 		},
 		DRUID = {
-			[(L['Spec_Druid_Balance'])] = { --조화
+			[(L["Spec_Druid_Balance"])] = { --조화
 				Color = '|cffff7d0a',
 				Role = 'Caster'
 			},
-			[(L['Spec_Druid_Feral'])] = { --야성
+			[(L["Spec_Druid_Feral"])] = { --야성
 				Color = '|cffffdb00',
 				Role = 'Melee'
 			},
-			[(L['Spec_Druid_Guardian'])] = { --수호
+			[(L["Spec_Druid_Guardian"])] = { --수호
 				Color = '|cff088fdc',
 				Role = 'Tank'
 			},
-			[(L['Spec_Druid_Restoration'])] = { --회복
+			[(L["Spec_Druid_Restoration"])] = { --회복
 				Color = '|cff64df62',
 				Role = 'Healer'
 			}
 		},
 		PALADIN = {
-			[(L['Spec_Paladin_Holy'])] = { --신성
+			[(L["Spec_Paladin_Holy"])] = { --신성
 				Color = '|cfff48cba',
 				Role = 'Healer'
 			},
-			[(L['Spec_Paladin_Protection'])] = { --보호
+			[(L["Spec_Paladin_Protection"])] = { --보호
 				Color = '|cff84e1ff',
 				Role = 'Tank'
 			},
-			[(L['Spec_Paladin_Retribution'])] = { --징벌
+			[(L["Spec_Paladin_Retribution"])] = { --징벌
 				Color = '|cffe60000',
 				Role = 'Melee'
 			}
 		},
 		PRIEST = {
-			[(L['Spec_Priest_Discipline'])] = { --수양
+			[(L["Spec_Priest_Discipline"])] = { --수양
 				Color = '|cffffffff',
 				Role = 'Healer'
 			},
-			[(L['Spec_Priest_Holy'])] = { --신성
+			[(L["Spec_Priest_Holy"])] = { --신성
 				Color = '|cff6bdaff',
 				Role = 'Healer'
 			},
-			[(L['Spec_Priest_Shadow'])] = { --암흑
+			[(L["Spec_Priest_Shadow"])] = { --암흑
 				Color = '|cff7e52c1',
 				Role = 'Caster'
 			}
 		},
 		WARLOCK = {
-			[(L['Spec_Warlock_Affliction'])] = { --고통
+			[(L["Spec_Warlock_Affliction"])] = { --고통
 				Color = '|cff00ff10',
 				Role = 'Caster'
 			},
-			[(L['Spec_Warlock_Demonology'])] = { --악마
+			[(L["Spec_Warlock_Demonology"])] = { --악마
 				Color = '|cff9482c9',
 				Role = 'Caster'
 			},
-			[(L['Spec_Warlock_Destruction'])] = { --파괴
+			[(L["Spec_Warlock_Destruction"])] = { --파괴
 				Color = '|cffba1706',
 				Role = 'Caster'
 			}
diff --git a/ElvUI_SLE/modules/actionbars.lua b/ElvUI_SLE/modules/actionbars.lua
new file mode 100644
index 0000000..c2e4d2c
--- /dev/null
+++ b/ElvUI_SLE/modules/actionbars.lua
@@ -0,0 +1,107 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local LSM = LibStub("LibSharedMedia-3.0")
+local A = SLE:NewModule("Actionbars", 'AceHook-3.0', 'AceEvent-3.0')
+
+local AB = E:GetModule('ActionBars');
+
+local _G = _G
+local NUM_PET_ACTION_SLOTS = NUM_PET_ACTION_SLOTS
+local NUM_ACTIONBAR_BUTTONS = NUM_ACTIONBAR_BUTTONS
+
+A.CheckedTextures = {}
+
+function A:BarsBackdrop()
+	-- Actionbar backdrops
+	for i = 1, 10 do
+		local transBars = {_G["ElvUI_Bar"..i]}
+		for _, frame in T.pairs(transBars) do
+			if frame.backdrop then
+				frame.backdrop:SetTemplate('Transparent')
+			end
+		end
+	end
+
+	-- Other bar backdrops
+	local transOtherBars = {_G["ElvUI_BarPet"], _G["ElvUI_StanceBar"], _G["ElvUI_TotemBar"], _G["ElvUIBags"]}
+	for _, frame in T.pairs(transOtherBars) do
+		if frame.backdrop then
+			frame.backdrop:SetTemplate('Transparent')
+		end
+	end
+
+	-- Pet Buttons
+	for i = 1, NUM_PET_ACTION_SLOTS do
+		local petButtons = {_G["PetActionButton"..i]}
+		for _, button in T.pairs(petButtons) do
+			if button.backdrop then
+				button.backdrop:SetTemplate('Transparent')
+			end
+		end
+	end
+end
+
+function A:ButtonsBackdrop()
+	for i = 1, 10 do
+		for k = 1, 12 do
+			local buttonBars = {_G["ElvUI_Bar"..i.."Button"..k]}
+			for _, button in T.pairs(buttonBars) do
+				if button.backdrop then
+					button.backdrop:SetTemplate('Transparent')
+				end
+			end
+		end
+	end
+end
+
+function A:Initialize()
+	if not SLE.initialized then return end
+	if E.private.actionbar.enable ~= true then return; end
+	A.MaxBars = T.IsAddOnLoaded('ElvUI_ExtraActionBars') and 10 or 6
+
+	if E.private.sle.actionbars.oorBind then
+		hooksecurefunc(AB, "UpdateButtonConfig", function(self, bar, buttonName)
+			if T.InCombatLockdown() then return end
+
+			bar.buttonConfig.outOfRangeColoring = "hotkey"
+			for i, button in T.pairs(bar.buttons) do
+				bar.buttonConfig.keyBoundTarget = T.format(buttonName.."%d", i)
+				button.keyBoundTarget = bar.buttonConfig.keyBoundTarget
+
+				button:UpdateConfig(bar.buttonConfig)
+			end
+		end)
+		for barName, bar in T.pairs(AB["handledBars"]) do
+			AB:UpdateButtonConfig(bar, bar.bindButtons)
+		end
+	end
+
+	if E.private.sle.actionbars.checkedtexture and not (LibStub("Masque", true) and E.private.actionbar.masque.actionbars) then
+		hooksecurefunc(AB, "PositionAndSizeBar", function(self, barName)
+			local bar = self["handledBars"][barName]
+			if not A.CheckedTextures[barName] then A.CheckedTextures[barName] = {} end
+			for i=1, NUM_ACTIONBAR_BUTTONS do
+				local button = bar.buttons[i];
+				if button.SetCheckedTexture then
+					if not A.CheckedTextures[barName][i] then
+						A.CheckedTextures[barName][i] = button:CreateTexture(button:GetName().."CheckedTexture", "OVERLAY")
+					end
+					local color = E.private.sle.actionbars.checkedColor
+					button.checked = A.CheckedTextures[barName][i]
+					button.checked:SetTexture(color.r, color.g, color.b, color.a)
+					button.checked:SetInside()
+					button:SetCheckedTexture(A.CheckedTextures[barName][i])
+				end
+			end
+		end)
+		for i=1, A.MaxBars do
+			AB:PositionAndSizeBar('bar'..i)
+		end
+	end
+
+	C_Timer.After(0.3, function()
+		if E.private.sle.actionbars.transparentBackdrop then A:BarsBackdrop() end
+		if E.private.sle.actionbars.transparentButtons then A:ButtonsBackdrop() end
+	end)
+end
+
+SLE:RegisterModule(A:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/afk.lua b/ElvUI_SLE/modules/afk.lua
new file mode 100644
index 0000000..96d5ad1
--- /dev/null
+++ b/ElvUI_SLE/modules/afk.lua
@@ -0,0 +1,467 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local LSM = LibStub("LibSharedMedia-3.0")
+local AFK = E:GetModule("AFK")
+local S = SLE:NewModule("Screensaver", 'AceHook-3.0', 'AceEvent-3.0')
+S.Animations = {}
+S.Fading = {}
+--GLOBALS: hooksecurefunc, UIParent
+local _G = _G
+local SS
+local Name, Level, GuildName, GuildRank, month, week, AnimTime, testM
+local Class, ClassToken = T.UnitClass("player")
+local Race, RaceToken = T.UnitRace("player")
+local FactionToken, Faction = T.UnitFactionGroup("player")
+local Color = RAID_CLASS_COLORS[ClassToken]
+local CrestPath = [[Interface\AddOns\ElvUI_SLE\media\textures\crests\]]
+local TipsElapsed, TipNum, TipThrottle, OldTip, degree = 0, 1, 15, 0, 0
+local RANK = RANK
+local LEVEL = LEVEL
+local CloseAllBags = CloseAllBags
+local CreateFrame = CreateFrame
+local CreateAnimationGroup = CreateAnimationGroup
+local C_Timer = C_Timer
+local SendChatMessage = SendChatMessage
+local PVEFrame_ToggleFrame = PVEFrame_ToggleFrame
+
+function S:Media()
+	--Updating all the shits!
+	SS.AFKtitle:SetFont(LSM:Fetch('font', S.db.title.font), S.db.title.size, S.db.title.outline)
+	SS.timePassed:SetFont(LSM:Fetch('font', S.db.title.font), S.db.title.size, S.db.title.outline)
+	SS.Subtitle:SetFont(LSM:Fetch('font', S.db.subtitle.font), S.db.subtitle.size, S.db.subtitle.outline)
+	SS.Date:SetFont(LSM:Fetch('font', S.db.date.font), S.db.date.size, S.db.date.outline)
+	SS.Time:SetFont(LSM:Fetch('font', S.db.date.font), S.db.date.size, S.db.date.outline)
+	SS.PlayerName:SetFont(LSM:Fetch('font', S.db.player.font), S.db.player.size, S.db.player.outline)
+	SS.PlayerInfo:SetFont(LSM:Fetch('font', S.db.player.font), S.db.player.size, S.db.player.outline)
+	SS.GuildRank:SetFont(LSM:Fetch('font', S.db.player.font), S.db.player.size, S.db.player.outline)
+	SS.Guild:SetFont(LSM:Fetch('font', S.db.player.font), S.db.player.size, S.db.player.outline)
+	SS.ScrollFrame:SetFont(LSM:Fetch('font', S.db.tips.font), S.db.tips.size, S.db.tips.outline)
+
+	SS.timePassed:SetTextColor(1, 1, 1)
+
+	SS.ExPack:SetSize(S.db.xpack, S.db.xpack/2)
+	SS.FactCrest:SetSize(S.db.crest, S.db.crest)
+	SS.RaceCrest:SetSize(S.db.crest, S.db.crest)
+	SS.Elv:SetSize(S.db.xpack, S.db.xpack/2)
+	SS.sle:SetSize(S.db.xpack, S.db.xpack/2)
+end
+
+function S:Setup()
+	--Creating top panel
+	SS.Top = CreateFrame("Frame", nil, SS)
+	SS.Top:SetFrameLevel(0)
+	SS.Top:SetWidth(T.GetScreenWidth() + (E.Border*2))
+
+	--Creating additional strings
+	SS.AFKtitle = SS.Top:CreateFontString(nil, "OVERLAY")
+	SS.Subtitle = SS.Top:CreateFontString(nil, "OVERLAY")
+	SS.Subtitle:SetJustifyH("LEFT")
+	SS.PlayerInfo = SS.Top:CreateFontString(nil, "OVERLAY")
+	SS.Date = SS.Top:CreateFontString(nil, "OVERAY")
+	SS.Time = SS.Top:CreateFontString(nil, "OVERLAY")
+
+	--Changing Elv's strings
+	SS.GuildRank = SS.Bottom:CreateFontString(nil, 'OVERLAY')
+	SS.GuildRank:FontTemplate(nil, 20)
+	SS.GuildRank:SetText("Stuff")
+	SS.GuildRank:SetPoint("TOP", SS.Bottom.guild, "BOTTOM", 0, -2)
+	SS.GuildRank:SetTextColor(0.7, 0.7, 0.7)
+
+	--Frame for tips
+	SS.ScrollFrame = CreateFrame("ScrollingMessageFrame", nil, SS)
+	SS.ScrollFrame:SetFading(false)
+	SS.ScrollFrame:SetFadeDuration(0)
+	SS.ScrollFrame:SetTimeVisible(1)
+	SS.ScrollFrame:SetMaxLines(1)
+	SS.ScrollFrame:SetSpacing(2)
+	SS.ScrollFrame:SetWidth(SS.Bottom:GetWidth()/2)
+	-- SS.ScrollFrame:CreateBackdrop()
+	SS.ScrollFrame:LevelUpBG() --Creating neat stuff for teh tips
+
+	--Crests, emblems and stuff
+	SS.ExPack = CreateFrame("Button", nil, SS.Top)
+	SS.ExPack:SetScript("OnClick", S.AbortAFK)
+	SS.ExPack.texture = SS:CreateTexture(nil, 'OVERLAY')
+	SS.ExPack.texture:SetAllPoints(SS.ExPack)
+	SS.ExPack.texture:SetTexture([[Interface\Glues\Common\LegionLogo.blp]])
+	SS.ExPack.texture:SetTexCoord(0, 1, 0, 0.25)
+	SS.FactCrest:SetTexture(CrestPath..FactionToken)
+	SS.RaceCrest = SS:CreateTexture(nil, 'ARTWORK')
+	SS.RaceCrest:SetTexture(CrestPath..RaceToken)
+	SS.sle = SS:CreateTexture(nil, 'OVERLAY')
+	SS.sle:SetTexture([[Interface\AddOns\ElvUI_SLE\media\textures\SLE_Banner]])
+
+	--Slightly moving chat
+	SS.chat:ClearAllPoints()
+	SS.chat:SetPoint("TOPLEFT", SS.Top, "TOPLEFT", 0, 0)
+
+	--Test model
+	SS.testmodel = CreateFrame("PlayerModel", "SLE_ScreenTestModel", E.UIParent)
+	SS.testmodel:SetSize(T.GetScreenWidth() * 2, T.GetScreenHeight() * 2) --Like in the original model
+	SS.testmodel:SetPoint("CENTER", SS.Model)
+	SS.testmodel:Hide()
+
+	--Calling for fonts and shit updating
+	self:Media()
+
+	--Setting text for tite string. Here casue fonts were not set before
+	SS.AFKtitle:SetText("|cff00AAFF"..L["You Are Away From Keyboard for"].."|r")
+
+	--Positioning
+	SS.AFKtitle:Point("TOP", SS.Top, "TOP", -25, -10)
+	SS.Subtitle:Point("TOP", SS.AFKtitle, "BOTTOM", 25, -2)
+	SS.timePassed:ClearAllPoints()
+	SS.timePassed:Point("LEFT", SS.AFKtitle, "RIGHT", 4, -1)
+	SS.ExPack:Point("CENTER", SS.Top, "BOTTOM", 0, 0)
+	SS.FactCrest:ClearAllPoints()
+	SS.FactCrest:Point("CENTER", SS.Top, "BOTTOM", -(T.GetScreenWidth()/6), 0)
+	SS.RaceCrest:Point("CENTER", SS.Top, "BOTTOM", (T.GetScreenWidth()/6), 0)
+	SS.Date:Point("RIGHT", SS.Top, "RIGHT", -40, 10)
+	SS.Time:Point("TOP", SS.Date, "BOTTOM", 0, -2)
+	SS.Elv:SetPoint("CENTER", SS.Bottom, "TOP", -(T.GetScreenWidth()/10), 0)
+	SS.sle:SetPoint("CENTER", SS.Bottom, "TOP", (T.GetScreenWidth()/10), 0)
+	SS.PlayerName:ClearAllPoints()
+	SS.Guild:ClearAllPoints()
+	SS.GuildRank:ClearAllPoints()
+	SS.PlayerInfo:Point("RIGHT", SS.Date, "LEFT", -100, 0)
+	SS.PlayerName:Point("BOTTOM", SS.PlayerInfo, "TOP", 0, 2)
+	SS.Guild:SetPoint("TOP", SS.PlayerInfo, "BOTTOM", 0, -2)
+	SS.GuildRank:SetPoint("TOP", SS.Guild, "BOTTOM", 0, -2)
+	SS.ScrollFrame:SetPoint("CENTER", SS.Bottom, "CENTER", 0, 0)
+	S:SetPanelTemplate()
+end
+
+--Setting the template for top/bottom bars
+function S:SetPanelTemplate()
+	SS.Top:SetTemplate(S.db.panelTemplate, true)
+	SS.Bottom:SetTemplate(S.db.panelTemplate, true)
+end
+
+--Template functons for animation types
+function S:SlideIn(frame)
+	if not frame.anim then frame.anim = CreateAnimationGroup(frame) end
+	if not frame.anim.SlideIn then
+		frame.anim.SlideIn = frame.anim:CreateAnimation("Move")
+		frame.anim.SlideIn:SetRounded(false)
+		T.tinsert(S.Animations, frame.anim.SlideIn)
+	end
+end
+function S:SlideSide(frame)
+	if not frame.anim then frame.anim = CreateAnimationGroup(frame) end
+	if not frame.anim.SlideSide then
+		frame.anim.SlideSide = frame.anim:CreateAnimation("Move")
+		frame.anim.SlideSide:SetRounded(false)
+		T.tinsert(S.Animations, frame.anim.SlideSide)
+	end
+end
+function S:FadeIn(frame)
+	if not frame.anim then frame.anim = CreateAnimationGroup(frame) end
+	if not frame.anim.FadeIn then
+		frame.anim.FadeIn = frame.anim:CreateAnimation("Fade")
+		frame.anim.FadeIn:SetChange(1)
+		T.tinsert(S.Animations, frame.anim.FadeIn)
+		if frame ~= SS.Top or frame ~= SS.Bottom then
+			T.tinsert(S.Fading, frame.anim.FadeIn)
+		end
+	end
+end
+--Creating and updating animations
+function S:SetupAnimations()
+	if not SS.Top.anim then --If no animation groups exist, create those
+		S:SlideIn(SS.Top)
+		S:SlideSide(SS.Top)
+		S:FadeIn(SS.Top)
+
+		S:SlideIn(SS.Bottom)
+		S:SlideSide(SS.Bottom)
+		S:FadeIn(SS.Bottom)
+
+		S:FadeIn(SS.Model)
+
+		S:FadeIn(SS.ExPack)
+		S:FadeIn(SS.FactCrest)
+		S:FadeIn(SS.RaceCrest)
+		S:FadeIn(SS.sle)
+		S:FadeIn(SS.Elv)
+
+		S:FadeIn(SS.ScrollFrame)
+	end
+
+	SS.Top.anim.SlideIn:SetSmoothing(S.db.animBounce and "Bounce" or "None")
+	SS.Bottom.anim.SlideIn:SetSmoothing(S.db.animBounce and "Bounce" or "None")
+	SS.Top.anim.SlideSide:SetSmoothing(S.db.animBounce and "Bounce" or "None")
+	SS.Bottom.anim.SlideSide:SetSmoothing(S.db.animBounce and "Bounce" or "None")
+	S:SetupType()
+end
+--For model positioning
+function S:ModelHolderPos()
+	SS.Bottom.modelHolder:ClearAllPoints()
+	SS.Bottom.modelHolder:SetPoint("BOTTOMRIGHT", SS.Bottom, "BOTTOMRIGHT", -200+S.db.playermodel.holderXoffset, (220 + S.db.playermodel.holderYoffset))
+end
+
+function S:Show()
+	Level, Name, TipNum = T.UnitLevel("player"), T.UnitPVPName("player"), T.random(1, #L["SLE_TIPS"])
+
+	--Resizings
+	SS.Top:SetHeight(S.db.height)
+	SS.Bottom:SetHeight(S.db.height)
+	SS.ScrollFrame:SetHeight(S.db.tips.size+4)
+	SS.ScrollFrame.bg:SetHeight(S.db.tips.size+20)
+
+	--Resizing chat
+	SS.chat:SetHeight(SS.Top:GetHeight())
+
+	--Setting texts
+	if T.IsInGuild() then
+		GuildName, GuildRank = T.GetGuildInfo("player")
+	end
+	SS.PlayerName:SetText(T.format("|c%s%s|r", Color.colorStr, Name))
+	SS.Guild:SetText(T.format(GuildName and "|cff00AAFF<%s>|r" or L["No Guild"], GuildName))
+	SS.GuildRank:SetText(T.format(GuildRank and "|cff00AAFF"..RANK..": %s|r" or "", GuildRank))
+	SS.Subtitle:SetText(L["Take care of yourself, Master!"])
+	SS.PlayerInfo:SetText(T.format("%s\n|c%s%s|r, %s %s", E.myrealm, Color.colorStr, Class, LEVEL, Level))
+
+	--Positioning model
+	SS.Model:SetCamDistanceScale(S.db.playermodel.distance)
+	if SS.Model:GetFacing() ~= (S.db.playermodel.rotation / 60) then
+		SS.Model:SetFacing(S.db.playermodel.rotation / 60)
+	end
+	SS.Model:SetAnimation(S.db.playermodel.anim)
+	SS.Model:SetScript("OnAnimFinished", S.AnimFinished)
+
+	--Animations
+	if S.db.animTime > 0 then
+		if S.db.animType == "SlideIn" then
+			SS.Top.anim.SlideIn:SetOffset(0, -S.db.height)
+			SS.Bottom.anim.SlideIn:SetOffset(0, S.db.height)
+		elseif S.db.animType == "SlideSide" then
+			SS.Top.anim.SlideSide:SetOffset(E.screenwidth, 0)
+			SS.Bottom.anim.SlideSide:SetOffset(-E.screenwidth, 0)
+		end
+
+		SS.Top.anim[S.db.animType]:SetDuration(S.db.animTime)
+		SS.Bottom.anim[S.db.animType]:SetDuration(S.db.animTime)
+		for i = 1, #(S.Fading) do
+			S.Fading[i]:SetDuration(S.db.animTime)
+		end
+
+		SS.Top.anim[S.db.animType]:Play()
+		SS.Bottom.anim[S.db.animType]:Play()
+		for i = 1, #(S.Fading) do
+			S.Fading[i]:Play()
+		end
+	end
+
+	--Tip message
+	SS.ScrollFrame:AddMessage(L["SLE_TIPS"][TipNum], 1, 1, 1)
+	S:UpdateTimer()
+end
+
+function S:Hide()
+	for i = 1, #(S.Animations) do --To avoid weird shit like S:SetupType was ignored when animations were interrupted in the go
+		S.Animations[i]:Stop()
+	end
+	SS.ExPack:SetAlpha((S.db.animTime > 0 and 0) or 1)
+	SS.FactCrest:SetAlpha((S.db.animTime > 0 and 0) or 1)
+	SS.RaceCrest:SetAlpha((S.db.animTime > 0 and 0) or 1)
+	SS.sle:SetAlpha((S.db.animTime > 0 and 0) or 1)
+	SS.Elv:SetAlpha((S.db.animTime > 0 and 0) or 1)
+	SS.Model:SetAlpha((S.db.animTime > 0 and 0) or 1)
+	SS.ScrollFrame:SetAlpha((S.db.animTime > 0 and 0) or 1)
+	S:SetupType()
+end
+
+function S:SetupType()
+	SS.Top:ClearAllPoints()
+	SS.Bottom:ClearAllPoints()
+	if S.db.animTime > 0 then
+		if S.db.animType == "SlideIn" then
+			SS.Top:Point("BOTTOM", SS, "TOP", 0, E.Border)
+			SS.Bottom:Point("TOP", SS, "BOTTOM", 0, - E.Border)
+			SS.Top:SetAlpha(1)
+			SS.Bottom:SetAlpha(1)
+		elseif S.db.animType == "SlideSide" then
+			SS.Top:Point("TOPRIGHT", SS, "TOPLEFT", 0, E.Border)
+			SS.Bottom:Point("BOTTOMLEFT", SS, "BOTTOMRIGHT", 0, - E.Border)
+			SS.Top:SetAlpha(1)
+			SS.Bottom:SetAlpha(1)
+		else
+			SS.Top:Point("TOP", SS, "TOP", 0, E.Border)
+			SS.Bottom:Point("BOTTOM", SS, "BOTTOM", 0, - E.Border)
+			SS.Top:SetAlpha(0)
+			SS.Bottom:SetAlpha(0)
+		end
+	else
+		SS.Top:Point("TOP", SS, "TOP", 0, E.Border)
+		SS.Bottom:Point("BOTTOM", SS, "BOTTOM", 0, - E.Border)
+		SS.Top:SetAlpha(1)
+		SS.Bottom:SetAlpha(1)
+	end
+end
+--Testing model positioning
+function S:TestShow()
+	if AnimTime then AnimTime:Cancel() end
+	testM = S.db.playermodel.anim
+	SS.testmodel:Show()
+	SS.testmodel:SetUnit("player")
+	SS.testmodel:SetCamDistanceScale(S.db.playermodel.distance)
+	if SS.testmodel:GetFacing() ~= (S.db.playermodel.rotation / 60) then
+		SS.testmodel:SetFacing(S.db.playermodel.rotation / 60)
+	end
+	SS.testmodel:SetAnimation(testM)
+	SS.testmodel:SetScript("OnAnimFinished", S.AnimTestFinished)
+
+	AnimTime = C_Timer.NewTimer(10, S.TestHide)
+end
+
+function S:TestHide()
+	SS.testmodel:Hide()
+end
+
+function S:AnimTestFinished()
+	SS.testmodel:SetAnimation(testM)
+end
+
+function S:UpdateTimer()
+	TipsElapsed = TipsElapsed + 1
+	month = SLE.Russian and SLE.RuMonths[T.tonumber(T.date("%m"))] or T.date("%B")
+	week = SLE.Russian and SLE.RuWeek[T.tonumber(T.date("%w"))+1] or T.date("%A")
+	SS.Time:SetText(T.format("%s", T.date("%H|cff00AAFF:|r%M|cff00AAFF:|r%S")))
+	SS.Date:SetText(T.date("%d").." "..month..", |cff00AAFF"..week.."|r")
+
+	if TipsElapsed > S.db.tipThrottle then
+		TipNum = T.random(1, #L["SLE_TIPS"])
+		while TipNum == OldTip do TipNum = T.random(1, #L["SLE_TIPS"]) end
+		SS.ScrollFrame:AddMessage(L["SLE_TIPS"][TipNum], 1, 1, 1)
+		OldTip = TipNum
+		TipsElapsed = 0
+	end
+end
+
+--Camera rotation script when entering or leaving afk
+function S:Event(event, unit)
+	if not E.db.general.afk then return end
+	if (event == "PLAYER_FLAGS_CHANGED" and unit ~= "player") or event ~= "PLAYER_FLAGS_CHANGED" then return end
+	if T.UnitIsAFK("player") then
+		if not SS:GetScript("OnUpdate") then
+			SS:SetScript("OnUpdate", function(self, elapsed)
+				T.FlipCameraYaw(elapsed*10)
+				degree = degree + elapsed*10
+			end)
+		end
+	else
+		SS:SetScript("OnUpdate", nil)
+		T.FlipCameraYaw(-degree)
+		degree = 0
+		TipsElapsed = 0
+	end
+end
+
+--Rotating Camera
+function S:UpdateCamera(elapsed)
+	T.FlipCameraYaw(elapsed*10)
+	degree = degree + elapsed*10
+end
+
+function S:AnimFinished()
+	SS.Model:SetAnimation(S.db.playermodel.anim)
+end
+
+function S:KeyScript()--Dealing with on key down script
+	if S.db.keydown then
+		SS:SetScript("OnKeyDown", S.OnKeyDown)
+	else
+		SS:SetScript("OnKeyDown", nil)
+	end
+end
+
+function S:AbortAFK()
+	if T.UnitIsAFK("player") then SendChatMessage("" ,"AFK" ) end
+end
+
+function S:Initialize()
+	if not SLE.initialized then return end
+	SS = AFK.AFKMode
+	S.db = E.db.sle.screensaver
+	S.OnKeyDown = SS:GetScript("OnKeyDown")
+	if not E.private.sle.module.screensaver then return end
+	S:KeyScript()
+	--Overwriting to get rid of Elv's camera rotation and starting animation
+	function AFK:SetAFK(status)
+		if(T.InCombatLockdown()) then return end
+		if not E.db.general.afk then return end -- To prevent bs from happening
+		if(status) then
+			self.AFKMode:Show()
+			CloseAllBags()
+			UIParent:Hide()
+
+			if S.db.enable then
+				SS.Model:SetUnit("player")
+				SS.Model:SetAnimation(S.db.playermodel.anim)
+				self.startTime = T.GetTime()
+				self.timer = self:ScheduleRepeatingTimer('UpdateTimer', 1)
+			else
+				self.AFKMode.bottom.model.curAnimation = "wave"
+				self.AFKMode.bottom.model.startTime = T.GetTime()
+				self.AFKMode.bottom.model.duration = 2.3
+				self.AFKMode.bottom.model:SetUnit("player")
+				self.AFKMode.bottom.model.isIdle = nil
+				self.AFKMode.bottom.model:SetAnimation(67)
+				self.AFKMode.bottom.model.idleDuration = 40
+				self.startTime = T.GetTime()
+				self.timer = self:ScheduleRepeatingTimer('UpdateTimer', 1)
+			end
+			self.AFKMode.chat:RegisterEvent("CHAT_MSG_WHISPER")
+			self.AFKMode.chat:RegisterEvent("CHAT_MSG_BN_WHISPER")
+			self.AFKMode.chat:RegisterEvent("CHAT_MSG_BN_CONVERSATION")
+			self.AFKMode.chat:RegisterEvent("CHAT_MSG_GUILD")
+
+			self.isAFK = true
+		elseif(self.isAFK) then
+			UIParent:Show()
+			self.AFKMode:Hide()
+
+			self:CancelTimer(self.timer)
+			self:CancelTimer(self.animTimer)
+			self.AFKMode.bottom.time:SetText("00:00")
+
+			self.AFKMode.chat:UnregisterAllEvents()
+			self.AFKMode.chat:Clear()
+			if(_G["PVEFrame"]:IsShown()) then --odd bug, frame is blank
+				PVEFrame_ToggleFrame()
+				PVEFrame_ToggleFrame()
+			end
+
+			self.isAFK = false
+		end
+	end
+
+	hooksecurefunc(AFK, "OnEvent", S.Event)
+	hooksecurefunc(AFK, "UpdateTimer", S.UpdateTimer)
+	SS.Bottom = SS.bottom
+	SS.Elv = SS.Bottom.logo
+	SS.FactCrest = SS.Bottom.faction
+	SS.PlayerName = SS.Bottom.name
+	SS.Guild = SS.Bottom.guild
+	SS.timePassed = SS.Bottom.time
+	SS.Model = SS.Bottom.model
+	S:Setup()
+	S:ModelHolderPos()
+
+	function S:ForUpdateAll()
+		-- if not E.private.sle.module.screensaver then return end
+		S.db = E.db.sle.screensaver
+		S:SetupAnimations()
+		S:Hide()
+		S:KeyScript()
+	end
+
+	S:ForUpdateAll()
+
+	SS:HookScript("OnShow", S.Show)
+	SS:HookScript("OnHide", S.Hide)
+	SS.Model:SetScript("OnUpdateModel", nil)
+
+	AFK:OnEvent()
+end
+
+SLE:RegisterModule(S:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/auras.lua b/ElvUI_SLE/modules/auras.lua
index 2cb4c0a..8e36e95 100644
--- a/ElvUI_SLE/modules/auras.lua
+++ b/ElvUI_SLE/modules/auras.lua
@@ -1,224 +1,35 @@
-local E, L, V, P, G = unpack(ElvUI);
-local AT = E:GetModule('SLE_AuraTimers');
-local A = E:GetModule('Auras');
-local SLE = E:GetModule("SLE")
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local SA = SLE:NewModule("Auras", 'AceEvent-3.0')
+local A = E:GetModule("Auras")
 local Masque = LibStub("Masque", true)
 local MasqueGroup = Masque and Masque:Group("ElvUI", "Consolidated Buffs")
-
-local format = string.format
-local twipe = table.wipe
-local GetSpellInfo = GetSpellInfo
-
-local function GetSpell(id)
-	local name = GetSpellInfo(id)
-	return name
-end
-AT.Buffs = {
-	[1] = { --Stats
-		GetSpell(1126), --Dru
-		GetSpell(115921), --MW Monk
-		GetSpell(20217), --Pal
-		GetSpell(116781), --WW/BM Monk
-		GetSpell(160206), --Hunt
-	},
-	[2] = { --Stamina
-		GetSpell(21562), --Priest
-		GetSpell(469), --Warr
-		GetSpell(160199), --Hunt
-	},
-	[3] = { --AttackPower
-		GetSpell(57330), --DK
-		GetSpell(6673), --War
-	},
-	[4] = { --Haste
-		GetSpell(160203), --Hunt
-	},
-	[5] = { --SpellPower
-		GetSpell(61316), --Mage Dal
-		GetSpell(1459), --Mage
-		GetSpell(109773), --Lock
-		GetSpell(160205), --Hunt
-	},
-	[6] = { --Crit
-		GetSpell(61316), --Mage Dal
-		GetSpell(1459), --Mage
-		GetSpell(116781), --BM/WW Monk
-		GetSpell(160200), --Hunter
-	},
-	[7] = { --Mastery
-		GetSpell(19740), --Pal
-		GetSpell(160198), --Hunt
-	},
-	[8] = { --Multistrike
-		GetSpell(109773), --Lock
-		GetSpell(172968), --Hunt
-	},
-	[9] = { --Verstility
-		GetSpell(1126), --Dru
-		GetSpell(172967), --Hunt
-	},
-}
-AT.Spells = {
-	["DEATHKNIGHT"] = {[3] = GetSpell(57330),},
-	["DRUID"] = {[1] = GetSpell(1126),[9] = GetSpell(1126),},
-	["HUNTER"] = {
-		[1] = GetSpell(160206),
-		[2] = GetSpell(160199),
-		[4] = GetSpell(160203),
-		[5] = GetSpell(160205),
-		[6] = GetSpell(160200),
-		[7] = GetSpell(160198),
-		[8] = GetSpell(172968),
-		[9] = GetSpell(172967),
-	},
-	["MAGE"] = {
-		[5] = IsSpellKnown(61316) and GetSpell(61316) or GetSpell(1459),
-		[6] = IsSpellKnown(61316) and GetSpell(61316) or GetSpell(1459),
-	},
-	["MONK"] = {},
-	["PALADIN"] = {
-		[1] = GetSpell(20217),
-		[7] = GetSpell(19740),
-	},
-	["PRIEST"] = {[2] = GetSpell(21562),},
-	["WARLOCK"] = {
-		[5] = GetSpell(109773),
-		[8] = GetSpell(109773),
-	},
-	["WARRIOR"] = {
-		[2] = GetSpell(469),
-		[3] = GetSpell(6673),
-	},
-}
-
-local ignoreIcons = {}
-function AT:Update_ConsolidatedBuffsSettings()
-	if(E.private.auras.disableBlizzard) then
-		for i = 1, NUM_LE_RAID_BUFF_TYPES do
-			local tt = _G[format("ConsolidatedBuffsTooltipBuff%d",i)]
-			tt:Hide()
-		end
-	end
-end
-
-local function ConsOnEnter(button)
-	GameTooltip:Hide()
-	GameTooltip:SetOwner(button, "ANCHOR_BOTTOMLEFT", -3, button:GetHeight() + 2)
-	GameTooltip:ClearLines()
-
-	if button.BuffID and (button.SpellName and button.SpellName ~= "") then
-		GameTooltip:SetUnitConsolidatedBuff("player", button.BuffID)
-	else
-		GameTooltip:AddLine(_G[("RAID_BUFF_%d"):format(button.BuffID)])
-	end
-
-	GameTooltip:Show()
-end
-
-local function ConsOnLeave()
-	GameTooltip:Hide()
-end
-
-function A:CreateButton(i)
-	local button = CreateFrame("Button", "ElvUIConsolidatedBuff"..i, ElvUI_ConsolidatedBuffs, "SecureActionButtonTemplate")
-	button.BuffID = i
-
-	button.t = button:CreateTexture(nil, "OVERLAY")
-	button.t:SetTexCoord(unpack(E.TexCoords))
-	button.t:SetInside()
-	button.t:SetTexture("Interface\\Icons\\INV_Misc_QuestionMark")
-
-	button.cd = CreateFrame('Cooldown', nil, button, 'CooldownFrameTemplate')
-	button.cd:SetInside()
-	button.cd.noOCC = true;
-	button.cd.noCooldownCount = true;
-	button.cd:SetHideCountdownNumbers(true)
-
-	button:SetAttribute("type1", "spell")
-	button:SetAttribute("unit", "player")
-
-	button.timer = button.cd:CreateFontString(nil, 'OVERLAY')
-	button.timer:SetPoint('CENTER')
-
-	local ButtonData = {
-		FloatingBG = nil,
-		Icon = button.t,
-		Cooldown = button.cd,
-		Flash = nil,
-		Pushed = nil,
-		Normal = nil,
-		Disabled = nil,
-		Checked = nil,
-		Border = nil,
-		AutoCastable = nil,
-		Highlight = nil,
-		HotKey = nil,
-		Count = nil,
-		Name = nil,
-		Duration = false,
-		AutoCast = nil,
-	}
-
-	if MasqueGroup and E.private.auras.masque.consolidatedBuffs then
-		MasqueGroup:AddButton(button, ButtonData)
-	elseif not E.private.auras.masque.consolidatedBuffs then
-		button:SetTemplate('Default')
-	end
-
-	button:RegisterForClicks("LeftButtonUp", "RightButtonUp")
-	button:SetScript("OnEnter", function(self) ConsOnEnter(self) end)
-	button:SetScript("OnLeave", function(self) ConsOnLeave() end)
-
-	button.icon = CreateFrame("Frame", "ElvUIConsolidatedBuff"..i.."CanCast", button)
-	-- local icon = button.icon
-	-- icon:Width(3)
-	-- icon:SetPoint("TOPRIGHT", button, "TOPLEFT", 1, (E.PixelMode and -1 or 0))
-	-- icon:SetPoint("BOTTOMRIGHT", button, "BOTTOMLEFT", 1, (E.PixelMode and 1 or 0))
-	-- local overlay = icon:CreateTexture(nil, "OVERLAY")
-	-- overlay:SetTexture(E['media'].blankTex)
-	-- overlay:SetAllPoints(icon)
-	-- local classColor = RAID_CLASS_COLORS[E.myclass]
-	-- overlay:SetVertexColor(classColor.r, classColor.g, classColor.b)
-	-- icon:SetFrameLevel(button:GetFrameLevel() + 3)
-	-- icon:Hide()
-	button.icon = CreateFrame("Frame", "ElvUIConsolidatedBuff"..i.."CanCast", button)
-	local icon = button.icon
-	icon:Width(3)
-	icon:SetPoint("TOPLEFT", button, "TOPLEFT", 1, (E.PixelMode and -1 or 0))
-	icon:SetPoint("BOTTOMLEFT", button, "BOTTOMLEFT", 1, (E.PixelMode and 1 or 0))
-	local overlay = icon:CreateTexture(nil, "OVERLAY")
-	overlay:SetTexture(E["media"].blankTex)
-	overlay:SetAllPoints(icon)
-	local classColor = RAID_CLASS_COLORS[E.myclass]
-	overlay:SetVertexColor(classColor.r, classColor.g, classColor.b)
-	icon:Hide()
-
-	button.cd:SetFrameLevel(icon:GetFrameLevel() + 1)
-
-	return button
-end
-
-function AT:UpdateAura(button, index)
-	if not E.db.sle.auras.enable then return end
+local _G = _G
+local NUM_LE_RAID_BUFF_TYPES = NUM_LE_RAID_BUFF_TYPES
+local GameTooltip = GameTooltip
+local RAID_CLASS_COLORS = RAID_CLASS_COLORS
+local C_Timer = C_Timer
+
+function SA:UpdateAura(button, index)
+	if not SA.db.hideBuffsTimer and not SA.db.hideDebuffsTimer then return end
 	local isDebuff
 	local filter = button:GetParent():GetAttribute('filter')
 	local unit = button:GetParent():GetAttribute("unit")
-	local name, _, _, _, dtype, duration, expiration = UnitAura(unit, index, filter)
+	local name, _, _, _, dtype, duration, expiration = T.UnitAura(unit, index, filter)

 	if (name) then
-		if UnitBuff('player', name) then
+		if T.UnitBuff('player', name) then
 			isDebuff = false
-		elseif UnitDebuff('player', name) then
+		elseif T.UnitDebuff('player', name) then
 			isDebuff = true
 		end

-		if isDebuff == false and E.db.sle.auras.buffs.hideTimer then
+		if isDebuff == false and SA.db.hideBuffsTimer then
 			button.time:Hide()
 		elseif isDebuff == false then
 			button.time:Show()
 		end

-		if isDebuff == true and E.db.sle.auras.debuffs.hideTimer then
+		if isDebuff == true and SA.db.hideDebuffsTimer then
 			button.time:Hide()
 		elseif isDebuff == true then
 			button.time:Show()
@@ -226,85 +37,15 @@ function AT:UpdateAura(button, index)
 	end
 end

-function AT:UpdateTempEnchant(button, index)
-	--Might do tempenchant stuff later
-end
-
-local f = CreateFrame("Frame")
-f:SetScript("OnEvent", function(self, event)
-	AT:BuildCasts(event)
-end)
-function AT:BuildCasts(event, unit)
-	if unit and unit ~= "player" then return end
-	if InCombatLockdown() then
-		f:RegisterEvent("PLAYER_REGEN_ENABLED")
-		SLE:Print(L["You are in combat, Consolidated Buffs Bars will be updated upon leaving it"])
-		return
-	end
-	if event == "PLAYER_REGEN_ENABLED" then f:UnregisterEvent(event) end
-	if E.myclass == "MONK" and GetSpecialization() then
-		twipe(AT.Spells["MONK"])
-		if GetSpecialization() == 2 then
-			AT.Spells["MONK"][1] = GetSpell(115921)
-			AT.Spells["MONK"][6] = nil
-		else
-			AT.Spells["MONK"][1] = GetSpell(116781)
-			AT.Spells["MONK"][6] = GetSpell(116781)
-		end
-	end
-	for i = 1, NUM_LE_RAID_BUFF_TYPES do
-		local button = _G["ElvUIConsolidatedBuff"..i]
-		if AT.Spells[E.myclass] then
-			local name = AT.Spells[E.myclass][i]
-			if name then
-				button:SetAttribute("spell1", name)
-				if E.private.sle.auras.consolidatedMark then
-					button.icon:Show()
-				else
-					button.icon:Hide()
-				end
-			end
-		end
-	end
-	AT:Update_ConsolidatedBuffsSettings()
-	AT:UpdateAuraStandings(nil, "player")
-end
+function SA:Initialize()
+	if E.private.auras.enable ~= true then return end
+	if not SLE.initialized then return end
+	SA.db = E.db.sle.auras
+	hooksecurefunc(A, 'UpdateAura', SA.UpdateAura)

-function AT:UpdateAuraStandings(event, unit)
-	if unit ~= "player" and event ~= "PLAYER_REGEN_ENABLED" then return end
-	if event == "PLAYER_REGEN_DISABLED" or InCombatLockdown() then
-		self:RegisterEvent("PLAYER_REGEN_ENABLED", "UpdateAuraStandings")
-		return
-	elseif event == "PLAYER_REGEN_ENABLED" then
-		self:UnregisterEvent(event)
-	end
-	for i = 1, NUM_LE_RAID_BUFF_TYPES do
-		local button = _G["ElvUIConsolidatedBuff"..i]
-		button.SpellName = ""
-		for s = 1, #AT.Buffs[i] do
-			local name = UnitAura("player", AT.Buffs[i][s])
-			if name then
-				button:SetAttribute("type2", "cancelaura")
-				button:SetAttribute("spell2", name)
-				button.SpellName = name
-				break
-			end
-		end
+	function SA:ForUpdateAll()
+		SA.db = E.db.sle.auras
 	end
 end

-function AT:Initialize()
-	if E.private.auras.enable ~= true then return end
-	hooksecurefunc(A, 'UpdateAura', AT.UpdateAura)
-	hooksecurefunc(A, 'Update_ConsolidatedBuffsSettings', AT.Update_ConsolidatedBuffsSettings)
-	--hooksecurefunc(A, 'UpdateTempEnchant', AT.UpdateTempEnchant)
-
-	self:RegisterEvent("UNIT_AURA", "UpdateAuraStandings")
-	self:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED", "BuildCasts")
-	self:RegisterEvent("PLAYER_SPECIALIZATION_CHANGED", "BuildCasts")
-	self:RegisterEvent("UNIT_LEVEL", "BuildCasts")
-	self:RegisterEvent("PLAYER_REGEN_DISABLED", "UpdateAuraStandings")
-
-	C_Timer.After(5, AT.BuildCasts)
-	C_Timer.After(5, function() A:Update_ConsolidatedBuffsSettings() end)
-end
\ No newline at end of file
+SLE:RegisterModule(SA:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/autorelease.lua b/ElvUI_SLE/modules/autorelease.lua
deleted file mode 100644
index ce67e0f..0000000
--- a/ElvUI_SLE/modules/autorelease.lua
+++ /dev/null
@@ -1,47 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local AR = E:GetModule('SLE_AutoRelease')
-local myclass = E.myclass
-local IsInInstance = IsInInstance
-local soulstone = GetSpellInfo(20707)
-local UnitLevel = UnitLevel
-local GetSpellCooldown = GetSpellCooldown
-local level = 0
-local cd
-local GetTime = GetTime
-local RepopMe = RepopMe
-
-local function Check(level, cd)
-	if ((myclass ~= "SHAMAN") and not (soulstone and UnitBuff("player", soulstone))) then
-		RepopMe()
-	elseif myclass == "SHAMAN" and (level < 32 or cd > 0) then
-		RepopMe()
-	end
-end
-
-local function Releasing()
-	local inInstance, instanceType = IsInInstance()
-	if myclass == "SHAMAN" then
-		level = UnitLevel("player")
-		local start, duration = GetSpellCooldown(20608)
-		if duration == nil then duration = 0 end
-		cd = (start + duration - GetTime())
-	end
-	if (inInstance and (instanceType == "pvp")) then
-		if E.db.sle.pvpautorelease then Check(level, cd) end
-	end
-
-	-- auto resurrection for world PvP area...when active
-	if E.db.sle.pvpautorelease then
-		for index = 1, GetNumWorldPVPAreas() do
-			local _, localizedName, isActive = GetWorldPVPAreaInfo(index)
-			if (GetRealZoneText() == localizedName and isActive) then Check(level, cd) end
-		end
-	end
-end
-
-function AR:Initialize()
-	ShowUIPanel(GhostFrame)
-	E:CreateMover(GhostFrame, "GhostFrameMover", L["Ghost Frame"], nil, nil, nil, "ALL,S&L,S&L MISC")
-	HideUIPanel(GhostFrame)
-	self:RegisterEvent("PLAYER_DEAD", Releasing);
-end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/backgrounds.lua b/ElvUI_SLE/modules/backgrounds.lua
index d05fdb5..3984f20 100644
--- a/ElvUI_SLE/modules/backgrounds.lua
+++ b/ElvUI_SLE/modules/backgrounds.lua
@@ -1,119 +1,92 @@
-local E, L, V, P, G = unpack(ElvUI);
-local BG = E:GetModule('SLE_BackGrounds');
-
-local BGb, BGl, BGr, BGa, Fr
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local BG = SLE:NewModule('Backgrounds', 'AceHook-3.0');
+local CreateFrame = CreateFrame
+BG.pos = {
+		[1] = {"BOTTOM", "BOTTOM", 0, 21},
+		[2] = {"BOTTOMRIGHT", "BOTTOM", -((E.eyefinity or E.screenwidth)/4 + 32)/2 - 1, 21, 21},
+		[3] = {"BOTTOMLEFT", "BOTTOM", ((E.eyefinity or E.screenwidth)/4 + 32)/2 + 1, 21},
+		[4] = {"BOTTOM", "BOTTOM", 0, E.screenheight/6 + 9},
+	}

---Frames setup
-local function CreateFrames()
-	BGb = CreateFrame('Frame', "BottomBG", E.UIParent);
-	BGl = CreateFrame('Frame', "LeftBG", E.UIParent);
-	BGr = CreateFrame('Frame', "RightBG", E.UIParent);
-	BGa = CreateFrame('Frame', "ActionBG", E.UIParent);
+function BG:CreateFrame(i)
+	local frame = CreateFrame("Frame", "SLE_BG_"..i, E.UIParent)
+	frame:SetFrameStrata("BACKGROUND")
+	frame.texture = frame:CreateTexture(nil, 'OVERLAY')
+	frame.texture:Point('TOPLEFT', frame, 'TOPLEFT', 2, -2)
+	frame.texture:Point('BOTTOMRIGHT', frame, 'BOTTOMRIGHT', -2, 2)
+	frame:Hide()

-	Fr = {
-		BottomBG = {BGb,"bottom"},
-		LeftBG = {BGl,"left"},
-		RightBG = {BGr,"right"},
-		ActionBG = {BGa,"action"},
-	}
+	frame.texture:SetAlpha(E.db.general.backdropfadecolor.a or 0.5)
+	return frame
+end

-	for _,v in pairs(Fr) do
-		v[1]:SetFrameLevel(v[1]:GetFrameLevel() - 1)
-		v[1]:SetScript("OnShow", function() v[1]:SetFrameStrata('BACKGROUND') end)
-		v[1].tex = v[1]:CreateTexture(nil, 'OVERLAY')
-		v[1]:Hide()
-	end
+function BG:Positions(i)
+	local anchor, point, x, y = T.unpack(BG.pos[i])
+	BG["Frame_"..i]:SetPoint(anchor, E.UIParent, point, x, y)
+end

-	BGb.tex:SetAlpha(E.db.general.backdropfadecolor.a or 0.5)
-	BGl.tex:SetAlpha(E.db.general.backdropfadecolor.a or 0.5)
-	BGr.tex:SetAlpha(E.db.general.backdropfadecolor.a or 0.5)
-	BGa.tex:SetAlpha(E.db.general.backdropfadecolor.a or 0.5)
+function BG:UpdateTexture(i)
+	BG["Frame_"..i].texture:SetTexture(BG.db["bg"..i].texture)
 end

---Frames Size
-function BG:FramesSize()
-	if not BGb then return end
-	local db = E.db.sle.backgrounds
-	for _,v in pairs(Fr) do
-		v[1]:SetSize(db[v[2]].width, db[v[2]].height)
-	end
+function BG:FramesSize(i)
+	BG["Frame_"..i]:SetSize(BG.db["bg"..i].width, BG.db["bg"..i].height)
 end

---Frames points
-local function FramesPositions()
-	if not BGb then return end
-	BGb:Point("BOTTOM", E.UIParent, "BOTTOM", 0, 21);
-	BGl:Point("BOTTOMRIGHT", E.UIParent, "BOTTOM", -((E.eyefinity or E.screenwidth)/4 + 32)/2 - 1, 21);
-	BGr:Point("BOTTOMLEFT", E.UIParent, "BOTTOM", ((E.eyefinity or E.screenwidth)/4 + 32)/2 + 1, 21);
-	BGa:Point("BOTTOM", E.UIParent, "BOTTOM", 0, E.screenheight/6 + 9);
+function BG:Alpha(i)
+	BG["Frame_"..i]:SetAlpha(BG.db["bg"..i].alpha)
 end

---Updating textures
-local function UpdateTex()
-	if not BGb then return end
-	local db = E.db.sle.backgrounds
-	for _,v in pairs(Fr) do
-		v[1].tex:Point('TOPLEFT', v[1], 'TOPLEFT', 2, -2)
-		v[1].tex:Point('BOTTOMRIGHT', v[1], 'BOTTOMRIGHT', -2, 2)
-		v[1].tex:SetTexture(db[v[2]].texture)
-	end
+function BG:FrameTemplate(i)
+	BG["Frame_"..i]:SetTemplate(BG.db["bg"..i].template, true)
 end

---Visibility / Enable check
-function BG:FramesVisibility()
-	if not BGb then return end
-	local db = E.db.sle.backgrounds
-	for _,v in pairs(Fr) do
-		if db[v[2]].enabled then
-			v[1]:Show()
-		else
-			v[1]:Hide()
-		end
+function BG:RegisterHide(i)
+	if BG.db["bg"..i].pethide then
+		E.FrameLocks[BG["Frame_"..i]] = true
+	else
+		E.FrameLocks[BG["Frame_"..i]] = nil
 	end
 end

-function BG:MouseCatching()
-	if not BGb then return end
-	local db = E.db.sle.backgrounds
-	for _,v in pairs(Fr) do
-		v[1]:EnableMouse(not(db[v[2]].clickthrough))
+function BG:FramesVisibility(i)
+	if BG.db["bg"..i].enabled then
+		BG["Frame_"..i]:Show()
+		E:EnableMover(BG["Frame_"..i].mover:GetName())
+	else
+		BG["Frame_"..i]:Hide()
+		E:DisableMover(BG["Frame_"..i].mover:GetName())
 	end
 end

-function BG:UpdateFrames()
-	if not BGb then return end
-	local db = E.db.sle.backgrounds
-	for _,v in pairs(Fr) do
-		v[1]:SetTemplate(db[v[2]].template, true)
-		v[1]:SetAlpha(db[v[2]].alpha)
-	end
-	BG:FramesSize()
-	BG:FramesVisibility()
-	BG:MouseCatching()
-    UpdateTex()
+function BG:MouseCatching(i)
+	BG["Frame_"..i]:EnableMouse(not(BG.db["bg"..i].clickthrough))
 end

-function BG:RegisterHide()
-	if not BGb then return end
-	local db = E.db.sle.backgrounds
-	for k,v in pairs(Fr) do
-		if db[v[2]].pethide then
-			E.FrameLocks[k] = true
-		else
-			E.FrameLocks[k] = nil
-		end
+function BG:CreateAndUpdateFrames()
+	for i = 1, 4 do
+		if not BG["Frame_"..i] then BG["Frame_"..i] = self:CreateFrame(i) end
+		BG:Positions(i)
+		BG:FramesSize(i)
+		BG:FrameTemplate(i)
+		BG:Alpha(i)
+		if not E.CreatedMovers["SLE_BG_"..i.."_Mover"] then E:CreateMover(BG["Frame_"..i], "SLE_BG_"..i.."_Mover", L["SLE_BG_"..i], nil, nil, nil, "S&L,S&L BG") end
+		BG:FramesVisibility(i)
+		BG:MouseCatching(i)
+		BG:UpdateTexture(i)
+		BG:RegisterHide(i)
 	end
 end

 function BG:Initialize()
-	if not E.private.sle.backgrounds then return end
-	CreateFrames()
-	FramesPositions()
-	BG:UpdateFrames()
-	BG:RegisterHide()
+	if not SLE.initialized then return end
+
+	function BG:ForUpdateAll()
+		BG.db = E.db.sle.backgrounds
+		BG:CreateAndUpdateFrames()
+	end
+
+	BG:ForUpdateAll()
+end

-	E:CreateMover(BottomBG, "BottomBG_Mover", L["Bottom BG"], nil, nil, nil, "S&L,S&L BG")
-	E:CreateMover(LeftBG, "LeftBG_Mover", L["Left BG"], nil, nil, nil, "S&L,S&L BG")
-	E:CreateMover(RightBG, "RightBG_Mover", L["Right BG"], nil, nil, nil, "S&L,S&L BG")
-	E:CreateMover(ActionBG, "ActionBG_Mover", L["Actionbar BG"], nil, nil, nil, "S&L,S&L BG")
-end
\ No newline at end of file
+SLE:RegisterModule(BG:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/baginfo.lua b/ElvUI_SLE/modules/baginfo.lua
index e46bf1a..903a3f9 100644
--- a/ElvUI_SLE/modules/baginfo.lua
+++ b/ElvUI_SLE/modules/baginfo.lua
@@ -1,14 +1,14 @@
-local E, L, V, P, G = unpack(ElvUI);
-local BI = E:GetModule('SLE_BagInfo')
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local BI = SLE:NewModule('BagInfo', 'AceHook-3.0', 'AceEvent-3.0', 'AceTimer-3.0')
 local B = E:GetModule('Bags')
-
-local byte, format = string.byte, string.format
-local tinsert, twipe = table.insert, table.wipe
+local _G = _G
+local byte = string.byte

 local updateTimer
-local containers = {}
-local infoArray = {}
-local equipmentMap = {}
+BI.containers = {}
+BI.infoArray = {}
+BI.equipmentMap = {}
+local EquipmentManager_UnpackLocation = EquipmentManager_UnpackLocation

 local function Utf8Sub(str, start, numChars)
 	local currentIndex = start
@@ -32,7 +32,7 @@ local function Utf8Sub(str, start, numChars)
 end

 local function MapKey(bag, slot)
-	return format("%d_%d", bag, slot)
+	return T.format("%d_%d", bag, slot)
 end

 local quickFormat = {
@@ -44,24 +44,24 @@ local quickFormat = {

 local function BuildEquipmentMap(clear)
 	-- clear mapped names
-	for k, v in pairs(equipmentMap) do
-		twipe(v)
+	for k, v in T.pairs(BI.equipmentMap) do
+		T.twipe(v)
 	end

 	if clear then return end

 	local name, player, bank, bags, slot, bag, key

-	for i = 1, GetNumEquipmentSets() do
-		name = GetEquipmentSetInfo(i)
-		GetEquipmentSetLocations(name, infoArray)
-		for _, location in pairs(infoArray) do
-			if type(location) == "number" and (location < -1 or location > 1) then
+	for i = 1, T.GetNumEquipmentSets() do
+		name = T.GetEquipmentSetInfo(i)
+		T.GetEquipmentSetLocations(name, BI.infoArray)
+		for _, location in T.pairs(BI.infoArray) do
+			if T.type(location) == "number" and (location < -1 or location > 1) then
 				player, bank, bags, _, slot, bag = EquipmentManager_UnpackLocation(location)
 				if ((bank or bags) and slot and bag) then
 					key = MapKey(bag, slot)
-					equipmentMap[key] = equipmentMap[key] or {}
-					tinsert(equipmentMap[key], name)
+					BI.equipmentMap[key] = BI.equipmentMap[key] or {}
+					T.tinsert(BI.equipmentMap[key], name)
 				end
 			end
 		end
@@ -81,8 +81,8 @@ local function UpdateContainerFrame(frame, bag, slot)
 		frame.equipmentinfo:SetAllPoints(frame)

 		local key = MapKey(bag, slot)
-		if equipmentMap[key] then
-			quickFormat[#equipmentMap[key] < 4 and #equipmentMap[key] or 3](frame.equipmentinfo, equipmentMap[key])
+		if BI.equipmentMap[key] then
+			quickFormat[#BI.equipmentMap[key] < 4 and #BI.equipmentMap[key] or 3](frame.equipmentinfo, BI.equipmentMap[key])
 		else
 			quickFormat[0](frame.equipmentinfo, nil)
 		end
@@ -93,9 +93,9 @@ local function UpdateBagInformation(clear)
 	updateTimer = nil

 	BuildEquipmentMap(clear)
-	for _, container in pairs(containers) do
-		for _, bagID in ipairs(container.BagIDs) do
-			for slotID = 1, GetContainerNumSlots(bagID) do
+	for _, container in T.pairs(BI.containers) do
+		for _, bagID in T.ipairs(container.BagIDs) do
+			for slotID = 1, T.GetContainerNumSlots(bagID) do
 				UpdateContainerFrame(container.Bags[bagID][slotID], bagID, slotID)
 			end
 		end
@@ -122,18 +122,21 @@ function BI:ToggleSettings()
 		self:UnregisterEvent("EQUIPMENT_SETS_CHANGED")
 		self:UnregisterEvent("BAG_UPDATE")
 		UpdateBagInformation(true)
-	end
+	end
 end

 function BI:Initialize()
+	if not SLE.initialized then return end
 	if not E.private.bags.enable then return end

-	tinsert(containers, _G["ElvUI_ContainerFrame"])
+	T.tinsert(BI.containers, _G["ElvUI_ContainerFrame"])
 	self:SecureHook(B, "OpenBank", function()
-		self:Unhook(B, "OpenBank")
-		tinsert(containers, _G["ElvUI_BankContainerFrame"])
+		self:Unhook(B, "OpenBank")
+		T.tinsert(BI.containers, _G["ElvUI_BankContainerFrame"])
 		BI:ToggleSettings()
 	end)

 	BI:ToggleSettings()
-end
\ No newline at end of file
+end
+
+SLE:RegisterModule(BI:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/bags.lua b/ElvUI_SLE/modules/bags.lua
index 5d8d6f9..c742694 100755
--- a/ElvUI_SLE/modules/bags.lua
+++ b/ElvUI_SLE/modules/bags.lua
@@ -1,9 +1,13 @@
-local E, L, V, P, G = unpack(ElvUI)
-local SB = E:GetModule("SLE_Bags")
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local SB = SLE:NewModule("Bags", 'AceHook-3.0')
+local Pr
 local B = E:GetModule('Bags')
+local _G = _G
+local REAGENTBANK_CONTAINER = REAGENTBANK_CONTAINER
+local C_NewItems = C_NewItems

 function SB:UpdateSlot(bagID, slotID)
-	if (self.Bags[bagID] and self.Bags[bagID].numSlots ~= GetContainerNumSlots(bagID)) or not self.Bags[bagID] or not self.Bags[bagID][slotID] then
+	if (self.Bags[bagID] and self.Bags[bagID].numSlots ~= T.GetContainerNumSlots(bagID)) or not self.Bags[bagID] or not self.Bags[bagID][slotID] then
 		return;
 	end

@@ -14,6 +18,13 @@ function SB:UpdateSlot(bagID, slotID)
 	if (slot:IsShown() and C_NewItems.IsNewItem(bagID, slotID)) then
 		SB:StartAnim(slot);
 	end
+
+	if not Pr then Pr = SLE:GetModule("Professions") end
+	if not Pr.DeconstructionReal then return end
+	if Pr.DeconstructionReal:IsShown() and not slot.hasItem then
+		B:Tooltip_Hide()
+		Pr.DeconstructionReal:OnLeave()
+	end
 end

 function SB:UpdateReagentSlot(slotID)
@@ -29,6 +40,9 @@ function SB:UpdateReagentSlot(slotID)
 end

 function SB:StartAnim(slot)
+	if not slot.flashTex then
+		SB:HookBags(nil, slot)
+	end
 	slot.flashTex:Show();
 	slot.flashAnim:Play();
 	slot.glowAnim:Play();
@@ -41,17 +55,21 @@ function SB:StopAnim(slot)
 end

 function SB:HookSlot(slot, bagID, slotID)
+	if bagID == REAGENTBANK_CONTAINER and E.private.sle.bags.transparentSlots and not slot.SLErarity then
+			slot.SLErarity = true
+			B:UpdateReagentSlot(slotID)
+	end
 	slot:HookScript('OnEnter', function()
-		if (E.db.sle.bags.lootflash) then
+		if (SB.db.lootflash) then
 			C_NewItems.RemoveNewItem(bagID, slotID);
 			SB:StopAnim(slot);
 		end
 	end);

 	slot:HookScript('OnShow', function()
-		if (E.db.sle.bags.lootflash) then
+		if (SB.db.lootflash) then
 			if (C_NewItems.IsNewItem(bagID, slotID)) then
-				SB:StartAnim(slot);
+				SB:StartAnim(slot);
 			else
 				SB:StopAnim(slot);
 			end
@@ -59,7 +77,7 @@ function SB:HookSlot(slot, bagID, slotID)
 	end);

 	slot:HookScript('OnHide', function()
-		if (E.db.sle.bags.lootflash) then
+		if (SB.db.lootflash) then
 			C_NewItems.RemoveNewItem(bagID, slotID);
 			SB:StopAnim(slot);
 		end
@@ -110,20 +128,29 @@ function SB:HookSlot(slot, bagID, slotID)
 	slot.glowAnim = glowAnimGroup;
 end

-function SB:HookBags()
-	for _, bagFrame in pairs(B.BagFrames) do
-		for _, bagID in pairs(bagFrame.BagIDs) do
-			if (not self.hookedBags[bagID]) then
-				for slotID = 1, GetContainerNumSlots(bagID) do
-					local slot = bagFrame.Bags[bagID][slotID];
+function SB:HookBags(isBank, force)
+	local slot
+	for _, bagFrame in T.pairs(B.BagFrames) do
+		for _, bagID in T.pairs(bagFrame.BagIDs) do
+			if (not self.hookedBags[bagID])then
+				for slotID = 1, T.GetContainerNumSlots(bagID) do
+					slot = bagFrame.Bags[bagID][slotID];
 					self:HookSlot(slot, bagID, slotID);
 				end
 				self.hookedBags[bagID] = true;
+			elseif self.hookedBags[bagID] and force then
+				for slotID = 1, T.GetContainerNumSlots(bagID) do
+					if force == bagFrame.Bags[bagID][slotID] then self:HookSlot(force, bagID, slotID) end
+				end
+			end
+			for slotID = 1, T.GetContainerNumSlots(bagID) do
+				slot = bagFrame.Bags[bagID][slotID];
+				if slot.template ~= "Transparent" and E.private.sle.bags.transparentSlots then slot:SetTemplate('Transparent') end
 			end
 		end
 	end

-	if (ElvUIReagentBankFrameItem1 and not self.hookedBags[REAGENTBANK_CONTAINER]) then
+	if (_G["ElvUIReagentBankFrameItem1"] and not self.hookedBags[REAGENTBANK_CONTAINER]) then
 		for slotID = 1, 98 do
 			local slot = _G["ElvUIReagentBankFrameItem"..slotID];
 			self:HookSlot(slot, REAGENTBANK_CONTAINER, slotID);
@@ -134,13 +161,20 @@ end

 function SB:Initialize()
 	self.hookedBags = {};
+	if not SLE.initialized then return end
 	if not E.private.bags.enable then return end
+
+	function SB:ForUpdateAll()
+		SB.db = E.db.sle.bags
+	end
+	SB:ForUpdateAll()
+
 	local BUpdateSlot = B.UpdateSlot;
 	local SBUpdateSlot = SB.UpdateSlot;
-	for _, bagFrame in pairs(B.BagFrames) do
+	for _, bagFrame in T.pairs(B.BagFrames) do
 		local UpdateSlot = function(self, bagID, slotID)
 			BUpdateSlot(bagFrame, bagID, slotID);
-			if (E.db.sle.bags.lootflash) then
+			if (SB.db.lootflash) then
 				SBUpdateSlot(bagFrame, bagID, slotID);
 			end
 		end
@@ -149,7 +183,7 @@ function SB:Initialize()
 		local SBUpdateReagentSlot = SB.UpdateReagentSlot;
 		local UpdateReagentSlot = function(self, slotID)
 			BUpdateReagentSlot(bagFrame, slotID);
-			if (E.db.sle.bags.lootflash) then
+			if (SB.db.lootflash) then
 				SBUpdateReagentSlot(bagFrame, slotID);
 			end
 		end
@@ -159,4 +193,6 @@ function SB:Initialize()
 	hooksecurefunc(B, "Layout", function()
 		self:HookBags()
 	end);
-end
\ No newline at end of file
+end
+
+SLE:RegisterModule(SB:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/blizzard.lua b/ElvUI_SLE/modules/blizzard.lua
new file mode 100644
index 0000000..54404c6
--- /dev/null
+++ b/ElvUI_SLE/modules/blizzard.lua
@@ -0,0 +1,133 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local B = SLE:NewModule("Blizzard", 'AceHook-3.0', 'AceEvent-3.0')
+local _G = _G
+
+local EnableMouse = EnableMouse
+local SetMovable = SetMovable
+local SetClampedToScreen = SetClampedToScreen
+local RegisterForDrag = RegisterForDrag
+local StartMoving = StartMoving
+local StopMovingOrSizing = StopMovingOrSizing
+
+B.Frames = {
+	"AddonList",
+	"BankFrame",
+	"CharacterFrame",
+	"ChatConfigFrame",
+	"CinematicFrame",
+	"DressUpFrame",
+	"FriendsFrame",
+	"GameMenuFrame",
+	"GossipFrame",
+	"GuildInviteFrame",
+	"GuildRegistrarFrame",
+	"HelpFrame",
+	"InterfaceOptionsFrame",
+	"ItemTextFrame",
+	"LootFrame",
+	"MailFrame",
+	"MerchantFrame",
+	"OpenMailFrame",
+	"PVEFrame",
+	"PetStableFrame",
+	"PetitionFrame",
+	"QuestFrame",
+	"RaidBrowserFrame",
+	"ScrollOfResurrectionSelectionFrame",
+	"SpellBookFrame",
+	"StackSplitFrame",
+	"StaticPopup1",
+	"StaticPopup2",
+	"TabardFrame",
+	"TaxiFrame",
+	"TimeManagerFrame",
+	"TradeFrame",
+	"TutorialFrame",
+	"VideoOptionsFrame",
+	"WorldMapFrame",
+}
+
+B.AddonsList = {
+	["Blizzard_AchievementUI"] = {"AchievementFrame","AchievementFrameHeader"},
+	["Blizzard_ArchaeologyUI"] = "ArchaeologyFrame",
+	["Blizzard_AuctionUI"] = "AuctionFrame",
+	["Blizzard_Calendar"] = "CalendarFrame",
+	["Blizzard_Collections"] = "CollectionsJournal",
+	["Blizzard_EncounterJournal"] = "EncounterJournal",
+	["Blizzard_GarrisonUI"] = {"GarrisonLandingPage", "GarrisonMissionFrame", "GarrisonCapacitiveDisplayFrame", "GarrisonBuildingFrame", "GarrisonRecruiterFrame", "GarrisonRecruitSelectFrame", "GarrisonShipyardFrame"},
+	["Blizzard_GuildBankUI"] = "GuildBankFrame",
+	["Blizzard_GuildControlUI"] = "GuildControlUI",
+	["Blizzard_GuildUI"] = "GuildFrame",
+	["Blizzard_InspectUI"] = "InspectFrame",
+	["Blizzard_ItemAlterationUI"] = "TransmogrifyFrame",
+	["Blizzard_ItemSocketingUI"] = "ItemSocketingFrame",
+	["Blizzard_ItemUpgradeUI"] = "ItemUpgradeFrame",
+	["Blizzard_LookingForGuildUI"] = "LookingForGuildFrame",
+	["Blizzard_MacroUI"] = "MacroFrame",
+	["Blizzard_TalentUI"] = "PlayerTalentFrame",
+	["Blizzard_TradeSkillUI"] = "TradeSkillFrame",
+	["Blizzard_VoidStorageUI"] = "VoidStorageFrame",
+}
+
+function B:MakeMovable(frame)
+	if frame then
+		frame:EnableMouse(true)
+		frame:SetMovable(true)
+		frame:SetClampedToScreen(true)
+		frame:RegisterForDrag("LeftButton")
+		frame:SetScript("OnDragStart", function(self) self:StartMoving() end)
+		frame:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
+		if frame.TitleMouseover then B:MakeMovable(frame.TitleMouseover) end
+	end
+end
+
+function B:Addons(event, addon)
+	local frame
+	addon = B.AddonsList[addon]
+	if not addon then return end
+	if T.type(addon) == "table" then
+		for i = 1, #addon do
+			frame = _G[addon[i]]
+			B:MakeMovable(frame)
+		end
+	else
+		frame = _G[addon]
+		B:MakeMovable(frame)
+	end
+	B.addonCount = B.addonCount + 1
+	if B.addonCount == #B.AddonsList then B:UnregisterEvent(event) end
+end
+
+function B:VehicleScale()
+	local frame = VehicleSeatIndicator
+	frame:SetScale(B.db.vehicleSeatScale)
+	frame.mover:SetSize(B.db.vehicleSeatScale * frame:GetWidth(), B.db.vehicleSeatScale * frame:GetHeight())
+end
+
+function B:ErrorFrameSize()
+	UIErrorsFrame:SetSize(B.db.errorframe.width, B.db.errorframe.height) --512 x 60
+end
+
+function B:Initialize()
+	B.db = E.db.sle.blizzard
+	if not SLE.initialized then return end
+	B.addonCount = 0
+	if E.private.sle.module.blizzmove then
+		if E.isMacClient then T.tinsert(B.Frames, "MacOptionsFrame") end
+		for i = 1, #B.Frames do
+			local frame = _G[B.Frames[i]]
+			if frame then B:MakeMovable(frame) else SLE:ErrorPrint("Doesn't exist: "..B.Frames[i]) end
+		end
+		self:RegisterEvent("ADDON_LOADED", "Addons")
+	end
+
+	E:Delay(1, B.VehicleScale)
+	B:ErrorFrameSize()
+	function B:ForUpdateAll()
+		B.db = E.db.sle.blizzard
+		B:VehicleScale()
+		B:ErrorFrameSize()
+	end
+end
+
+SLE:RegisterModule(B:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/chat.lua b/ElvUI_SLE/modules/chat.lua
deleted file mode 100644
index 3a671ee..0000000
--- a/ElvUI_SLE/modules/chat.lua
+++ /dev/null
@@ -1,508 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local CH = E:GetModule('Chat')
-local SLE = E:GetModule('SLE');
-local LSM = LibStub("LibSharedMedia-3.0")
-local CreatedFrames = 0;
-local lfgRoles = {};
-local chatFilters = {};
-local lfgChannels = {
-	"PARTY_LEADER",
-	"PARTY",
-	"RAID",
-	"RAID_LEADER",
-	"INSTANCE_CHAT",
-	"INSTANCE_CHAT_LEADER",
-	"RAID_WARNING",
-}
-
-local Myname = E.myname
-local GetGuildRosterInfo = GetGuildRosterInfo
-local IsInGuild = IsInGuild
-local GuildMaster = ""
-local GMName, GMRealm
-
-local len, gsub, find, sub, gmatch, format, random = string.len, string.gsub, string.find, string.sub, string.gmatch, string.format, math.random
-local tinsert, tremove, tsort, twipe, tconcat = table.insert, table.remove, table.sort, table.wipe, table.concat
-
-local PLAYER_REALM = gsub(E.myrealm,'[%s%-]','')
-local PLAYER_NAME = Myname.."-"..PLAYER_REALM
-
-local leader = [[|TInterface\GroupFrame\UI-Group-LeaderIcon:12:12|t]]
-local specialChatIcons
-
---Damage Meter Spam stuff--
-CH.MeterSpam = false
-CH.ChannelEvents = {
-	"CHAT_MSG_CHANNEL",
-	"CHAT_MSG_GUILD",
-	"CHAT_MSG_OFFICER",
-	"CHAT_MSG_PARTY",
-	"CHAT_MSG_PARTY_LEADER",
-	"CHAT_MSG_INSTANCE_CHAT",
-	"CHAT_MSG_INSTANCE_CHAT_LEADER",
-	"CHAT_MSG_RAID",
-	"CHAT_MSG_RAID_LEADER",
-	"CHAT_MSG_SAY",
-	"CHAT_MSG_WHISPER",
-	"CHAT_MSG_WHISPER_INFORM",
-	"CHAT_MSG_YELL",
-}
-CH.spamFirstLines = {
-	"^Recount - (.*)$", --Recount
-	"^Skada: (.*) for (.*):$", -- Skada enUS
-	"^Skada: (.*) por (.*):$", -- Skada esES/ptBR
-	"^Skada: (.*) für (.*):$", -- Skada deDE
-	"^Skada: (.*) pour (.*):$", -- Skada frFR
-	"^Skada: (.*) per (.*):$", -- Skada itIT
-	"^(.*) 의 Skada 보고 (.*):$", -- Skada koKR
-	"^Отчёт Skada: (.*), с (.*):$", -- Skada ruRU
-	"^Skada报告(.*)的(.*):$", -- Skada zhCN
-	"^Skada:(.*)來自(.*):$", -- Skada zhTW
-	"^(.*) Done for (.*)$", -- TinyDPS
-	"^Numeration: (.*)$", -- Numeration
-	"^Details! Report for (.*)$" -- Details!
-}
-CH.spamNextLines = {
-	"^(%d+)\. (.*)$", --Recount, Details! and Skada
-	"^(.*)   (.*)$", --Additional Skada
-	"^Numeration: (.*)$", -- Numeration
-	"^[+-]%d+.%d", -- Numeration Deathlog Details
-	"^(%d+). (.*):(.*)(%d+)(.*)(%d+)%%(.*)%((%d+)%)$", -- TinyDPS
-	"^(.+) (%d-%.%d-%w)$", -- Skada 2
-	'|c%x-|H.-|h(%[.-%])|h|r (%d-%.%d-%w %(%d-%.%d-%%%))', --Skada 3
-}
-CH.Meters = {}
-
-local function Style(self, frame)
-	CreatedFrames = frame:GetID()
-end
-
---Replacement of chat tab position and size function
-local PixelOff = E.PixelMode and 33 or 27
-
-local function PositionChat(self, override)
-	if ((InCombatLockdown() and not override and self.initialMove) or (IsMouseButtonDown("LeftButton") and not override)) then return end
-	if not RightChatPanel or not LeftChatPanel then return; end
-	if not self.db.lockPositions or E.private.chat.enable ~= true then return end
-	if not E.db.sle.datatext.chathandle then return end
-
-	local BASE_OFFSET = 60
-	if E.PixelMode then
-		BASE_OFFSET = BASE_OFFSET - 3
-	end
-	local chat, id, isDocked, point
-	for i=1, CreatedFrames do
-		chat = _G[format("ChatFrame%d", i)]
-		id = chat:GetID()
-		tab = _G[format("ChatFrame%sTab", i)]
-		point = GetChatWindowSavedPosition(id)
-		isDocked = chat.isDocked
-
-		if chat:IsShown() and not (id > NUM_CHAT_WINDOWS) and id == CH.RightChatWindowID then
-			chat:ClearAllPoints()
-			if E.db.datatexts.rightChatPanel then
-				chat:Point("BOTTOMRIGHT", RightChatDataPanel, "TOPRIGHT", 10, 3)
-			else
-				BASE_OFFSET = BASE_OFFSET - 24
-				chat:SetPoint("BOTTOMLEFT", RightChatPanel, "BOTTOMLEFT", 4, 4)
-			end
-			if id ~= 2 then
-				chat:Size((E.db.chat.separateSizes and E.db.chat.panelWidthRight or E.db.chat.panelWidth) - 10, ((E.db.chat.separateSizes and E.db.chat.panelHeightRight or E.db.chat.panelHeight) - PixelOff))
-			end
-		elseif not isDocked and chat:IsShown() then
-
-		else
-			if id ~= 2 and not (id > NUM_CHAT_WINDOWS) then
-				BASE_OFFSET = BASE_OFFSET - 24
-				chat:SetPoint("BOTTOMLEFT", LeftChatPanel, "BOTTOMLEFT", 4, 4)
-				chat:Size(E.db.chat.panelWidth - 10, E.db.chat.panelHeight - PixelOff)
-			end
-		end
-	end
-end
-
-local function GetChatIcon(sender)
-	if not specialChatIcons then
-		SLE:GetRegion()
-		specialChatIcons = SLE.SpecialChatIcons[SLE.region]
-	end
-	local senderName, senderRealm
-	if sender then
-		senderName, senderRealm = string.split('-', sender)
-	else
-		senderName = Myname
-	end
-	senderRealm = senderRealm or PLAYER_REALM
-	senderRealm = senderRealm:gsub(' ', '')
-
-	if specialChatIcons[senderRealm] and specialChatIcons[senderRealm][senderName] then
-		return specialChatIcons[senderRealm][senderName]
-	end
-
-	if not IsInGuild() then return "" end
-	if not E.db.sle.chat.guildmaster then return "" end
-	if senderName == GMName and senderRealm == GMRealm then
-		return leader
-	end
-
-	return ""
-end
-
-function CH:GetPluginReplacementIcon(arg2, arg6, type)
-	local icon = ""
-	if arg6 and (strlen(arg6) > 0) then
-		if ( arg6 == "GM" ) then
-			--If it was a whisper, dispatch it to the GMChat addon.
-			if ( type == "WHISPER" ) then
-				return;
-			end
-			--Add Blizzard Icon, this was sent by a GM
-			icon = "|TInterface\\ChatFrame\\UI-ChatIcon-Blizz:12:20:0:0:32:16:4:28:0:16|t ";
-		elseif ( arg6 == "DEV" ) then
-			--Add Blizzard Icon, this was sent by a Dev
-			icon = "|TInterface\\ChatFrame\\UI-ChatIcon-Blizz:12:20:0:0:32:16:4:28:0:16|t ";
-		elseif ( arg6 == "DND" or arg6 == "AFK") then
-			icon = GetChatIcon(arg2).._G["CHAT_FLAG_"..arg6]
-		else
-			icon = _G["CHAT_FLAG_"..arg6];
-		end
-	else
-		icon = GetChatIcon(arg2)
-		if(lfgRoles[arg2] and SLE:SimpleTable(lfgChannels, type)) then
-			icon = lfgRoles[arg2]..icon
-		end
-	end
-	if icon == "" then icon = nil end
-	return icon, true
-end
-
-function CH:CheckLFGRoles()
-	local isInGroup, isInRaid = IsInGroup(), IsInRaid()
-	local unit = isInRaid and "raid" or "party"
-	local name, realm
-	twipe(lfgRoles)
-	if(not isInGroup or not self.db.lfgIcons) then return end
-
-	local role = UnitGroupRolesAssigned("player")
-	if(role and role ~= "NONE") then
-		local path = SLE.rolePaths[E.db.sle.roleicons][role]
-		lfgRoles[PLAYER_NAME] = "|T"..path..":15:15:0:0:64:64:2:56:2:56|t"
-	end
-
-	for i=1, GetNumGroupMembers() do
-		if(UnitExists(unit..i) and not UnitIsUnit(unit..i, "player")) then
-			role = UnitGroupRolesAssigned(unit..i)
-			name, realm = UnitName(unit..i)
-
-			if(role and name) then
-				name = (realm and realm ~= '') and name..'-'..realm or name ..'-'..PLAYER_REALM;
-				lfgRoles[name] = role ~= "NONE" and "|T"..SLE.rolePaths[E.db.sle.roleicons][role]..":15:15:0:0:64:64:2:56:2:56|t" or nil
-			end
-		end
-	end
-end
-
-local function GMCheck()
-	local name, rank
-	if GetNumGuildMembers() == 0 and IsInGuild() then E:Delay(2, GMCheck); return end
-	if not IsInGuild() then GuildMaster = ""; GMName = ''; GMRealm = ''; return end
-	for i = 1, GetNumGuildMembers() do
-		name, _, rank = GetGuildRosterInfo(i)
-		if rank == 0 then
-			break
-		end
-	end
-
-	GuildMaster = name
-	if GuildMaster then
-		GMName, GMRealm = string.split('-', GuildMaster)
-	end
-	GMRealm = GMRealm or PLAYER_REALM
-	GMRealm = GMRealm:gsub(' ', '')
-end
-
-local function Roster(event, update)
- if update then GMCheck() end
-end
-
-function CH:GMIconUpdate()
-	if E.private.chat.enable ~= true then return end
-	if E.db.sle.chat.guildmaster then
-		self:RegisterEvent('GUILD_ROSTER_UPDATE', Roster)
-		GMCheck()
-	else
-		self:UnregisterEvent('GUILD_ROSTER_UPDATE')
-		GuildMaster = ""
-		GMName = ''
-		GMRealm = ''
-	end
-end
-
-function CH:filterLine(event, source, msg, ...)
-	local isSpam = false
-	for _, line in ipairs(CH.spamNextLines) do
-		if msg:match(line) then
-			local curTime = GetTime()
-			for id, meter in ipairs(CH.Meters) do
-				local elapsed = curTime - meter.time
-				if meter.src == source and meter.evt == event and elapsed < 1 then
-					-- found the meter, now check wheter this line is already in there
-					local toInsert = true
-					for a,b in ipairs(meter.data) do
-						if (b == msg) then
-							toInsert = false
-						end
-					end
-
-					if toInsert then
-						tinsert(meter.data,msg)
-					end
-					return true, false, nil
-				end
-			end
-		end
-	end
-
-	for i, line in ipairs(CH.spamFirstLines) do
-		local newID = 0
-		if msg:match(line) then
-			local curTime = GetTime();
-			if find(msg, "|cff(.+)|r") then
-				msg = gsub(msg, "|cff%w%w%w%w%w%w", "")
-				msg = gsub(msg, "|r", "")
-			end
-			for id,meter in ipairs(CH.Meters) do
-				local elapsed = curTime - meter.time
-				if meter.src == source and meter.evt == event and elapsed < 1 then
-					newID = id
-					return true, true, string.format("|HSLD:%1$d|h|cFFFFFF00[%2$s]|r|h",newID or 0,msg or "nil")
-				end
-			end
-
-			local newMeter = {src = source, evt = event, time = curTime, data = {}, title = msg, addon = addonName}
-			tinsert(CH.Meters, newMeter)
-
-			for id,meter in ipairs(CH.Meters) do
-				if meter.src == source and meter.evt == event and meter.time == curTime then
-					newID = id
-				end
-			end
-
-			return true, true, string.format("|HSLD:%1$d|h|cFFFFFF00[%2$s]|r|h",newID or 0,msg or "nil")
-		end
-	end
-	return false, false, nil
-end
-
-function CH:ParseChatEvent(event, msg, sender, ...)
-	local hide = false
-	for _,allevents in ipairs(CH.ChannelEvents) do
-		if event == allevents then
-			local isRecount, isFirstLine, newMessage = CH:filterLine(event, sender, msg)
-			if isRecount then
-				if isFirstLine then
-					msg = newMessage
-				else
-					hide = true
-				end
-			end
-		end
-	end
-
-
-	if not hide then
-		return false, msg, sender, ...
-	end
-	return true
-end
-
-function CH:ParseLink(link, text, button, chatframe)
-	if E.db.sle.chat.dpsSpam then
-		local linktype, id = strsplit(":", link)
-		if linktype == "SLD" then
-			local meterID = tonumber(id)
-			-- put stuff in the ItemRefTooltip from FrameXML
-			ShowUIPanel(ItemRefTooltip);
-			if ( not ItemRefTooltip:IsShown() ) then
-				ItemRefTooltip:SetOwner(UIParent, "ANCHOR_PRESERVE");
-			end
-			ItemRefTooltip:ClearLines()
-			ItemRefTooltip:AddLine(CH.Meters[meterID].title)
-			ItemRefTooltip:AddLine(format(L["Reported by %s"],CH.Meters[meterID].src))
-			for _,message in ipairs(CH.Meters[meterID].data) do
-				ItemRefTooltip:AddLine(message,1,1,1)
-			end
-			ItemRefTooltip:Show()
-		end
-	end
-end
-
-function CH:SpamFilter()
-	if E.db.sle.chat.dpsSpam then
-		for _,event in ipairs(CH.ChannelEvents) do
-			ChatFrame_AddMessageEventFilter(event, self.ParseChatEvent)
-		end
-
-		CH.MeterSpam = true
-	else
-		if CH.MeterSpam then
-			for _,event in ipairs(CH.ChannelEvents) do
-				ChatFrame_RemoveMessageEventFilter(event, self.ParseChatEvent)
-			end
-			CH.MeterSpam = false
-		end
-	end
-end
-
-function CH:Combat(event)
-	if E.db.sle.chat.combathide == "NONE" or not E.db.sle.chat.combathide then return end
-	if event == "PLAYER_REGEN_DISABLED" then
-		if E.db.sle.chat.combathide == "BOTH" or E.db.sle.chat.combathide == "RIGHT" then
-			RightChatPanel:Hide()
-			RightChatToggleButton:Hide()
-		end
-		if E.db.sle.chat.combathide == "BOTH" or E.db.sle.chat.combathide == "LEFT" then
-			LeftChatPanel:Hide()
-			LeftChatToggleButton:Hide()
-		end
-	elseif event == "PLAYER_REGEN_ENABLED" then
-		if not RightChatPanel:IsShown() then
-			RightChatPanel:Show()
-			RightChatToggleButton:Show()
-		end
-		if not LeftChatPanel:IsShown() then
-			LeftChatPanel:Show()
-			LeftChatToggleButton:Show()
-		end
-	end
-end
-
---Previously layout.lua
-local LO = E:GetModule('Layout');
-local PANEL_HEIGHT = 22;
-local SIDE_BUTTON_WIDTH = 16;
-local function ChatPanels()
-	if not E.db.sle.datatext.chathandle then return end
-
-	if not E:HasMoverBeenMoved("LeftChatMover") and E.db.datatexts.leftChatPanel then
-		if not E.db.movers then E.db.movers = {}; end
-		if E.PixelMode then
-			SLE:SetMoverPosition("LeftChatMover", "BOTTOMLEFT", UIParent, "BOTTOMLEFT", 0, 19)
-		else
-			SLE:SetMoverPosition("LeftChatMover", "BOTTOMLEFT", UIParent, "BOTTOMLEFT", 0, 21)
-		end
-		E:SetMoversPositions()
-	end
-
-	if not E:HasMoverBeenMoved("RightChatMover") and E.db.datatexts.rightChatPanel then
-		if not E.db.movers then E.db.movers = {}; end
-		if E.PixelMode then
-			SLE:SetMoverPosition("RightChatMover", "BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", 0, 19)
-		else
-			SLE:SetMoverPosition("RightChatMover", "BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", 0, 21)
-		end
-		E:SetMoversPositions()
-	end
-
-	if E.db.chat.panelBackdrop == 'SHOWBOTH' then
-		LeftChatPanel.backdrop:Show()
-		RightChatPanel.backdrop:Show()
-
-		LeftChatDataPanel:Point('BOTTOMLEFT', LeftChatPanel, 'BOTTOMLEFT', SIDE_BUTTON_WIDTH, (E.PixelMode and -19 or -21)) --lower line of datapanel
-		LeftChatDataPanel:Point('TOPRIGHT', LeftChatPanel, 'BOTTOMLEFT', 16 + E.db.sle.datatext.chatleft.width, (E.PixelMode and 1 or -1)) --upper line of datapanel
-		RightChatDataPanel:Point('BOTTOMLEFT', RightChatPanel, 'BOTTOMRIGHT', - (E.db.sle.datatext.chatright.width + 16), (E.PixelMode and -19 or -21)) --lower-left corner of right datapanel
-		RightChatDataPanel:Point('TOPRIGHT', RightChatPanel, 'BOTTOMRIGHT', -SIDE_BUTTON_WIDTH, (E.PixelMode and 1 or -1))	--upper-right corner of right datapanel
-		LeftChatToggleButton:Point('BOTTOMLEFT', LeftChatPanel, 'BOTTOMLEFT', 0, (E.PixelMode and -19 or -21))
-		RightChatToggleButton:Point('BOTTOMRIGHT', RightChatPanel, 'BOTTOMRIGHT', 0, (E.PixelMode and -19 or -21))
-		LO:ToggleChatTabPanels()
-	elseif E.db.chat.panelBackdrop == 'HIDEBOTH' then
-		LeftChatPanel.backdrop:Hide()
-		RightChatPanel.backdrop:Hide()
-
-		LeftChatDataPanel:Point('BOTTOMLEFT', LeftChatPanel, 'BOTTOMLEFT', SIDE_BUTTON_WIDTH, (E.PixelMode and -19 or -21)) --lower line of datapanel
-		LeftChatDataPanel:Point('TOPRIGHT', LeftChatPanel, 'BOTTOMLEFT', 16 + E.db.sle.datatext.chatleft.width, (E.PixelMode and 1 or -1)) --upper line of datapanel
-		RightChatDataPanel:Point('BOTTOMLEFT', RightChatPanel, 'BOTTOMRIGHT', - (E.db.sle.datatext.chatright.width + 16), (E.PixelMode and -19 or -21)) --lower-left corner of right datapanel
-		RightChatDataPanel:Point('TOPRIGHT', RightChatPanel, 'BOTTOMRIGHT', -SIDE_BUTTON_WIDTH, (E.PixelMode and 1 or -1))	--upper-right corner of right datapanel
-		LeftChatToggleButton:Point('BOTTOMLEFT', LeftChatPanel, 'BOTTOMLEFT', 0, (E.PixelMode and -19 or -21))
-		RightChatToggleButton:Point('BOTTOMRIGHT', RightChatPanel, 'BOTTOMRIGHT', 0, (E.PixelMode and -19 or -21))
-		LO:ToggleChatTabPanels(true, true)
-	elseif E.db.chat.panelBackdrop == 'LEFT' then
-		LeftChatPanel.backdrop:Show()
-		RightChatPanel.backdrop:Hide()
-
-		LeftChatDataPanel:Point('BOTTOMLEFT', LeftChatPanel, 'BOTTOMLEFT', SIDE_BUTTON_WIDTH, (E.PixelMode and -19 or -21)) --lower line of datapanel
-		LeftChatDataPanel:Point('TOPRIGHT', LeftChatPanel, 'BOTTOMLEFT', 16 + E.db.sle.datatext.chatleft.width, (E.PixelMode and 1 or -1)) --upper line of datapanel
-		RightChatDataPanel:Point('BOTTOMLEFT', RightChatPanel, 'BOTTOMRIGHT', - (E.db.sle.datatext.chatright.width + 16), (E.PixelMode and -19 or -21)) --lower-left corner of right datapanel
-		RightChatDataPanel:Point('TOPRIGHT', RightChatPanel, 'BOTTOMRIGHT', -SIDE_BUTTON_WIDTH, (E.PixelMode and 1 or -1))	--upper-right corner of right datapanel
-		LeftChatToggleButton:Point('BOTTOMLEFT', LeftChatPanel, 'BOTTOMLEFT', 0, (E.PixelMode and -19 or -21))
-		RightChatToggleButton:Point('BOTTOMRIGHT', RightChatPanel, 'BOTTOMRIGHT', 0, (E.PixelMode and -19 or -21))
-		LO:ToggleChatTabPanels(true)
-	else
-		LeftChatPanel.backdrop:Hide()
-		RightChatPanel.backdrop:Show()
-
-		LeftChatDataPanel:Point('BOTTOMLEFT', LeftChatPanel, 'BOTTOMLEFT', SIDE_BUTTON_WIDTH, (E.PixelMode and -19 or -21)) --lower line of datapanel
-		LeftChatDataPanel:Point('TOPRIGHT', LeftChatPanel, 'BOTTOMLEFT', 16 + E.db.sle.datatext.chatleft.width, (E.PixelMode and 1 or -1)) --upper line of datapanel
-		RightChatDataPanel:Point('BOTTOMLEFT', RightChatPanel, 'BOTTOMRIGHT', - (E.db.sle.datatext.chatright.width + 16), (E.PixelMode and -19 or -21)) --lower-left corner of right datapanel
-		RightChatDataPanel:Point('TOPRIGHT', RightChatPanel, 'BOTTOMRIGHT', -SIDE_BUTTON_WIDTH, (E.PixelMode and 1 or -1))	--upper-right corner of right datapanel
-		LeftChatToggleButton:Point('BOTTOMLEFT', LeftChatPanel, 'BOTTOMLEFT', 0, (E.PixelMode and -19 or -21))
-		RightChatToggleButton:Point('BOTTOMRIGHT', RightChatPanel, 'BOTTOMRIGHT', 0, (E.PixelMode and -19 or -21))
-		LO:ToggleChatTabPanels(nil, true)
-	end
-end
-
-local function CreateChatPanels()
-	--Left Chat Tab
-	LeftChatTab:Point('TOPLEFT', LeftChatPanel, 'TOPLEFT', 2, -2)
-	LeftChatTab:Point('BOTTOMRIGHT', LeftChatPanel, 'TOPRIGHT', -2, -PANEL_HEIGHT)
-	--Preventing left chat datapanel fading
-	ChatFrame1EditBox:Hide()
-	--Right Chat Tab
-	RightChatTab:Point('TOPRIGHT', RightChatPanel, 'TOPRIGHT', -2, -2)
-	RightChatTab:Point('BOTTOMLEFT', RightChatPanel, 'TOPLEFT', 2, -PANEL_HEIGHT)
-end
-
-local function ChatTextures()
-	if not E.db['general'] or not E.private['general'] then return end --Prevent rare nil value errors
-	if not E.db.sle.chat or not E.db.sle.chat.textureAlpha or not E.db.sle.chat.textureAlpha.enable then return end --our option enable check
-
-	if LeftChatPanel and LeftChatPanel.tex and RightChatPanel and RightChatPanel.tex then
-		local a = E.db.sle.chat.textureAlpha.alpha or 0.5
-		LeftChatPanel.tex:SetAlpha(a)
-		RightChatPanel.tex:SetAlpha(a)
-	end
-end
-
-hooksecurefunc(LO, "ToggleChatPanels", ChatPanels)
-hooksecurefunc(LO, "CreateChatPanels", CreateChatPanels)
-hooksecurefunc(CH, "PositionChat", PositionChat)
-hooksecurefunc(CH, "StyleChat", Style)
-hooksecurefunc(E, "UpdateMedia", ChatTextures)
-hooksecurefunc(CH, "Initialize", function(self)
-	if not E.private.chat.enable then return end
-
-	self:RegisterEvent("GROUP_JOINED", function() E:Delay(5, function() CH:CheckLFGRoles() end) end)
-
-	if E.db.sle.chat.guildmaster then
-		self:RegisterEvent('GUILD_ROSTER_UPDATE', Roster)
-		GMCheck()
-	end
-
-	CH:SpamFilter()
-
-	self:SecureHook("SetItemRef","ParseLink")
-
-	-- Borrowed from Deadly Boss Mods
-	do
-		local old = ItemRefTooltip.SetHyperlink -- we have to hook this function since the default ChatFrame code assumes that all links except for player and channel links are valid arguments for this function
-		function ItemRefTooltip:SetHyperlink(link, ...)
-			if link:sub(0, 4) == "SLD:" then
-				return
-			end
-			return old(self, link, ...)
-		end
-	end
-
-	self:RegisterEvent("PLAYER_REGEN_ENABLED", "Combat")
-	self:RegisterEvent("PLAYER_REGEN_DISABLED", "Combat")
-end)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/chat/chat.lua b/ElvUI_SLE/modules/chat/chat.lua
new file mode 100644
index 0000000..4a42318
--- /dev/null
+++ b/ElvUI_SLE/modules/chat/chat.lua
@@ -0,0 +1,290 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local CH, LO = SLE:GetElvModules("Chat", "Layout")
+local C = SLE:NewModule("Chat",  'AceHook-3.0', 'AceEvent-3.0', 'AceTimer-3.0')
+local LSM = LibStub("LibSharedMedia-3.0")
+--GLOBALS:  UIParent, LeftChatPanel, LeftChatDataPanel, LeftChatToggleButton, LeftChatTab, RightChatPanel,
+--GLOBALS:  RightChatDataPanel, RightChatToggleButton, RightChatTab, hooksecurefunc
+
+local _G = _G
+local _
+local sub = string.sub
+local leader = [[|TInterface\GroupFrame\UI-Group-LeaderIcon:12:12|t]]
+local NUM_CHAT_WINDOWS = NUM_CHAT_WINDOWS
+local IsMouseButtonDown = IsMouseButtonDown
+local GetChatWindowSavedPosition = GetChatWindowSavedPosition
+local specialChatIcons
+C.GuildMaster = ""
+C.GMName = ""
+C.GMRealm = ""
+C.PlayerRealm = T.gsub(E.myrealm,'[%s%-]','')
+C.PlayerName = E.myname.."-"..C.PlayerRealm
+C.CreatedFrames = 0;
+
+local function Style(self, frame)
+	C.CreatedFrames = frame:GetID()
+
+	local name = frame:GetName()
+	local tab = _G[name..'Tab']
+	tab.isTemporary = frame.isTemporary
+	tab:HookScript("OnClick", function()
+		C:SetSelectedTab()
+	end)
+end
+
+local function PositionChat(self, override)
+	if C.CreatedFrames == 0 then return end
+	if ((T.InCombatLockdown() and not override and self.initialMove) or (IsMouseButtonDown("LeftButton") and not override)) then return end
+	if not RightChatPanel or not LeftChatPanel then return; end
+	if not self.db.lockPositions or E.private.chat.enable ~= true then return end
+	if not E.db.sle.datatexts.chathandle then return end
+	local chat, id, tab, isDocked, point
+	for i=1, C.CreatedFrames do
+		local BASE_OFFSET = 57 + E.Spacing*3
+		chat = _G[T.format("ChatFrame%d", i)]
+		id = chat:GetID()
+		tab = _G[T.format("ChatFrame%sTab", i)]
+		point = GetChatWindowSavedPosition(id)
+		isDocked = chat.isDocked
+		if chat:IsShown() and not (id > NUM_CHAT_WINDOWS) and id == CH.RightChatWindowID then
+			BASE_OFFSET = BASE_OFFSET - (24 + E.Spacing*2)
+			chat:ClearAllPoints()
+			chat:SetPoint("BOTTOMLEFT", RightChatPanel, "BOTTOMLEFT", 4, 7)
+			if id ~= 2 then
+				chat:Size(
+					(E.db.chat.separateSizes and E.db.chat.panelWidthRight or E.db.chat.panelWidth) - 10,
+					((E.db.chat.separateSizes and E.db.chat.panelHeightRight or E.db.chat.panelHeight) - BASE_OFFSET)
+				)
+			end
+		elseif not isDocked and chat:IsShown() then
+		--Do Nothing
+		else --Left Chat
+			if id ~= 2 and not (id > NUM_CHAT_WINDOWS) then
+				BASE_OFFSET = BASE_OFFSET - (24 + E.Spacing*4)
+				chat:SetPoint("BOTTOMLEFT", LeftChatPanel, "BOTTOMLEFT", 4, 7)
+				chat:Size(E.db.chat.panelWidth - 10, E.db.chat.panelHeight - BASE_OFFSET)
+			end
+		end
+	end
+end
+
+local function GetChatIcon(sender)
+	if not C.db then C.db = E.db.sle.chat end
+	if not specialChatIcons then
+		SLE:GetRegion()
+		specialChatIcons = SLE.SpecialChatIcons[SLE.region]
+	end
+	local senderName, senderRealm
+	if sender then
+		senderName, senderRealm = T.split('-', sender)
+	else
+		senderName = E.myname
+	end
+	senderRealm = senderRealm or C.PlayerRealm
+	senderRealm = T.gsub(senderRealm, ' ', '')
+
+	if specialChatIcons[senderRealm] and specialChatIcons[senderRealm][senderName] then
+		return specialChatIcons[senderRealm][senderName]
+	end
+
+	if not T.IsInGuild() then return "" end
+	if not C.db.guildmaster then return "" end
+	if senderName == C.GMName and senderRealm == C.GMRealm then
+		return leader
+	end
+	return nil
+end
+
+function C:GMCheck()
+	local name, rank
+	if T.GetNumGuildMembers() == 0 and T.IsInGuild() then E:Delay(2, C.GMCheck); return end
+	if not T.IsInGuild() then C.GuildMaster = ""; C.GMName = ''; C.GMRealm = ''; return end
+	for i = 1, T.GetNumGuildMembers() do
+		name, _, rank = T.GetGuildRosterInfo(i)
+		if rank == 0 then break end
+	end
+	C.GuildMaster = name
+	if C.GuildMaster then C.GMName, C.GMRealm = T.split('-', C.GuildMaster) end
+	C.GMRealm = C.GMRealm or C.PlayerRealm
+	C.GMRealm = T.gsub(C.GMRealm, ' ', '')
+end
+
+local function Roster(event, update)
+ if update then C:GMCheck() end
+end
+
+function C:GMIconUpdate()
+	if E.private.chat.enable ~= true then return end
+	if C.db.guildmaster then
+		self:RegisterEvent('GUILD_ROSTER_UPDATE', Roster)
+		C:GMCheck()
+	else
+		self:UnregisterEvent('GUILD_ROSTER_UPDATE')
+		C.GuildMaster, C.GMName, C.GMRealm = "", "", ""
+	end
+end
+
+function C:Combat(event)
+	if C.db.combathide == "NONE" or not C.db.combathide then return end
+	if event == "PLAYER_REGEN_DISABLED" then
+		if C.db.combathide == "BOTH" or C.db.combathide == "RIGHT" then
+			RightChatPanel:Hide()
+			RightChatToggleButton:Hide()
+		end
+		if C.db.combathide == "BOTH" or C.db.combathide == "LEFT" then
+			LeftChatPanel:Hide()
+			LeftChatToggleButton:Hide()
+		end
+	elseif event == "PLAYER_REGEN_ENABLED" then
+		if not RightChatPanel:IsShown() then
+			RightChatPanel:Show()
+			RightChatToggleButton:Show()
+		end
+		if not LeftChatPanel:IsShown() then
+			LeftChatPanel:Show()
+			LeftChatToggleButton:Show()
+		end
+	end
+end
+
+--Previously layout.lua
+local PANEL_HEIGHT = 22;
+local function ChatPanels()
+	local HEIGHT = E.db.sle.datatexts.chathandle and (PANEL_HEIGHT - 2) or PANEL_HEIGHT
+	LeftChatToggleButton:Size(16, HEIGHT)
+	RightChatToggleButton:Size(16, HEIGHT)
+	if not E.db.sle.datatexts.chathandle then return end
+
+	if not E:HasMoverBeenMoved("LeftChatMover") and E.db.datatexts.leftChatPanel then
+		if not E.db.movers then E.db.movers = {}; end
+		SLE:SetMoverPosition("LeftChatMover", "BOTTOMLEFT", UIParent, "BOTTOMLEFT", 0, 19 + E.Spacing*2)
+		E:SetMoversPositions()
+	end
+
+	if not E:HasMoverBeenMoved("RightChatMover") and E.db.datatexts.rightChatPanel then
+		if not E.db.movers then E.db.movers = {}; end
+		SLE:SetMoverPosition("RightChatMover", "BOTTOMRIGHT", UIParent, "BOTTOMRIGHT", 0, 19 + E.Spacing*2)
+		E:SetMoversPositions()
+	end
+	LeftChatToggleButton:Point('BOTTOMLEFT', LeftChatPanel, 'BOTTOMLEFT', 0, -(19 + E.Spacing*2))
+	RightChatToggleButton:Point('BOTTOMRIGHT', RightChatPanel, 'BOTTOMRIGHT', 0, -(19 + E.Spacing*2))
+
+	LeftChatDataPanel:ClearAllPoints()
+	LeftChatDataPanel:Point("TOPLEFT", LeftChatToggleButton, "TOPRIGHT", -1 + E.Spacing*2, 0)
+	LeftChatDataPanel:Point("BOTTOMLEFT", LeftChatToggleButton, "BOTTOMRIGHT", -1 + E.Spacing*2, 0)
+	LeftChatDataPanel:Height(20)
+
+	RightChatDataPanel:ClearAllPoints()
+	RightChatDataPanel:Point("TOPRIGHT", RightChatToggleButton, "TOPLEFT", 1 - E.Spacing*2, 0)
+	RightChatDataPanel:Point("BOTTOMRIGHT", RightChatToggleButton, "BOTTOMLEFT", 1 - E.Spacing*2, 0)
+	RightChatDataPanel:Height(20)
+end
+
+local function CreateChatPanels()
+	local SPACING = E.Border*3 - E.Spacing
+	--Left Chat
+	LeftChatTab:Point('TOPLEFT', LeftChatPanel, 'TOPLEFT', 2, -2)
+	LeftChatTab:Point('BOTTOMRIGHT', LeftChatPanel, 'TOPRIGHT', -2, -PANEL_HEIGHT)
+
+	LeftChatToggleButton:ClearAllPoints()
+	LeftChatToggleButton:Point('BOTTOMLEFT', LeftChatPanel, 'BOTTOMLEFT', SPACING, SPACING)
+	LeftChatToggleButton:Size(16, PANEL_HEIGHT)
+
+	LeftChatDataPanel:ClearAllPoints()
+	LeftChatDataPanel:Point("TOPLEFT", LeftChatToggleButton, "TOPRIGHT", -1 + E.Spacing*2, 0)
+	LeftChatDataPanel:Point("BOTTOMLEFT", LeftChatToggleButton, "BOTTOMRIGHT", -1 + E.Spacing*2, 0)
+	LeftChatDataPanel:Size(E.db.sle.datatexts.leftchat.width, PANEL_HEIGHT)
+	--Right Chat
+	RightChatTab:Point('TOPRIGHT', RightChatPanel, 'TOPRIGHT', -2, -2)
+	RightChatTab:Point('BOTTOMLEFT', RightChatPanel, 'TOPLEFT', 2, -PANEL_HEIGHT)
+
+	RightChatToggleButton:ClearAllPoints()
+	RightChatToggleButton:Point('BOTTOMRIGHT', RightChatPanel, 'BOTTOMRIGHT', -SPACING, SPACING)
+	RightChatToggleButton:Size(16, PANEL_HEIGHT)
+
+	RightChatDataPanel:ClearAllPoints()
+	RightChatDataPanel:Point("TOPRIGHT", RightChatToggleButton, "TOPLEFT", 1 - E.Spacing*2, 0)
+	RightChatDataPanel:Point("BOTTOMRIGHT", RightChatToggleButton, "BOTTOMLEFT", 1 - E.Spacing*2, 0)
+	RightChatDataPanel:Size(E.db.sle.datatexts.rightchat.width, PANEL_HEIGHT)
+end
+
+local function ChatTextures()
+	if not E.db["general"] or not E.private["general"] then return end --Prevent rare nil value errors
+	if not C.db or not C.db.textureAlpha or not C.db.textureAlpha.enable then return end --our option enable check
+
+	if LeftChatPanel and LeftChatPanel.tex and RightChatPanel and RightChatPanel.tex then
+		local a = C.db.textureAlpha.alpha or 0.5
+		LeftChatPanel.tex:SetAlpha(a)
+		RightChatPanel.tex:SetAlpha(a)
+	end
+end
+
+function C:JustifyChat(i)
+	local frame = _G["ChatFrame"..i]
+	frame:SetJustifyH(C.db.justify["frame"..i] or "LEFT")
+end
+
+function C:IdentifyChatFrames()
+	for i = 1, 18 do
+		local frame = _G["ChatFrame"..i]
+		if frame then
+			frame:AddMessage(T.format(L["This is %sFrame %s|r"], E["media"].hexvaluecolor, i), 1.0, 1.0, 0)
+		end
+	end
+end
+
+function C:UpdateChatMax()
+	if SLE._Compatibility["ElvUI_CustomTweaks"] then return end
+	for _, frameName in T.pairs(_G["CHAT_FRAMES"]) do
+		local frame = _G[frameName]
+		frame:SetMaxLines(E.private.sle.chat.chatMax)
+	end
+	CH:DisplayChatHistory()
+end
+hooksecurefunc(CH, "Initialize", C.UpdateChatMax)
+
+function C:Initialize()
+	if not SLE.initialized then return end
+	if not E.private.chat.enable then return end
+	C.db = E.db.sle.chat
+
+	function C:ForUpdateAll()
+		C.db = E.db.sle.chat
+		C:GMIconUpdate()
+		for i = 1, NUM_CHAT_WINDOWS do
+			C:JustifyChat(i)
+		end
+	end
+
+	hooksecurefunc(LO, "ToggleChatPanels", ChatPanels)
+	hooksecurefunc(CH, "PositionChat", PositionChat)
+	hooksecurefunc(CH, "StyleChat", Style)
+	hooksecurefunc(E, "UpdateMedia", ChatTextures)
+
+	if C.db.guildmaster then
+		self:RegisterEvent('GUILD_ROSTER_UPDATE', Roster)
+		C:GMCheck()
+	end
+
+	--Teh Damage meter spam handle
+	C:InitDamageSpam()
+
+	--Combat Hide
+	self:RegisterEvent("PLAYER_REGEN_ENABLED", "Combat")
+	self:RegisterEvent("PLAYER_REGEN_DISABLED", "Combat")
+
+	--Launching stuff so hooks can work
+	LO:ToggleChatPanels()
+	CH:SetupChat()
+	--Justify
+	for i = 1, NUM_CHAT_WINDOWS do
+		C:JustifyChat(i)
+	end
+
+	C:InitHistory()
+
+	C:InitTabs()
+end
+hooksecurefunc(LO, "CreateChatPanels", CreateChatPanels)
+CH:AddPluginIcons(GetChatIcon)
+
+SLE:RegisterModule(C:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/chat/dpsSpam.lua b/ElvUI_SLE/modules/chat/dpsSpam.lua
new file mode 100644
index 0000000..104943a
--- /dev/null
+++ b/ElvUI_SLE/modules/chat/dpsSpam.lua
@@ -0,0 +1,169 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local C = SLE:GetModule("Chat")
+local ItemRefTooltip = ItemRefTooltip
+local ShowUIPanel = ShowUIPanel
+--GLOBALS: UIParent, ChatFrame_AddMessageEventFilter, ChatFrame_RemoveMessageEventFilter
+
+C.Meterspam = false
+C.ChannelEvents = {
+	"CHAT_MSG_CHANNEL",
+	"CHAT_MSG_GUILD",
+	"CHAT_MSG_OFFICER",
+	"CHAT_MSG_PARTY",
+	"CHAT_MSG_PARTY_LEADER",
+	"CHAT_MSG_INSTANCE_CHAT",
+	"CHAT_MSG_INSTANCE_CHAT_LEADER",
+	"CHAT_MSG_RAID",
+	"CHAT_MSG_RAID_LEADER",
+	"CHAT_MSG_SAY",
+	"CHAT_MSG_WHISPER",
+	"CHAT_MSG_WHISPER_INFORM",
+	"CHAT_MSG_YELL",
+}
+
+C.spamFirstLines = {
+	"^Recount - (.*)$", --Recount
+	"^Skada: (.*) for (.*):$", -- Skada enUS
+	"^Skada: (.*) por (.*):$", -- Skada esES/ptBR
+	"^Skada: (.*) fur (.*):$", -- Skada deDE
+	"^Skada: (.*) pour (.*):$", -- Skada frFR
+	"^Skada: (.*) per (.*):$", -- Skada itIT
+	"^(.*) ? Skada ?? (.*):$", -- Skada koKR
+	"^Отчёт Skada: (.*), с (.*):$", -- Skada ruRU
+	"^Skada??(.*)?(.*):$", -- Skada zhCN
+	"^Skada:(.*)??(.*):$", -- Skada zhTW
+	"^(.*) Done for (.*)$", -- TinyDPS
+	"^Numeration: (.*)$", -- Numeration
+	"^Details! Report for (.*)$" -- Details!
+}
+C.spamNextLines = {
+	"^(%d+)\. (.*)$", --Recount, Details! and Skada
+	"^(.*)   (.*)$", --Additional Skada
+	"^Numeration: (.*)$", -- Numeration
+	"^[+-]%d+.%d", -- Numeration Deathlog Details
+	"^(%d+). (.*):(.*)(%d+)(.*)(%d+)%%(.*)%((%d+)%)$", -- TinyDPS
+	"^(.+) (%d-%.%d-%w)$", -- Skada 2
+	'|c%x-|H.-|h(%[.-%])|h|r (%d-%.%d-%w %(%d-%.%d-%%%))', --Skada 3
+}
+C.Meters = {}
+
+function C:filterLine(event, source, msg, ...)
+	local isSpam = false
+	for _, line in T.ipairs(C.spamNextLines) do
+		if msg:match(line) then
+			local curTime = T.GetTime()
+			for id, meter in T.ipairs(C.Meters) do
+				local elapsed = curTime - meter.time
+				if meter.src == source and meter.evt == event and elapsed < 1 then
+					-- found the meter, now check wheter this line is already in there
+					local toInsert = true
+					for a,b in T.ipairs(meter.data) do
+						if (b == msg) then
+							toInsert = false
+						end
+					end
+					if toInsert then T.tinsert(meter.data,msg) end
+					return true, false, nil
+				end
+			end
+		end
+	end
+
+	for i, line in T.ipairs(C.spamFirstLines) do
+		local newID = 0
+		if msg:match(line) then
+			local curTime = T.GetTime();
+			if T.find(msg, "|cff(.+)|r") then
+				msg = T.gsub(msg, "|cff%w%w%w%w%w%w", "")
+				msg = T.gsub(msg, "|r", "")
+			end
+			for id,meter in T.ipairs(C.Meters) do
+				local elapsed = curTime - meter.time
+				if meter.src == source and meter.evt == event and elapsed < 1 then
+					newID = id
+					return true, true, T.format("|HSLD:%1$d|h|cFFFFFF00[%2$s]|r|h",newID or 0,msg or "nil")
+				end
+			end
+
+			local newMeter = {src = source, evt = event, time = curTime, data = {}, title = msg}
+			T.tinsert(C.Meters, newMeter)
+			for id,meter in T.ipairs(C.Meters) do
+				if meter.src == source and meter.evt == event and meter.time == curTime then
+					newID = id
+				end
+			end
+
+			return true, true, T.format("|HSLD:%1$d|h|cFFFFFF00[%2$s]|r|h",newID or 0,msg or "nil")
+		end
+	end
+	return false, false, nil
+end
+
+function C:ParseChatEvent(event, msg, sender, ...)
+	local hide = false
+	for _,allevents in T.ipairs(C.ChannelEvents) do
+		if event == allevents then
+			local isRecount, isFirstLine, newMessage = C:filterLine(event, sender, msg)
+			if isRecount then
+				if isFirstLine then
+					msg = newMessage
+				else
+					hide = true
+				end
+			end
+		end
+	end
+
+	if not hide then
+		return false, msg, sender, ...
+	end
+	return true
+end
+
+function C:ParseLink(link, text, button, chatframe)
+	if C.db.dpsSpam then
+		local linktype, id = T.split(":", link)
+		if linktype == "SLD" then
+			local meterID = T.tonumber(id)
+			-- put stuff in the ItemRefTooltip from FrameXML
+			ShowUIPanel(ItemRefTooltip);
+			if ( not ItemRefTooltip:IsShown() ) then
+				ItemRefTooltip:SetOwner(UIParent, "ANCHOR_PRESERVE");
+			end
+			ItemRefTooltip:ClearLines()
+			ItemRefTooltip:AddLine(C.Meters[meterID].title)
+			ItemRefTooltip:AddLine(T.format(L["Reported by %s"],C.Meters[meterID].src))
+			for _,message in T.ipairs(C.Meters[meterID].data) do ItemRefTooltip:AddLine(message,1,1,1) end
+			ItemRefTooltip:Show()
+		end
+	end
+end
+
+function C:SpamFilter()
+	if C.db.dpsSpam then
+		for _,event in T.ipairs(C.ChannelEvents) do
+			ChatFrame_AddMessageEventFilter(event, self.ParseChatEvent)
+		end
+		C.Meterspam = true
+	else
+		if C.Meterspam then
+			for _,event in T.ipairs(C.ChannelEvents) do
+				ChatFrame_RemoveMessageEventFilter(event, self.ParseChatEvent)
+			end
+			C.Meterspam = false
+		end
+	end
+end
+
+function C:InitDamageSpam()
+	C:SpamFilter()
+	self:SecureHook("SetItemRef","ParseLink")
+	-- Borrowed from Deadly Boss Mods
+	do
+		local old = ItemRefTooltip.SetHyperlink -- we have to hook this function since the default ChatFrame code assumes that all links except for player and channel links are valid arguments for this function
+		function ItemRefTooltip:SetHyperlink(link, ...)
+			if link:sub(0, 4) == "SLD:" then return end
+			return old(self, link, ...)
+		end
+	end
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/chat/history.lua b/ElvUI_SLE/modules/chat/history.lua
new file mode 100644
index 0000000..73e2443
--- /dev/null
+++ b/ElvUI_SLE/modules/chat/history.lua
@@ -0,0 +1,180 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local C = SLE:GetModule("Chat")
+local CH = E:GetModule("Chat")
+local _G = _G
+local random = random
+
+local historyEvents = {
+	"CHAT_MSG_INSTANCE_CHAT",
+	"CHAT_MSG_INSTANCE_CHAT_LEADER",
+	"CHAT_MSG_BN_WHISPER",
+	"CHAT_MSG_BN_WHISPER_INFORM",
+	"CHAT_MSG_CHANNEL",
+	"CHAT_MSG_EMOTE",
+	"CHAT_MSG_GUILD",
+	"CHAT_MSG_GUILD_ACHIEVEMENT",
+	"CHAT_MSG_OFFICER",
+	"CHAT_MSG_PARTY",
+	"CHAT_MSG_PARTY_LEADER",
+	"CHAT_MSG_RAID",
+	"CHAT_MSG_RAID_LEADER",
+	"CHAT_MSG_RAID_WARNING",
+	"CHAT_MSG_SAY",
+	"CHAT_MSG_WHISPER",
+	"CHAT_MSG_WHISPER_INFORM",
+	"CHAT_MSG_YELL",
+}
+local function PrepareMessage(author, message)
+	return author:upper() .. message
+end
+local function GetTimeForSavedMessage()
+	local randomTime = T.select(2, ("."):split(T.GetTime() or "0."..random(1, 999), 2)) or 0
+	return T.time().."."..randomTime
+end
+local msgList, msgCount, msgTime = {}, {}, {}
+
+function C:ChatHistoryToggle(option)
+	for i = 1, #historyEvents do
+		CH:UnregisterEvent(historyEvents[i])
+		if E.private.sle.chat.chatHistory[historyEvents[i]] then
+			CH:RegisterEvent(historyEvents[i], "SaveChatHistory")
+		end
+	end
+	if option then C:ClearUnusedHistory() end
+end
+
+function C:ClearUnusedHistory()
+	for id, data in T.pairs(_G["ElvCharacterDB"].ChatLog) do
+		if T.type(data) == "table" and E.private.sle.chat.chatHistory[data[20]] == false then
+			_G["ElvCharacterDB"].ChatLog[id] = nil
+		end
+	end
+end
+
+--Replacing stuff needed for functioning of the module
+function C:HystoryOverwrite()
+	function CH:CHAT_MSG_YELL(event, message, author, ...)
+		local blockFlag = false
+		local msg = PrepareMessage(author, message)
+
+		if msg == nil then return CH.FindURL(self, event, message, author, ...) end
+
+		-- ignore player messages
+		if author == C.PlayerName then return CH.FindURL(self, event, message, author, ...) end
+		if msgList[msg] and msgCount[msg] > 1 and CH.db.throttleInterval ~= 0 then
+			if T.difftime(T.time(), msgTime[msg]) <= CH.db.throttleInterval then
+				blockFlag = true
+			end
+		end
+
+		if blockFlag then
+			return true;
+		else
+			if CH.db.throttleInterval ~= 0 then
+				msgTime[msg] = T.time()
+			end
+
+			return CH.FindURL(self, event, message, author, ...)
+		end
+	end
+
+	function CH:DisableChatThrottle()
+		T.twipe(msgList); T.twipe(msgCount); T.twipe(msgTime)
+	end
+
+	function CH:ChatThrottleHandler(event, ...)
+		local arg1, arg2 = ...
+
+		if arg2 ~= "" then
+			local message = PrepareMessage(arg2, arg1)
+			if msgList[message] == nil then
+				msgList[message] = true
+				msgCount[message] = 1
+				msgTime[message] = T.time()
+			else
+				msgCount[message] = msgCount[message] + 1
+			end
+		end
+	end
+
+	function CH:CHAT_MSG_CHANNEL(event, message, author, ...)
+		local blockFlag = false
+		local msg = PrepareMessage(author, message)
+
+		-- ignore player messages
+		if author == C.PlayerName then return CH.FindURL(self, event, message, author, ...) end
+		if msgList[msg] and CH.db.throttleInterval ~= 0 then
+			if T.difftime(T.time(), msgTime[msg]) <= CH.db.throttleInterval then
+				blockFlag = true
+			end
+		end
+
+		if blockFlag then
+			return true;
+		else
+			if CH.db.throttleInterval ~= 0 then
+				msgTime[msg] = T.time()
+			end
+
+			return CH.FindURL(self, event, message, author, ...)
+		end
+	end
+
+	function CH:SaveChatHistory(event, ...)
+		if self.db.throttleInterval ~= 0 and (event == 'CHAT_MSG_SAY' or event == 'CHAT_MSG_YELL' or event == 'CHAT_MSG_CHANNEL') then
+			self:ChatThrottleHandler(event, ...)
+
+			local message, author = ...
+			local msg = PrepareMessage(author, message)
+			if author ~= C.PlayerName and msgList[msg] then
+				if T.difftime(T.time(), msgTime[msg]) <= CH.db.throttleInterval then
+					return;
+				end
+			end
+		end
+
+		local temp = {}
+		for i = 1, T.select('#', ...) do
+			temp[i] = T.select(i, ...) or false
+		end
+
+		if #temp > 0 then
+			temp[20] = event
+			local timeForMessage = GetTimeForSavedMessage()
+			_G["ElvCharacterDB"].ChatLog[timeForMessage] = temp
+
+			local c, k = 0
+			for id, data in T.pairs(_G["ElvCharacterDB"].ChatLog) do
+				c = c + 1
+				if (not k) or k > id then
+					k = id
+				end
+			end
+
+			if c > E.private.sle.chat.chatHistory.size then
+				_G["ElvCharacterDB"].ChatLog[k] = nil
+			end
+		end
+	end
+end
+
+function C:InitHistory()
+	--Overwriting stuff cause fuck this shit
+	function CH:ChatEdit_AddHistory(editBox, line)
+		if T.find(line, "/rl") then return; end
+		if ( T.strlen(line) > 0 ) then
+			for i, text in T.pairs(_G["ElvCharacterDB"].ChatEditHistory) do
+				if text == line then
+					return
+				end
+			end
+			T.tinsert(_G["ElvCharacterDB"].ChatEditHistory, #(_G["ElvCharacterDB"].ChatEditHistory) + 1, line)
+			if #(_G["ElvCharacterDB"].ChatEditHistory) > C.db.editboxhistory then
+				T.tremove(_G["ElvCharacterDB"].ChatEditHistory, 1)
+			end
+		end
+	end
+
+	C:HystoryOverwrite()
+	C:ChatHistoryToggle()
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/chat/load_chat.xml b/ElvUI_SLE/modules/chat/load_chat.xml
new file mode 100644
index 0000000..f0c7650
--- /dev/null
+++ b/ElvUI_SLE/modules/chat/load_chat.xml
@@ -0,0 +1,6 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<Script file='chat.lua'/>
+	<Script file='dpsSpam.lua'/>
+	<Script file='tabs.lua'/>
+	<Script file='history.lua'/>
+</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/chat/tabs.lua b/ElvUI_SLE/modules/chat/tabs.lua
new file mode 100644
index 0000000..63d337d
--- /dev/null
+++ b/ElvUI_SLE/modules/chat/tabs.lua
@@ -0,0 +1,77 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local C = SLE:GetModule("Chat")
+local _G = _G
+--GLOBALS: hooksecurefunc
+
+local FCF_GetChatWindowInfo = FCF_GetChatWindowInfo
+local FCF_GetCurrentChatFrameID = FCF_GetCurrentChatFrameID
+local PanelTemplates_TabResize = PanelTemplates_TabResize
+
+C.SelectedStrings = {
+	["DEFAULT"] = "|cff%02x%02x%02x>|r %s |cff%02x%02x%02x<|r",
+	["SQUARE"] = "|cff%02x%02x%02x[|r %s |cff%02x%02x%02x]|r",
+	["HALFDEFAULT"] = "|cff%02x%02x%02x>|r %s",
+	["CHECKBOX"] = [[|TInterface\ACHIEVEMENTFRAME\UI-Achievement-Criteria-Check:%s|t%s]],
+	["ARROWRIGHT"] = [[|TInterface\BUTTONS\UI-SpellbookIcon-NextPage-Up:%s|t%s]],
+	["ARROWDOWN"] = [[|TInterface\BUTTONS\UI-MicroStream-Green:%s|t%s]],
+}
+function C:SetSelectedTab(isForced)
+	local selectedId = _G["GeneralDockManager"].selected:GetID()
+
+	--Set/Remove brackets and set alpha of chat tabs
+	for i=1, C.CreatedFrames do
+		local tab = _G[T.format("ChatFrame%sTab", i)]
+		if tab.isDocked then
+			--Brackets
+			if selectedId == tab:GetID() and C.db.tab.select then
+				if tab.hasBracket ~= true or isForced then
+					local color = C.db.tab.color
+					if C.db.tab.style == "DEFAULT" or C.db.tab.style == "SQUARE" then
+						tab.text:SetText(T.format(C.SelectedStrings[C.db.tab.style], color.r * 255, color.g * 255, color.b * 255, (FCF_GetChatWindowInfo(tab:GetID())), color.r * 255, color.g * 255, color.b * 255))
+					elseif C.db.tab.style == "HALFDEFAULT" then
+						tab.text:SetText(T.format(C.SelectedStrings[C.db.tab.style], color.r * 255, color.g * 255, color.b * 255, (FCF_GetChatWindowInfo(tab:GetID()))))
+					else
+						tab.text:SetText(T.format(C.SelectedStrings[C.db.tab.style], (E.db.chat.tabFontSize + 12), (FCF_GetChatWindowInfo(tab:GetID()))))
+					end
+					tab.hasBracket = true
+				end
+			else
+				if tab.hasBracket == true then
+					local tabText = tab.isTemporary and tab.origText or (FCF_GetChatWindowInfo(tab:GetID()))
+					tab.text:SetText(tabText)
+					tab.hasBracket = false
+				end
+			end
+		end
+
+		--Prevent chat tabs changing width on each click.
+		PanelTemplates_TabResize(tab, tab.isTemporary and 20 or 10, nil, nil, nil, tab.textWidth);
+	end
+end
+
+function C:OpenTemporaryWindow()
+	local chatID = FCF_GetCurrentChatFrameID()
+	local tab = _G[T.format("ChatFrame%sTab", chatID)]
+	tab.origText = (FCF_GetChatWindowInfo(tab:GetID()))
+	E:Delay(0.2, function() C:SetSelectedTab() end)
+end
+
+function C:DelaySetSelectedTab()
+	C:ScheduleTimer('SetSelectedTab', 1)
+end
+
+function C:SetTabWidth()
+	for i=1, C.CreatedFrames do
+		local tab = _G[T.format("ChatFrame%sTab", i)]
+		PanelTemplates_TabResize(tab, tab.isTemporary and 20 or 10, nil, nil, nil, tab.textWidth);
+	end
+end
+
+function C:InitTabs()
+	hooksecurefunc("FCFDockOverflowListButton_OnClick", C.SetSelectedTab)
+	hooksecurefunc("FCF_Close", C.SetSelectedTab)
+	hooksecurefunc("FCF_OpenNewWindow", C.DelaySetSelectedTab)
+	hooksecurefunc("FCF_OpenTemporaryWindow", C.OpenTemporaryWindow)
+	hooksecurefunc("FCF_DockUpdate", C.SetTabWidth)
+	C:SetSelectedTab()
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/dashboard/dashboard.lua b/ElvUI_SLE/modules/dashboard/dashboard.lua
deleted file mode 100644
index 38a18a3..0000000
--- a/ElvUI_SLE/modules/dashboard/dashboard.lua
+++ /dev/null
@@ -1,85 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
---[[ Dashboard for ElvUI
-Credits : Sinaris, Elv
-made for ElvUI under Sinaris permission. Big thanks :)
-]]
-local DTP = E:GetModule('SLE_DTPanels')
-local DT = E:GetModule('DataTexts')
-local LSM = LibStub("LibSharedMedia-3.0")
-if E.db.sle == nil then E.db.sle = {} end
-if E.db.sle.datatext == nil then E.db.sle.datatext = {} end
-if E.db.sle.datatext.dashboard == nil then E.db.sle.datatext.dashboard = {} end
-if E.db.sle.datatext.dashboard.width == nil then E.db.sle.datatext.dashboard.width = 100 end
-local DTPANELS_WIDTH = E.db.sle.datatext.dashboard.width
-local DTPANELS_HEIGHT = 20
-local PANEL_SPACING = 1
-local font = LSM:Fetch("font", E.db.datatexts.font)
-local fontsize = E.db.datatexts.fontSize
-local outline = E.db.datatexts.fontOutline
-
-local board = {}
-
-local bholder = CreateFrame("Frame", "BoardsHolder", E.UIParent)
-bholder:Point('TOPLEFT', E.UIParent, 'TOPLEFT', 0, -21)
-bholder:Size(((DTPANELS_WIDTH*4)+(PANEL_SPACING*3)), DTPANELS_HEIGHT)
-
-E:CreateMover(BoardsHolder, "SLE_Dashboard_Mover", L["Dashboard"], nil, nil, nil, "ALL,S&L,S&L MISC")
-
-local board = CreateFrame('frame', 'board', BoardsHolder)
-
-for i = 1, 4 do
-	board[i] = CreateFrame('frame', 'board'..i, bholder)
-	board[i]:SetFrameLevel(2)
-	board[i]:Size(DTPANELS_WIDTH, DTPANELS_HEIGHT)
-	board[i]:SetTemplate('Default', true)
-	board[i]:CreateShadow('Default')
-
-	if i == 1 then
-		board[i]:Point('TOPLEFT', bholder, 'TOPLEFT', 0, 0)
-	else
-		board[i]:Point('LEFT', board[i-1], 'RIGHT', PANEL_SPACING, 0)
-	end
-
-	board[i].Status = CreateFrame("StatusBar", "PanelStatus" .. i, board[i])
-	board[i].Status:SetFrameLevel(12)
-	board[i].Status:SetStatusBarTexture(E["media"].normTex)
-	board[i].Status:SetMinMaxValues(0, 100)
-	board[i].Status:SetStatusBarColor(.4, .4, .4, 1)
-	board[i].Status:Point("TOPLEFT", board[i], "TOPLEFT", 2, -2)
-	board[i].Status:Point("BOTTOMRIGHT", board[i], "BOTTOMRIGHT", -2, 2)
-
-	board[i].Text = board[i].Status:CreateFontString( nil, "OVERLAY" )
-	board[i].Text:FontTemplate()
-	board[i].Text:SetFont(font, fontsize, outline)
-	board[i].Text:Point("LEFT", board[i], "LEFT", 3, 0)
-	board[i].Text:SetJustifyV('MIDDLE')
-	board[i].Text:SetShadowColor(0, 0, 0)
-	board[i].Text:SetShadowOffset(1.25, -1.25)
-end
-
-function DTP:DashboardShow()
-	if E.db.sle.datatext.dashboard.enable then
-		E.FrameLocks['BoardsHolder'] = true
-		BoardsHolder:Show()
-	else
-		E.FrameLocks['BoardsHolder'] = nil
-		BoardsHolder:Hide()
-	end
-end
-
-local function SetupFonts()
-	font = LSM:Fetch("font", E.db.datatexts.font)
-	fontsize = E.db.datatexts.fontSize
-	outline = E.db.datatexts.fontOutline
-	for i = 1, 4 do
-		board[i].Text:SetFont(font, fontsize, outline)
-	end
-end
-hooksecurefunc(DT, "LoadDataTexts", SetupFonts)
-
-function DTP:DashWidth()
-	for i = 1, 4 do
-		board[i]:Size(E.db.sle.datatext.dashboard.width, DTPANELS_HEIGHT)
-	end
-	bholder:Size(((E.db.sle.datatext.dashboard.width*4)+(PANEL_SPACING*3)), DTPANELS_HEIGHT)
-end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/dashboard/datapanels/bags.lua b/ElvUI_SLE/modules/dashboard/datapanels/bags.lua
deleted file mode 100644
index cc09486..0000000
--- a/ElvUI_SLE/modules/dashboard/datapanels/bags.lua
+++ /dev/null
@@ -1,24 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local LastUpdate = 1
-
-board[2].Status:SetScript("OnUpdate", function(self)
-	local free, total, used = 0, 0, 0
-	for i = 0, NUM_BAG_SLOTS do
-		free, total = free + GetContainerNumFreeSlots(i), total + GetContainerNumSlots(i)
-	end
-	used = total - free
-	value = (used * 120 / total)
-
-	self:SetMinMaxValues(0, total)
-	self:SetValue(used)
-		board[2].Text:SetText(L["Bags"]..": " .. used .. " /" .. total)
-	if(used * 100 / total >= 75) then
-		self:SetStatusBarColor(1, 75 / 255, 75 / 255, 0.5, .8)
-	elseif used * 100 / total < 75 and used * 100 / total > 40 then
-		self:SetStatusBarColor(1, 180 / 255, 0, .8)
-	else
-		self:SetStatusBarColor(30 / 255, 1, 30 / 255, .8)
-	end
-end)
-
-board[2].Status:RegisterEvent("BAG_UPDATE")
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/dashboard/datapanels/durability.lua b/ElvUI_SLE/modules/dashboard/datapanels/durability.lua
deleted file mode 100644
index 641938a..0000000
--- a/ElvUI_SLE/modules/dashboard/datapanels/durability.lua
+++ /dev/null
@@ -1,68 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local displayString = ""
-local total, totalDurability, totalPerc = 0, 0, 0
-local current, max, lastPanel, result
-local invDurability = {}
-
-local slots = {
-	["SecondaryHandSlot"] = L['Offhand'],
-	["MainHandSlot"] = L['Main Hand'],
-	["FeetSlot"] = L['Feet'],
-	["LegsSlot"] = L['Legs'],
-	["HandsSlot"] = L['Hands'],
-	["WristSlot"] = L['Wrist'],
-	["WaistSlot"] = L['Waist'],
-	["ChestSlot"] = L['Chest'],
-	["ShoulderSlot"] = L['Shoulder'],
-	["HeadSlot"] = L['Head'],
-}
-
-board[1].Status:SetScript("OnEvent", function( self, ...)
-
-	lastPanel = self
-	total = 0
-	totalDurability = 0
-	totalPerc = 0
-
-	for index, value in pairs(slots) do
-		local slot = GetInventorySlotInfo(index)
-		current, max = GetInventoryItemDurability(slot)
-
-		if current then
-			totalDurability = totalDurability + current
-			invDurability[value] = (current/max)*100
-			totalPerc = totalPerc + (current/max)*100
-			total = total + 1
-		end
-	end
-
-	if total ~= 0 then
-		result = totalPerc/total
-	else
-		result = 0
-	end
-
-	if total > 0 then
-		board[1].Text:SetFormattedText(displayString, result)
-	end
-
-	self:SetMinMaxValues(0, 100)
-	self:SetValue(result)
-
-	if( result >= 75 ) then
-		self:SetStatusBarColor(30 / 255, 1, 30 / 255, .8)
-	elseif result < 75 and result > 40 then
-		self:SetStatusBarColor(1, 180 / 255, 0, .8)
-	else
-		self:SetStatusBarColor(1, 75 / 255, 75 / 255, 0.5, .8)
-	end
-end)
-
-local function ValueColorUpdate(hex, r, g, b)
-	displayString = string.join("", DURABILITY, ": ", hex, "%d%%|r")
-end
-E['valueColorUpdateFuncs'][ValueColorUpdate] = true
-
-board[1].Status:RegisterEvent("UPDATE_INVENTORY_DURABILITY")
-board[1].Status:RegisterEvent("MERCHANT_SHOW")
-board[1].Status:RegisterEvent("PLAYER_ENTERING_WORLD")
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/dashboard/datapanels/fps.lua b/ElvUI_SLE/modules/dashboard/datapanels/fps.lua
deleted file mode 100644
index 9d1db9f..0000000
--- a/ElvUI_SLE/modules/dashboard/datapanels/fps.lua
+++ /dev/null
@@ -1,22 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local LastUpdate = 1
-
-board[3].Status:SetScript("OnUpdate", function( self, elapsed)
-	LastUpdate = LastUpdate - elapsed
-
-	if(LastUpdate < 0) then
-		self:SetMinMaxValues(0, 200)
-		local value = floor(GetFramerate())
-		local max = 120
-		self:SetValue(value)
-		board[3].Text:SetText("FPS: " .. value)
-		if(value * 100 / max >= 75) then
-			self:SetStatusBarColor(30 / 255, 1, 30 / 255, .8)
-		elseif value * 100 / max < 75 and value * 100 / max > 40 then
-			self:SetStatusBarColor(1, 180 / 255, 0, .8)
-		else
-			self:SetStatusBarColor(1, 75 / 255, 75 / 255, 0.5, .8)
-		end
-		LastUpdate = 1
-	end
-end)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/dashboard/datapanels/ms.lua b/ElvUI_SLE/modules/dashboard/datapanels/ms.lua
deleted file mode 100644
index 3bece2f..0000000
--- a/ElvUI_SLE/modules/dashboard/datapanels/ms.lua
+++ /dev/null
@@ -1,23 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local LastUpdate = 1
-
-board[4].Status:SetScript("OnUpdate", function(self, elapsed)
-	LastUpdate = LastUpdate - elapsed
-
-	if(LastUpdate < 0) then
-		self:SetMinMaxValues(0, 200)
-		local value = (select( 3, GetNetStats()))
-		local max = 200
-		self:SetValue(value)
-		board[4].Text:SetText("MS: " .. value)
-
-		if( value * 100 / max <= 35) then
-			self:SetStatusBarColor(30 / 255, 1, 30 / 255, .8)
-		elseif value * 100 / max > 35 and value * 100 / max < 75 then
-			self:SetStatusBarColor(1, 180 / 255, 0, .8)
-		else
-			self:SetStatusBarColor(1, 75 / 255, 75 / 255, 0.5, .8)
-		end
-		LastUpdate = 1
-	end
-end)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/dashboard/load_dashboard.xml b/ElvUI_SLE/modules/dashboard/load_dashboard.xml
deleted file mode 100644
index c77944e..0000000
--- a/ElvUI_SLE/modules/dashboard/load_dashboard.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<Ui xmlns="http://www.blizzard.com/wow/ui/">
-	<Script file="dashboard.lua"/>
-	<Script file="datapanels\durability.lua"/>
-	<Script file="datapanels\bags.lua"/>
-	<Script file="datapanels\fps.lua"/>
-	<Script file="datapanels\ms.lua"/>
-</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/databars/artifact.lua b/ElvUI_SLE/modules/databars/artifact.lua
new file mode 100644
index 0000000..2d6e960
--- /dev/null
+++ b/ElvUI_SLE/modules/databars/artifact.lua
@@ -0,0 +1,79 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local DB = SLE:GetModule("DataBars")
+
+local HasArtifactEquipped = HasArtifactEquipped
+local MainMenuBar_GetNumArtifactTraitsPurchasableFromXP = MainMenuBar_GetNumArtifactTraitsPurchasableFromXP
+local C_ArtifactUIGetEquippedArtifactInfo = C_ArtifactUI.GetEquippedArtifactInfo
+
+local ARTIFACT_XP_GAIN = ARTIFACT_XP_GAIN
+
+DB.Art = {
+	Strings = {},
+	Styles = {
+		["STYLE1"] = "|T%s:%s|t|cffe6cc80%s|r +%s.",
+		["STYLE2"] = "|T%s:%s|t|cffe6cc80%s|r |cff0CD809+%s|r.",
+	},
+}
+
+local function UpdateArtifact(self, event)
+	if not E.db.sle.databars.artifact.longtext then return end
+	local bar = self.artifactBar
+	local showArtifact = HasArtifactEquipped();
+	if not showArtifact then
+		bar:Hide()
+	else
+		bar:Show()
+
+		if self.db.artifact.hideInVehicle then
+			E:RegisterObjectForVehicleLock(bar, E.UIParent)
+		else
+			E:UnregisterObjectForVehicleLock(bar)
+		end
+
+		local text = ''
+		local itemID, altItemID, name, icon, totalXP, pointsSpent, quality, artifactAppearanceID, appearanceModID, itemAppearanceID, altItemAppearanceID, altOnTop = C_ArtifactUIGetEquippedArtifactInfo();
+		local numPointsAvailableToSpend, xp, xpForNextPoint = MainMenuBar_GetNumArtifactTraitsPurchasableFromXP(pointsSpent, totalXP);
+		bar.statusBar:SetMinMaxValues(0, xpForNextPoint)
+		bar.statusBar:SetValue(xp)
+
+		local textFormat = self.db.artifact.textFormat
+		if textFormat == 'PERCENT' then
+			text = T.format(numPointsAvailableToSpend > 0 and '%d%% (%s)' or '%d%%', xp / xpForNextPoint * 100, numPointsAvailableToSpend)
+		elseif textFormat == 'CURMAX' then
+			text = T.format(numPointsAvailableToSpend > 0 and '%s - %s (%s)' or '%s - %s', xp, xpForNextPoint, numPointsAvailableToSpend)
+		elseif textFormat == 'CURPERC' then
+			text = T.format(numPointsAvailableToSpend > 0 and '%s - %d%% (%s)' or '%s - %d%%',xp, xp / xpForNextPoint * 100, numPointsAvailableToSpend)
+		end
+
+		bar.text:SetText(text)
+	end
+end
+
+function DB:PopulateArtPatterns()
+	local symbols = {'%(','%)','%.','([-+])','|4.-;','%%[sd]','%%%d%$[sd]','%%(','%%)','%%.','%%%1','.-','(.-)','(.-)'}
+	local pattern
+
+	pattern = T.rgsub(ARTIFACT_XP_GAIN,T.unpack(symbols))
+	T.tinsert(DB.Art.Strings, pattern)
+end
+
+function DB:FilterArtExperience(event, message, ...)
+	local name, exp
+	if DB.db.artifact.chatfilter.enable then
+			for i = 1, #DB.Art.Strings do
+				name, exp = T.match(message, DB.Art.Strings[i])
+				local _, _, _, icon = C_ArtifactUIGetEquippedArtifactInfo()
+				if name then
+					message = T.format(DB.Art.Styles[DB.db.artifact.chatfilter.style], icon, DB.db.artifact.chatfilter.iconsize, name, exp)
+					return false, message, ...
+				end
+			end
+		return false, message, ...
+	end
+	return false, message, ...
+end
+
+function DB:ArtInit()
+	DB:PopulateArtPatterns()
+	hooksecurefunc(E:GetModule('DataBars'), "UpdateArtifact", UpdateArtifact)
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/databars/databars.lua b/ElvUI_SLE/modules/databars/databars.lua
new file mode 100644
index 0000000..d962ba7
--- /dev/null
+++ b/ElvUI_SLE/modules/databars/databars.lua
@@ -0,0 +1,55 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local DB = SLE:NewModule("DataBars","AceHook-3.0", "AceEvent-3.0")
+
+DB.Icons = {
+	Rep = [[Interface\Icons\Achievement_Reputation_08]],
+	XP = [[Interface\Icons\XP_ICON]],
+}
+
+function DB:RegisterFilters()
+	if E.db.sle.databars.rep.chatfilter.enable then
+		ChatFrame_AddMessageEventFilter("CHAT_MSG_COMBAT_FACTION_CHANGE", self.FilterReputation)
+	else
+		ChatFrame_RemoveMessageEventFilter("CHAT_MSG_COMBAT_FACTION_CHANGE", self.FilterReputation)
+	end
+	if E.db.sle.databars.exp.chatfilter.enable then
+		ChatFrame_AddMessageEventFilter("CHAT_MSG_COMBAT_XP_GAIN", self.FilterExperience)
+	else
+		ChatFrame_RemoveMessageEventFilter("CHAT_MSG_COMBAT_XP_GAIN", self.FilterExperience)
+	end
+	if E.db.sle.databars.artifact.chatfilter.enable then
+		ChatFrame_AddMessageEventFilter("CHAT_MSG_SYSTEM", self.FilterArtExperience)
+	else
+		ChatFrame_RemoveMessageEventFilter("CHAT_MSG_SYSTEM", self.FilterArtExperience)
+	end
+	if E.db.sle.databars.honor.chatfilter.enable then
+		ChatFrame_AddMessageEventFilter("CHAT_MSG_COMBAT_HONOR_GAIN", self.FilterHonor)
+	else
+		ChatFrame_RemoveMessageEventFilter("CHAT_MSG_COMBAT_HONOR_GAIN", self.FilterHonor)
+	end
+end
+
+function DB:Initialize()
+	if not SLE.initialized then return end
+
+	function DB:ForUpdateAll()
+		DB.db = E.db.sle.databars
+		DB:RegisterFilters()
+	end
+
+	DB:ExpInit()
+	DB:RepInit()
+	DB:ArtInit()
+	DB:HonorInit()
+	DB:ForUpdateAll()
+
+	self:RegisterEvent("CHAT_MSG_COMBAT_FACTION_CHANGE", "ChatMsgCombat")
+	self:RegisterEvent("COMBAT_TEXT_UPDATE", "CombatTextUpdate")
+	self:RegisterEvent("CHAT_MSG_SYSTEM", "ChatMsgSys")
+	self:RegisterEvent("PLAYER_LOGIN", "PlayerRepLogin")
+	self:RegisterEvent("PLAYER_GUILD_UPDATE", "PlayerGuildRepUdate")
+	self:RegisterEvent("UPDATE_FACTION", "NewRepString")
+	DB:NewRepString()
+end
+
+SLE:RegisterModule(DB:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/databars/exp.lua b/ElvUI_SLE/modules/databars/exp.lua
new file mode 100644
index 0000000..1a8a8e6
--- /dev/null
+++ b/ElvUI_SLE/modules/databars/exp.lua
@@ -0,0 +1,166 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local DB = SLE:GetModule("DataBars")
+
+--strings and shit
+local COMBATLOG_XPGAIN_FIRSTPERSON, COMBATLOG_XPGAIN_FIRSTPERSON_UNNAMED = COMBATLOG_XPGAIN_FIRSTPERSON, COMBATLOG_XPGAIN_FIRSTPERSON_UNNAMED
+local COMBATLOG_XPGAIN_EXHAUSTION1, COMBATLOG_XPGAIN_EXHAUSTION2, COMBATLOG_XPGAIN_EXHAUSTION4, COMBATLOG_XPGAIN_EXHAUSTION5 = COMBATLOG_XPGAIN_EXHAUSTION1, COMBATLOG_XPGAIN_EXHAUSTION2, COMBATLOG_XPGAIN_EXHAUSTION4, COMBATLOG_XPGAIN_EXHAUSTION5
+local COMBATLOG_XPGAIN_EXHAUSTION1_GROUP, COMBATLOG_XPGAIN_EXHAUSTION2_GROUP, COMBATLOG_XPGAIN_EXHAUSTION4_GROUP, COMBATLOG_XPGAIN_EXHAUSTION5_GROUP = COMBATLOG_XPGAIN_EXHAUSTION1_GROUP, COMBATLOG_XPGAIN_EXHAUSTION2_GROUP, COMBATLOG_XPGAIN_EXHAUSTION4_GROUP, COMBATLOG_XPGAIN_EXHAUSTION5_GROUP
+local COMBATLOG_XPGAIN_EXHAUSTION1_RAID, COMBATLOG_XPGAIN_EXHAUSTION2_RAID, COMBATLOG_XPGAIN_EXHAUSTION4_RAID, COMBATLOG_XPGAIN_EXHAUSTION5_RAID = COMBATLOG_XPGAIN_EXHAUSTION1_RAID, COMBATLOG_XPGAIN_EXHAUSTION2_RAID, COMBATLOG_XPGAIN_EXHAUSTION4_RAID, COMBATLOG_XPGAIN_EXHAUSTION5_RAID
+local COMBATLOG_XPGAIN_FIRSTPERSON_GROUP, COMBATLOG_XPGAIN_FIRSTPERSON_RAID = COMBATLOG_XPGAIN_FIRSTPERSON_GROUP, COMBATLOG_XPGAIN_FIRSTPERSON_RAID
+local MAX_PLAYER_LEVEL = MAX_PLAYER_LEVEL
+
+DB.Exp = {
+	Strings = {
+		["NoName"] = {},
+		["Normal"] = {},
+		["Bonus"] = {},
+		["BonusGroup"] = {},
+		["BonusRaid"] = {},
+		["Penalty"] = {},
+		["PenaltyGroup"] = {},
+		["PenaltyRaid"] = {},
+		["FirstBonus"] = {},
+		["FirstPenalty"] = {},
+	},
+	Styles = {
+		["STYLE1"] = {
+			["NoName"] = "|T"..DB.Icons.XP..":%s|t +%s",
+			["Normal"] = "|T"..DB.Icons.XP..":%s|t %s: +%s",
+			["Bonus"] = "|T"..DB.Icons.XP..":%s|t %s: +%s (%s %s)",
+			["BonusGroup"] = "|T"..DB.Icons.XP..":%s|t %s: +%s (%s %s, +%s "..GROUP..")",
+			["BonusRaid"] = "|T"..DB.Icons.XP..":%s|t %s: +%s (%s %s, -%s "..RAID..")",
+			["Penalty"] = "|T"..DB.Icons.XP..":%s|t %s: +%s (-%s %s)",
+			["PenaltyGroup"] = "|T"..DB.Icons.XP..":%s|t %s: +%s (-%s %s, +%s "..GROUP..")",
+			["PenaltyRaid"] = "|T"..DB.Icons.XP..":%s|t %s: +%s (-%s %s, -%s "..RAID..")",
+			["FirstBonus"] = "|T"..DB.Icons.XP..":%s|t %s: +%s (%s "..GROUP..")",
+			["FirstPenalty"] = "|T"..DB.Icons.XP..":%s|t %s: +%s (-%s "..RAID..")",
+		},
+		["STYLE2"] = {
+			["NoName"] = "|T"..DB.Icons.XP..":%s|t |cff0CD809+%s|r ",
+			["Normal"] = "|T"..DB.Icons.XP..":%s|t %s: |cff0CD809+%s|r",
+			["Bonus"] = "|T"..DB.Icons.XP..":%s|t %s: |cff0CD809+%s|r (|cff0CD809%s|r %s)",
+			["BonusGroup"] = "|T"..DB.Icons.XP..":%s|t %s: |cff0CD809+%s|r (|cff0CD809%s|r %s, +%s "..GROUP..")",
+			["BonusRaid"] = "|T"..DB.Icons.XP..":%s|t %s: |cff0CD809+%s|r (|cff0CD809%s|r %s, -%s "..RAID..")",
+			["Penalty"] = "|T"..DB.Icons.XP..":%s|t %s: |cff0CD809+%s|r (-%s %s)",
+			["PenaltyGroup"] = "|T"..DB.Icons.XP..":%s|t %s: |cff0CD809+%s|r (-%s %s, +%s "..GROUP..")",
+			["PenaltyRaid"] = "|T"..DB.Icons.XP..":%s|t %s: |cff0CD809+%s|r (-%s %s, -%s "..RAID..")",
+			["FirstBonus"] = "|T"..DB.Icons.XP..":%s|t %s: |cff0CD809+%s|r (%s "..GROUP..")",
+			["FirstPenalty"] = "|T"..DB.Icons.XP..":%s|t %s: |cff0CD809+%s|r (-%s "..RAID..")",
+		},
+	}
+}
+
+local function UpdateExperience(self, event)
+	if not E.db.sle.databars.exp.longtext then return end
+	local bar = self.expBar
+
+	if not T.UnitLevel('player') == MAX_PLAYER_LEVEL or not T.IsXPUserDisabled() then
+		local cur, max = self:GetXP('player')
+		local rested = T.GetXPExhaustion()
+		local text = ''
+		local textFormat = E.db.databars.experience.textFormat
+
+		if rested and rested > 0 then
+				if textFormat == 'PERCENT' then
+					text = T.format('%d%%  '..L["Rested:"]..' %d%%', cur / max * 100, rested / max * 100)
+				elseif textFormat == 'CURMAX' then
+					text = T.format('%s - %s  '..L["Rested:"]..' %s', cur, max, rested)
+				elseif textFormat == 'CURPERC' then
+					text = T.format('%s - %d%%  '..L["Rested:"]..' %s [%d%%]', cur, cur / max * 100, rested, rested / max * 100)
+				end
+		else
+				if textFormat == 'PERCENT' then
+					text = T.format('%d%%', cur / max * 100)
+				elseif textFormat == 'CURMAX' then
+					text = T.format('%s - %s', cur, max)
+				elseif textFormat == 'CURPERC' then
+					text = T.format('%s - %d%%', cur, cur / max * 100)
+				end
+		end
+
+		bar.text:SetText(text)
+	end
+end
+
+function DB:PopulateExpPatterns()
+	local symbols = {'%(','%)','%.','([-+])','|4.-;','%%[sd]','%%%d%$[sd]','%%(','%%)','%%.','%%%1','.-','(.-)','(.-)'}
+	local pattern
+	pattern = T.rgsub(COMBATLOG_XPGAIN_FIRSTPERSON_UNNAMED, T.unpack(symbols));
+	T.tinsert(DB.Exp.Strings.NoName, pattern)
+
+	pattern = T.rgsub(COMBATLOG_XPGAIN_FIRSTPERSON,T.unpack(symbols))
+	T.tinsert(DB.Exp.Strings.Normal, pattern)
+
+	-- pattern = T.rgsub(COMBATLOG_XPGAIN_QUEST,T.unpack(symbols))
+	-- T.tinsert(DB.Exp.Strings, pattern)
+
+	pattern = T.rgsub(COMBATLOG_XPGAIN_EXHAUSTION1,T.unpack(symbols))
+	T.tinsert(DB.Exp.Strings.Bonus, pattern)
+
+	pattern = T.rgsub(COMBATLOG_XPGAIN_EXHAUSTION2,T.unpack(symbols))
+	T.tinsert(DB.Exp.Strings.Bonus, pattern)
+
+	pattern = T.rgsub(COMBATLOG_XPGAIN_EXHAUSTION4,T.unpack(symbols))
+	T.tinsert(DB.Exp.Strings.Penalty, pattern)
+
+	pattern = T.rgsub(COMBATLOG_XPGAIN_EXHAUSTION5,T.unpack(symbols))
+	T.tinsert(DB.Exp.Strings.Penalty, pattern)
+
+	pattern = T.rgsub(COMBATLOG_XPGAIN_EXHAUSTION1_GROUP,T.unpack(symbols))
+	T.tinsert(DB.Exp.Strings.BonusGroup, pattern)
+
+	pattern = T.rgsub(COMBATLOG_XPGAIN_EXHAUSTION2_GROUP,T.unpack(symbols))
+	T.tinsert(DB.Exp.Strings.BonusGroup, pattern)
+
+	pattern = T.rgsub(COMBATLOG_XPGAIN_EXHAUSTION4_GROUP,T.unpack(symbols))
+	T.tinsert(DB.Exp.Strings.PenaltyGroup, pattern)
+
+	pattern = T.rgsub(COMBATLOG_XPGAIN_EXHAUSTION5_GROUP,T.unpack(symbols))
+	T.tinsert(DB.Exp.Strings.PenaltyGroup, pattern)
+
+	pattern = T.rgsub(COMBATLOG_XPGAIN_EXHAUSTION1_RAID,T.unpack(symbols))
+	T.tinsert(DB.Exp.Strings.BonusRaid, pattern)
+
+	pattern = T.rgsub(COMBATLOG_XPGAIN_EXHAUSTION2_RAID,T.unpack(symbols))
+	T.tinsert(DB.Exp.Strings.BonusRaid, pattern)
+
+	pattern = T.rgsub(COMBATLOG_XPGAIN_EXHAUSTION4_RAID,T.unpack(symbols))
+	T.tinsert(DB.Exp.Strings.PenaltyRaid, pattern)
+
+	pattern = T.rgsub(COMBATLOG_XPGAIN_EXHAUSTION5_RAID,T.unpack(symbols))
+	T.tinsert(DB.Exp.Strings.PenaltyRaid, pattern)
+
+	pattern = T.rgsub(COMBATLOG_XPGAIN_FIRSTPERSON_GROUP,T.unpack(symbols))
+	T.tinsert(DB.Exp.Strings.FirstBonus, pattern)
+
+	pattern = T.rgsub(COMBATLOG_XPGAIN_FIRSTPERSON_RAID,T.unpack(symbols))
+	T.tinsert(DB.Exp.Strings.FirstPenalty, pattern)
+
+	-- pattern = T.rgsub(COMBATLOG_XPGAIN_FIRSTPERSON_UNNAMED_GROUP,T.unpack(symbols))
+	-- T.tinsert(DB.Exp.Strings, pattern)
+
+	-- pattern = T.rgsub(COMBATLOG_XPGAIN_FIRSTPERSON_UNNAMED_RAID,T.unpack(symbols))
+	-- T.tinsert(DB.Exp.Strings, pattern)
+end
+
+function DB:FilterExperience(event, message, ...)
+	local name, exp, bonus, reason, addbonus
+	if DB.db.exp.chatfilter.enable then
+		for type, patterns in T.pairs(DB.Exp.Strings) do
+			for i = 1, #patterns do
+				name, exp, bonus, reason, addbonus = T.match(message, "^"..DB.Exp.Strings[type][i].."$")
+				if name then
+					message = T.format(DB.Exp.Styles[DB.db.exp.chatfilter.style][type] , DB.db.exp.chatfilter.iconsize, name, exp, SLE.Russian and reason or bonus, SLE.Russian and bonus or reason, addbonus)
+					return false, message, ...
+				end
+			end
+		end
+		return false, message, ...
+	end
+	return false, message, ...
+end
+
+function DB:ExpInit()
+	DB:PopulateExpPatterns()
+	hooksecurefunc(E:GetModule('DataBars'), "UpdateExperience", UpdateExperience)
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/databars/honor.lua b/ElvUI_SLE/modules/databars/honor.lua
new file mode 100644
index 0000000..564db8f
--- /dev/null
+++ b/ElvUI_SLE/modules/databars/honor.lua
@@ -0,0 +1,135 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local DB = SLE:GetModule("DataBars")
+
+local MAX_PLAYER_LEVEL = MAX_PLAYER_LEVEL
+local PVP_HONOR_PRESTIGE_AVAILABLE = PVP_HONOR_PRESTIGE_AVAILABLE
+local MAX_HONOR_LEVEL = MAX_HONOR_LEVEL
+local faction = UnitFactionGroup('player')
+DB.Honor ={
+	Styles = {
+		["STYLE1"] = "%s <%s>: +%s|T%s:%s|t",
+		["STYLE2"] = "%s <%s>: +"..E["media"].hexvaluecolor.."%s|r|T%s:%s|t",
+		["STYLE3"] = E["media"].hexvaluecolor.."%s|r <%s>: +"..E["media"].hexvaluecolor.."%s|r|T%s:%s|t",
+		["STYLE4"] = "%s <%s> +%s|T%s:%s|t",
+		["STYLE5"] = "%s <%s> +"..E["media"].hexvaluecolor.."%s|r|T%s:%s|t",
+		["STYLE6"] = E["media"].hexvaluecolor.."%s|r <%s> +"..E["media"].hexvaluecolor.."%s|r|T%s:%s|t",
+		["STYLE7"] = "%s <%s> (%s|T%s:%s|t)",
+		["STYLE8"] = "%s <%s> ("..E["media"].hexvaluecolor.."%s|r|T%s:%s|t)",
+		["STYLE9"] = E["media"].hexvaluecolor.."%s|r <%s> ("..E["media"].hexvaluecolor.."%s|r|T%s:%s|t)",
+	},
+	AwardStyles = {
+		["STYLE1"] = L["Award"]..": %s|T%s:%s|t",
+		["STYLE2"] = L["Award"]..": "..E["media"].hexvaluecolor.."%s|r|T%s:%s|t",
+		["STYLE3"] = "|TInterface\\Icons\\Achievement_PVP_O_15:14:14|t: %s|T%s:%s|t",
+		["STYLE4"] = "|TInterface\\Icons\\Achievement_PVP_O_15:14:14|t: "..E["media"].hexvaluecolor.."%s|r|T%s:%s|t",
+		["STYLE5"] = "|TInterface\\Icons\\ACHIEVEMENT_GUILDPERK_MRPOPULARITY_RANK2:14:14|t: %s|T%s:%s|t",
+		["STYLE6"] = "|TInterface\\Icons\\ACHIEVEMENT_GUILDPERK_MRPOPULARITY_RANK2:14:14|t: "..E["media"].hexvaluecolor.."%s|r|T%s:%s|t",
+	},
+	Strings = {},
+	Icon = [[Interface\AddOns\ElvUI_SLE\media\textures\]]..faction,
+}
+
+local function UpdateHonor(self, event, unit)
+	if not E.db.sle.databars.honor.longtext then return end
+	if event == "HONOR_PRESTIGE_UPDATE"  and unit ~= "player" then return end
+	local bar = self.honorBar
+	local showHonor = T.UnitLevel("player") >= MAX_PLAYER_LEVEL
+	if not showHonor then
+		bar:Hide()
+	else
+		bar:Show()
+
+		local current = T.UnitHonor("player");
+		local max = T.UnitHonorMax("player");
+		local level = T.UnitHonorLevel("player");
+        local levelmax = T.GetMaxPlayerHonorLevel();
+
+
+        if (level == levelmax) then
+			-- Force the bar to full for the max level
+			bar.statusBar:SetMinMaxValues(0, 1)
+			bar.statusBar:SetValue(1)
+		else
+			bar.statusBar:SetMinMaxValues(0, max)
+			bar.statusBar:SetValue(current)
+		end
+
+		if self.db.honor.hideInVehicle then
+			E:RegisterObjectForVehicleLock(bar, E.UIParent)
+		else
+			E:UnregisterObjectForVehicleLock(bar)
+		end
+
+		local text = ''
+		local textFormat = self.db.honor.textFormat
+
+		if textFormat == 'PERCENT' then
+			if (T.CanPrestige()) then
+				text = PVP_HONOR_PRESTIGE_AVAILABLE
+			elseif (level == levelmax) then
+				text = MAX_HONOR_LEVEL
+			else
+				text = T.format('%d%%', current / max * 100)
+			end
+		elseif textFormat == 'CURMAX' then
+			if (T.CanPrestige()) then
+				text = PVP_HONOR_PRESTIGE_AVAILABLE
+			elseif (level == levelmax) then
+				text = MAX_HONOR_LEVEL
+			else
+				text = T.format('%s - %s', current, max)
+			end
+		elseif textFormat == 'CURPERC' then
+			if (T.CanPrestige()) then
+				text = PVP_HONOR_PRESTIGE_AVAILABLE
+			elseif (level == levelmax) then
+				text = MAX_HONOR_LEVEL
+			else
+				text = T.format('%s - %d%%', current, current / max * 100)
+			end
+		end
+
+		bar.text:SetText(text)
+	end
+end
+
+local AwardPattern
+function DB:PopulateHonorStrings()
+	local symbols = {'%(','%)','%.','([-+])','|4.-;','%%[sd]','%%%d%$[sd]','%%(','%%)','%%.','%%%1','.-','(.-)','(.-)'}
+
+	local pattern
+	pattern = T.rgsub(COMBATLOG_HONORGAIN, T.unpack(symbols))
+	T.tinsert(DB.Honor.Strings, pattern)
+
+	pattern = T.rgsub(COMBATLOG_HONORGAIN_NO_RANK, T.unpack(symbols))
+	T.tinsert(DB.Honor.Strings, pattern)
+
+	AwardPattern = T.rgsub(COMBATLOG_HONORAWARD, T.unpack(symbols))
+end
+
+function DB:FilterHonor(event, message, ...)
+	local name, rank, honor
+	if DB.db.honor.chatfilter.enable then
+		for i, v in T.ipairs(DB.Honor.Strings) do
+			name, rank, honor = T.match(message,DB.Honor.Strings[i])
+			if name then
+				if not honor then
+					honor = rank
+					rank = PVP_RANK_0_0
+				end
+				message = T.format(DB.Honor.Styles[DB.db.honor.chatfilter.style or "STYLE1"], name, rank, honor, DB.Honor.Icon, DB.db.honor.chatfilter.iconsize)
+				return false, message, ...
+			end
+		end
+	end
+	honor = T.match(message,AwardPattern)
+	if honor then
+		message = T.format(DB.Honor.AwardStyles[DB.db.honor.chatfilter.awardStyle or "STYLE1"], honor, DB.Honor.Icon, DB.db.honor.chatfilter.iconsize)
+		return false, message, ...
+	end
+end
+
+function DB:HonorInit()
+	DB:PopulateHonorStrings()
+	hooksecurefunc(E:GetModule('DataBars'), "UpdateHonor", UpdateHonor)
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/databars/load_databars.xml b/ElvUI_SLE/modules/databars/load_databars.xml
new file mode 100644
index 0000000..3dede7c
--- /dev/null
+++ b/ElvUI_SLE/modules/databars/load_databars.xml
@@ -0,0 +1,7 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<Script file='databars.lua'/>
+	<Script file='exp.lua'/>
+	<Script file='rep.lua'/>
+	<Script file='honor.lua'/>
+	<Script file='artifact.lua'/>
+</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/databars/rep.lua b/ElvUI_SLE/modules/databars/rep.lua
new file mode 100644
index 0000000..44920d3
--- /dev/null
+++ b/ElvUI_SLE/modules/databars/rep.lua
@@ -0,0 +1,322 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local DB = SLE:GetModule("DataBars")
+
+local _G = _G
+local strMatchCombat = {}
+local guildName
+local abs = math.abs
+local NUM_CHAT_WINDOWS = NUM_CHAT_WINDOWS
+local ExpandFactionHeader, CollapseFactionHeader = ExpandFactionHeader, CollapseFactionHeader
+local next = next
+local collapsed = {}
+
+--strings and shit
+local GUILD = GUILD
+local FACTION_STANDING_INCREASED = FACTION_STANDING_INCREASED
+local FACTION_STANDING_INCREASED_GENERIC = FACTION_STANDING_INCREASED_GENERIC
+local FACTION_STANDING_INCREASED_BONUS = FACTION_STANDING_INCREASED_BONUS
+local FACTION_STANDING_INCREASED_DOUBLE_BONUS = FACTION_STANDING_INCREASED_DOUBLE_BONUS
+local FACTION_STANDING_INCREASED_ACH_BONUS = FACTION_STANDING_INCREASED_ACH_BONUS
+local FACTION_STANDING_CHANGED = FACTION_STANDING_CHANGED
+local FACTION_STANDING_CHANGED_GUILD = FACTION_STANDING_CHANGED_GUILD
+local FACTION_STANDING_CHANGED_GUILDNAME = FACTION_STANDING_CHANGED_GUILDNAME
+local FACTION_STANDING_DECREASED = FACTION_STANDING_DECREASED
+local FACTION_STANDING_DECREASED_GENERIC = FACTION_STANDING_DECREASED_GENERIC
+
+local FACTION_BAR_COLORS = FACTION_BAR_COLORS
+
+DB.RepIncreaseStrings = {}
+DB.RepDecreaseStrings = {}
+DB.factionVars = {}
+DB.factions = 0
+
+DB.RepIncreaseStyles = {
+	["STYLE1"] = "|T"..DB.Icons.Rep..":%s|t %s: +%s.",
+	["STYLE2"] = "|T"..DB.Icons.Rep..":%s|t %s: |cff0CD809+%s|r.",
+}
+
+DB.RepDecreaseStyles = {
+	["STYLE1"] = "|T"..DB.Icons.Rep..":%s|t %s: %s.",
+	["STYLE2"] = "|T"..DB.Icons.Rep..":%s|t %s: |cffD80909%s|r.",
+}
+
+T.tinsert(strMatchCombat, (T.gsub(FACTION_STANDING_INCREASED,"%%%d?%$?s", "(.+)")))
+T.tinsert(strMatchCombat, (T.gsub(FACTION_STANDING_INCREASED_GENERIC,"%%%d?%$?s", "(.+)")))
+T.tinsert(strMatchCombat, (T.gsub(FACTION_STANDING_INCREASED_BONUS,"%%%d?%$?s", "(.+)")))
+T.tinsert(strMatchCombat, (T.gsub(FACTION_STANDING_INCREASED_DOUBLE_BONUS,"%%%d?%$?s", "(.+)")))
+T.tinsert(strMatchCombat, (T.gsub(FACTION_STANDING_INCREASED_ACH_BONUS,"%%%d?%$?s", "(.+)")))
+local strChangeMatch = (T.gsub(FACTION_STANDING_CHANGED,"%%%d?%$?s", "(.+)"))
+local strGuildChangeMatch = {}
+T.tinsert(strGuildChangeMatch, (T.gsub(FACTION_STANDING_CHANGED_GUILD,"%%%d?%$?s", "(.+)")))
+T.tinsert(strGuildChangeMatch, (T.gsub(FACTION_STANDING_CHANGED_GUILDNAME,"%%%d?%$?s", "(.+)")))
+
+local backupColor = FACTION_BAR_COLORS[1]
+local FactionStandingLabelUnknown = UNKNOWN
+local function UpdateReputation(self, event)
+	if not E.db.sle.databars.rep.longtext or not SLE.initialized then return end
+	local bar = self.repBar
+	local ID
+	local isFriend, friendText, standingLabel
+	local name, reaction, min, max, value = T.GetWatchedFactionInfo()
+	local numFactions = T.GetNumFactions();
+
+	if name then
+		local text = ''
+		local textFormat = E.db.databars.reputation.textFormat
+		local color = FACTION_BAR_COLORS[reaction] or backupColor
+		bar.statusBar:SetStatusBarColor(color.r, color.g, color.b)
+
+		bar.statusBar:SetMinMaxValues(min, max)
+		bar.statusBar:SetValue(value)
+
+		for i=1, numFactions do
+			local factionName, _, standingID,_,_,_,_,_,_,_,_,_,_, factionID = T.GetFactionInfo(i);
+			local friendID, friendRep, friendMaxRep, _, _, _, friendTextLevel = T.GetFriendshipReputation(factionID);
+			if factionName == name then
+				if friendID ~= nil then
+					isFriend = true
+					friendText = friendTextLevel
+				else
+					ID = standingID
+				end
+			end
+		end
+
+		if ID then
+			standingLabel = _G["FACTION_STANDING_LABEL"..ID]
+		else
+			standingLabel = FactionStandingLabelUnknown
+		end
+
+		if textFormat == 'PERCENT' then
+			text = T.format('%s: %d%% [%s]', name, ((value - min) / (max - min) * 100), isFriend and friendText or _G["FACTION_STANDING_LABEL"..ID])
+		elseif textFormat == 'CURMAX' then
+			text = T.format('%s: %s - %s [%s]', name, value - min, max - min, isFriend and friendText or _G["FACTION_STANDING_LABEL"..ID])
+		elseif textFormat == 'CURPERC' then
+			text = T.format('%s: %s - %d%% [%s]', name, value - min, ((value - min) / (max - min) * 100), isFriend and friendText or _G["FACTION_STANDING_LABEL"..ID])
+		end
+
+		bar.text:SetText(text)
+	end
+end
+
+function DB:ChatMsgCombat(event, ...)
+	if not DB.db.rep.autotrack then return end
+
+	local messg = ...
+	local found
+	for i, v in T.ipairs(strMatchCombat) do
+		found = (T.match(messg,strMatchCombat[i]))
+		if found then
+			if GUILD and guildName and (found == GUILD) then
+				found = guildName
+			end
+			break
+		end
+	end
+	if found then
+		DB:setWatchedFaction(found)
+	end
+end
+
+function DB:CombatTextUpdate(event, ...)
+	if not DB.db.rep.autotrack then return end
+
+	local messagetype, faction, amount = ...
+	if messagetype ~= "FACTION" then return end
+	if (not amount) or (amount < 0) then return end
+	if GUILD and faction and guildName and (faction == GUILD) then
+		faction = guildName
+	end
+	if faction then
+		DB:setWatchedFaction(faction)
+	end
+end
+
+function DB:ChatMsgSys(event, ...)
+	if not DB.db.rep.autotrack then return end
+
+	local messg = ...
+	local found
+	local newfaction = (T.match(messg,strChangeMatch)) and T.select(2,T.match(messg,strChangeMatch))
+	if newfaction then
+		if guildName and (newfaction == GUILD) then
+			found = guildName
+		else
+			found = newfaction
+		end
+	else
+		local guildfaction
+		for i, v in T.ipairs(strGuildChangeMatch) do
+			guildfaction = (T.match(messg,strGuildChangeMatch[i]))
+			if guildfaction then
+				break
+			end
+		end
+		if guildfaction and guildName then
+			found = guildName
+		end
+	end
+	if found then
+		DB:setWatchedFaction(found)
+	end
+end
+
+function DB:PlayerRepLogin()
+	if T.IsInGuild() then
+		guildName = (T.GetGuildInfo("player"))
+		if not guildName then
+			DB:RegisterEvent("GUILD_ROSTER_UPDATE", 'PlayerGuildRosterUpdate')
+		end
+	end
+end
+
+function DB:PlayerGuildRosterUpdate()
+	if not SLE.initialized  then return end
+	if T.IsInGuild() then
+		guildName = (T.GetGuildInfo("player"))
+	end
+	if guildName then
+		DB:UnregisterEvent("GUILD_ROSTER_UPDATE")
+	end
+end
+
+function DB:PlayerGuildRepUdate()
+	if T.IsInGuild() then
+		guildName = (T.GetGuildInfo("player"))
+		if not guildName then
+			DB:RegisterEvent("GUILD_ROSTER_UPDATE", 'PlayerGuildRosterUpdate')
+		end
+	else
+		guildName = nil
+	end
+end
+
+function DB:setWatchedFaction(faction)
+	if not SLE.initialized then return end
+	T.twipe(collapsed)
+	local i,j = 1, T.GetNumFactions()
+	while i <= j do
+		local name,_,_,_,_,_,_,_,isHeader,isCollapsed,_,isWatched = T.GetFactionInfo(i)
+		if name == faction then
+			if not (isWatched or T.IsFactionInactive(i)) then
+				T.SetWatchedFactionIndex(i)
+			end
+			break
+		end
+		if isHeader and isCollapsed then
+			ExpandFactionHeader(i)
+			collapsed[i] = true
+			j = T.GetNumFactions()
+		end
+		i = i+1
+	end
+	if next(collapsed) then
+		for k=i,1,-1 do
+			if collapsed[k] then
+				CollapseFactionHeader(k)
+			end
+		end
+	end
+end
+
+function DB:PopulateRepPatterns()
+	local symbols = {'%.$','%(','%)','|3%-7%%%(%%s%%%)','%%s([^%%])','%+','%%d','%%.1f','%%.','%%(','%%)','(.-)','(.-)%1','%%+','(%%d-)','(%%d-)'}
+	local pattern
+	pattern = T.rgsub(FACTION_STANDING_INCREASED, T.unpack(symbols));
+	T.tinsert(DB.RepIncreaseStrings, pattern)
+
+	pattern = T.rgsub(FACTION_STANDING_INCREASED_ACH_BONUS, T.unpack(symbols));
+	T.tinsert(DB.RepIncreaseStrings, pattern)
+
+	pattern = T.rgsub(FACTION_STANDING_DECREASED, T.unpack(symbols))
+	T.tinsert(DB.RepDecreaseStrings, pattern)
+
+	pattern = T.rgsub(FACTION_STANDING_DECREASED_GENERIC, T.unpack(symbols))
+	T.tinsert(DB.RepDecreaseStrings, pattern)
+end
+
+function DB:FilterReputation(event, message, ...)
+	local faction, rep, bonus
+	if DB.db.rep.chatfilter.enable then
+		for i, v in T.ipairs(DB.RepIncreaseStrings) do
+			faction, rep, bonus = T.match(message, DB.RepIncreaseStrings[i])
+			if faction then
+				return true
+			end
+		end
+		for i, v in T.ipairs(DB.RepDecreaseStrings) do
+			faction, rep = T.match(message, DB.RepDecreaseStrings[i])
+			if faction then
+				return true
+			end
+		end
+		return false, message, ...
+	end
+	return false, message, ...
+end
+
+function DB:ScanFactions()
+	self.factions = T.GetNumFactions();
+	for i = 1, self.factions do
+		local name, _, standingID, _, _, barValue, _, _, isHeader, _, hasRep = T.GetFactionInfo(i)
+		if (not isHeader or hasRep) then
+			self.factionVars[name] = {}
+			self.factionVars[name].Standing = standingID
+			self.factionVars[name].Value = barValue
+		end
+	end
+end
+DB.RepChatFrames = {}
+function DB:NewRepString(event, ...)
+	if not DB.db.rep.chatfilter.enable then return end
+	local stop = false
+	local tempfactions = T.GetNumFactions()
+	if (tempfactions > self.factions) then
+		self:ScanFactions()
+		self.factions = tempfactions
+	end
+	if DB.db.rep.chatfilter.chatframe == "AUTO" then
+		T.twipe(DB.RepChatFrames)
+		for i = 1, NUM_CHAT_WINDOWS do
+			if SLE:SimpleTable(_G["ChatFrame"..i]["messageTypeList"], "COMBAT_FACTION_CHANGE") then
+				T.tinsert(DB.RepChatFrames, "ChatFrame"..i)
+			end
+		end
+	end
+	for factionIndex = 1, T.GetNumFactions() do
+		local StyleTable = nil
+		local name, _, standingID, barMin, barMax, barValue, _, _, isHeader, _, hasRep, _, _, factionID = T.GetFactionInfo(factionIndex)
+		local friendID, _, _, _, _, _, friendTextLevel = T.GetFriendshipReputation(factionID);
+		local currentRank, maxRank = T.GetFriendshipReputationRanks(factionID);
+		if (not isHeader or hasRep) and self.factionVars[name] then
+			local diff = barValue - self.factionVars[name].Value
+			if diff > 0 then
+				StyleTable = "RepIncreaseStyles"
+			elseif diff < 0 then
+				StyleTable = "RepDecreaseStyles"
+			end
+			if StyleTable then
+				local change = abs(barValue - self.factionVars[name].Value)
+				if DB.db.rep.chatfilter.chatframe == "AUTO" then
+					for n = 1, #(DB.RepChatFrames) do
+						local chatframe = _G[DB.RepChatFrames[n]]
+						chatframe:AddMessage(T.format(DB[StyleTable][DB.db.rep.chatfilter.style] , DB.db.rep.chatfilter.iconsize, name, diff))
+						if not E.db.sle.databars.rep.chatfilter.showAll then stop = true; break end
+					end
+				else
+					local chatframe = _G[DB.db.rep.chatfilter.chatframe]
+					chatframe:AddMessage(T.format(DB[StyleTable][DB.db.rep.chatfilter.style] , DB.db.rep.chatfilter.iconsize, name, diff))
+					if not E.db.sle.databars.rep.chatfilter.showAll then stop = true; break end
+				end
+				self.factionVars[name].Value = barValue
+				if stop then return end
+			end
+		end
+	end
+end
+
+function DB:RepInit()
+	DB:PopulateRepPatterns()
+	hooksecurefunc(E:GetModule('DataBars'), "UpdateReputation", UpdateReputation)
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/datatexts.lua b/ElvUI_SLE/modules/datatexts.lua
index ae7ae3a..a4da853 100644
--- a/ElvUI_SLE/modules/datatexts.lua
+++ b/ElvUI_SLE/modules/datatexts.lua
@@ -1,117 +1,177 @@
-local E, L, V, P, G = unpack(ElvUI);
-local DTP = E:GetModule('SLE_DTPanels');
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local DTP = SLE:NewModule('Datatexts', 'AceHook-3.0', 'AceEvent-3.0');
 local DT = E:GetModule('DataTexts');
-local LO = E:GetModule('Layout');
-local dp1 = CreateFrame('Frame', "DP_1", E.UIParent)
-local dp2 = CreateFrame('Frame', "DP_2", E.UIParent)
-local dp3 = CreateFrame('Frame', "DP_3", E.UIParent)
-local dp4 = CreateFrame('Frame', "DP_4", E.UIParent)
-local dp5 = CreateFrame('Frame', "DP_5", E.UIParent)
-local dp6 = CreateFrame('Frame', "DP_6", E.UIParent)
-local top = CreateFrame('Frame', "Top_Center", E.UIParent)
-local bottom = CreateFrame('Frame', "Bottom_Panel", E.UIParent)
-local rchat = CreateFrame('Frame', "Right_Chat_SLE", E.UIParent)
-local lchat = CreateFrame('Frame', "Left_Chat_SLE", E.UIParent)
-
--- Move Elv's Datatext Panel Transparency Option to our section
--- Make Drunk Russian handle elvs dt panel transparency
-
-local panels = {
-	--Panel = short, name, point, x, panel, slot
-	DP_1 = {"dp1", "DP_1", "TOPLEFT", 0, DP_1, 3},
-	DP_2 = {"dp2", "DP_2", "TOP", -((E.eyefinity or E.screenwidth)/5), DP_2, 3},
-	DP_3 = {"dp3", "DP_3", "TOP", ((E.eyefinity or E.screenwidth)/5), DP_3, 3},
-	DP_4 = {"dp4", "DP_4", "TOPRIGHT", 0, DP_4, 3},
-	DP_5 = {"dp5", "DP_5", "BOTTOM", -((E.eyefinity or E.screenwidth)/6 - 15), DP_5, 3},
-	DP_6 = {"dp6", "DP_6", "BOTTOM", ((E.eyefinity or E.screenwidth)/6 - 15), DP_6, 3},
-	Top_Center = {"top", "Top_Center", "TOP", 0, Top_Center, 1},
-	Bottom_Panel = {"bottom", "Bottom_Panel", "BOTTOM", 0, Bottom_Panel, 1},
+local _G = _G
+local CreateFrame = CreateFrame
+DTP.values = {
+	[1] = {"TOPLEFT", 0, 3},
+	[2] = {"TOP", -((E.eyefinity or E.screenwidth)/5), 3},
+	[3] = {"TOP", 0, 1},
+	[4] = {"TOP", ((E.eyefinity or E.screenwidth)/5), 3},
+	[5] = {"TOPRIGHT", 0, 3},
+	[6] = {"BOTTOM", -((E.eyefinity or E.screenwidth)/6 - 15), 3},
+	[7] = {"BOTTOM", 0, 1},
+	[8] = {"BOTTOM", ((E.eyefinity or E.screenwidth)/6 - 15), 3},
 }
+DTP.Names = {}

--- New panels
-local function CreateDataPanels(panel, name, point, x, slot, short)
-	panel:SetFrameStrata('LOW')
-	panel:Point(point, E.UIParent, point, x, 0);
-	DT:RegisterPanel(panel, slot, 'ANCHOR_BOTTOM', 0, -4)
-	panel:Hide()
+local function Bar_OnEnter(self)
+	if DTP.db["panel"..self.Num].mouseover then
+		E:UIFrameFadeIn(self, 0.2, self:GetAlpha(), 1)
+	end
 end

-local function PanelResize()
-	local db = E.db.sle.datatext
-	for _,v in pairs(panels) do
-		v[5]:Size(db[v[1]].width, 20)
+local function Button_OnEnter(self)
+	local bar = self:GetParent()
+	if DTP.db["panel"..bar.Num].mouseover then
+		E:UIFrameFadeIn(bar, 0.2, bar:GetAlpha(), 1)
 	end
-	DT:UpdateAllDimensions()
 end

-local function AddPanels()
-	for _,v in pairs(panels) do
-		CreateDataPanels(v[5], v[2], v[3], v[4], v[6], v[1])
+local function Bar_OnLeave(self)
+	if DTP.db["panel"..self.Num].mouseover then
+		E:UIFrameFadeOut(self, 0.2, self:GetAlpha(), 0)
 	end
+end

-	PanelResize()
-
-	for _,v in pairs(panels) do
-		E:CreateMover(v[5], v[2].."_Mover", L[v[2]], nil, nil, nil, "ALL,S&L,S&L DT")
+local function Button_OnLeave(self)
+	local bar = self:GetParent()
+	if DTP.db["panel"..bar.Num].mouseover then
+		E:UIFrameFadeOut(bar, 0.2, bar:GetAlpha(), 0)
 	end
 end

-function DTP:ChatResize()
-	LeftChatDataPanel:SetAlpha(E.db.sle.datatext.chatleft.alpha)
-	LeftChatToggleButton:SetAlpha(E.db.sle.datatext.chatleft.alpha)
-	RightChatDataPanel:SetAlpha(E.db.sle.datatext.chatright.alpha)
-	RightChatToggleButton:SetAlpha(E.db.sle.datatext.chatright.alpha)
-	if not E.db.sle.datatext.chathandle then return end
-	LeftChatDataPanel:Point('TOPRIGHT', LeftChatPanel, 'BOTTOMLEFT', 16 + E.db.sle.datatext.chatleft.width, (E.PixelMode and 1 or -1))
-	RightChatDataPanel:Point('BOTTOMLEFT', RightChatPanel, 'BOTTOMRIGHT', - E.db.sle.datatext.chatright.width - 16, (E.PixelMode and -19 or -21))
-end
-
---Showing panels
-function DTP:ExtraDataBarSetup()
-	local db = E.db.sle.datatext
-	for _,v in pairs(panels) do
-		if db[v[1]].enabled then
-			v[5]:Show()
-		else
-			v[5]:Hide()
-		end
-		if not E.private.sle.datatext[v[1].."hide"] then
-			v[5]:SetAlpha(E.db.sle.datatext[v[1]].alpha)
-			if db[v[1]].transparent then
-				v[5]:SetTemplate("Transparent")
-			else
-				v[5]:SetTemplate("Default", true)
+function DTP:MouseoverHook()
+	for panelName, panel in T.pairs(DT.RegisteredPanels) do
+		for i=1, panel.numPoints do
+			local pointIndex = DT.PointLocation[i]
+			if DTP.Names[panelName] then
+				panel.dataPanels[pointIndex]:HookScript("OnEnter", Button_OnEnter)
+				panel.dataPanels[pointIndex]:HookScript("OnLeave", Button_OnLeave)
 			end
 		end
 	end
 end

-function DTP:Update()
-	DTP:ExtraDataBarSetup()
-	DTP:RegisterHide()
-	PanelResize()
+function DTP:CreatePanel(i)
+	local panel = CreateFrame('Frame', "SLE_DataPanel_"..i, E.UIParent)
+	panel.Num = i
+	panel:SetFrameStrata('LOW')
+	panel:Point(DTP.values[i][1], E.UIParent, DTP.values[i][1], DTP.values[i][2], 0);
+	DT:RegisterPanel(panel, DTP.values[i][3], 'ANCHOR_BOTTOM', 0, -4)
+	panel:SetScript("OnEnter", Bar_OnEnter)
+	panel:SetScript("OnLeave", Bar_OnLeave)
+	panel:Hide()
+	DTP.Names["SLE_DataPanel_"..i] = true
+
+	return panel
+end
+
+function DTP:Mouseover(i)
+	if DTP.db["panel"..i].mouseover then
+		self["Panel_"..i]:SetAlpha(0)
+	else
+		self["Panel_"..i]:SetAlpha(1)
+	end
+end
+
+function DTP:Size(i)
+	self["Panel_"..i]:Size(DTP.db["panel"..i].width, 20)
+	DT:UpdateAllDimensions()
 end

-function DTP:RegisterHide()
-	local db = E.db.sle.datatext
-	for k,v in pairs(panels) do
-		if db[v[1]].pethide then
-			E.FrameLocks[k] = true
+function DTP:Toggle(i)
+	if DTP.db["panel"..i].enabled then
+		self["Panel_"..i]:Show()
+		E:EnableMover(self["Panel_"..i].mover:GetName())
+	else
+		self["Panel_"..i]:Hide()
+		E:DisableMover(self["Panel_"..i].mover:GetName())
+	end
+end
+
+function DTP:PetHide(i)
+	E.FrameLocks[self["Panel_"..i]] = DTP.db["panel"..i].pethide or nil
+end
+
+function DTP:Template(i)
+	if not DTP.db["panel"..i].noback then
+		if DTP.db["panel"..i].transparent then
+			self["Panel_"..i]:SetTemplate("Transparent")
 		else
-			E.FrameLocks[k] = nil
+			self["Panel_"..i]:SetTemplate("Default", true)
 		end
 	end
 end

---Renew panels after loading screens
-function DTP:PLAYER_ENTERING_WORLD(...)
-	DTP:ExtraDataBarSetup()
-	DTP:RegisterHide()
+function DTP:Alpha(i)
+	self["Panel_"..i]:SetAlpha(DTP.db["panel"..i].alpha)
+end
+
+function DTP:ChatResize()
+	_G["LeftChatDataPanel"]:SetAlpha(DTP.db.leftchat.alpha)
+	_G["LeftChatToggleButton"]:SetAlpha(DTP.db.leftchat.alpha)
+	_G["RightChatDataPanel"]:SetAlpha(DTP.db.rightchat.alpha)
+	_G["RightChatToggleButton"]:SetAlpha(DTP.db.rightchat.alpha)
+	if not DTP.db.chathandle then return end
+	_G["LeftChatDataPanel"]:Width(DTP.db.leftchat.width - E.Spacing*2)
+	_G["RightChatDataPanel"]:Width(DTP.db.rightchat.width  - E.Spacing*2)
+end
+
+function DTP:CreateAndUpdatePanels()
+	for i = 1, 8 do
+		if not self["Panel_"..i] then self["Panel_"..i] = DTP:CreatePanel(i) end
+		DTP:Size(i)
+		DTP:Template(i)
+		if not E.CreatedMovers["SLE_DataPanel_"..i.."_Mover"] then E:CreateMover(self["Panel_"..i], "SLE_DataPanel_"..i.."_Mover", L["SLE_DataPanel_"..i], nil, nil, nil, "ALL,S&L,S&L DT") end
+		DTP:Toggle(i)
+		DTP:PetHide(i)
+		DTP:Alpha(i)
+		DTP:Mouseover(i)
+	end
 	DTP:ChatResize()
-	self:UnregisterEvent("PLAYER_ENTERING_WORLD");
+end
+
+function DTP:DeleteCurrencyEntry(data)
+	if ElvDB['gold'][data.realm][data.name] then
+		ElvDB['gold'][data.realm][data.name] = nil;
+	end
+	if ElvDB['class'] then
+		if ElvDB['class'][data.realm][data.name] then
+			ElvDB['class'][data.realm][data.name] = nil;
+		end
+	end
+	if ElvDB['faction'] then
+		if ElvDB['faction'][data.realm][FACTION_ALLIANCE][data.name] then
+			ElvDB['faction'][data.realm][FACTION_ALLIANCE][data.name] = nil;
+		end
+		if ElvDB['faction'][data.realm][FACTION_HORDE][data.name] then
+			ElvDB['faction'][data.realm][FACTION_HORDE][data.name] = nil;
+		end
+	end
+	SLE.ACD:ConfigTableChanged(nil, "ElvUI")
 end

 function DTP:Initialize()
-	AddPanels()
-	self:RegisterEvent('PLAYER_ENTERING_WORLD')
-end
\ No newline at end of file
+	if not SLE.initialized then return end
+
+	function DTP:ForUpdateAll()
+		DTP.db = E.db.sle.datatexts
+		DTP:CreateAndUpdatePanels()
+	end
+
+	DTP:ForUpdateAll()
+	--Datatexts
+	DTP:HookTimeDT()
+	DTP:HookDurabilityDT()
+	DTP:CreateMailDT()
+	DTP:CreateCurrencyDT()
+
+	--Remove char
+	local popup = E.PopupDialogs['SLE_CONFIRM_DELETE_CURRENCY_CHARACTER']
+	popup.OnAccept = DTP.DeleteCurrencyEntry,
+
+	hooksecurefunc(DT, "LoadDataTexts", DTP.MouseoverHook)
+end
+
+SLE:RegisterModule(DTP:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/elvConfig.lua b/ElvUI_SLE/modules/elvConfig.lua
new file mode 100644
index 0000000..7e171af
--- /dev/null
+++ b/ElvUI_SLE/modules/elvConfig.lua
@@ -0,0 +1,61 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local EC = SLE:NewModule("ElvConfig", "AceEvent-3.0")
+
+function EC:ADDON_LOADED(event, addon)
+	if addon ~= "ElvUI_Config" then return end
+	EC:UnregisterEvent(event)
+	EC:UpdateActionbars()
+	EC:UpdateUitframes()
+end
+
+function EC:UpdateActionbars()
+	local extra = T.IsAddOnLoaded('ElvUI_ExtraActionBars')
+	if extra then
+		if not E.Options.args.blazeplugins then
+			E:Delay(0.1, EC.UpdateActionbars)
+			return
+		end
+		for i = 7, 10 do
+			E.Options.args.blazeplugins.args.EAB.args['bar'..i].args.buttonspacing.min = -4
+		end
+	end
+	for i=1, 6 do
+		E.Options.args.actionbar.args['bar'..i].args.buttonspacing.min = -4
+	end
+	E.Options.args.actionbar.args.barPet.args.buttonspacing.min = -4
+	E.Options.args.actionbar.args.stanceBar.args.buttonspacing.min = -4
+end
+
+function EC:UpdateUitframes()
+	E.Options.args.unitframe.args.boss.args.spacing.min = -4
+	E.Options.args.unitframe.args.arena.args.spacing.min = -4
+
+	E.Options.args.unitframe.args.party.args.general.args.positionsGroup.args.horizontalSpacing.min = -4
+	E.Options.args.unitframe.args.party.args.general.args.positionsGroup.args.verticalSpacing.min = -4
+
+	E.Options.args.unitframe.args.raid.args.general.args.positionsGroup.args.horizontalSpacing.min = -4
+	E.Options.args.unitframe.args.raid.args.general.args.positionsGroup.args.verticalSpacing.min = -4
+
+	E.Options.args.unitframe.args.raid40.args.general.args.positionsGroup.args.horizontalSpacing.min = -4
+	E.Options.args.unitframe.args.raid40.args.general.args.positionsGroup.args.verticalSpacing.min = -4
+
+	E.Options.args.unitframe.args.raidpet.args.general.args.positionsGroup.args.horizontalSpacing.min = -4
+	E.Options.args.unitframe.args.raidpet.args.general.args.positionsGroup.args.verticalSpacing.min = -4
+
+	E.Options.args.unitframe.args.tank.args.general.args.verticalSpacing.min = -4
+	E.Options.args.unitframe.args.assist.args.general.args.verticalSpacing.min = -4
+
+	for unit, settings in T.pairs(E.Options.args.unitframe.args) do
+		if E.Options.args.unitframe.args[unit].args and E.Options.args.unitframe.args[unit].args.portrait then
+			E.Options.args.unitframe.args[unit].args.portrait.args.camDistanceScale.max = 7
+		end
+	end
+end
+
+function EC:Initialize()
+	if not SLE.initialized then return end
+	if not E.global.sle.advanced.optionsLimits then return end
+	self:RegisterEvent("ADDON_LOADED")
+end
+
+SLE:RegisterModule(EC:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/equipmanager.lua b/ElvUI_SLE/modules/equipmanager.lua
index 55bdb49..a5a99c0 100644
--- a/ElvUI_SLE/modules/equipmanager.lua
+++ b/ElvUI_SLE/modules/equipmanager.lua
@@ -1,117 +1,93 @@
-local E, L, V, P, G = unpack(ElvUI);
-local EM = E:GetModule('SLE_EquipManager')
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local EM = SLE:NewModule('EquipManager', 'AceHook-3.0', 'AceEvent-3.0')
+local GetRealZoneText = GetRealZoneText
+EM.Processing = false

-local GetEquipmentSetInfo, GetSpecialization, GetActiveSpecGroup, UseEquipmentSet = GetEquipmentSetInfo, GetSpecialization, GetActiveSpecGroup, UseEquipmentSet
-local IsInInstance, GetNumWorldPVPAreas, GetWorldPVPAreaInfo = IsInInstance, GetNumWorldPVPAreas, GetWorldPVPAreaInfo
-local gsub, strfind = string.gsub, string.find, string.sub
+local SpecTable = {
+	[1] = "firstSpec",
+	[2] = "secondSpec",
+	[3] = "thirdSpec",
+	[4] = "forthSpec",
+}

-local function Equip(event)
-	local primary = GetSpecialization()
+function EM:GetData()
+	local spec = T.GetSpecialization()
 	local equipSet
-	local pvp = false
-	for i = 1, GetNumEquipmentSets() do
-		local name, _, _, isEquipped = GetEquipmentSetInfo(i)
+	for i = 1, T.GetNumEquipmentSets() do
+		local name, _, _, isEquipped = T.GetEquipmentSetInfo(i)
 		if isEquipped then
 			equipSet = name
 			break
 		end
 	end
+	return spec, equipSet
+end

-	if primary ~= nil then
-		local inInstance, instanceType = IsInInstance()
-
-		if (event == "ACTIVE_TALENT_GROUP_CHANGED") then
-			if GetActiveSpecGroup() == 1 then
-				if equipSet ~= E.private.sle.equip.primary and E.private.sle.equip.primary ~= "NONE" then
-					UseEquipmentSet(E.private.sle.equip.primary)
-					return
-				end
-			else
-				if equipSet ~= E.private.sle.equip.secondary and E.private.sle.equip.secondary ~= "NONE" then
-					UseEquipmentSet(E.private.sle.equip.secondary)
-					return
-				end
-			end
-		end
-
-		if (instanceType == "party" or instanceType == "raid") then
-			if equipSet ~= E.private.sle.equip.instance and E.private.sle.equip.instance ~= "NONE" then
-				UseEquipmentSet(E.private.sle.equip.instance)
-				return
-			end
-		end
-
-		if (instanceType == "pvp" or instanceType == "arena") then
-			pvp = true
-			if equipSet ~= E.private.sle.equip.pvp and E.private.sle.equip.pvp ~= "NONE" then
-				UseEquipmentSet(E.private.sle.equip.pvp)
-				return
-			end
-		end
+function EM:IsPvP(inInstance, instanceType)
+	if inInstance and (instanceType == "pvp" or instanceType == "arena") then return true end
+	for i = 1, T.GetNumWorldPVPAreas() do
+		local _, localizedName, isActive, canQueue = T.GetWorldPVPAreaInfo(i)
+		if (T.GetRealZoneText() == localizedName and isActive) or (GetRealZoneText() == localizedName and canQueue) then return true end
+	end
+	return false
+end

-		if E.private.sle.equip.pvp ~= "NONE" then
-			for i = 1, GetNumWorldPVPAreas() do
-				local _, localizedName, isActive = GetWorldPVPAreaInfo(i)
+function EM:IsDungeon(inInstance, instanceType)
+	if inInstance and (instanceType ==  "scenario" or instanceType == "party" or instanceType == "raid") then return true end
+	return false
+end

-				if (GetRealZoneText() == localizedName and isActive) then
-					pvp = true
-					if equipSet ~= E.private.sle.equip.pvp then
-						UseEquipmentSet(E.private.sle.equip.pvp)
-						return
-					end
-				end
+function EM:WrongSet(equipSet, group, inCombat)
+	local inInstance, instanceType = T.IsInInstance()
+	if inInstance and ((EM.db.instanceSet and EM.db[group].instance ~= "NONE") or (EM.db.pvpSet and EM.db[group].pvp ~= "NONE")) then
+		if EM:IsDungeon(inInstance, instanceType) and EM.db.instanceSet then
+			if equipSet ~= EM.db[group].instance and EM.db[group].instance ~= "NONE" then
+				if inCombat then SLE:ErrorPrint(L["Impossible to switch to appropriate equipment set in combat. Will switch after combat ends."]); return false end
+				return true, EM.db[group].instance
 			end
 		end
-
-		if event == "ZONE_CHANGED" then
-			if (equipSet ~= E.private.sle.equip.primary and E.private.sle.equip.primary ~= "NONE") and (equipSet ~= E.private.sle.equip.secondary and E.private.sle.equip.secondary ~= "NONE") and equipSet == E.private.sle.equip.pvp and not pvp then
-				if GetActiveSpecGroup() == 1 then
-					UseEquipmentSet(E.private.sle.equip.primary)
-					return
-				else
-					UseEquipmentSet(E.private.sle.equip.secondary)
-					return
-				end
+		if EM:IsPvP(inInstance, instanceType) and EM.db.pvpSet then
+			if equipSet ~= EM.db[group].pvp and EM.db[group].pvp ~= "NONE" then
+				if inCombat then SLE:ErrorPrint(L["Impossible to switch to appropriate equipment set in combat. Will switch after combat ends."]); return false end
+				return true, EM.db[group].pvp
 			end
 		end
 	end
-end
-
-function EM:EquipSpamFilter(event, msg, ...)
-	if strfind(msg, string.gsub(ERR_LEARN_ABILITY_S:gsub('%.', '%.'), '%%s', '(.*)')) then
-		return true
-	elseif strfind(msg, string.gsub(ERR_LEARN_SPELL_S:gsub('%.', '%.'), '%%s', '(.*)')) then
-		return true
-	elseif strfind(msg, string.gsub(ERR_SPELL_UNLEARNED_S:gsub('%.', '%.'), '%%s', '(.*)')) then
-		return true
-	elseif strfind(msg, string.gsub(ERR_LEARN_PASSIVE_S:gsub('%.', '%.'), '%%s', '(.*)')) then
-		return true
+	if equipSet ~= EM.db[group].general and EM.db[group].general ~= "NONE" then
+		if inCombat then SLE:ErrorPrint(L["Impossible to switch to appropriate equipment set in combat. Will switch after combat ends."]); return false end
+		return true, EM.db[group].general
 	end
-
-	return false, msg, ...
-end
-
-local function EnableSpamFilter()
-	ChatFrame_AddMessageEventFilter("CHAT_MSG_SYSTEM", EM.EquipSpamFilter)
-end
-
-local function DisableSpamFilter()
-	ChatFrame_RemoveMessageEventFilter("CHAT_MSG_SYSTEM", EM.EquipSpamFilter)
+	return false
 end

-function EM:SpamThrottle()
-	if E.private.sle.equip.spam then
-		EnableSpamFilter()
-	else
-		DisableSpamFilter()
+local function Equip(event)
+	if EM.Processing then return end
+	EM.Processing = true
+	local inCombat = false
+	E:Delay(1, function() EM.Processing = false end)
+	if T.InCombatLockdown() then
+		EM:RegisterEvent("PLAYER_REGEN_ENABLED", Equip)
+		inCombat = true
+	end
+	if event == "PLAYER_REGEN_ENABLED" then
+		EM:UnregisterEvent(event)
+	end
+	local spec, equipSet = EM:GetData()
+	if spec ~= nil then --In case you don't have spec
+		local isWrong, trueSet = EM:WrongSet(equipSet, SpecTable[spec], inCombat)
+		if isWrong then
+			T.UseEquipmentSet(trueSet)
+		end
 	end
 end

 function EM:Initialize()
-	EM:SpamThrottle()
-	if not E.private.sle.equip.enable then return end
+	EM.db = E.private.sle.equip
+	if not SLE.initialized then return end
+	if not EM.db.enable then return end
 	self:RegisterEvent("PLAYER_ENTERING_WORLD", Equip)
 	self:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED", Equip)
-	self:RegisterEvent("PLAYER_TALENT_UPDATE", Equip)
 	self:RegisterEvent("ZONE_CHANGED", Equip)
-end
\ No newline at end of file
+end
+
+SLE:RegisterModule(EM:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/errorframe.lua b/ElvUI_SLE/modules/errorframe.lua
deleted file mode 100644
index d4cfe73..0000000
--- a/ElvUI_SLE/modules/errorframe.lua
+++ /dev/null
@@ -1,11 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local F = E:GetModule('SLE_ErrorFrame');
-
-function F:SetSize()
-	UIErrorsFrame:SetSize(E.db.sle.errorframe.width, E.db.sle.errorframe.height) --512 x 60
-end
-
-function F:Initialize()
-	F:SetSize()
-	E:CreateMover(UIErrorsFrame, "UIErrorsFrameMover", L["Error Frame"], nil, nil, nil, "ALL,S&L,S&L MISC")
-end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/exprepbar.lua b/ElvUI_SLE/modules/exprepbar.lua
deleted file mode 100644
index fdc4df2..0000000
--- a/ElvUI_SLE/modules/exprepbar.lua
+++ /dev/null
@@ -1,233 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local M = E:GetModule('Misc');
-
-local strMatchCombat = {}
-local tinsert, gsub, format = tinsert, string.gsub, format
-local GetXPExhaustion = GetXPExhaustion
-local SetMinMaxValues = SetMinMaxValues
-local GetFactionInfo = GetFactionInfo
-local GetGuildInfo = GetGuildInfo
-
-tinsert(strMatchCombat, (gsub(FACTION_STANDING_INCREASED,"%%%d?%$?s", "(.+)")))
-tinsert(strMatchCombat, (gsub(FACTION_STANDING_INCREASED_GENERIC,"%%%d?%$?s", "(.+)")))
-tinsert(strMatchCombat, (gsub(FACTION_STANDING_INCREASED_BONUS,"%%%d?%$?s", "(.+)")))
-tinsert(strMatchCombat, (gsub(FACTION_STANDING_INCREASED_DOUBLE_BONUS,"%%%d?%$?s", "(.+)")))
-tinsert(strMatchCombat, (gsub(FACTION_STANDING_INCREASED_ACH_BONUS,"%%%d?%$?s", "(.+)")))
-local strChangeMatch = (gsub(FACTION_STANDING_CHANGED,"%%%d?%$?s", "(.+)"))
-local strGuildChangeMatch = {}
-tinsert(strGuildChangeMatch, (gsub(FACTION_STANDING_CHANGED_GUILD,"%%%d?%$?s", "(.+)")))
-tinsert(strGuildChangeMatch, (gsub(FACTION_STANDING_CHANGED_GUILDNAME,"%%%d?%$?s", "(.+)")))
-
-local collapsed = {}
-local guildName
-
-local function UpdateExperience(self, event)
-	if not E.db.sle.exprep.explong then return end
-	local bar = self.expBar
-
-	if not UnitLevel('player') == MAX_PLAYER_LEVEL or not IsXPUserDisabled() then
-		local cur, max = self:GetXP('player')
-		local rested = GetXPExhaustion()
-		local text = ''
-		local textFormat = E.db.general.experience.textFormat
-
-		if rested and rested > 0 then
-				if textFormat == 'PERCENT' then
-					text = format('%d%%  '..L['Rested:']..' %d%%', cur / max * 100, rested / max * 100)
-				elseif textFormat == 'CURMAX' then
-					text = format('%s - %s  '..L['Rested:']..' %s', cur, max, rested)
-				elseif textFormat == 'CURPERC' then
-					text = format('%s - %d%%  '..L['Rested:']..' %s [%d%%]', cur, cur / max * 100, rested, rested / max * 100)
-				end
-		else
-				if textFormat == 'PERCENT' then
-					text = format('%d%%', cur / max * 100)
-				elseif textFormat == 'CURMAX' then
-					text = format('%s - %s', cur, max)
-				elseif textFormat == 'CURPERC' then
-					text = format('%s - %d%%', cur, cur / max * 100)
-				end
-		end
-
-		bar.text:SetText(text)
-	end
-end
-
-local backupColor = FACTION_BAR_COLORS[1]
-local FactionStandingLabelUnknown = UNKNOWN
-local function UpdateReputation(self, event)
-	if not E.db.sle.exprep.replong then return end
-	local bar = self.repBar
-	local ID
-	local isFriend, friendText, standingLabel
-	local name, reaction, min, max, value = GetWatchedFactionInfo()
-	local numFactions = GetNumFactions();
-
-	if name then
-		local text = ''
-		local textFormat = E.db.general.reputation.textFormat
-		local color = FACTION_BAR_COLORS[reaction] or backupColor
-		bar.statusBar:SetStatusBarColor(color.r, color.g, color.b)
-
-		bar.statusBar:SetMinMaxValues(min, max)
-		bar.statusBar:SetValue(value)
-
-		for i=1, numFactions do
-			local factionName, _, standingID,_,_,_,_,_,_,_,_,_,_, factionID = GetFactionInfo(i);
-			local friendID, friendRep, friendMaxRep, _, _, _, friendTextLevel = GetFriendshipReputation(factionID);
-			if factionName == name then
-				if friendID ~= nil then
-					isFriend = true
-					friendText = friendTextLevel
-				else
-					ID = standingID
-				end
-			end
-		end
-
-		if ID then
-			standingLabel = _G['FACTION_STANDING_LABEL'..ID]
-		else
-			standingLabel = FactionStandingLabelUnknown
-		end
-
-		if textFormat == 'PERCENT' then
-			text = format('%s: %d%% [%s]', name, ((value - min) / (max - min) * 100), isFriend and friendText or _G['FACTION_STANDING_LABEL'..ID])
-		elseif textFormat == 'CURMAX' then
-			text = format('%s: %s - %s [%s]', name, value - min, max - min, isFriend and friendText or _G['FACTION_STANDING_LABEL'..ID])
-		elseif textFormat == 'CURPERC' then
-			text = format('%s: %s - %d%% [%s]', name, value - min, ((value - min) / (max - min) * 100), isFriend and friendText or _G['FACTION_STANDING_LABEL'..ID])
-		end
-
-		bar.text:SetText(text)
-	end
-end
-
-function M:ChatMsgCombat(event, ...)
-	if not E.private.sle.exprep.autotrack then return end
-
-	local messg = ...
-	local found
-	for i, v in ipairs(strMatchCombat) do
-		found = (string.match(messg,strMatchCombat[i]))
-		if found then
-			if GUILD and guildName and (found == GUILD) then
-				found = guildName
-			end
-			break
-		end
-	end
-	if found then
-		M:setWatchedFaction(found)
-	end
-end
-
-function M:CombatTextUpdate(event, ...)
-	if not E.private.sle.exprep.autotrack then return end
-
-	local messagetype, faction, amount = ...
-	if messagetype ~= "FACTION" then return end
-	if (not amount) or (amount < 0) then return end
-	if GUILD and faction and guildName and (faction == GUILD) then
-		faction = guildName
-	end
-	if faction then
-		M:setWatchedFaction(faction)
-	end
-end
-
-function M:ChatMsgSys(event, ...)
-	if not E.private.sle.exprep.autotrack then return end
-
-	local messg = ...
-	local found
-	local newfaction = (string.match(messg,strChangeMatch)) and select(2,string.match(messg,strChangeMatch))
-	if newfaction then
-		if guildName and (newfaction == GUILD) then
-			found = guildName
-		else
-			found = newfaction
-		end
-	else
-		local guildfaction
-		for i, v in ipairs(strGuildChangeMatch) do
-			guildfaction = (string.match(messg,strGuildChangeMatch[i]))
-			if guildfaction then
-				break
-			end
-		end
-		if guildfaction and guildName then
-			found = guildName
-		end
-	end
-	if found then
-		M:setWatchedFaction(found)
-	end
-end
-
-function M:PlayerRepLogin()
-	if IsInGuild() then
-		guildName = (GetGuildInfo("player"))
-		if not guildName then
-			M:RegisterEvent("GUILD_ROSTER_UPDATE", 'PlayerGuildRosterUpdate')
-		end
-	end
-end
-
-function M:PlayerGuildRosterUpdate()
-	if IsInGuild() then
-		guildName = (GetGuildInfo("player"))
-	end
-	if guildName then
-		M:UnregisterEvent("GUILD_ROSTER_UPDATE")
-	end
-end
-
-function M:PlayerGuildRepUdate()
-	if IsInGuild() then
-		guildName = (GetGuildInfo("player"))
-		if not guildName then
-			M:RegisterEvent("GUILD_ROSTER_UPDATE", 'PlayerGuildRosterUpdate')
-		end
-	else
-		guildName = nil
-	end
-end
-
-function M:setWatchedFaction(faction)
-	wipe(collapsed)
-	local i,j = 1, GetNumFactions()
-	while i <= j do
-		local name,_,_,_,_,_,_,_,isHeader,isCollapsed,_,isWatched = GetFactionInfo(i)
-		if name == faction then
-			if not (isWatched or IsFactionInactive(i)) then
-				SetWatchedFactionIndex(i)
-			end
-			break
-		end
-		if isHeader and isCollapsed then
-			ExpandFactionHeader(i)
-			collapsed[i] = true
-			j = GetNumFactions()
-		end
-		i = i+1
-	end
-	if next(collapsed) then
-		for k=i,1,-1 do
-			if collapsed[k] then
-				CollapseFactionHeader(k)
-			end
-		end
-	end
-end
-
-hooksecurefunc(M, "Initialize", function(self,...)
-	M:RegisterEvent("CHAT_MSG_COMBAT_FACTION_CHANGE", 'ChatMsgCombat')
-	M:RegisterEvent("COMBAT_TEXT_UPDATE", 'CombatTextUpdate')
-	M:RegisterEvent("CHAT_MSG_SYSTEM", 'ChatMsgSys')
-	M:RegisterEvent("PLAYER_LOGIN", 'PlayerRepLogin')
-	M:RegisterEvent("PLAYER_GUILD_UPDATE", 'PlayerGuildRepUdate')
-end)
-
-hooksecurefunc(M, "UpdateExperience", UpdateExperience)
-hooksecurefunc(M, "UpdateReputation", UpdateReputation)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/farm.lua b/ElvUI_SLE/modules/farm.lua
deleted file mode 100644
index 170fc31..0000000
--- a/ElvUI_SLE/modules/farm.lua
+++ /dev/null
@@ -1,700 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local B = LibStub("LibBabble-SubZone-3.0")
-local BL = B:GetLookupTable()
-local F = E:GetModule('SLE_Farm')
-local SLE = E:GetModule('SLE');
-local S = E:GetModule("Skins")
-
-local SeedAnchor, ToolAnchor, PortalAnchor, SalvageAnchor, MineAnchor
-local tsort, format = table.sort, format
-local farmzones = { BL["Sunsong Ranch"], BL["The Halfhill Market"] }
-local garrisonzones = { BL["Salvage Yard"], BL["Frostwall Mine"], BL["Lunarfall Excavation"]}
-local size
-local Zcheck = false
-local GetSubZoneText = GetSubZoneText
-local InCombatLockdown = InCombatLockdown
-local GetItemCount, GetItemInfo = GetItemCount, GetItemInfo
-local Point = Point
-local playerFaction = UnitFactionGroup('player')
-
-
-FseedButtons = {}
-FtoolButtons = {}
-FportalButtons = {}
-FsalvageButtons = {}
-FminingButtons = {}
-
-local seeds = {
-	--Seeds general
-	[79102] = { 1 }, -- Green Cabbage
-	[89328] = { 1 }, -- Jade Squash
-	[80590] = { 1 }, -- Juicycrunch Carrot
-	[80592] = { 1 }, -- Mogu Pumpkin
-	[80594] = { 1 }, -- Pink Turnip
-	[80593] = { 1 }, -- Red Blossom Leek
-	[80591] = { 1 }, -- Scallion
-	[89329] = { 1 }, -- Striped Melon
-	[80595] = { 1 }, -- White Turnip
-	[89326] = { 1 }, -- Witchberry
-	--Bags general
-	[80809] = { 2 }, -- Green Cabbage
-	[89848] = { 2 }, -- Jade Squash
-	[84782] = { 2 }, -- Juicycrunch Carrot
-	[85153] = { 2 }, -- Mogu Pumpkin
-	[85162] = { 2 }, -- Pink Turnip
-	[85158] = { 2 }, -- Red Blossom Leek
-	[84783] = { 2 }, -- Scallion
-	[89849] = { 2 }, -- Striped Melon
-	[85163] = { 2 }, -- White Turnip
-	[89847] = { 2 }, -- Witchberry
-	--Seeds special
-	[85216] = { 3 }, -- Enigma
-	[85217] = { 3 }, -- Magebulb
-	[85219] = { 3 }, -- Ominous
-	[89202] = { 3 }, -- Raptorleaf
-	[85215] = { 3 }, -- Snakeroot
-	[89233] = { 3 }, -- Songbell
-	[91806] = { 3 }, -- Unstable Portal
-	[89197] = { 3 }, -- Windshear Cactus
-	--Bags special
-	[95449] = { 4 }, -- Enigma
-	[95451] = { 4 }, -- Magebulb
-	[95457] = { 4 }, -- Raptorleaf
-	[95447] = { 4 }, -- Snakeroot
-	[95445] = { 4 }, -- Songbell
-	[95454] = { 4 }, -- Windshear Cactus
-	--Trees lol
-	[85267] = { 5 }, -- Autumn Blossom Sapling
-	[85268] = { 5 }, -- Spring Blossom Sapling
-	[85269] = { 5 }, -- Winter Blossom Sapling
-}
-
-local addseeds = {
-	[95434] = { 80809 }, -- Green Cabbage
-	[95437] = { 89848 }, -- Jade Squash
-	[95436] = { 84782 }, -- Juicycrunch Carrot
-	[95438] = { 85153 }, -- Mogu Pumpkin
-	[95439] = { 85162 }, -- Pink Turnip
-	[95440] = { 85158 }, -- Red Blossom Leek
-	[95441] = { 84783 }, -- Scallion
-	[95442] = { 89849 }, -- Striped Melon
-	[95443] = { 85163 }, -- White Turnip
-	[95444] = { 89847 }, -- Witchberry
-
-	[95450] = { 95449 }, -- Enigma
-	[95452] = { 95451 }, -- Magebulb
-	[95458] = { 95457 }, -- Raptorleaf
-	[95448] = { 95447 }, -- Snakeroot
-	[95446] = { 95445 }, -- Songbell
-	[95456] = { 95454 }, -- Windshear Cactus
-}
-
-local tools = {
-	[79104]	= { 1 }, -- Rusy Watering Can
-	[80513] = { 1 }, -- Vintage Bug Sprayer
-	[89880] = { 1 }, -- Dented Shovel
-	[89815] = { 1 }, -- Master Plow
-}
-
-local portals = {
-	[91850] = { "Horde" }, -- Orgrimmar Portal Shard
-	[91861] = { "Horde" }, -- Thunder Bluff Portal Shard
-	[91862] = { "Horde" }, -- Undercity Portal Shard
-	[91863] = { "Horde" }, -- Silvermoon Portal Shard
-
-	[91860] = { "Alliance" }, -- Stormwind Portal Shard
-	[91864] = { "Alliance" }, -- Ironforge Portal Shard
-	[91865] = { "Alliance" }, -- Darnassus Portal Shard
-	[91866] = { "Alliance" }, -- Exodar Portal Shard
-}
-
-local quests = {
---Tillers counsil
-	[31945] = {80591, 84783}, -- Gina, Scallion
-	[31946] = {80590, 84782}, -- Mung-Mung, Juicycrunch Carrot
-	[31947] = {79102, 80809}, -- Farmer Fung, Green Cabbage
-	[31949] = {89326, 89847}, -- Nana, Witchberry
-	[30527] = {89329, 89849}, -- Haohan, Striped Melon
-	--Farmer Yoon
-	[31943] = {89326, 89847}, -- Witchberry
-	[31942] = {89329, 89849}, -- Striped Melon
-	[31941] = {89328, 89848}, -- Jade Squash
-	[31669] = {79102, 80809}, -- Green Cabbage
-	[31670] = {80590, 84782}, -- Juicycrunch Carrot
-	[31672] = {80592, 85153}, -- Mogu Pumpkin
-	[31673] = {80593, 85158}, -- Red Blossom Leek
-	[31674] = {80594, 85162}, -- Pink Turnip
-	[31675] = {80595, 85163}, -- White Turnip
-	[31671] = {80591, 84783}, -- Scallion
-	--Work Orders
-	[32645] = {89326, 89847}, -- Witchberry (Alliance Only)
-	[32653] = {89329, 89849}, -- Striped Melon
-	--[31941] = {89328, 89848}, -- Jade Squash
-	[32649] = {79102, 80809}, -- Green Cabbage
-	--[31670] = {80590, 84782}, -- Juicycrunch Carrot
-	[32658] = {80592, 85153}, -- Mogu Pumpkin
-	[32642] = {80593, 85158}, -- Red Blossom Leek (Horde Only)
-	--[31674] = {80594, 85162}, -- Pink Turnip
-	[32647] = {80595, 85163}, -- White Turnip
-	--[31671] = {80591, 84783}, -- Scallion
-}
-
-local salvage = {
-	[114116] = { 1 }, -- Bag of Salvaged Goods
-	[114119] = { 1 }, -- Crate of Salvage
-	[114120] = { 1 }, -- Big Crate of Salvage
-}
-
-local mineTools = {
-	[118903] = { 1 }, -- Minepick
-	[118897] = { 1 }, -- Coffee
-}
-
-local buttoncounts = {}
-
-local function CanSeed()
-	local subzone = GetSubZoneText()
-	for _, zone in ipairs(farmzones) do
-		if (zone == subzone) then
-			return true
-		end
-	end
-	return false
-end
-
-local function OnFarm()
-	return GetSubZoneText() == farmzones[1]
-end
-
-local function InSalvageYard()
-	return GetMinimapZoneText() == garrisonzones[1]
-end
-
-local function InMine()
-	return GetMinimapZoneText() == garrisonzones[playerFaction == "Horde" and 2 or 3]
-end
-
-local function InventoryUpdate(event)
-	if InCombatLockdown() then
-		F:RegisterEvent("PLAYER_REGEN_ENABLED", InventoryUpdate)
-		return
-	else
-		F:UnregisterEvent("PLAYER_REGEN_ENABLED")
- 	end
-
- 	local SeedChange = false
-	for i = 1, 5 do
-		for _, button in ipairs(FseedButtons[i]) do
-			button.items = GetItemCount(button.itemId, nil, true)
-			if i == 2 or i == 4 then
-				for id, v in pairs(addseeds) do
-					if button.itemId == addseeds[id][1] then
-						local nCount = GetItemCount(id, nil, true)
-						button.items = button.items + nCount
-					end
-				end
-			end
-			if not buttoncounts[button.itemId] then
-				buttoncounts[button.itemId] = button.items
-			end
-			if button.items ~= buttoncounts[button.itemId] then
-				SeedChange = true
-				buttoncounts[button.itemId] = button.items
-			end
-			button.text:SetText(button.items)
-			button.icon:SetDesaturated(button.items == 0)
-			button.icon:SetAlpha(button.items == 0 and .25 or 1)
-		end
-	end
-
-	for _, button in ipairs(FtoolButtons) do
-		button.items = GetItemCount(button.itemId)
-		if not buttoncounts[button.itemId] then
-			buttoncounts[button.itemId] = button.items
-		end
-		if button.items ~= buttoncounts[button.itemId] then
-			SeedChange = true
-			buttoncounts[button.itemId] = button.items
-		end
-		button.icon:SetDesaturated(button.items == 0)
-		button.icon:SetAlpha(button.items == 0 and .25 or 1)
-	end
-
-	for _, button in ipairs(FportalButtons) do
-		button.items = GetItemCount(button.itemId)
-		if not buttoncounts[button.itemId] then
-			buttoncounts[button.itemId] = button.items
-		end
-		if button.items ~= buttoncounts[button.itemId] then
-			SeedChange = true
-			buttoncounts[button.itemId] = button.items
-		end
-		button.text:SetText(button.items)
-		button.icon:SetDesaturated(button.items == 0)
-		button.icon:SetAlpha(button.items == 0 and .25 or 1)
-	end
-
-	for _, button in ipairs(FsalvageButtons) do
-		button.items = GetItemCount(button.itemId)
-		if not buttoncounts[button.itemId] then
-			buttoncounts[button.itemId] = button.items
-		end
-		if button.items ~= buttoncounts[button.itemId] then
-			SeedChange = true
-			buttoncounts[button.itemId] = button.items
-		end
-		button.text:SetText(button.items)
-		button.icon:SetDesaturated(button.items == 0)
-		button.icon:SetAlpha(button.items == 0 and .25 or 1)
-	end
-	for _, button in ipairs(FminingButtons) do
-		button.items = GetItemCount(button.itemId)
-		if not buttoncounts[button.itemId] then
-			buttoncounts[button.itemId] = button.items
-		end
-		if button.items ~= buttoncounts[button.itemId] then
-			SeedChange = true
-			buttoncounts[button.itemId] = button.items
-		end
-		button.text:SetText(button.items)
-		button.icon:SetDesaturated(button.items == 0)
-		button.icon:SetAlpha(button.items == 0 and .25 or 1)
-	end
-	if event and event ~= "BAG_UPDATE_COOLDOWN" and SeedChange == true then
-		F:UpdateLayout()
-	end
-end
-
-local function UpdateBarLayout(bar, anchor, buttons)
-	local count = 0
-	size = E.db.sle.farm.size
-	bar:ClearAllPoints()
-	bar:Point("LEFT", anchor, "LEFT", 0, 0)
-
-	for i, button in ipairs(buttons) do
-		button:ClearAllPoints()
-		if not button.items then InventoryUpdate() end
-		if not E.db.sle.farm.active or button.items > 0 then
-			button:Point("TOPLEFT", bar, "TOPLEFT", (count * (size+(E.PixelMode and 2 or 1)))+(E.PixelMode and 1 or 0), -1)
-			button:Show()
-			button:Size(size, size)
-			count = count + 1
-		else
-			button:Hide()
-		end
-	end
-
-	bar:Width(1)
-	bar:Height(size+2)
-
-	return count
-end
-
-local function QuestItems(itemID)
-	for i = 1, GetNumQuestLogEntries() do
-		for qid, sid in pairs(quests) do
-			if qid == select(9,GetQuestLogTitle(i)) then
-				if itemID == sid[1] or itemID == sid[2] then
-					return true
-				end
-			end
-		end
-	end
-
-	return false
-end
-
-local function UpdateButtonCooldown(button)
-	if button.cooldown then
-		button.cooldown:SetCooldown(GetItemCooldown(button.itemId))
-	end
-end
-
-local function UpdateCooldown()
-	if not CanSeed() and not InSalvageYard() and not InMine() then return end
-
-	for i = 1, 5 do
-		for _, button in ipairs(FseedButtons[i]) do
-			UpdateButtonCooldown(button)
-		end
-	end
-	for _, button in ipairs(FtoolButtons) do
-		UpdateButtonCooldown(button)
-	end
-	for _, button in ipairs(FportalButtons) do
-		UpdateButtonCooldown(button)
-	end
-	for _, button in ipairs(FsalvageButtons) do
-		UpdateButtonCooldown(button)
-	end
-	for _, button in ipairs(FminingButtons) do
-		UpdateButtonCooldown(button)
-	end
-end
-
-local function UpdateSeedBarLayout(seedBar, anchor, buttons, category)
-	local count = 0
-	local db = E.db.sle.farm
-	size = db.size
-	local seedor = db.seedor
-	local id
-	seedBar:ClearAllPoints()
-	if category == 1 then
-		if seedor == "TOP" or seedor == "BOTTOM" then
-			seedBar:Point(seedor.."LEFT", anchor, (E.PixelMode and 0 or -2), seedor == "TOP" and 0 or (E.PixelMode and 2 or 0))
-		elseif seedor == "LEFT" or seedor ==  "RIGHT" then
-			seedBar:Point("TOP"..seedor, anchor, E.PixelMode and 2 or (seedor == "LEFT" and 0 or 2), (E.PixelMode and -2 or -2))
-		end
-
-	else
-		if _G[("FarmSeedBar%d"):format(category-1)]:IsShown() then
-			if seedor == "TOP" or seedor == "BOTTOM" then
-				seedBar:Point("TOPLEFT", _G[("FarmSeedBar%d"):format(category-1)], "TOPRIGHT", (E.PixelMode and 0 or -1), 0)
-			elseif seedor == "LEFT" or seedor ==  "RIGHT" then
-				seedBar:Point("TOPLEFT", _G[("FarmSeedBar%d"):format(category-1)], "BOTTOMLEFT", 0, (E.PixelMode and 0 or 1))
-			end
-		else
-			UpdateSeedBarLayout(seedBar, anchor, buttons, category-1)
-		end
-	end
-
-
-	for i, button in ipairs(buttons) do
-		id = button:GetName():gsub("FarmButton", "")
-		id = tonumber(id)
-		button:ClearAllPoints()
-		if not E.db.sle.farm.active or button.items > 0 then
-			if seedor == "TOP" or seedor == "BOTTOM" then
-				local mult = seedor == "TOP" and -1 or 1
-				button:Point(seedor.."LEFT", seedBar, E.PixelMode and 1 or 2, mult*(count * (size+(E.PixelMode and 2 or 1)))-(E.PixelMode and 1 or 0))
-			elseif seedor == "LEFT" or seedor == "RIGHT" then
-				local mult = seedor == "RIGHT" and -1 or 1
-				button:Point("TOPLEFT", seedBar, "TOPLEFT", mult*(count * (size+(E.PixelMode and 2 or 1)))-(E.PixelMode and 1 or 0), E.PixelMode and 1 or 2)
-			end
-			button:Show()
-			button:Size(size, size)
-			count = count + 1
-		else
-			button:Hide()
-		end
-		if E.db.sle.farm.quest then
-			if not CanSeed() then
-				seedBar:Width(size+2)
-				seedBar:Height(size+2)
-				return count
-			end
-			if QuestItems(id) then
-				ActionButton_ShowOverlayGlow(button)
-			else
-				ActionButton_HideOverlayGlow(button)
-			end
-		else
-			ActionButton_HideOverlayGlow(button)
-		end
-	end
-
-	seedBar:Width(size+2)
-	seedBar:Height(size+2)
-
-	return count
-end
-
-local function UpdateBar(bar, layoutfunc, zonecheck, anchor, buttons, category)
-	bar:Show()
-
-	local count = layoutfunc(bar, anchor, buttons, category)
-	if (E.private.sle.farm.enable and count > 0 and zonecheck() and not InCombatLockdown()) then
-		bar:Show()
-	else
-		bar:Hide()
-	end
-end
-
-function F:BAG_UPDATE_COOLDOWN()
-	InventoryUpdate()
-	UpdateCooldown()
-end
-
-local function Zone(event)
-	if CanSeed() or InSalvageYard() or InMine() then
-		F:RegisterEvent("BAG_UPDATE", InventoryUpdate)
-		F:RegisterEvent("BAG_UPDATE_COOLDOWN")
-		F:RegisterEvent("UNIT_QUEST_LOG_CHANGED", "UpdateLayout")
-		F:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED", InventoryUpdate)
-
-		InventoryUpdate(event)
-		F:UpdateLayout()
-		Zcheck = true
-	else
-		F:UnregisterEvent("BAG_UPDATE")
-		F:UnregisterEvent("BAG_UPDATE_COOLDOWN")
-		F:UnregisterEvent("UNIT_QUEST_LOG_CHANGED")
-		F:UnregisterEvent("UNIT_SPELLCAST_SUCCEEDED")
-		if Zcheck then
-			F:UpdateLayout()
-			Zcheck = false
-		end
-	end
-end
-
-local function ResizeFrames()
-	local seedor = E.db.sle.farm.seedor
-	if seedor == "TOP" or seedor == "BOTTOM" then
-		SeedAnchor:Size((size+(E.PixelMode and 2 or 1))*5-(E.PixelMode and 0 or 1), (size+(E.PixelMode and 2 or 1))*10-(E.PixelMode and 0 or 1))
-	elseif seedor == "LEFT" or seedor == "RIGHT" then
-		SeedAnchor:Size((size+(E.PixelMode and 2 or 1))*10-(E.PixelMode and 0 or 1), (size+(E.PixelMode and 2 or 1))*5-(E.PixelMode and 0 or 1))
-	end
-	ToolAnchor:Size((size+(E.PixelMode and 2 or 1))*5-(E.PixelMode and 0 or 1), size+(E.PixelMode and 2 or 1)-(E.PixelMode and 0 or 1))
-	PortalAnchor:Size((size+(E.PixelMode and 2 or 1))*5-(E.PixelMode and 0 or 1), size+(E.PixelMode and 2 or 1)-(E.PixelMode and 0 or 1))
-	SalvageAnchor:Size((size+(E.PixelMode and 2 or 1))*3-(E.PixelMode and 0 or 1), size+(E.PixelMode and 2 or 1)-(E.PixelMode and 0 or 1))
-	MineAnchor:Size((size+(E.PixelMode and 2 or 1))*2-(E.PixelMode and 0 or 1), size+(E.PixelMode and 2 or 1)-(E.PixelMode and 0 or 1))
-end
-
-function F:UpdateLayout(event, unit) --don't touch
-	if not SeedAnchor then return end
-	--For updating borders after quest was complited. for some reason events fires before quest disappeares from log
-	if event == "UNIT_QUEST_LOG_CHANGED" then
-		if unit == "player" then
-			E:Delay(1, F.UpdateLayout)
-		else
-			return
-		end
-	end
-	if InCombatLockdown() then
-		F:RegisterEvent("PLAYER_REGEN_ENABLED", "UpdateLayout")
-		return
-	else
-		F:UnregisterEvent("PLAYER_REGEN_ENABLED")
- 	end
-	UpdateBar(_G["FarmToolBar"], UpdateBarLayout, OnFarm, ToolAnchor, FtoolButtons)
-	UpdateBar(_G["FarmPortalBar"], UpdateBarLayout, OnFarm, PortalAnchor, FportalButtons)
-	for i=1, 5 do
-		UpdateBar(_G[("FarmSeedBar%d"):format(i)], UpdateSeedBarLayout, CanSeed, SeedAnchor, FseedButtons[i], i)
-	end
-	UpdateBar(_G["SalvageCrateBar"], UpdateBarLayout, InSalvageYard, SalvageAnchor, FsalvageButtons);
-	UpdateBar(_G["MiningToolsBar"], UpdateBarLayout, InMine, MineAnchor, FminingButtons);
-	ResizeFrames()
-end
-
-local function AutoTarget(button)
-	local container, slot = SLE:BagSearch(button.itemId)
-	if container and slot then
-		button:SetAttribute("type", "macro")
-		button:SetAttribute("macrotext", format("/targetexact %s \n/use %s %s", L["Tilled Soil"], container, slot))
-	end
-end
-
-local function onClick(self, mousebutton)
-	if mousebutton == "LeftButton" then
-		if InCombatLockdown() and not self.macro then
-			SLE:Print(L["We are sorry, but you can't do this now. Try again after the end of this combat."])
-			return
-		end
-		self:SetAttribute("type", self.buttonType)
-		self:SetAttribute(self.buttonType, self.sortname)
-		if self.id and self.id ~= 2 and self.id ~= 4 and E.db.sle.farm.autotarget and UnitName("target") ~= L["Tilled Soil"] then
-			AutoTarget(self)
-		end
-		if self.cooldown then
-			self.cooldown:SetCooldown(GetItemCooldown(self.itemId))
-		end
-		if not self.macro then self.macro = true end
-	elseif mousebutton == "RightButton" and self.allowDrop then
-		self:SetAttribute("type", "click")
-		local container, slot = SLE:BagSearch(self.itemId)
-		if container and slot then
-			PickupContainerItem(container, slot)
-			DeleteCursorItem()
-		end
-	end
-	InventoryUpdate()
-end
-
-local function onEnter(self)
-	GameTooltip:SetOwner(self, 'ANCHOR_TOPLEFT', 2, 4)
-	GameTooltip:ClearLines()
-	GameTooltip:AddLine(" ")
-	GameTooltip:SetItemByID(self.itemId)
-	if self.allowDrop then
-		GameTooltip:AddLine(L['Right-click to drop the item.'])
-	end
-	GameTooltip:Show()
-end
-
-local function onLeave()
-	GameTooltip:Hide()
-end
-
-local function CreateFarmButton(index, owner, buttonType, name, texture, allowDrop, id)
-	size = E.db.sle.farm.size
-	local button = CreateFrame("Button", ("FarmButton%d"):format(index), owner, "SecureActionButtonTemplate")
-	button:Size(size, size)
-	S:HandleButton(button)
-
-	button.sortname = name
-	button.itemId = index
-	button.allowDrop = allowDrop
-	button.buttonType = buttonType
-	button.id = id
-	button.macro = false
-
-	button.icon = button:CreateTexture(nil, "OVERLAY")
-	button.icon:SetTexture(texture)
-	button.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
-	button.icon:SetInside()
-
-	button.text = button:CreateFontString(nil, "OVERLAY")
-	button.text:SetFont(E.media.normFont, 12, "OUTLINE")
-	button.text:SetPoint("BOTTOMRIGHT", button, 1, 2)
-
-	if select(3, GetItemCooldown(button.itemId)) == 1 then
-		button.cooldown = CreateFrame("Cooldown", ("FarmButton%dCooldown"):format(index), button)
-		button.cooldown:SetAllPoints(button)
-	end
-
-	button:HookScript("OnEnter", onEnter)
-	button:HookScript("OnLeave", onLeave)
-	button:SetScript("OnMouseDown", onClick)
-
-	return button
-end
-
-local function FramesPosition()
-	SeedAnchor:Point("LEFT", E.UIParent, "LEFT", 24, -160)
-	ToolAnchor:Point("BOTTOMLEFT", SeedAnchor, "TOPLEFT", 0, E.PixelMode and 1 or 5)
-	PortalAnchor:Point("BOTTOMLEFT", ToolAnchor, "TOPLEFT", 0, E.PixelMode and 1 or 5)
-	SalvageAnchor:Point("LEFT", E.UIParent, "LEFT", 24, 0);
-	MineAnchor:Point("LEFT", SalvageAnchor, "LEFT", 0, 0)
-end
-
-local function CreateFrames()
-	size = E.db.sle.farm.size
-	SeedAnchor = CreateFrame("Frame", "SeedAnchor", E.UIParent)
-	SeedAnchor:SetFrameStrata("BACKGROUND")
-
-	ToolAnchor = CreateFrame("Frame", "ToolAnchor", E.UIParent)
-	ToolAnchor:SetFrameStrata("BACKGROUND")
-
-	PortalAnchor = CreateFrame("Frame", "PortalAnchor", E.UIParent)
-	PortalAnchor:SetFrameStrata("BACKGROUND")
-
-	SalvageAnchor = CreateFrame("Frame", "SalvageAnchor", E.UIParent)
-	SalvageAnchor:SetFrameStrata("BACKGROUND")
-
-	MineAnchor = CreateFrame("Frame", "MineAnchor", E.UIParent)
-	MineAnchor:SetFrameStrata("BACKGROUND")
-
-	ResizeFrames()
-	FramesPosition()
-
-	E:CreateMover(SeedAnchor, "FarmSeedMover", L["Farm Seed Bars"], nil, nil, nil, "ALL,S&L,S&L MISC")
-	E:CreateMover(ToolAnchor, "FarmToolMover", L["Farm Tool Bar"], nil, nil, nil, "ALL,S&L,S&L MISC")
-	E:CreateMover(PortalAnchor, "FarmPortalMover", L["Farm Portal Bar"], nil, nil, nil, "ALL,S&L,S&L MISC")
-	E:CreateMover(SalvageAnchor, "SalvageCrateMover", L["Garrison Tools Bar"], nil, nil, nil, "ALL,S&L,S&L MISC")
-
-	for id, v in pairs(seeds) do
-		seeds[id] = { v[1], GetItemInfo(id) }
-	end
-
-	for id, v in pairs(tools) do
-		tools[id] = { GetItemInfo(id) }
-	end
-
-	for id, v in pairs(portals) do
-		portals[id] = { v[1], GetItemInfo(id) }
-	end
-
-	for id, v in pairs(salvage) do
-		salvage[id] = { GetItemInfo(id) }
-	end
-
-	for id, v in pairs(mineTools) do
-		mineTools[id] = { GetItemInfo(id) }
-	end
-
-	for i = 1, 5 do
-		local seedBar = CreateFrame("Frame", ("FarmSeedBar%d"):format(i), UIParent)
-		seedBar:SetFrameStrata("BACKGROUND")
-
-		seedBar:SetPoint("CENTER", SeedAnchor, "CENTER", 0, 0)
-
-		FseedButtons[i] = FseedButtons[i] or {}
-
-		for id, v in pairs(seeds) do
-			if v[1] == i then
-				tinsert(FseedButtons[i], CreateFarmButton(id, seedBar, "item", v[2], v[11], E.private.sle.farm.seedtrash, i))
-			end
-			tsort(FseedButtons[i], function(a, b) return a.sortname < b.sortname end)
-		end
-	end
-
-	local toolBar = CreateFrame("Frame", "FarmToolBar", UIParent)
-	toolBar:SetFrameStrata("BACKGROUND")
-	toolBar:SetPoint("CENTER", ToolAnchor, "CENTER", 0, 0)
-	for id, v in pairs(tools) do
-		tinsert(FtoolButtons, CreateFarmButton(id, toolBar, "item", v[1], v[10], true, nil))
-	end
-
-	local portalBar = CreateFrame("Frame", "FarmPortalBar", UIParent)
-	portalBar:SetFrameStrata("BACKGROUND")
-	portalBar:SetPoint("CENTER", PortalAnchor, "CENTER", 0, 0)
-	for id, v in pairs(portals) do
-		if v[1] == playerFaction then
-			tinsert(FportalButtons, CreateFarmButton(id, portalBar, "item", v[2], v[11], false, nil))
-		end
-	end
-
-	local salvageBar = CreateFrame("Frame", "SalvageCrateBar", UIParent);
-	salvageBar:SetFrameStrata("BACKGROUND")
-	salvageBar:SetPoint("CENTER", SalvageAnchor, "CENTER", 0, 0)
-	for id, v in pairs(salvage) do
-		tinsert(FsalvageButtons, CreateFarmButton(id, salvageBar, "item", v[1], v[10], false, nil));
-	end
-
-	local mineBar = CreateFrame("Frame", "MiningToolsBar", UIParent);
-	mineBar:SetFrameStrata("BACKGROUND")
-	mineBar:SetPoint("CENTER", MineAnchor, "CENTER", 0, 0)
-	for id, v in pairs(mineTools) do
-		tinsert(FminingButtons, CreateFarmButton(id, mineBar, "item", v[1], v[10], false, nil));
-	end
-
-	F:RegisterEvent("ZONE_CHANGED", Zone)
-	F:RegisterEvent("ZONE_CHANGED_NEW_AREA", Zone)
-	F:RegisterEvent("ZONE_CHANGED_INDOORS", Zone)
-	F:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED", InventoryUpdate)
-
-	E:Delay(10, Zone)
-end
-
-local function StartFarmBarLoader()
-	F:UnregisterEvent("PLAYER_ENTERING_WORLD")
-
-	local noItem = false
-	-- preload item links to prevent errors
-	for id, _ in pairs(seeds) do
-		if select(2, GetItemInfo(id)) == nil then noItem = true end
-	end
-	for id, _ in pairs(tools) do
-		if select(2, GetItemInfo(id)) == nil then noItem = true end
-	end
-	for id, _ in pairs(portals) do
-		if select(2, GetItemInfo(id)) == nil then noItem = true end
-	end
-	for id, _ in pairs(salvage) do
-		if select(2, GetItemInfo(id)) == nil then noItem = true end
-	end
-	for id, _ in pairs(mineTools) do
-		if select(2, GetItemInfo(id)) == nil then noItem = true end
-	end
-	if noItem then
-		E:Delay(5, StartFarmBarLoader)
-	else
-		CreateFrames()
-	end
-end
-
-function F:Initialize()
-	if not E.private.sle.farm.enable then return end
-
-	self:RegisterEvent("PLAYER_ENTERING_WORLD", StartFarmBarLoader)
-end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/garrison.lua b/ElvUI_SLE/modules/garrison.lua
index 8c8b031..ec71d6a 100644
--- a/ElvUI_SLE/modules/garrison.lua
+++ b/ElvUI_SLE/modules/garrison.lua
@@ -1,7 +1,6 @@
-local E, L, V, P, G = unpack(ElvUI);
-local S = E:GetModule("Skins")
-local G = E:GetModule("SLE_Garrison")
-
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local Gar = SLE:NewModule("Garrison", 'AceEvent-3.0')
+local _G = _G
 local buildID = {
 	[8] = "War",
 	[9] = "War",
@@ -13,30 +12,39 @@ local buildID = {
 	[206] = "Ship",
 	[207] = "Ship",
 }
+local C_Garrison = C_Garrison

-function G:SHIPMENT_CRAFTER_INFO(event, success, _, maxShipments, plotID)
-	if not GarrisonCapacitiveDisplayFrame then return end --Just in case
-	local n = GarrisonCapacitiveDisplayFrame.available or 0
-	if G.clicked or n == 0 or not E.db.sle.garrison.autoOrder then return end
-	G.clicked = true
+function Gar:SHIPMENT_CRAFTER_INFO(event, success, _, maxShipments, plotID)
+	if not _G["GarrisonCapacitiveDisplayFrame"] then return end --Just in case
+	local n = _G["GarrisonCapacitiveDisplayFrame"].available or 0
+	if Gar.clicked or n == 0 or not Gar.db.autoOrder.enable then return end
+	Gar.clicked = true
 	local ID = C_Garrison.GetOwnedBuildingInfo(plotID)
 	local nope = buildID[ID]
 	if nope then
-		if E.db.sle.garrison['auto'..nope] then
-			GarrisonCapacitiveDisplayFrame.CreateAllWorkOrdersButton:Click()
+		if Gar.db.autoOrder["auto"..nope] then
+			_G["GarrisonCapacitiveDisplayFrame"].CreateAllWorkOrdersButton:Click()
 		end
 	else
-		GarrisonCapacitiveDisplayFrame.CreateAllWorkOrdersButton:Click()
+		_G["GarrisonCapacitiveDisplayFrame"].CreateAllWorkOrdersButton:Click()
 	end
 end

-function G:SHIPMENT_CRAFTER_CLOSED()
-	G.clicked = false
+function Gar:SHIPMENT_CRAFTER_CLOSED()
+	Gar.clicked = false
 end

-function G:Initialize()
-	G.clicked = false
+function Gar:Initialize()
+	if not SLE.initialized then return end
+	Gar.db = E.db.sle.legacy.garrison
+	Gar.clicked = false
+
+	function Gar:ForUpdateAll()
+		Gar.db = E.db.sle.legacy.garrison
+	end

 	self:RegisterEvent("SHIPMENT_CRAFTER_INFO");
 	self:RegisterEvent("SHIPMENT_CRAFTER_CLOSED");
-end
\ No newline at end of file
+end
+
+SLE:RegisterModule(Gar:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/lfr.lua b/ElvUI_SLE/modules/lfr.lua
new file mode 100644
index 0000000..18971d4
--- /dev/null
+++ b/ElvUI_SLE/modules/lfr.lua
@@ -0,0 +1,576 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+--LFR boss status calculations--
+local DT = E:GetModule('DataTexts')
+local LFR = SLE:NewModule("LFR")
+local _G = _G
+--strings
+local RAID_FINDER = RAID_FINDER
+local BOSS_DEAD = BOSS_DEAD
+local BOSS_ALIVE_INELIGIBLE = BOSS_ALIVE_INELIGIBLE
+local BOSS_ALIVE = BOSS_ALIVE
+--stuff
+local RED_FONT_COLOR = RED_FONT_COLOR
+local GREEN_FONT_COLOR = GREEN_FONT_COLOR
+local IsShiftKeyDown = IsShiftKeyDown
+
+local bossName, _, isKilled, isIneligible
+local ExpackColor = "|cff9482c9"
+
+--For 4 boss raid
+local function FourKill(id)
+	local killNum = 0
+	for i =1,4 do
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+
+	LFR:BossCount(killNum, 4)
+end
+
+local function FourShift(id)
+	for i =1,4 do --1st part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+end
+
+--For 6 boss raid
+local function SixKill(id1, id2)
+	local killNum = 0
+	for i =1,3 do --1st part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id1, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	for i =4,6 do --2nd part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id2, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+
+	LFR:BossCount(killNum, 6)
+end
+
+local function SixShift(id1, id2)
+	for i =1,3 do --1st part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id1, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	for i =4,6 do --2nd part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id2, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+end
+
+--For 7 boss raid
+local function SevenKill(id1, id2, id3)
+	local killNum = 0
+	for i =1,3 do --1st part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id1, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	for i =4,6 do --2nd part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id2, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+
+	-- 3rd part
+	_, _, isKilled = T.GetLFGDungeonEncounterInfo(id3, 7);
+	if (isKilled) then killNum = killNum + 1 end
+
+	LFR:BossCount(killNum, 7)
+end
+
+local function SevenShift(id1, id2, id3)
+	for i =1,3 do --1st part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id1, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	for i =4,6 do --2nd part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id2, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	-- 3rd part
+	bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id3, 7);
+	LFR:BossStatus(bossName, isKilled, isIneligible)
+end
+
+--For 8 boss raid
+local function EightKill(id1, id2)
+	local killNum = 0
+	for i =1,4 do --1st part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id1, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	for i =5,8 do --2nd part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id2, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+
+	LFR:BossCount(killNum, 8)
+end
+
+local function EightShift(id1, id2)
+	for i =1,4 do --1st part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id1, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	for i =5,8 do --2nd part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id2, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+end
+
+--For 10 boss raid
+local function TenKill(id1, id2, id3, id4)
+	local killNum = 0
+	local bosses = {} --cause fuck blizz ordering
+	--1st part
+	bosses = {1, 2, 7}
+	for i =1, #bosses do
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id1, bosses[i]);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	T.twipe(bosses)
+	--2nd part
+	bosses = {3, 5, 8}
+	for i =1, #bosses do
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id2, bosses[i]);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	T.twipe(bosses)
+	--3rd part
+	bosses = {4, 6, 9}
+	for i =1, #bosses do
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id3, bosses[i]);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+
+	-- 4th part
+	_, _, isKilled = T.GetLFGDungeonEncounterInfo(id4, 10);
+	if (isKilled) then killNum = killNum + 1 end
+
+	LFR:BossCount(killNum, 10)
+end
+
+local function TenShift(id1, id2, id3, id4)
+
+	local bosses = {} --cause fuck blizz ordering
+	--1st part
+	bosses = {1, 2, 7}
+	for i =1, #bosses do
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id1, bosses[i]);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	T.twipe(bosses)
+	--2nd part
+	bosses = {3, 5, 8}
+	for i =1, #bosses do
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id2, bosses[i]);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	T.twipe(bosses)
+	--3rd part
+	bosses = {4, 6, 9}
+	for i =1, #bosses do
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id3, bosses[i]);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	--4th part
+	bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id4, 10);
+	LFR:BossStatus(bossName, isKilled, isIneligible)
+end
+
+--For 12 boss raid
+local function TwelveKill(id1, id2, id3, id4)
+	local killNum = 0
+	for i =1,3 do --1st part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id1, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	for i =4,6 do --2nd part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id2, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	for i =7,9 do --3rd part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id3, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	for i =10,12 do --4th part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id4, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+
+	LFR:BossCount(killNum, 12)
+end
+
+local function TwelveShift(id1, id2, id3, id4)
+	for i =1,3 do --1st part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id1, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	for i =4,6 do --2nd part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id2, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	for i =7,9 do --3rd part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id3, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	for i =10,12 do --4th part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id4, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+end
+
+--For 13 boss raid (HFC)
+local function HFCKill(id1, id2, id3, id4, id5)
+	local killNum = 0
+	for i =1,3 do --1st part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id1, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	for i =4,6 do --2nd part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id2, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	for i =7,9 do --3rd part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id3, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	for i =10,12 do --4th part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id4, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	_, _, isKilled = T.GetLFGDungeonEncounterInfo(id5, 13);
+	if (isKilled) then killNum = killNum + 1 end
+
+	LFR:BossCount(killNum, 13)
+end
+
+local function HFCShift(id1, id2, id3, id4, id5)
+	for i =1,3 do --1st part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id1, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	for i =4,6 do --2nd part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id2, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	for i =7,9 do --3rd part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id3, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	for i =10,12 do --4th part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id4, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id5, 13);
+	LFR:BossStatus(bossName, isKilled, isIneligible)
+end
+
+--For 14 boss raid
+local function FourteenKill(id1, id2, id3, id4)
+	local killNum = 0
+	for i =1,4 do --1st part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id1, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	for i =5,8 do --2nd part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id2, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	for i =9,11 do --3rd part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id3, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	for i =12,14 do --4th part
+		_, _, isKilled = T.GetLFGDungeonEncounterInfo(id4, i);
+		if (isKilled) then killNum = killNum + 1 end
+	end
+	LFR:BossCount(killNum, 14)
+end
+
+local function FourteenShift(id1, id2, id3, id4)
+	for i =1,4 do --1st part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id1, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	for i =5,8 do --2nd part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id2, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	for i =9,11 do --3rd part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id3, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+	for i =12,14 do --4th part
+		bossName, _, isKilled, isIneligible = T.GetLFGDungeonEncounterInfo(id4, i);
+		LFR:BossStatus(bossName, isKilled, isIneligible)
+	end
+end
+
+local function DragonSoul()
+	if IsShiftKeyDown() then
+		EightShift(416, 417)
+	else
+		EightKill(416, 417)
+	end
+end
+
+local function Mogushan()
+	if IsShiftKeyDown() then
+		SixShift(527, 528)
+	else
+		SixKill(527, 528)
+	end
+end
+
+local function HoF()
+	if IsShiftKeyDown() then
+		SixShift(529, 530)
+	else
+		SixKill(529, 530)
+	end
+end
+
+local function ToES()
+	if IsShiftKeyDown() then
+		FourShift(526)
+	else
+		FourKill(526)
+	end
+end
+
+local function ToT()
+	if IsShiftKeyDown() then
+		TwelveShift(610, 611, 612, 613)
+	else
+		TwelveKill(610, 611, 612, 613)
+	end
+end
+
+local function SoO()
+	if IsShiftKeyDown() then
+		FourteenShift(716, 717, 724, 725)
+	else
+		FourteenKill(716, 717, 724, 725)
+	end
+end
+
+local function HM()
+	if IsShiftKeyDown() then
+		SevenShift(849, 850, 851);
+	else
+		SevenKill(849, 850, 851);
+	end
+end
+
+local function BRF()
+	if IsShiftKeyDown() then
+		TenShift(847, 846, 848, 823);
+	else
+		TenKill(847, 846, 848, 823);
+	end
+end
+
+local function HFC()
+	if IsShiftKeyDown() then
+		HFCShift(982, 983, 984, 985, 986);
+	else
+		HFCKill(982, 983, 984, 985, 986);
+	end
+end
+
+local function Nightmare()
+	if IsShiftKeyDown() then
+		SevenShift(1287,1288,1289);
+	else
+		SevenKill(1287,1288,1289);
+	end
+end
+
+local function Suramar()
+	if IsShiftKeyDown() then
+		TenShift(1290,1291,1292,1293);
+	else
+		TenKill(1290,1291,1292,1293);
+	end
+end
+
+LFR.Req = {
+	["Cata"] = {3, 85},
+	["MoP"] = {4, 90},
+	["WoD"] = {5, 100},
+	["Legion"] = {6, 110},
+}
+LFR.Cata = {
+	[1] = {
+		["name"] = 'ds',
+		["ilevel"] = 372,
+		["map"] = 824,
+		["func"] = DragonSoul,
+	},
+}
+LFR.MoP = {
+	[1] = {
+		["name"] = 'mv',
+		["ilevel"] = 460,
+		["map"] = 896,
+		["func"] = Mogushan,
+	},
+	[2] = {
+		["name"] = 'hof',
+		["ilevel"] = 470,
+		["map"] = 897,
+		["func"] = HoF,
+	},
+	[3] = {
+		["name"] = 'toes',
+		["ilevel"] = 470,
+		["map"] = 886,
+		["func"] = ToES,
+	},
+	[4] = {
+		["name"] = 'tot',
+		["ilevel"] = 480,
+		["map"] = 930,
+		["func"] = ToT,
+	},
+	[5] = {
+		["name"] = 'soo',
+		["ilevel"] = 496,
+		["map"] = 953,
+		["func"] = SoO,
+	},
+}
+LFR.WoD = {
+	[1] = {
+		["name"] = 'hm',
+		["ilevel"] = 615,
+		["map"] = 994,
+		["func"] = HM,
+	},
+	[2] = {
+		["name"] = 'brf',
+		["ilevel"] = 635,
+		["map"] = 988,
+		["func"] = BRF,
+	},
+	[3] = {
+		["name"] = 'hfc',
+		["ilevel"] = 650,
+		["map"] = 1026,
+		["func"] = HFC,
+	},
+}
+LFR.Legion = {
+	[1] = {
+		["name"] = 'nightmare',
+		["ilevel"] = 825,
+		["map"] = 1094,
+		["func"] = Nightmare,
+	},
+	[2] = {
+		["name"] = 'palace',
+		["ilevel"] = 835,
+		["map"] = 1088,
+		["func"] = Suramar,
+	},
+}
+
+function LFR:CheckOptions()
+	if LFR.db.cata.ds or LFR:CheckMoP() or LFR:CheckWoD() or LFR:CheckLegion() then return true end
+	return false
+end
+
+function LFR:CheckCata()
+	if LFR.db.cata.ds then return true else return false end
+end
+function LFR:CheckMoP()
+	for k, v in T.pairs(LFR.db.mop) do
+		if v == true then
+			return v
+      end
+	end
+	return false
+end
+function LFR:CheckWoD()
+	for k, v in T.pairs(LFR.db.wod) do
+		if v == true then
+			return v
+      end
+	end
+	return false
+end
+
+function LFR:BuildGroup(lvl, ilvl, expack)
+	local n, req = T.unpack(LFR.Req[expack])
+	local small = T.strlower(expack)
+	if not LFR["Check"..expack]() then return end
+	DT.tooltip:AddLine(ExpackColor.."< ".._G["EXPANSION_NAME"..n].." >|r")
+	for i = 1, #(LFR[expack]) do
+		local db = LFR[expack][i]
+		if LFR.db[small][db.name] then
+			DT.tooltip:AddLine(" "..T.GetMapNameByID(db.map))
+			if lvl >= req and ilvl >= db.ilevel then
+				db.func()
+			else
+				DT.tooltip:AddLine(" "..L["This LFR isn't available for your level/gear."])
+			end
+		end
+	end
+	DT.tooltip:AddLine(" ")
+end
+
+function LFR:CheckLegion()
+	for k, v in T.pairs(LFR.db.legion) do
+		if v == true then
+			return v
+      end
+	end
+	return false
+end
+
+function LFR:Show()
+	local lvl = T.UnitLevel("player")
+	local ilvl = T.GetAverageItemLevel()
+	DT.tooltip:AddLine(" ")
+	DT.tooltip:AddLine(RAID_FINDER)
+	if not LFR:CheckOptions() then
+		DT.tooltip:AddLine(" "..L["You didn't select any instance to track."])
+		return
+	end
+	LFR:BuildGroup(lvl, ilvl, "Cata")
+	LFR:BuildGroup(lvl, ilvl, "MoP")
+	LFR:BuildGroup(lvl, ilvl, "WoD")
+	LFR:BuildGroup(lvl, ilvl, "Legion")
+end
+
+function LFR:BossStatus(bossName, isKilled, isIneligible)
+	if not bossName then return end
+	if (isKilled) then
+		DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
+	elseif (isIneligible) then
+		DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
+	else
+		DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
+	end
+end
+
+function LFR:BossCount(killNum, count)
+	if killNum == count then
+		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/"..count, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
+	else
+		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/"..count, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b)
+	end
+end
+
+function LFR:Initialize()
+	if not SLE.initialized then return end
+	LFR.db = E.db.sle.lfr
+
+	function LFR:ForUpdateAll()
+		LFR.db = E.db.sle.lfr
+	end
+end
+
+SLE:RegisterModule(LFR:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/load_modules.xml b/ElvUI_SLE/modules/load_modules.xml
index 6629c56..9a14b50 100644
--- a/ElvUI_SLE/modules/load_modules.xml
+++ b/ElvUI_SLE/modules/load_modules.xml
@@ -1,32 +1,35 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file='AddOnSkins.lua'/>
+	<Script file='actionbars.lua'/>
+	<Script file='afk.lua'/>
+	<Include file='Armory\Load_Armory.xml'/>
 	<Script file='auras.lua'/>
-	<Script file='autorelease.lua'/>
 	<Script file='backgrounds.lua'/>
-	<Script file='garrison.lua'/>
 	<Script file='bags.lua'/>
-	<Include file='Armory\Load_Armory.xml'/>
-	<Script file='datatexts.lua'/>
-	<Include file='sledatatexts\load_datatexts.xml'/>
-	<Include file='dashboard\load_dashboard.xml'/>
-	<Script file='chat.lua'/>
 	<Script file='baginfo.lua'/>
+	<Script file='blizzard.lua'/>
+	<Include file='chat\load_chat.xml'/>
+	<Script file='datatexts.lua'/>
+	<Script file='elvConfig.lua'/>
 	<Script file='equipmanager.lua'/>
-	<Script file='exprepbar.lua'/>
-	<Script file='farm.lua'/>
+	<Script file='toolbars.lua'/>
+	<Script file='garrison.lua'/>
+	<Script file='lfr.lua'/>
 	<Script file='loot.lua'/>
 	<Include file='minimap\load_minimap.xml'/>
+	<Script file='misc.lua'/>
 	<Script file='nameplates.lua'/>
-	<Script file='raidutility.lua'/>
-	<Script file='pvpmover.lua'/>
+	<Script file='pvp.lua'/>
+	<Include file='professions\load_professions.xml'/>
+	<Include file='quests\load_quests.xml'/>
 	<Script file='raidmarkers.lua'/>
-	<Script file='screensaver.lua'/>
+	<Script file='raidroleicons.lua'/>
+	<Script file='raidutility.lua'/>
+	<Include file='sledatatexts\load_datatexts.xml'/>
+	<Include file='tooltips\load_tooltips.xml'/>
 	<Script file='threat.lua'/>
-	<Script file='tooltip.lua'/>
 	<Script file='uibuttons.lua'/>
-	<Script file='unitframes.lua'/>
+	<Include file='unitframes\load_unitframes.xml'/>
 	<Script file='vehicle.lua'/>
-	<Script file='errorframe.lua'/>
-	<Script file='quests.lua'/>
-	<Script file='raidroleicons.lua'/>
+	<Include file='databars\load_databars.xml'/>
 </Ui>
diff --git a/ElvUI_SLE/modules/loot.lua b/ElvUI_SLE/modules/loot.lua
index a1f0e64..a45d437 100644
--- a/ElvUI_SLE/modules/loot.lua
+++ b/ElvUI_SLE/modules/loot.lua
@@ -1,26 +1,37 @@
-local E, L, V, P, G = unpack(ElvUI);
-local LT = E:GetModule('SLE_Loot')
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local LT = SLE:NewModule('Loot','AceHook-3.0', 'AceEvent-3.0')
 local M = E:GetModule('Misc')
-local ACD = LibStub("AceConfigDialog-3.0-ElvUI")
-
+LT.PlayerLevel = 0
+LT.MaxPlayerLevel = 0
+LT.LootItems = 0 --To determine how many items are in our loot cache
+LT.LootEvents = {
+	"CONFIRM_DISENCHANT_ROLL", --Group
+	"CONFIRM_LOOT_ROLL", --Group
+	"LOOT_BIND_CONFIRM", --Solo
+}
+LT.Loot = {}
+LT.LootTemp = {}
+LT.Numbers = {}
 local check = false
 local t = 0
-local n = 0
-local loot, loottemp, numbers = {}, {}, {}
-local MyName, UnitLevel = E.myname, UnitLevel
-local IsInGroup, IsInRaid, IsPartyLFG = IsInGroup, IsInRaid, IsPartyLFG
-local GetNumGroupMembers, GetRaidRosterInfo = GetNumGroupMembers, GetRaidRosterInfo
-local GetLootSlotType, GetLootSlotLink, GetLootSlotInfo, GetLootRollItemInfo = GetLootSlotType, GetLootSlotLink, GetLootSlotInfo, GetLootRollItemInfo
-local GetNumLootItems, GetItemInfo = GetNumLootItems, GetItemInfo
-local IsLeftControlKeyDown = IsLeftControlKeyDown
-local tremove = table.remove
-local PlayerLevel, MaxPlayerLevel
+local QUEUED_STATUS_UNKNOWN = QUEUED_STATUS_UNKNOWN
+local LOOT_ROLL_TYPE_GREED = LOOT_ROLL_TYPE_GREED
+local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown
+local SendChatMessage = SendChatMessage
+local RollOnLoot, ConfirmLootRoll, CloseLoot = RollOnLoot, ConfirmLootRoll, CloseLoot
+
+LT.IconChannels = {
+	"CHAT_MSG_BN_CONVERSATION","CHAT_MSG_BN_WHISPER","CHAT_MSG_BN_WHISPER_INFORM",
+	"CHAT_MSG_CHANNEL","CHAT_MSG_EMOTE","CHAT_MSG_GUILD","CHAT_MSG_INSTANCE_CHAT",
+	"CHAT_MSG_INSTANCE_CHAT_LEADER","CHAT_MSG_LOOT","CHAT_MSG_OFFICER","CHAT_MSG_PARTY",
+	"CHAT_MSG_PARTY_LEADER","CHAT_MSG_RAID","CHAT_MSG_RAID_LEADER","CHAT_MSG_RAID_WARNING",
+	"CHAT_MSG_SAY","CHAT_MSG_SYSTEM","CHAT_MSG_WHISPER","CHAT_MSG_WHISPER_INFORM","CHAT_MSG_YELL",
+}

 local function Check()
-	local name, rank, isML
-	for x = 1, GetNumGroupMembers() do
-		name, rank, _, _, _, _, _, _, _, _, isML = GetRaidRosterInfo(x)
-		if name == MyName then
+	for x = 1, T.GetNumGroupMembers() do
+		local name, rank, _, _, _, _, _, _, _, _, isML = T.GetRaidRosterInfo(x)
+		if name == E.myname then
 			if isML then
 				return true
 			elseif rank == 1 then
@@ -33,8 +44,8 @@ local function Check()
 	return false
 end

-local function ModifierCheck()
-	local heldModifier = E.db.sle.loot.announcer.override
+function LT:ModifierCheck()
+	local heldModifier = LT.db.announcer.override
 	local shiftDown = IsShiftKeyDown();
 	local ctrlDown = IsControlKeyDown();
 	local altDown = IsAltKeyDown();
@@ -53,34 +64,33 @@ local function ModifierCheck()
 end

 local function Merge()
-	local p, k
-	for i = 1, #loot do
-		k = 1
-		while loot[i] ~= loot[k] do k = k + 1 end
-		if i ~= k then
-			numbers[i] = numbers[i] + numbers[k]
-			tremove(numbers, k)
-			tremove(loot, k)
-			n = n - 1
+	-- local checking
+	for i = 1, #(LT.Loot) do
+		local checking = 1
+		while LT.Loot[i] ~= LT.Loot[checking] do checking = checking + 1 end
+		if i ~= checking then
+			LT.Numbers[i] = LT.Numbers[i] + LT.Numbers[checking]
+			T.tremove(LT.Numbers, checking)
+			T.tremove(LT.Loot, checking)
+			LT.LootItems = LT.LootItems - 1
 		end
 	end
 end

-local function PopulateTable(q)
-	local p, k
-	for i = 1, GetNumLootItems() do
-		if GetLootSlotType(i) == 1 then
-			local _, item, quantity, quality = GetLootSlotInfo(i)
+function LT:PopulateTable(qualityPassed)
+	for i = 1, T.GetNumLootItems() do
+		if T.GetLootSlotType(i) == 1 then
+			local _, item, quantity, quality = T.GetLootSlotInfo(i)
 			local link, ilvl

-			if quality >= q then
-				link = GetLootSlotLink(i)
-				ilvl = select(4, GetItemInfo(link)) or QUEUED_STATUS_UNKNOWN
+			if quality >= qualityPassed then
+				link = T.GetLootSlotLink(i)
+				ilvl = T.select(4, T.GetItemInfo(link)) or QUEUED_STATUS_UNKNOWN

-				n = n + 1
-				loot[n] = link
-				loot[n] = loot[n].." (ilvl: "..ilvl..")"
-				numbers[n] = quantity or 1
+				LT.LootItems = LT.LootItems + 1
+				LT.Loot[LT.LootItems] = link
+				LT.Loot[LT.LootItems] = LT.Loot[LT.LootItems].." (ilvl: "..ilvl..")"
+				LT.Numbers[LT.LootItems] = quantity or 1
 			end
 		end
 	end
@@ -88,90 +98,89 @@ local function PopulateTable(q)
 end

 local function Channel()
-	local channel
-	if E.db.sle.loot.announcer.channel ~= "SAY" and IsPartyLFG() then
+	if LT.db.announcer.channel ~= "SAY" and T.IsPartyLFG() then
 		return "INSTANCE_CHAT"
 	end
-	if E.db.sle.loot.announcer.channel == "RAID" and not IsInRaid() then
+	if LT.db.announcer.channel == "RAID" and not T.IsInRaid() then
 		return "PARTY"
 	end
-	return E.db.sle.loot.announcer.channel
+	return LT.db.announcer.channel
 end

-local function List()
-	for i = 1, n do
-		if numbers[i] == 1 then
-			SendChatMessage(i..". "..loot[i], Channel())
-		elseif numbers[i] > 1 then
-			SendChatMessage(i..". "..numbers[i].."x"..loot[i], Channel())
+function LT:AnnounceList()
+	for i = 1, LT.LootItems do
+		if LT.Numbers[i] == 1 then
+			SendChatMessage(i..". "..LT.Loot[i], Channel())
+		elseif LT.Numbers[i] > 1 then
+			SendChatMessage(i..". "..LT.Numbers[i].."x"..LT.Loot[i], Channel())
 		end
-		if i == n then
-			loot = {}
-			numbers = {}
-			n = 0
+		if i == LT.LootItems then
+			T.twipe(LT.Loot)
+			T.twipe(LT.Numbers)
+			LT.LootItems = 0
 		end
 	end
 end

-local function Announce(event)
-	if not IsInGroup() then return end -- not in group, exit.
+function LT:Announce(event)
+	if not T.IsInGroup() then return end -- not in group, exit.
 	local m = 0
-	local q = E.db.sle.loot.announcer.quality == "EPIC" and 4 or E.db.sle.loot.announcer.quality == "RARE" and 3 or E.db.sle.loot.announcer.quality == "UNCOMMON" and 2
-	if (Check() and E.db.sle.loot.announcer.auto) or (ModifierCheck() and (IsInGroup() or IsInRaid())) then
-		for i = 1, GetNumLootItems() do
-			if GetLootSlotType(i) == 1 then
+	local quality = LT.db.announcer.quality == "EPIC" and 4 or LT.db.announcer.quality == "RARE" and 3 or LT.db.announcer.quality == "UNCOMMON" and 2
+	if (Check() and LT.db.announcer.auto) or (LT:ModifierCheck() and (T.IsInGroup() or T.IsInRaid())) then
+		for i = 1, T.GetNumLootItems() do
+			if T.GetLootSlotType(i) == 1 then
 				for j = 1, t do
-					if GetLootSlotLink(i) == loottemp[j] then
+					if T.GetLootSlotLink(i) == LT.LootTemp[j] then
 						check = true
 					end
 				end
 			end
 		end

-		if check == false or ModifierCheck() then
-			PopulateTable(q)
-			if n ~= 0 then
+		if check == false or LT:ModifierCheck() then
+			LT:PopulateTable(quality)
+			if LT.LootItems ~= 0 then
 				SendChatMessage(L["Loot Dropped:"], Channel())
-				List()
+				LT:AnnounceList()
 			end
 		end

-		for i = 1, GetNumLootItems() do
-			if GetLootSlotType(i) == 1 then
-				loottemp[i] = GetLootSlotLink(i)
+		for i = 1, T.GetNumLootItems() do
+			if T.GetLootSlotType(i) == 1 then
+				LT.LootTemp[i] = T.GetLootSlotLink(i)
 			end
 		end
-		t = GetNumLootItems()
+		t = T.GetNumLootItems()
 		check = false
 	end
 end

-local function HandleRoll(event, id)
-	if not E.db.sle.loot.autoroll.enable then return end
-	if not (E.db.sle.loot.autoroll.autogreed or E.db.sle.loot.autoroll.autode) then return end
+function LT:HandleRoll(event, id)
+	if not LT.db.autoroll.enable then return end
+	if not (LT.db.autoroll.autogreed or LT.db.autoroll.autode) then return end

-	local _, name, _, quality, _, _, _, disenchant = GetLootRollItemInfo(id)
-	local link = GetLootRollItemLink(id)
-	local itemID = tonumber(strmatch(link, 'item:(%d+)'))
+	local _, name, _, quality, _, _, _, disenchant = T.GetLootRollItemInfo(id)
+	local link = T.GetLootRollItemLink(id)
+	local itemID = T.tonumber(T.match(link, 'item:(%d+)'))

 	if itemID == 43102 or itemID == 52078 then
 		RollOnLoot(id, LOOT_ROLL_TYPE_GREED)
 	end

-	if IsXPUserDisabled() then MaxPlayerLevel = PlayerLevel end
-	if (E.db.sle.loot.autoroll.bylevel and PlayerLevel < E.db.sle.loot.autoroll.level) and PlayerLevel ~= MaxPlayerLevel then return end
+	if T.IsXPUserDisabled() then LT.MaxPlayerLevel = LT.PlayerLevel end
+	if (LT.db.autoroll.bylevel and LT.PlayerLevel < LT.db.autoroll.level) and LT.PlayerLevel ~= LT.MaxPlayerLevel then return end

-	if E.db.sle.loot.autoroll.bylevel then
-		if IsEquippableItem(link) then
-			local _, _, _, ilvl, _, _, _, _, slot = GetItemInfo(link)
-			local itemLink = GetInventoryItemLink('player', slot)
-			local matchItemLevel = itemLink and select(4, GetItemInfo(itemLink)) or 1
+	if LT.db.autoroll.bylevel then
+		if T.IsEquippableItem(link) then
+			local _, _, _, ilvl, _, _, _, _, slot = T.GetItemInfo(link)
+			local itemLink = T.GetInventoryItemLink('player', slot)
+			local matchItemLevel = itemLink and T.select(4, T.GetItemInfo(itemLink)) or 1
 			if quality ~= 7 and matchItemLevel < ilvl then return end
 		end
 	end

-	if quality <= E.db.sle.loot.autoroll.autoqlty then
-		if E.db.sle.loot.autoroll.autode and disenchant then
+	if quality <= LT.db.autoroll.autoqlty then
+		if LT.db.autoroll.autode and disenchant then
 			RollOnLoot(id, 3)
 		else
 			RollOnLoot(id, 2)
@@ -179,19 +188,19 @@ local function HandleRoll(event, id)
 	end
 end

-local function HandleEvent(event, ...)
+function LT:HandleEvent(event, ...)
 	if event == "LOOT_OPENED" then
-		if E.db.sle.loot.announcer.enable then
-			Announce(event)
+		if LT.db.announcer.enable then
+			LT:Announce(event)
 		end
 	end

-	if not E.db.sle.loot.autoroll.autoconfirm then return end
+	if not LT.db.autoroll.autoconfirm then return end
 	if event == "CONFIRM_LOOT_ROLL" or event == "CONFIRM_DISENCHANT_ROLL" then
 		local arg1, arg2 = ...
 		ConfirmLootRoll(arg1, arg2)
 	elseif event == "LOOT_OPENED" or event == "LOOT_BIND_CONFIRM" then
-		local count = GetNumLootItems()
+		local count = T.GetNumLootItems()
 		if count == 0 then CloseLoot() return end
 		for numslot = 1, count do
 			ConfirmLootSlot(numslot)
@@ -206,33 +215,12 @@ local function LoadConfig(event, addon)
 	LT:UnregisterEvent("ADDON_LOADED")
 end

-function LT:LoadLoot()
-	MaxPlayerLevel = GetMaxPlayerLevel()
-	PlayerLevel = UnitLevel('player')
-
-	--Azil made this, blame him if something fucked up
-	if E.db.general and E.db.sle.loot.autoroll.enable then
-		E.db.general.autoRoll = false
-	end
-
-	if E.db.sle.loot.enable then
-		self:RegisterEvent("LOOT_OPENED", HandleEvent)
+function LT:Toggle()
+	if LT.db.enable then
+		self:RegisterEvent("LOOT_OPENED", "HandleEvent")
 		self:RegisterEvent('PLAYER_ENTERING_WORLD', 'LootShow');
-		self:RegisterEvent("ADDON_LOADED", LoadConfig)
-		if E.db.sle.loot.autoroll.autoconfirm then
-			self:RegisterEvent("CONFIRM_DISENCHANT_ROLL", HandleEvent)
-			self:RegisterEvent("CONFIRM_LOOT_ROLL", HandleEvent)
-			self:RegisterEvent("LOOT_BIND_CONFIRM", HandleEvent)
-			UIParent:UnregisterEvent("LOOT_BIND_CONFIRM") --Solo
-			UIParent:UnregisterEvent("CONFIRM_DISENCHANT_ROLL") --Group
-			UIParent:UnregisterEvent("CONFIRM_LOOT_ROLL") --Group
-		else
-			self:UnregisterEvent("CONFIRM_DISENCHANT_ROLL")
-			self:UnregisterEvent("CONFIRM_LOOT_ROLL")
-			self:UnregisterEvent("LOOT_BIND_CONFIRM")
-			UIParent:RegisterEvent("LOOT_BIND_CONFIRM") --Solo
-			UIParent:RegisterEvent("CONFIRM_DISENCHANT_ROLL") --Group
-			UIParent:RegisterEvent("CONFIRM_LOOT_ROLL") --Group
+		if not T.IsAddOnLoaded("ElvUI_Config") then
+			self:RegisterEvent("ADDON_LOADED", LoadConfig)
 		end
 	else
 		self:UnregisterEvent("LOOT_OPENED")
@@ -241,23 +229,39 @@ function LT:LoadLoot()
 	end
 end

+function LT:AutoToggle()
+	for i = 1, 3 do
+		if LT.db.autoroll.autoconfirm and LT.db.enable then
+			self:RegisterEvent(LT.LootEvents[i], "HandleEvent")
+			UIParent:UnregisterEvent(LT.LootEvents[i])
+		else
+			UIParent:RegisterEvent(LT.LootEvents[i])
+			self:UnregisterEvent(LT.LootEvents[i])
+		end
+	end
+end
+
+function LT:LootAlpha()
+	LootHistoryFrame:SetAlpha(LT.db.history.alpha or 1)
+end
+
 function LT:LootShow()
-	local instance = IsInInstance()
+	local instance = T.IsInInstance()

-	if (not instance and E.db.sle.loot.history.autohide) then
+	if (not instance and LT.db.history.autohide) then
 		LootHistoryFrame:Hide()
 	end
 end

 function LT:Update()
-	if IsAddOnLoaded("ElvUI_Config") then
-		if E.db.sle.loot.autoroll.enable then
+	if T.IsAddOnLoaded("ElvUI_Config") then
+		if LT.db.autoroll.enable then
 			E.Options.args.general.args.general.args.autoRoll = {
 				order = 6,
 				name = L["Auto Greed/DE"],
 				desc = L["This option have been disabled by Shadow & Light. To return it you need to disable S&L's option. Click here to see it's location."],
 				type = "execute",
-				func = function() ACD:SelectGroup("ElvUI", "sle", "options", "loot") end,
+				func = function() SLE.ACD:SelectGroup("ElvUI", "sle", "modules", "loot") end,
 			}
 		else
 			E.Options.args.general.args.general.args.autoRoll = {
@@ -270,36 +274,61 @@ function LT:Update()
 		end
 	end

-	if E.db.sle.loot.autoroll.autoconfirm then
-		self:RegisterEvent("CONFIRM_DISENCHANT_ROLL", HandleEvent)
-		self:RegisterEvent("CONFIRM_LOOT_ROLL", HandleEvent)
-		self:RegisterEvent("LOOT_BIND_CONFIRM", HandleEvent)
-		UIParent:UnregisterEvent("LOOT_BIND_CONFIRM") --Solo
-		UIParent:UnregisterEvent("CONFIRM_DISENCHANT_ROLL") --Group
-		UIParent:UnregisterEvent("CONFIRM_LOOT_ROLL") --Group
-	else
-		self:UnregisterEvent("CONFIRM_DISENCHANT_ROLL")
-		self:UnregisterEvent("CONFIRM_LOOT_ROLL")
-		self:UnregisterEvent("LOOT_BIND_CONFIRM")
-		UIParent:RegisterEvent("LOOT_BIND_CONFIRM") --Solo
-		UIParent:RegisterEvent("CONFIRM_DISENCHANT_ROLL") --Group
-		UIParent:RegisterEvent("CONFIRM_LOOT_ROLL") --Group
-	end
+	LT:Toggle()
+	LT:AutoToggle()
+	LT:LootAlpha()
+end

-	LootHistoryFrame:SetAlpha(E.db.sle.loot.history.alpha or 1)
+function LT:PLAYER_LEVEL_UP(event, level)
+	LT.PlayerLevel = level
 end

+function LT:AddLootIcons(event, message, ...)
+	if LT.db.looticons.channels[event] then
+		local function IconForLink(link)
+			local texture = T.GetItemIcon(link)
+			return (LT.db.looticons.position == "LEFT") and "\124T" .. texture .. ":" .. LT.db.looticons.size .. "\124t" .. link or link .. "\124T" .. texture .. ":" .. LT.db.looticons.size .. "\124t"
+		end
+		message = T.gsub(message, "(\124c%x+\124Hitem:.-\124h\124r)", IconForLink)
+	end
+	return false, message, ...
+end

-function LT:PLAYER_LEVEL_UP(event, level)
-	PlayerLevel = level
+function LT:LootIconToggle()
+	if LT.db.looticons.enable then
+		for i = 1, #LT.IconChannels do
+			ChatFrame_AddMessageEventFilter(LT.IconChannels[i], LT.AddLootIcons)
+		end
+	else
+		for i = 1, #LT.IconChannels do
+			ChatFrame_RemoveMessageEventFilter(LT.IconChannels[i], LT.AddLootIcons)
+		end
+	end
 end

 function LT:Initialize()
-	if not E.db.sle.loot.enable then return end
-	--self:RegisterEvent("START_LOOT_ROLL", HandleRoll)
+	if not SLE.initialized then return end
+	LT.db = E.db.sle.loot
 	self:RegisterEvent("PLAYER_LEVEL_UP")

-	LT:LoadLoot()
+	function LT:ForUpdateAll()
+		LT.db = E.db.sle.loot
+		LT:Update()
+		LT:LootShow()
+		LT:LootIconToggle()
+	end
+
+	LT.MaxPlayerLevel = T.GetMaxPlayerLevel()
+	LT.PlayerLevel = T.UnitLevel('player')
+
+	--Azil made this, blame him if something fucked up
+	if E.db.general and LT.db.autoroll.enable then
+		E.db.general.autoRoll = false
+	end
 	LT:Update()
-	hooksecurefunc(M, 'START_LOOT_ROLL', function(self, event, id) HandleRoll(event, id) end)
-end
\ No newline at end of file
+	hooksecurefunc(M, 'START_LOOT_ROLL', function(self, event, id) LT:HandleRoll(event, id) end)
+	-- hooksecurefunc("LootHistoryFrame_FullUpdate", )
+	LT:LootIconToggle()
+end
+
+SLE:RegisterModule(LT:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/minimap/instance.lua b/ElvUI_SLE/modules/minimap/instance.lua
index b3f7311..3d8c6ee 100644
--- a/ElvUI_SLE/modules/minimap/instance.lua
+++ b/ElvUI_SLE/modules/minimap/instance.lua
@@ -1,9 +1,6 @@
-local E, L, V, P, G = unpack(ElvUI);
-local I = E:GetModule('SLE_InstDif')
-local GetInstanceInfo = GetInstanceInfo
-local sub = string.sub
-local IsInInstance, IsInGuild = IsInInstance, IsInGuild
-local f
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local I = SLE:NewModule("InstDif",'AceHook-3.0', 'AceEvent-3.0')
+local sub = string.utf8sub
 local LSM = LibStub("LibSharedMedia-3.0")

 local Difficulties = {
@@ -22,28 +19,29 @@ local Difficulties = {
 	[15] = 'heroic', --13-30ppl heroic
 	[16] = 'mythic', --20ppl mythic
 	[17] = 'lfr', --10-30 LFR
+	[23] = 'mythic', --5ppl mythic
+	[24] = 'time', --Timewalking
 }

 function I:CreateText()
-	f = CreateFrame("Frame", "MiniMapDifFrame", Minimap)
-	f:Size(50, 20)
-	-- f:Point("CENTER", UIParent)
-	f.text = f:CreateFontString(nil, 'OVERLAY')
-	f.text:SetPoint("CENTER", f, "CENTER")
-	f.icon = f:CreateFontString(nil, 'OVERLAY')
-	f.icon:SetPoint("LEFT", f.text, "RIGHT", 4, 0)
+	I.frame = CreateFrame("Frame", "MiniMapDifFrame", Minimap)
+	I.frame:Size(50, 20)
+	-- I.frame:Point("CENTER", UIParent)
+	I.frame.text = I.frame:CreateFontString(nil, 'OVERLAY')
+	I.frame.text:SetPoint("CENTER", I.frame, "CENTER")
+	I.frame.icon = I.frame:CreateFontString(nil, 'OVERLAY')
+	I.frame.icon:SetPoint("LEFT", I.frame.text, "RIGHT", 4, 0)
 	self:SetFonts()
 end

 function I:SetFonts()
-	local db = E.db.sle.minimap.instance
-	f.text:SetFont(LSM:Fetch('font', db.font), db.fontSize, db.fontOutline)
-	f.icon:SetFont(LSM:Fetch('font', db.font), db.fontSize, db.fontOutline)
+	I.frame.text:SetFont(LSM:Fetch('font', I.db.font), I.db.fontSize, I.db.fontOutline)
+	I.frame.icon:SetFont(LSM:Fetch('font', I.db.font), I.db.fontSize, I.db.fontOutline)
 end


-local function InstanceCheck()
-	local isInstance, InstanseType = IsInInstance()
+function I:InstanceCheck()
+	local isInstance, InstanseType = T.IsInInstance()
 	local s = false
 	if isInstance and InstanseType ~= "pvp" then
 		if InstanseType ~= "arena" then
@@ -54,7 +52,7 @@ local function InstanceCheck()
 	return s
 end

-local function GuildEmblem()
+function I:GuildEmblem()
 	-- table
 	local char = {}
 	-- check if Blizzard_GuildUI is loaded
@@ -63,7 +61,7 @@ local function GuildEmblem()
 	else
 		char.guildTexCoord = false
 	end
-	if IsInGuild() and char.guildTexCoord then
+	if T.IsInGuild() and char.guildTexCoord then
 		return "|TInterface\\GuildFrame\\GuildEmblemsLG_01:24:24:-4:1:32:32:"..(char.guildTexCoord[1]*32)..":"..(char.guildTexCoord[7]*32)..":"..(char.guildTexCoord[2]*32)..":"..(char.guildTexCoord[8]*32).."|t"
 	else
 		return ""
@@ -71,28 +69,28 @@ local function GuildEmblem()
 end

 function I:UpdateFrame()
-	local db = E.db.sle.minimap.instance
-	if IsInInstance() then
+	local db = I.db
+	if T.IsInInstance() then
 		if not db.flag then
 			MiniMapInstanceDifficulty:Hide()
 		elseif db.flag and not MiniMapInstanceDifficulty:IsShown() then
 			MiniMapInstanceDifficulty:Show()
 		end
 	end
-	f:Point("TOPLEFT", Minimap, "TOPLEFT", db.xoffset, db.yoffset)
+	I.frame:Point("TOPLEFT", Minimap, "TOPLEFT", db.xoffset, db.yoffset)
 	I:SetFonts()
 	if db.enable then
-		f.text:Show()
-		f.icon:Show()
+		I.frame.text:Show()
+		I.frame.icon:Show()
 	else
-		f.text:Hide()
-		f.icon:Hide()
+		I.frame.text:Hide()
+		I.frame.icon:Hide()
 	end
 end

 function I:GetColor(dif)
 	if dif and Difficulties[dif] then
-		local color = E.db.sle.minimap.instance.colors[Difficulties[dif]]
+		local color = I.db.colors[Difficulties[dif]]
 		return color.r*255, color.g*255, color.b*255
 	else
 		return 255, 255, 255
@@ -101,30 +99,40 @@ end

 function I:GenerateText(event, guild, force)
 	local text
-	if not InstanceCheck() then
-		f.text:SetText("")
-		f.icon:SetText("")
+	if not I:InstanceCheck() then
+		I.frame.text:SetText("")
+		I.frame.icon:SetText("")
 	else
-		local _, _, difficulty, difficultyName, _, _, _, _, instanceGroupSize = GetInstanceInfo()
+		local _, _, difficulty, difficultyName, _, _, _, _, instanceGroupSize = T.GetInstanceInfo()
 		local r, g, b = I:GetColor(difficulty)
 		if (difficulty >= 3 and difficulty <= 7) or difficulty == 9 then
-			text = format("|cff%02x%02x%02x%s|r", r, g, b, instanceGroupSize)
+			text = T.format("|cff%02x%02x%02x%s|r", r, g, b, instanceGroupSize)
 		else
-			difficultyName = sub(difficultyName, 1 , 2)
-			text = format(instanceGroupSize.." |cff%02x%02x%02x%s|r", r, g, b, difficultyName)
+			difficultyName = sub(difficultyName, 1 , 1)
+			text = T.format(instanceGroupSize.." |cff%02x%02x%02x%s|r", r, g, b, difficultyName)
 		end
-		f.text:SetText(text)
+		I.frame.text:SetText(text)
 		if guild or force then
-			local logo = GuildEmblem()
-			f.icon:SetText(logo)
+			local logo = I:GuildEmblem()
+			I.frame.icon:SetText(logo)
 		end
 	end
 end

 function I:Initialize()
+	if not SLE.initialized then return end
+	I.db = E.db.sle.minimap.instance
 	self:CreateText()
-	MiniMapInstanceDifficulty:HookScript("OnShow", function(self) if not E.db.sle.minimap.instance.flag then self:Hide() end end)
+	MiniMapInstanceDifficulty:HookScript("OnShow", function(self) if not I.db.flag then self:Hide() end end)
 	self:RegisterEvent("PLAYER_ENTERING_WORLD", "GenerateText")
+	self:RegisterEvent("ZONE_CHANGED_NEW_AREA", "GenerateText")
 	self:RegisterEvent("GUILD_PARTY_STATE_UPDATED", "GenerateText")
 	self:UpdateFrame()
-end
\ No newline at end of file
+
+	function I:ForUpdateAll()
+		I.db = E.db.sle.minimap.instance
+		I:UpdateFrame()
+	end
+end
+
+SLE:RegisterModule(I:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/minimap/load_minimap.xml b/ElvUI_SLE/modules/minimap/load_minimap.xml
index 947a16d..33d6947 100644
--- a/ElvUI_SLE/modules/minimap/load_minimap.xml
+++ b/ElvUI_SLE/modules/minimap/load_minimap.xml
@@ -2,4 +2,5 @@
 	<Script file='minimapcoords.lua'/>
 	<Script file='minimapicons.lua'/>
 	<Script file='instance.lua'/>
+	<Script file='locationbar.lua'/>
 </Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/minimap/locationbar.lua b/ElvUI_SLE/modules/minimap/locationbar.lua
new file mode 100644
index 0000000..38b4add
--- /dev/null
+++ b/ElvUI_SLE/modules/minimap/locationbar.lua
@@ -0,0 +1,395 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local M = E:GetModule('Minimap')
+local MM, DD = SLE:GetModules("Minimap", "Dropdowns")
+local LP = SLE:NewModule("LocationPanel", "AceTimer-3.0")
+local LSM = LibStub("LibSharedMedia-3.0");
+local loc_panel
+local COORDS_WIDTH = 35 -- Coord panels width
+
+local _G = _G
+local cluster = _G["MinimapCluster"]
+local faction
+local GetScreenHeight = GetScreenHeight
+local CreateFrame = CreateFrame
+local ToggleFrame = ToggleFrame
+local IsShiftKeyDown = IsShiftKeyDown
+local ChatEdit_ChooseBoxForSend, ChatEdit_ActivateChat = ChatEdit_ChooseBoxForSend, ChatEdit_ActivateChat
+local UNKNOWN, GARRISON_LOCATION_TOOLTIP, ITEMS, SPELLS, CLOSE, BACK = UNKNOWN, GARRISON_LOCATION_TOOLTIP, ITEMS, SPELLS, CLOSE, BACK
+LP.CDformats = {
+	["DEFAULT"] = [[ (%s |TInterface\FriendsFrame\StatusIcon-Away:16|t)]],
+	["DEFAULT_ICONFIRST"] = [[ (|TInterface\FriendsFrame\StatusIcon-Away:16|t %s)]],
+}
+
+LP.ReactionColors = {
+	["sanctuary"] = {r = 0.41, g = 0.8, b = 0.94},
+	["arena"] = {r = 1, g = 0.1, b = 0.1},
+	["friendly"] = {r = 0.1, g = 1, b = 0.1},
+	["hostile"] = {r = 1, g = 0.1, b = 0.1},
+	["contested"] = {r = 1, g = 0.7, b = 0.10},
+	["combat"] = {r = 1, g = 0.1, b = 0.1},
+}
+
+LP.MainMenu = {}
+LP.SecondaryMenu = {}
+
+local function GetDirection()
+	local x, y = _G["SLE_LocationPanel"]:GetCenter()
+	local screenHeight = GetScreenHeight()
+	local anchor, point = "TOP", "BOTTOM"
+	if y and y < (screenHeight / 2) then
+		anchor = "BOTTOM"
+		point = "TOP"
+	end
+	return anchor, point
+end
+
+LP.PortItems = {}
+LP.Spells = {
+	["DEATHKNIGHT"] = {
+		[1] = {text =  T.GetSpellInfo(50977),icon = SLE:GetIconFromID("spell", 50977),secure = {buttonType = "spell",ID = 50977}},
+	},
+	["DEMONHUNTER"] = {},
+	["DRUID"] = {
+		[1] = {text =  T.GetSpellInfo(18960),icon = SLE:GetIconFromID("spell", 18960),secure = {buttonType = "spell",ID = 18960}},--Moonglade
+		[2] = {text =  T.GetSpellInfo(147420),icon = SLE:GetIconFromID("spell", 147420),secure = {buttonType = "spell",ID = 147420}},--One With Nature
+		[3] = {text =  T.GetSpellInfo(193753),icon = SLE:GetIconFromID("spell", 193753),secure = {buttonType = "spell",ID = 193753}},--Druid ClassHall
+	},
+	["HUNTER"] = {},
+	["MAGE"] = {
+		[1] = {text =  T.GetSpellInfo(193759),icon = SLE:GetIconFromID("spell", 193759),secure = {buttonType = "spell",ID = 193759}}, --Guardian place
+	},
+	["MONK"] = {
+		[1] = {text =  T.GetSpellInfo(126892),icon = SLE:GetIconFromID("spell", 126892),secure = {buttonType = "spell",ID = 126892}},-- Zen Pilgrimage
+		[2] = {text =  T.GetSpellInfo(126895),icon = SLE:GetIconFromID("spell", 126895),secure = {buttonType = "spell",ID = 126895}},-- Zen Pilgrimage: Return
+	},
+	["PALADIN"] = {},
+	["PRIEST"] = {},
+	["ROGUE"] = {},
+	["SHAMAN"] = {
+		[1] = {text =  T.GetSpellInfo(556),icon = SLE:GetIconFromID("spell", 556),secure = {buttonType = "spell",ID = 556}},
+	},
+	["WARLOCK"] = {},
+	["WARRIOR"] = {},
+	["teleports"] = {
+		["Horde"] = {
+			[1] = {text = T.GetSpellInfo(3563),icon = SLE:GetIconFromID("spell", 3563),secure = {buttonType = "spell",ID = 3563}},-- TP:Undercity
+			[2] = {text = T.GetSpellInfo(3566),icon = SLE:GetIconFromID("spell", 3566),secure = {buttonType = "spell",ID = 3566}},-- TP:Thunder Bluff
+			[3] = {text = T.GetSpellInfo(3567),icon = SLE:GetIconFromID("spell", 3567),secure = {buttonType = "spell",ID = 3567}},-- TP:Orgrimmar
+			[4] = {text = T.GetSpellInfo(32272),icon = SLE:GetIconFromID("spell", 32272),secure = {buttonType = "spell",ID = 32272}},-- TP:Silvermoon
+			[5] = {text = T.GetSpellInfo(49358),icon = SLE:GetIconFromID("spell", 49358),secure = {buttonType = "spell",ID = 49358}},-- TP:Stonard
+			[6] = {text = T.GetSpellInfo(35715),icon = SLE:GetIconFromID("spell", 35715),secure = {buttonType = "spell",ID = 35715}},-- TP:Shattrath
+			[7] = {text = T.GetSpellInfo(53140),icon = SLE:GetIconFromID("spell", 53140),secure = {buttonType = "spell",ID = 53140}},-- TP:Dalaran - Northrend
+			[8] = {text = T.GetSpellInfo(88344),icon = SLE:GetIconFromID("spell", 88344),secure = {buttonType = "spell",ID = 88344}},-- TP:Tol Barad
+			[9] = {text = T.GetSpellInfo(132627),icon = SLE:GetIconFromID("spell", 132627),secure = {buttonType = "spell",ID = 132627}},-- TP:Vale of Eternal Blossoms
+			[10] = {text = T.GetSpellInfo(120145),icon = SLE:GetIconFromID("spell", 120145),secure = {buttonType = "spell",ID = 120145}},-- TP:Ancient Dalaran
+			[11] = {text = T.GetSpellInfo(176242),icon = SLE:GetIconFromID("spell", 176242),secure = {buttonType = "spell",ID = 176242}},-- TP:Warspear
+			[12] = {text = T.GetSpellInfo(224873),icon = SLE:GetIconFromID("spell", 224873),secure = {buttonType = "spell",ID = 224873}},-- TP:Dalaran - BI
+		},
+		["Alliance"] = {
+			[1] = {text = T.GetSpellInfo(3561),icon = SLE:GetIconFromID("spell", 3561),secure = {buttonType = "spell",ID = 3561}},-- TP:Stormwind
+			[2] = {text = T.GetSpellInfo(3562),icon = SLE:GetIconFromID("spell", 3562),secure = {buttonType = "spell",ID = 3562}},-- TP:Ironforge
+			[3] = {text = T.GetSpellInfo(3565),icon = SLE:GetIconFromID("spell", 3565),secure = {buttonType = "spell",ID = 3565}},-- TP:Darnassus
+			[4] = {text = T.GetSpellInfo(32271),icon = SLE:GetIconFromID("spell", 32271),secure = {buttonType = "spell",ID = 32271}},-- TP:Exodar
+			[5] = {text = T.GetSpellInfo(49359),icon = SLE:GetIconFromID("spell", 49359),secure = {buttonType = "spell",ID = 49359}},-- TP:Theramore
+			[6] = {text = T.GetSpellInfo(33690),icon = SLE:GetIconFromID("spell", 33690),secure = {buttonType = "spell",ID = 33690}},-- TP:Shattrath
+			[7] = {text = T.GetSpellInfo(53140),icon = SLE:GetIconFromID("spell", 53140),secure = {buttonType = "spell",ID = 53140}},-- TP:Dalaran - Northrend
+			[8] = {text = T.GetSpellInfo(88342),icon = SLE:GetIconFromID("spell", 88342),secure = {buttonType = "spell",ID = 88342}},-- TP:Tol Barad
+			[9] = {text = T.GetSpellInfo(132621),icon = SLE:GetIconFromID("spell", 132621),secure = {buttonType = "spell",ID = 132621}},-- TP:Vale of Eternal Blossoms
+			[10] = {text = T.GetSpellInfo(120145),icon = SLE:GetIconFromID("spell", 120145),secure = {buttonType = "spell",ID = 120145}},-- TP:Ancient Dalaran
+			[11] = {text = T.GetSpellInfo(176248),icon = SLE:GetIconFromID("spell", 176248),secure = {buttonType = "spell",ID = 176248}},-- TP:StormShield
+			[12] = {text = T.GetSpellInfo(224873),icon = SLE:GetIconFromID("spell", 224873),secure = {buttonType = "spell",ID = 224873}},-- TP:Dalaran - BI
+		},
+	},
+	["portals"] = {
+		["Horde"] = {
+			[1] = {text = T.GetSpellInfo(11418),icon = SLE:GetIconFromID("spell", 11418),secure = {buttonType = "spell",ID = 11418}},-- P:Undercity
+			[2] = {text = T.GetSpellInfo(11420),icon = SLE:GetIconFromID("spell", 11420),secure = {buttonType = "spell",ID = 11420}}, -- P:Thunder Bluff
+			[3] = {text = T.GetSpellInfo(11417),icon = SLE:GetIconFromID("spell", 11417),secure = {buttonType = "spell",ID = 11417}},-- P:Orgrimmar
+			[4] = {text = T.GetSpellInfo(32267),icon = SLE:GetIconFromID("spell", 32267),secure = {buttonType = "spell",ID = 32267}},-- P:Silvermoon
+			[5] = {text = T.GetSpellInfo(49361),icon = SLE:GetIconFromID("spell", 49361),secure = {buttonType = "spell",ID = 49361}},-- P:Stonard
+			[6] = {text = T.GetSpellInfo(35717),icon = SLE:GetIconFromID("spell", 35717),secure = {buttonType = "spell",ID = 35717}},-- P:Shattrath
+			[7] = {text = T.GetSpellInfo(53142),icon = SLE:GetIconFromID("spell", 53142),secure = {buttonType = "spell",ID = 53142}},-- P:Dalaran - Northred
+			[8] = {text = T.GetSpellInfo(88346),icon = SLE:GetIconFromID("spell", 88346),secure = {buttonType = "spell",ID = 88346}},-- P:Tol Barad
+			[9] = {text = T.GetSpellInfo(120146),icon = SLE:GetIconFromID("spell", 120146),secure = {buttonType = "spell",ID = 120146}},-- P:Ancient Dalaran
+			[10] = {text = T.GetSpellInfo(132626),icon = SLE:GetIconFromID("spell", 132626),secure = {buttonType = "spell",ID = 132626}},-- P:Vale of Eternal Blossoms
+			[11] = {text = T.GetSpellInfo(176244),icon = SLE:GetIconFromID("spell", 176244),secure = {buttonType = "spell",ID = 176244}},-- P:Warspear
+			[12] = {text = T.GetSpellInfo(224871),icon = SLE:GetIconFromID("spell", 224871),secure = {buttonType = "spell",ID = 224871}},-- P:Dalaran - BI
+		},
+		["Alliance"] = {
+			[1] = {text = T.GetSpellInfo(10059),icon = SLE:GetIconFromID("spell", 10059),secure = {buttonType = "spell",ID = 10059}},-- P:Stormwind
+			[2] = {text = T.GetSpellInfo(11416),icon = SLE:GetIconFromID("spell", 11416),secure = {buttonType = "spell",ID = 11416}},-- P:Ironforge
+			[3] = {text = T.GetSpellInfo(11419),icon = SLE:GetIconFromID("spell", 11419),secure = {buttonType = "spell",ID = 11419}},-- P:Darnassus
+			[4] = {text = T.GetSpellInfo(32266),icon = SLE:GetIconFromID("spell", 32266),secure = {buttonType = "spell",ID = 32266}},-- P:Exodar
+			[5] = {text = T.GetSpellInfo(49360),icon = SLE:GetIconFromID("spell", 49360),secure = {buttonType = "spell",ID = 49360}},-- P:Theramore
+			[6] = {text = T.GetSpellInfo(33691),icon = SLE:GetIconFromID("spell", 33691),secure = {buttonType = "spell",ID = 33691}},-- P:Shattrath
+			[7] = {text = T.GetSpellInfo(53142),icon = SLE:GetIconFromID("spell", 53142),secure = {buttonType = "spell",ID = 53142}},-- P:Dalaran - Northred
+			[8] = {text = T.GetSpellInfo(88345),icon = SLE:GetIconFromID("spell", 88345),secure = {buttonType = "spell",ID = 88345}},-- P:Tol Barad
+			[9] = {text = T.GetSpellInfo(120146),icon = SLE:GetIconFromID("spell", 120146),secure = {buttonType = "spell",ID = 120146}},-- P:Ancient Dalaran
+			[10] = {text = T.GetSpellInfo(132620),icon = SLE:GetIconFromID("spell", 132620),secure = {buttonType = "spell",ID = 132620}},-- P:Vale of Eternal Blossoms
+			[11] = {text = T.GetSpellInfo(176246),icon = SLE:GetIconFromID("spell", 176246),secure = {buttonType = "spell",ID = 176246}},-- P:StormShield
+			[12] = {text = T.GetSpellInfo(224871),icon = SLE:GetIconFromID("spell", 224871),secure = {buttonType = "spell",ID = 224871}},-- P:Dalaran - BI
+		},
+	},
+}
+
+local function CreateCoords()
+	local x, y = T.GetPlayerMapPosition("player")
+	x = T.format(LP.db.format, x * 100)
+	y = T.format(LP.db.format, y * 100)
+
+	return x, y
+end
+
+function LP:CreateLocationPanel()
+	loc_panel = CreateFrame('Frame', "SLE_LocationPanel", E.UIParent)
+	loc_panel:Point('TOP', E.UIParent, 'TOP', 0, -E.mult -22)
+	loc_panel:SetFrameStrata('LOW')
+	loc_panel:SetFrameLevel(2)
+	loc_panel:EnableMouse(true)
+	loc_panel:SetScript('OnMouseUp', LP.OnClick)
+	loc_panel:SetScript("OnUpdate", LP.UpdateCoords)
+
+	-- Location Text
+	loc_panel.Text = loc_panel:CreateFontString(nil, "LOW")
+	loc_panel.Text:Point("CENTER", 0, 0)
+	loc_panel.Text:SetWordWrap(false)
+	E.FrameLocks[loc_panel] = true
+
+	--Coords
+	loc_panel.Xcoord = CreateFrame('Frame', "SLE_LocationPanel_X", loc_panel)
+	loc_panel.Xcoord:SetPoint("RIGHT", loc_panel, "LEFT", 1 - 2*E.Spacing, 0)
+	loc_panel.Xcoord.Text = loc_panel.Xcoord:CreateFontString(nil, "LOW")
+	loc_panel.Xcoord.Text:Point("CENTER", 0, 0)
+
+	loc_panel.Ycoord = CreateFrame('Frame', "SLE_LocationPanel_Y", loc_panel)
+	loc_panel.Ycoord:SetPoint("LEFT", loc_panel, "RIGHT", -1 + 2*E.Spacing, 0)
+	loc_panel.Ycoord.Text = loc_panel.Ycoord:CreateFontString(nil, "LOW")
+	loc_panel.Ycoord.Text:Point("CENTER", 0, 0)
+
+	LP:Resize()
+	-- Mover
+	E:CreateMover(loc_panel, "SLE_Location_Mover", L["Location Panel"], nil, nil, nil, "ALL,S&L,S&L MISC")
+
+	LP.Menu1 = CreateFrame("Frame", "SLE_LocationPanel_RightClickMenu1", E.UIParent)
+	LP.Menu1:SetTemplate("Transparent", true)
+	LP.Menu2 = CreateFrame("Frame", "SLE_LocationPanel_RightClickMenu2", E.UIParent)
+	LP.Menu2:SetTemplate("Transparent", true)
+	DD:RegisterMenu(LP.Menu1)
+	DD:RegisterMenu(LP.Menu2)
+end
+
+function LP:OnClick(btn)
+	local zoneText = T.GetRealZoneText() or UNKNOWN;
+	if btn == "LeftButton" then
+		if IsShiftKeyDown() and LP.db.linkcoords then
+			local edit_box = ChatEdit_ChooseBoxForSend()
+			local x, y = CreateCoords()
+			local message
+			local coords = x..", "..y
+				if zoneText ~= T.GetSubZoneText() then
+					message = T.format("%s: %s (%s)", zoneText, T.GetSubZoneText(), coords)
+				else
+					message = T.format("%s (%s)", zoneText, coords)
+				end
+			ChatEdit_ActivateChat(edit_box)
+			edit_box:Insert(message)
+		else
+			ToggleFrame(_G["WorldMapFrame"])
+		end
+	elseif btn == "RightButton" and LP.db.portals.enable then
+		LP:PopulateDropdown()
+	end
+end
+
+function LP:UpdateCoords(elapsed)
+	LP.elapsed = LP.elapsed + elapsed
+	if LP.elapsed < LP.db.throttle then return end
+	--Coords
+	local x, y = CreateCoords()
+	if x == "0" or x == "0.0" or x == "0.00" then x = "-" end
+	if y == "0" or y == "0.0" or y == "0.00" then y = "-" end
+	loc_panel.Xcoord.Text:SetText(x)
+	loc_panel.Ycoord.Text:SetText(y)
+	--Location
+	local subZoneText = T.GetMinimapZoneText() or ""
+	local zoneText = T.GetRealZoneText() or UNKNOWN;
+	local displayLine
+	if LP.db.zoneText then
+		if (subZoneText ~= "") and (subZoneText ~= zoneText) then
+			displayLine = zoneText .. ": " .. subZoneText
+		else
+			displayLine = subZoneText
+		end
+	else
+		displayLine = subZoneText
+	end
+	loc_panel.Text:SetText(displayLine)
+
+	--Location Colorings
+	if displayLine ~= "" then
+		local color = {r = 1, g = 1, b = 1}
+		if LP.db.colorType == "REACTION" then
+			local inInstance, _ = T.IsInInstance()
+			if inInstance then
+				color = {r = 1, g = 0.1,b =  0.1}
+			else
+				local pvpType = T.GetZonePVPInfo()
+				color = LP.ReactionColors[pvpType] or {r = 1, g = 1, b = 0}
+			end
+		elseif LP.db.colorType == "CUSTOM" then
+			color = LP.db.customColor
+		end
+		loc_panel.Text:SetTextColor(color.r, color.g, color.b)
+	end
+
+	LP.elapsed = 0
+end
+
+function LP:Resize()
+	loc_panel:Size(LP.db.width, LP.db.height)
+	loc_panel.Text:Width(LP.db.width - 18)
+	loc_panel.Xcoord:Size(LP.db.fontSize * 3, LP.db.height)
+	loc_panel.Ycoord:Size(LP.db.fontSize * 3, LP.db.height)
+end
+
+function LP:Fonts()
+	loc_panel.Text:SetFont(LSM:Fetch('font', LP.db.font), LP.db.fontSize, LP.db.fontOutline)
+	loc_panel.Xcoord.Text:SetFont(LSM:Fetch('font', LP.db.font), LP.db.fontSize, LP.db.fontOutline)
+	loc_panel.Ycoord.Text:SetFont(LSM:Fetch('font', LP.db.font), LP.db.fontSize, LP.db.fontOutline)
+end
+
+function LP:Template()
+	loc_panel:SetTemplate(LP.db.template)
+	loc_panel.Xcoord:SetTemplate(LP.db.template)
+	loc_panel.Ycoord:SetTemplate(LP.db.template)
+end
+
+function LP:Toggle()
+	if LP.db.enable then
+		loc_panel:Show()
+		E:EnableMover(loc_panel.mover:GetName())
+	else
+		loc_panel:Hide()
+		E:DisableMover(loc_panel.mover:GetName())
+	end
+end
+
+function LP:PopulateItems()
+	local noItem = false
+	if T.select(2, T.GetItemInfo(6948)) == nil then noItem = true end
+	if noItem then
+		E:Delay(2, LP.PopulateItems)
+	else
+		LP.PortItems[1] = {text = T.GetItemInfo(6948), icon = SLE:GetIconFromID("item", 6948),secure = {buttonType = "item",ID = 6948}} --Hearthstone
+		LP.PortItems[2] = {text = T.GetItemInfo(64488), icon = SLE:GetIconFromID("item", 64488),secure = {buttonType = "item",ID = 64488}} -- The Innkeeper's Daughter
+		LP.PortItems[3] = {text = GARRISON_LOCATION_TOOLTIP, icon = SLE:GetIconFromID("item", 110560),secure = {buttonType = "item",ID = 110560}} --Garrison Hearthstone
+		LP.PortItems[4] = {text = DUNGEON_FLOOR_DALARAN1, icon = SLE:GetIconFromID("item", 140192),secure = {buttonType = "item",ID = 140192}} --Dalaran Hearthstone
+		LP.PortItems[5] = {text = T.GetItemInfo(48933), icon = SLE:GetIconFromID("item", 48933),secure = {buttonType = "item",ID = 48933}} --Wormhole Generator: Northrend
+		LP.PortItems[6] = {text = T.GetItemInfo(87215), icon = SLE:GetIconFromID("item", 87215),secure = {buttonType = "item",ID = 87215}} --Wormhole Generator: Pandaria
+		LP.PortItems[7] = {text = T.GetItemInfo(112059), icon = SLE:GetIconFromID("item", 112059),secure = {buttonType = "item",ID = 112059}} --Wormhole Centrifuge
+		LP.PortItems[8] = {text = T.GetItemInfo(128502), icon = SLE:GetIconFromID("item", 128502),secure = {buttonType = "item",ID = 128502}} --Hunter's Seeking Crystal
+		LP.PortItems[9] = {text = T.GetItemInfo(128503), icon = SLE:GetIconFromID("item", 128503),secure = {buttonType = "item",ID = 128503}} --Master Hunter's Seeking Crystal
+	end
+end
+
+function LP:ItemList(check)
+	for i = 1, #LP.PortItems do
+		local data = LP.PortItems[i]
+		if SLE:BagSearch(data.secure.ID) then
+			if check then
+				T.tinsert(LP.MainMenu, {text = ITEMS..":", title = true, nohighlight = true})
+				return true
+			else
+				local tmp = {}
+				local cd = DD:GetCooldown("Item", data.secure.ID)
+				if cd then
+					E:CopyTable(tmp, data)
+					tmp.text = tmp.text..T.format(LP.CDformats[LP.db.portals.cdFormat], cd)
+					T.tinsert(LP.MainMenu, tmp)
+				else
+					T.tinsert(LP.MainMenu, data)
+				end
+			end
+		end
+	end
+end
+
+function LP:SpellList(list, dropdown, check)
+	local tmp = {}
+	for i = 1, #list do
+		local data = list[i]
+		if T.IsSpellKnown(data.secure.ID) then
+			if check then
+				return true
+			else
+				local cd = DD:GetCooldown("Spell", data.secure.ID)
+				if cd then
+					E:CopyTable(tmp, data)
+					tmp.text = tmp.text..T.format(LP.CDformats[LP.db.portals.cdFormat], cd)
+					T.tinsert(dropdown, tmp)
+				else
+					T.tinsert(dropdown, data)
+				end
+			end
+		end
+	end
+end
+
+function LP:PopulateDropdown()
+	if LP.Menu2:IsShown() then ToggleFrame(LP.Menu2) end
+	T.twipe(LP.MainMenu)
+	local anchor, point = GetDirection()
+	local MENU_WIDTH
+	if LP:ItemList(true) then
+		LP:ItemList()
+	end
+	if LP:SpellList(LP.Spells[E.myclass], nil, true) or E.myclass == "MAGE" then
+		T.tinsert(LP.MainMenu, {text = SPELLS..":", title = true, nohighlight = true})
+		LP:SpellList(LP.Spells[E.myclass], LP.MainMenu)
+		if E.myclass == "MAGE" then
+			T.tinsert(LP.MainMenu, {text = L["Teleports"].." >>", icon = SLE:GetIconFromID("spell", 53140), func = function()
+				T.twipe(LP.SecondaryMenu)
+				MENU_WIDTH = LP.db.portals.customWidth and LP.db.portals.customWidthValue or _G["SLE_LocationPanel"]:GetWidth()
+				T.tinsert(LP.SecondaryMenu, {text = "<< "..BACK, func = function() LP:PopulateDropdown() end})
+				T.tinsert(LP.SecondaryMenu, {text = L["Teleports"]..":", title = true, nohighlight = true})
+				LP:SpellList(LP.Spells["teleports"][faction], LP.SecondaryMenu)
+				T.tinsert(LP.SecondaryMenu, {text = CLOSE, title = true, ending = true, func = function() ToggleFrame(LP.Menu2) end})
+				SLE:DropDown(LP.SecondaryMenu, LP.Menu2, anchor, point, 0, 0, _G["SLE_LocationPanel"], MENU_WIDTH, LP.db.portals.justify)
+			end})
+			T.tinsert(LP.MainMenu, {text = L["Portals"].." >>",icon = SLE:GetIconFromID("spell", 53142), func = function()
+				T.twipe(LP.SecondaryMenu)
+				MENU_WIDTH = LP.db.portals.customWidth and LP.db.portals.customWidthValue or _G["SLE_LocationPanel"]:GetWidth()
+				T.tinsert(LP.SecondaryMenu, {text = "<< "..BACK, func = function() LP:PopulateDropdown() end})
+				T.tinsert(LP.SecondaryMenu, {text = L["Portals"]..":", title = true, nohighlight = true})
+				LP:SpellList(LP.Spells["portals"][faction], LP.SecondaryMenu)
+				T.tinsert(LP.SecondaryMenu, {text = CLOSE, title = true, ending = true, func = function() ToggleFrame(LP.Menu2) end})
+				SLE:DropDown(LP.SecondaryMenu, LP.Menu2, anchor, point, 0, 0, _G["SLE_LocationPanel"], MENU_WIDTH, LP.db.portals.justify)
+			end})
+		end
+	end
+	T.tinsert(LP.MainMenu, {text = CLOSE, title = true, ending = true, func = function() ToggleFrame(LP.Menu1) end})
+	MENU_WIDTH = LP.db.portals.customWidth and LP.db.portals.customWidthValue or _G["SLE_LocationPanel"]:GetWidth()
+	SLE:DropDown(LP.MainMenu, LP.Menu1, anchor, point, 0, 0, _G["SLE_LocationPanel"], MENU_WIDTH, LP.db.portals.justify)
+end
+
+function LP:Initialize()
+	LP.db = E.db.sle.minimap.locPanel
+	if not SLE.initialized then return end
+	faction = T.UnitFactionGroup('player')
+	LP:PopulateItems()
+
+	LP.elapsed = 0
+	LP:CreateLocationPanel()
+	LP:Template()
+	LP:Fonts()
+	LP:Toggle()
+	function LP:ForUpdateAll()
+		LP.db = E.db.sle.minimap.locPanel
+		LP:Resize()
+		LP:Template()
+		LP:Fonts()
+		LP:Toggle()
+	end
+end
+
+SLE:RegisterModule(LP:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/minimap/minimapcoords.lua b/ElvUI_SLE/modules/minimap/minimapcoords.lua
index 548ee17..98af2f8 100644
--- a/ElvUI_SLE/modules/minimap/minimapcoords.lua
+++ b/ElvUI_SLE/modules/minimap/minimapcoords.lua
@@ -1,117 +1,122 @@
-local E, L, V, P, G = unpack(ElvUI);
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local M = E:GetModule('Minimap')
-
-local GetPlayerMapPosition = GetPlayerMapPosition
-local framescreated = false
-local panel, xpos, ypos
-local middle
-
-local cluster = _G['MinimapCluster']
+local MM = SLE:NewModule("Minimap", 'AceHook-3.0', 'AceEvent-3.0')
+local LSM = LibStub("LibSharedMedia-3.0");
+local _G = _G
+local cluster = _G["MinimapCluster"]
+local UIFrameFadeIn = UIFrameFadeIn

 local function HideMinimap()
 	cluster:Hide()
 end

 local function ShowMinimap()
-	if not InCombatLockdown() then
+	if not T.InCombatLockdown() then
 		UIFrameFadeIn(cluster, 0.2, cluster:GetAlpha(), 1)
 	end
 end

-local function UpdateCoords(self, elapsed)
-	local f = E.db.sle.minimap.coords.decimals and '%.2f' or '%.0f'
-	panel.elapsed = (panel.elapsed or 0) + elapsed
-	if panel.elapsed < .1 then return end
-
-	xpos.pos, ypos.pos = GetPlayerMapPosition('player')
-	xpos.text:SetFormattedText(E.db.sle.minimap.coords.middle == "CENTER" and f..'/' or f, xpos.pos * 100)
-	ypos.text:SetFormattedText(f, ypos.pos * 100)
+local function CreateCoords()
+	local x, y = T.GetPlayerMapPosition("player")
+	x = T.format(E.db.sle.minimap.coords.format, x * 100)
+	y = T.format(E.db.sle.minimap.coords.format, y * 100)
+
+	return x, y
+end

-	panel.elapsed = 0
+function MM:UpdateCoords(elapsed)
+	MM.coordspanel.elapsed = (MM.coordspanel.elapsed or 0) + elapsed
+	if MM.coordspanel.elapsed < E.db.sle.minimap.coords.throttle then return end
+
+	local x, y = CreateCoords()
+	if x == "0" or x == "0.0" or x == "0.00" then x = "-" end
+	if y == "0" or y == "0.0" or y == "0.00" then y = "-" end
+	MM.coordspanel.Text:SetText(x.." , "..y)
+	if not MM.coordspanel.FirstLoad then
+		MM.coordspanel.FirstLoad = true
+		MM:CoordsSize()
+	end
+	MM.coordspanel.elapsed = 0
 end

-function M:SLEHideMinimap()
+function MM:HideMinimapRegister()
 	if E.db.sle.minimap.combat then
-		M:RegisterEvent("PLAYER_REGEN_DISABLED", HideMinimap)
+		M:RegisterEvent("PLAYER_REGEN_DISABLED", HideMinimap)
 		M:RegisterEvent("PLAYER_REGEN_ENABLED", ShowMinimap)
 	else
-		M:UnregisterEvent("PLAYER_REGEN_DISABLED")
+		M:UnregisterEvent("PLAYER_REGEN_DISABLED")
 		M:UnregisterEvent("PLAYER_REGEN_ENABLED")
 	end
 end

-local function UpdatePosition(middle)
-	xpos:ClearAllPoints()
-	ypos:ClearAllPoints()
-	if middle == "CENTER" then
-		xpos:Point('BOTTOMRIGHT', panel, 'BOTTOM',10, 0)
-	else
-		xpos:Point('LEFT', panel, 'LEFT', 2, 0)
-	end
-	if middle == "CENTER" then
-		ypos:Point('BOTTOMLEFT', panel, 'BOTTOM', E.db.sle.minimap.coords.decimals and 0 or -15, 0)
-	else
-		ypos:Point('RIGHT', panel, 'RIGHT', 2, 0)
-	end
+function MM:CoordFont()
+	MM.coordspanel.Text:SetFont(LSM:Fetch('font', E.db.sle.minimap.coords.font), E.db.sle.minimap.coords.fontSize, E.db.sle.minimap.coords.fontOutline)
+end
+
+function MM:CoordsSize()
+	local size = MM.coordspanel.Text:GetStringWidth()
+	MM.coordspanel:Size(size + 4, E.db.sle.minimap.coords.fontSize + 2)
 end

-local function CreateCoordsFrame(middle)
-	panel = CreateFrame('Frame', 'CoordsPanel', E.UIParent)
-	panel:SetFrameStrata("MEDIUM")
-	panel:Point("CENTER", Minimap, "CENTER", 0, 0)
-	panel:Size(E.MinimapSize, 22)
-	E.FrameLocks['CoordsPanel'] = true;
+function MM:UpdateCoordinatesPosition()
+	MM.coordspanel:ClearAllPoints()
+	MM.coordspanel:SetPoint(E.db.sle.minimap.coords.position, Minimap)
+end

-	xpos = CreateFrame('Frame', "MapCoordinatesX", panel)
-	xpos:Size(40, 22)
+function MM:CreateCoordsFrame()
+	MM.coordspanel = CreateFrame('Frame', "SLE_CoordsPanel", E.UIParent)
+	-- MM.coordspanel:SetFrameStrata("MEDIUM")
+	MM.coordspanel:Point("BOTTOM", Minimap, "BOTTOM", 0, 0)
+	-- MM.coordspanel:CreateBackdrop()
+	E.FrameLocks["SLE_CoordsPanel"] = true;

-	xpos.text = xpos:CreateFontString(nil, "OVERLAY")
-	xpos.text:FontTemplate(E.media.font, 12, "OUTLINE")
-	xpos.text:SetAllPoints(xpos)
+	MM.coordspanel.Text = MM.coordspanel:CreateFontString(nil, "OVERLAY")
+	MM.coordspanel.Text:SetAllPoints(MM.coordspanel)
+	MM.coordspanel.Text:SetWordWrap(false)

-	ypos = CreateFrame('Frame', "MapCoordinatesY", panel)
-	ypos:Size(40, 22)
-
-	ypos.text = ypos:CreateFontString(nil, "OVERLAY")
-	ypos.text:FontTemplate(E.media.font, 12, "OUTLINE")
-	ypos.text:SetAllPoints(ypos)
 	Minimap:HookScript('OnEnter', function(self)
-		if E.db.sle.minimap.coords.display ~= 'MOUSEOVER' or not E.private.general.minimap.enable or not E.db.sle.minimap.enable then return; end
-		panel:Show()
+		if E.db.sle.minimap.coords.display ~= 'MOUSEOVER' or not E.private.general.minimap.enable or not E.db.sle.minimap.coords.enable then return; end
+		MM.coordspanel:Show()
 	end)

 	Minimap:HookScript('OnLeave', function(self)
-		if E.db.sle.minimap.coords.display ~= 'MOUSEOVER' or not E.private.general.minimap.enable or not E.db.sle.minimap.enable then return; end
-		panel:Hide()
-	end)
-	framescreated = true
-
-	UpdatePosition(middle)
+		if E.db.sle.minimap.coords.display ~= 'MOUSEOVER' or not E.private.general.minimap.enable or not E.db.sle.minimap.coords.enable then return; end
+		MM.coordspanel:Hide()
+	end)
+
+	MM:UpdateCoordinatesPosition()
 end

-function M:Transparency()
+function MM:MinimapTransparency()
 	cluster:SetAlpha(E.db.sle.minimap.alpha)
 end

-local function Update()
-	middle = E.db.sle.minimap.coords.middle
-
-	if not framescreated then
-		CreateCoordsFrame(middle)
+function MM:UpdateSettings()
+	if not MM.coordspanel then
+		MM:CreateCoordsFrame()
 	end
+	MM:CoordFont()
+	MM:CoordsSize()

-	panel:SetPoint('BOTTOM', Minimap, 'BOTTOM', 0, -(E.PixelMode and 1 or 2))
-	panel:Size(E.MinimapSize, 22)
-	panel:SetScript('OnUpdate', UpdateCoords)
-	UpdatePosition(middle)
-	if E.db.sle.minimap.coords.display ~= 'SHOW' or not E.private.general.minimap.enable or not E.db.sle.minimap.enable then
-		panel:Hide()
+	MM.coordspanel:SetPoint(E.db.sle.minimap.coords.position, Minimap)
+	MM.coordspanel:SetScript('OnUpdate', MM.UpdateCoords)
+
+	MM:UpdateCoordinatesPosition()
+	if E.db.sle.minimap.coords.display ~= 'SHOW' or not E.private.general.minimap.enable or not E.db.sle.minimap.coords.enable then
+		MM.coordspanel:Hide()
 	else
-		panel:Show()
+		MM.coordspanel:Show()
 	end
-
-	M:SLEHideMinimap()
-	M:Transparency()
+	MM:HideMinimapRegister()
+	MM:MinimapTransparency()
+end
+
+function MM:Initialize()
+	if not SLE.initialized then return end
+
+	hooksecurefunc(M, 'UpdateSettings', MM.UpdateSettings)
+
+	MM:UpdateSettings()
 end

-hooksecurefunc(M, 'UpdateSettings', Update)
\ No newline at end of file
+SLE:RegisterModule(MM:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/minimap/minimapicons.lua b/ElvUI_SLE/modules/minimap/minimapicons.lua
index 4c31048..72c5728 100644
--- a/ElvUI_SLE/modules/minimap/minimapicons.lua
+++ b/ElvUI_SLE/modules/minimap/minimapicons.lua
@@ -1,57 +1,48 @@
-local E, L, V, P, G = unpack(ElvUI);
-local SMB = E:GetModule('SLE_SquareMinimapButtons');
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local SMB = SLE:NewModule('SquareMinimapButtons','AceHook-3.0', 'AceEvent-3.0');

-
-local AddOnName, NS = ...
-local strsub, strlen, strfind, ceil = strsub, strlen, strfind, ceil
-local tinsert, pairs, unpack = tinsert, pairs, unpack
-
-local SkinnedMinimapButtons = {}
-local BorderColor = E['media'].bordercolor
+local strsub, ceil = strsub, ceil
+local BorderColor = E["media"].bordercolor
 local TexCoords = { 0.1, 0.9, 0.1, 0.9 }
-local SquareMinimapButtonBar

 if E.private.sle == nil then E.private.sle = {} end
 if E.private.sle.minimap == nil then E.private.sle.minimap = {} end
 if E.private.sle.minimap.mapicons == nil then E.private.sle.minimap.mapicons = {} end
 if E.private.sle.minimap.mapicons.enable == nil then E.private.sle.minimap.mapicons.enable = false end
 if E.private.sle.minimap.mapicons.barenable == nil then E.private.sle.minimap.mapicons.barenable = false end
+local UIFrameFadeIn, UIFrameFadeOut = UIFrameFadeIn, UIFrameFadeOut
+local ShowUIPanel, HideUIPanel = ShowUIPanel, HideUIPanel
+local GroupFinderFrame_ShowGroupFrame = GroupFinderFrame_ShowGroupFrame

-if E.db.sle.minimap == nil then E.db.sle.minimap = {} end
-if E.db.sle.minimap.mapicons == nil then E.db.sle.minimap.mapicons = {} end
-if E.db.sle.minimap.mapicons.iconmouseover == nil then E.db.sle.minimap.mapicons.iconmouseover = false end
-if E.db.sle.minimap.mapicons.iconsize == nil then E.db.sle.minimap.mapicons.iconsize = 27 end
-if E.db.sle.minimap.mapicons.iconperrow == nil then E.db.sle.minimap.mapicons.iconperrow = 12 end
-if E.db.sle.minimap.mapicons.skindungeon == nil then E.db.sle.minimap.mapicons.skindungeon = false end
-if E.db.sle.minimap.mapicons.skinmail == nil then E.db.sle.minimap.mapicons.skinmail = false end
-
-QueueStatusMinimapButton:SetParent(Minimap)
+local SMARTBUFF_MinimapButton_CheckPos, SMARTBUFF_MinimapButton_OnUpdate

 local function OnEnter(self)
-	UIFrameFadeIn(SquareMinimapButtonBar, 0.2, SquareMinimapButtonBar:GetAlpha(), 1)
-	if self:GetName() ~= 'SquareMinimapButtonBar' then
+	UIFrameFadeIn(SMB.bar, 0.2, SMB.bar:GetAlpha(), 1)
+	if self:GetName() ~= 'SMB.bar' then
 		self:SetBackdropBorderColor(.7, 0, .7)
 	end
 end

 local function OnLeave(self)
+	if not SMB.bar then return end
 	if E.db.sle.minimap.mapicons.iconmouseover then
-		UIFrameFadeOut(SquareMinimapButtonBar, 0.2, SquareMinimapButtonBar:GetAlpha(), 0)
+		UIFrameFadeOut(SMB.bar, 0.2, SMB.bar:GetAlpha(), 0)
 	end
-	if self:GetName() ~= 'SquareMinimapButtonBar' then
-		self:SetBackdropBorderColor(unpack(BorderColor))
+	if self:GetName() ~= 'SMB.bar' then
+		self:SetBackdropBorderColor(T.unpack(BorderColor))
 	end
 end

 function SMB:ChangeMouseOverSetting()
 	if E.db.sle.minimap.mapicons.iconmouseover then
-		SquareMinimapButtonBar:SetAlpha(0)
+		SMB.bar:SetAlpha(0)
 	else
-		SquareMinimapButtonBar:SetAlpha(1)
+		SMB.bar:SetAlpha(1)
 	end
 end

-local ignoreButtons = {
+SMB.SkinnedMinimapButtons = {}
+SMB.ignoreButtons = {
 	'ElvConfigToggle',
 	'GameTimeFrame',
 	'HelpOpenTicketButton',
@@ -59,8 +50,7 @@ local ignoreButtons = {
 	'MiniMapVoiceChatFrame',
 	'TimeManagerClockButton',
 }
-
-local GenericIgnores = {
+SMB.GenericIgnores = {
 	'Archy',
 	'GatherMatePin',
 	'GatherNote',
@@ -71,25 +61,21 @@ local GenericIgnores = {
 	'Spy_MapNoteList_mini',
 	'ZGVMarker',
 }
-
-local PartialIgnores = {
+SMB.PartialIgnores = {
 	'Node',
 	'Note',
 	'Pin',
 	'POI',
 }
-
-local WhiteList = {
+SMB.WhiteList = {
 	'LibDBIcon',
 }
-
-local AcceptedFrames = {
+SMB.AcceptedFrames = {
 	'BagSync_MinimapButton',
 	'VendomaticButtonFrame',
 	'MiniMapMailFrame',
 }
-
-local AddButtonsToBar = {
+SMB.AddButtonsToBar = {
 	'SmartBuff_MiniMapButton',
 	'QueueStatusMinimapButton',
 	'MiniMapMailFrame',
@@ -102,21 +88,21 @@ local function SkinButton(Button)
 		if Button:IsObjectType('Button') then
 			local ValidIcon = false

-			for i = 1, #WhiteList do
-				if strsub(Name, 1, strlen(WhiteList[i])) == WhiteList[i] then ValidIcon = true break end
+			for i = 1, #SMB.WhiteList do
+				if strsub(Name, 1, T.strlen(SMB.WhiteList[i])) == SMB.WhiteList[i] then ValidIcon = true break end
 			end

 			if not ValidIcon then
-				for i = 1, #ignoreButtons do
-					if Name == ignoreButtons[i] then return end
+				for i = 1, #SMB.ignoreButtons do
+					if Name == SMB.ignoreButtons[i] then return end
 				end

-				for i = 1, #GenericIgnores do
-					if strsub(Name, 1, strlen(GenericIgnores[i])) == GenericIgnores[i] then return end
+				for i = 1, #SMB.GenericIgnores do
+					if strsub(Name, 1, T.strlen(SMB.GenericIgnores[i])) == SMB.GenericIgnores[i] then return end
 				end

-				for i = 1, #PartialIgnores do
-					if strfind(Name, PartialIgnores[i]) ~= nil then return end
+				for i = 1, #SMB.PartialIgnores do
+					if T.find(Name, SMB.PartialIgnores[i]) ~= nil then return end
 				end
 			end

@@ -126,16 +112,16 @@ local function SkinButton(Button)
 		end

 		for i = 1, Button:GetNumRegions() do
-			local Region = select(i, Button:GetRegions())
+			local Region = T.select(i, Button:GetRegions())
 			if Region:GetObjectType() == 'Texture' then
 				local Texture = Region:GetTexture()

-				if Texture and (strfind(Texture, 'Border') or strfind(Texture, 'Background') or strfind(Texture, 'AlphaMask')) then
+				if Texture and (T.find(Texture, 'Border') or T.find(Texture, 'Background') or T.find(Texture, 'AlphaMask')) then
 					Region:SetTexture(nil)
 				else
 					if Name == 'BagSync_MinimapButton' then Region:SetTexture('Interface\\AddOns\\BagSync\\media\\icon') end
 					if Name == 'DBMMinimapButton' then Region:SetTexture('Interface\\Icons\\INV_Helmet_87') end
-					if Name == 'SmartBuff_MiniMapButton' then Region:SetTexture(select(3, GetSpellInfo(12051))) end
+					if Name == 'SmartBuff_MiniMapButton' then Region:SetTexture(T.select(3, T.GetSpellInfo(12051))) end
 					if Name == 'MiniMapMailFrame' then
 						Region:ClearAllPoints()
 						Region:SetPoint('CENTER', Button)
@@ -143,8 +129,8 @@ local function SkinButton(Button)
 					if not (Name == 'MiniMapMailFrame' or Name == 'SmartBuff_MiniMapButton') then
 						Region:ClearAllPoints()
 						Region:SetInside()
-						Region:SetTexCoord(unpack(TexCoords))
-						Button:HookScript('OnLeave', function(self) Region:SetTexCoord(unpack(TexCoords)) end)
+						Region:SetTexCoord(T.unpack(TexCoords))
+						Button:HookScript('OnLeave', function(self) Region:SetTexCoord(T.unpack(TexCoords)) end)
 					end
 					Region:SetDrawLayer('ARTWORK')
 					Region.SetPoint = function() return end
@@ -157,22 +143,22 @@ local function SkinButton(Button)

 		if Name == 'SmartBuff_MiniMapButton' then
 			Button:SetNormalTexture("Interface\\Icons\\Spell_Nature_Purge")
-			Button:GetNormalTexture():SetTexCoord(unpack(TexCoords))
+			Button:GetNormalTexture():SetTexCoord(T.unpack(TexCoords))
 			Button.SetNormalTexture = function() end
 			Button:SetDisabledTexture("Interface\\Icons\\Spell_Nature_Purge")
-			Button:GetDisabledTexture():SetTexCoord(unpack(TexCoords))
+			Button:GetDisabledTexture():SetTexCoord(T.unpack(TexCoords))
 		elseif Name == 'VendomaticButtonFrame' then
 			VendomaticButton:StripTextures()
 			VendomaticButton:SetInside()
 			VendomaticButtonIcon:SetTexture('Interface\\Icons\\INV_Misc_Rabbit_2')
-			VendomaticButtonIcon:SetTexCoord(unpack(TexCoords))
+			VendomaticButtonIcon:SetTexCoord(T.unpack(TexCoords))
 		end

 		if Name == 'QueueStatusMinimapButton' then
 			QueueStatusMinimapButton:HookScript('OnUpdate', function(self)
 				QueueStatusMinimapButtonIcon:SetFrameLevel(QueueStatusMinimapButton:GetFrameLevel() + 1)
 			end)
-			local Frame = CreateFrame('Frame', QueueDummyFrame, SquareMinimapButtonBar)
+			local Frame = CreateFrame('Frame', QueueDummyFrame, SMB.bar)
 			Frame:SetTemplate()
 			Frame.Icon = Frame:CreateTexture(nil, 'ARTWORK')
 			Frame.Icon:SetInside()
@@ -186,7 +172,7 @@ local function SkinButton(Button)
 					GroupFinderFrame_ShowGroupFrame()
 				end
 			end)
-			SquareMinimapButtonBar:HookScript('OnUpdate', function()
+			SMB.bar:HookScript('OnUpdate', function()
 				if E.db.sle.minimap.mapicons.skindungeon then
 					Frame:Show()
 				else
@@ -214,7 +200,7 @@ local function SkinButton(Button)
 				self:SetPoint(QueueStatusMinimapButton:GetPoint())
 			end)
 		elseif Name == 'MiniMapMailFrame' then
-			local Frame = CreateFrame('Frame', 'MailDummyFrame', SquareMinimapButtonBar)
+			local Frame = CreateFrame('Frame', 'MailDummyFrame', SMB.bar)
 			Frame:Size(E.db.sle.minimap.mapicons.iconsize)
 			Frame:SetTemplate()
 			Frame.Icon = Frame:CreateTexture(nil, 'ARTWORK')
@@ -243,18 +229,18 @@ local function SkinButton(Button)
 		end

 		Button.isSkinned = true
-		tinsert(SkinnedMinimapButtons, Button)
+		T.tinsert(SMB.SkinnedMinimapButtons, Button)
 	end
 end

-local function SkinMinimapButtons()
+function SMB:SkinMinimapButtons()
 	for i = 1, Minimap:GetNumChildren() do
-		local object = select(i, Minimap:GetChildren())
+		local object = T.select(i, Minimap:GetChildren())
 		if object then
 			if object:IsObjectType('Button') and object:GetName() then
 				SkinButton(object)
 			end
-			for _, frame in pairs(AcceptedFrames) do
+			for _, frame in T.pairs(SMB.AcceptedFrames) do
 				if object:IsObjectType('Frame') and object:GetName() == frame then
 					SkinButton(object)
 				end
@@ -266,22 +252,22 @@ end
 function SMB:Update()
 	if not E.private.sle.minimap.mapicons.barenable then return end

-	OnLeave(SquareMinimapButtonBar)
+	OnLeave(SMB.bar)
 	local AnchorX, AnchorY, MaxX = 0, 1, E.db.sle.minimap.mapicons.iconperrow
 	local ButtonsPerRow = E.db.sle.minimap.mapicons.iconperrow
-	local NumColumns = ceil(#SkinnedMinimapButtons / ButtonsPerRow)
+	local NumColumns = ceil(#SMB.SkinnedMinimapButtons / ButtonsPerRow)
 	local Spacing, Mult = 4, 1
 	local Size = E.db.sle.minimap.mapicons.iconsize
 	local ActualButtons, Maxed = 0

-	if NumColumns == 1 and ButtonsPerRow > #SkinnedMinimapButtons then
-		ButtonsPerRow = #SkinnedMinimapButtons
+	if NumColumns == 1 and ButtonsPerRow > #SMB.SkinnedMinimapButtons then
+		ButtonsPerRow = #SMB.SkinnedMinimapButtons
 	end

-	for Key, Frame in pairs(SkinnedMinimapButtons) do
+	for Key, Frame in T.pairs(SMB.SkinnedMinimapButtons) do
 		local Name = Frame:GetName()
 		local Exception = false
-		for _, Button in pairs(AddButtonsToBar) do
+		for _, Button in T.pairs(SMB.AddButtonsToBar) do
 			if Name == Button then
 				Exception = true
 				if Name == 'SmartBuff_MiniMapButton' then
@@ -310,9 +296,9 @@ function SMB:Update()
 			local xOffset = Spacing + ((Size + Spacing) * (AnchorX - 1))
 			Frame:SetTemplate()
 			Frame:SetBackdropColor(0, 0, 0, 0)
-			Frame:SetParent(SquareMinimapButtonBar)
+			Frame:SetParent(SMB.bar)
 			Frame:ClearAllPoints()
-			Frame:Point('TOPLEFT', SquareMinimapButtonBar, 'TOPLEFT', xOffset, yOffset)
+			Frame:Point('TOPLEFT', SMB.bar, 'TOPLEFT', xOffset, yOffset)
 			Frame:SetSize(E.db.sle.minimap.mapicons.iconsize, E.db.sle.minimap.mapicons.iconsize)
 			Frame:SetFrameStrata('LOW')
 			Frame:SetFrameLevel(3)
@@ -324,32 +310,39 @@ function SMB:Update()

 			local BarWidth = (Spacing + ((Size * (ActualButtons * Mult)) + ((Spacing * (ActualButtons - 1)) * Mult) + (Spacing * Mult)))
 			local BarHeight = (Spacing + ((Size * (AnchorY * Mult)) + ((Spacing * (AnchorY - 1)) * Mult) + (Spacing * Mult)))
-			SquareMinimapButtonBar:SetSize(BarWidth, BarHeight)
-			E:CreateMover(SquareMinimapButtonBar, "SquareMinimapBar", "Square Minimap Bar", nil, nil, nil, "ALL,SOLO")
+			SMB.bar:SetSize(BarWidth, BarHeight)
+			E:CreateMover(SMB.bar, "SquareMinimapBar", "Square Minimap Bar", nil, nil, nil, "ALL,S&L,S&L MISC")
 		end
 	end

-	SquareMinimapButtonBar:Show()
+	SMB.bar:Show()
 end

 function SMB:Initialize()
+	if not SLE.initialized then return end
 	if not E.private.sle.minimap.mapicons.enable then return end
-	SquareMinimapButtonBar = CreateFrame('Frame', 'SquareMinimapButtonBar', E.UIParent)
-	SquareMinimapButtonBar:Hide()
-	SquareMinimapButtonBar:SetTemplate('Transparent', true)
-	SquareMinimapButtonBar:SetFrameStrata('LOW')
-	SquareMinimapButtonBar:SetFrameLevel(1)
-	SquareMinimapButtonBar:SetClampedToScreen(true)
-	SquareMinimapButtonBar:SetPoint('RIGHT', UIParent, 'RIGHT', -45, 0)
-	SquareMinimapButtonBar:SetScript('OnEnter', OnEnter)
-	SquareMinimapButtonBar:SetScript('OnLeave', OnLeave)
-	RegisterStateDriver(SquareMinimapButtonBar, 'visibility', '[petbattle] hide; show')
-	SkinMinimapButtons()
+
+	QueueStatusMinimapButton:SetParent(Minimap)
+
+	SMB.bar = CreateFrame('Frame', 'SLE_SquareMinimapButtonBar', E.UIParent)
+	SMB.bar:Hide()
+	SMB.bar:SetTemplate('Transparent', true)
+	SMB.bar:SetFrameStrata('LOW')
+	SMB.bar:SetFrameLevel(1)
+	SMB.bar:SetClampedToScreen(true)
+	SMB.bar:SetPoint('RIGHT', UIParent, 'RIGHT', -45, 0)
+	SMB.bar:SetScript('OnEnter', OnEnter)
+	SMB.bar:SetScript('OnLeave', OnLeave)
+	RegisterStateDriver(SMB.bar, 'visibility', '[petbattle] hide; show')
+	self:SkinMinimapButtons()
 	self:RegisterEvent('PLAYER_ENTERING_WORLD', 'Update')
 	self:RegisterEvent('ACTIVE_TALENT_GROUP_CHANGED', 'Update')
-	self:RegisterEvent('ADDON_LOADED', SkinMinimapButtons)
+	self:RegisterEvent('ADDON_LOADED', "SkinMinimapButtons")
 	E:Delay(5, function()
-		SkinMinimapButtons()
+		SMB:SkinMinimapButtons()
 		SMB:Update()
 	end)
-end
\ No newline at end of file
+	SLE.UpdateFunctions["SquareMinimapButtons"] = SMB.Update
+end
+
+SLE:RegisterModule(SMB:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/misc.lua b/ElvUI_SLE/modules/misc.lua
new file mode 100644
index 0000000..a357cb8
--- /dev/null
+++ b/ElvUI_SLE/modules/misc.lua
@@ -0,0 +1,133 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local M = SLE:NewModule("Misc", 'AceHook-3.0', 'AceEvent-3.0')
+local Tr = E:GetModule('Threat');
+local ShowUIPanel, HideUIPanel = ShowUIPanel, HideUIPanel
+local find = string.find
+
+function M:RUReset()
+	local a = E.db.sle.blizzard.rumouseover and 0 or 1
+	RaidUtility_ShowButton:SetAlpha(a)
+end
+
+function M:UpdateThreatPosition()
+	if not E.db.general.threat.enable or not M.db.threat or not M.db.threat.enable then return end
+
+	Tr.bar:SetInside(M.db.threat.position)
+	Tr.bar:SetParent(M.db.threat.position)
+
+	Tr.bar.text:FontTemplate(nil, E.db.general.threat.textSize)
+	Tr.bar:SetFrameStrata('MEDIUM')
+	Tr.bar:SetAlpha(1)
+end
+
+function M:UpdateThreatConfig()
+	if IsAddOnLoaded("ElvUI_Config") then
+		if M.db.threat.enable then
+			E.Options.args.general.args.threat.args.position = {
+				order = 2,
+				name = L["Position"],
+				desc = L["This option have been disabled by Shadow & Light. To return it you need to disable S&L's option. Click here to see it's location."],
+				type = "execute",
+				func = function() SLE.ACD:SelectGroup("ElvUI", "sle") end,
+			}
+		else
+			E.Options.args.general.args.threat.args.position = {
+				order = 2,
+				type = 'select',
+				name = L["Position"],
+				desc = L["Adjust the position of the threat bar to either the left or right datatext panels."],
+				values = {
+					["LEFTCHAT"] = L["Left Chat"],
+					["RIGHTCHAT"] = L["Right Chat"],
+				},
+				set = function(info, value) E.db.general.threat[ info[#info] ] = value; T:UpdatePosition() end,
+			}
+		end
+	end
+end
+
+function M:LoadConfig(event, addon)
+	if addon ~= "ElvUI_Config" then return end
+
+	M:UpdateThreatConfig()
+	M:UnregisterEvent("ADDON_LOADED")
+end
+
+function M:SetViewport()
+	local scale = 768 / UIParent:GetHeight()
+	WorldFrame:SetPoint("TOPLEFT", ( M.db.viewport.left * scale ), -( M.db.viewport.top * scale ) )
+	WorldFrame:SetPoint("BOTTOMRIGHT", -( M.db.viewport.right * scale ), ( M.db.viewport.bottom * scale ) )
+	-- SLE:GetModule("Nameplates"):RegisterViewport()
+end
+
+function M:Initialize()
+	if not SLE.initialized then return end
+	M.db = E.db.sle.misc
+	E:CreateMover(UIErrorsFrame, "UIErrorsFrameMover", L["Error Frame"], nil, nil, nil, "ALL,S&L,S&L MISC")
+
+	--GhostFrame Mover.
+	ShowUIPanel(GhostFrame)
+	E:CreateMover(GhostFrame, "GhostFrameMover", L["Ghost Frame"], nil, nil, nil, "ALL,S&L,S&L MISC")
+	HideUIPanel(GhostFrame)
+
+	--Raid Utility
+	if RaidUtility_ShowButton then
+		E:CreateMover(RaidUtility_ShowButton, "RaidUtility_Mover", L["Raid Utility"], nil, nil, nil, "ALL,S&L,S&L MISC")
+		local mover = RaidUtility_Mover
+		local frame = RaidUtility_ShowButton
+		if E.db.movers == nil then E.db.movers = {} end
+
+		mover:HookScript("OnDragStart", function(self)
+			frame:ClearAllPoints()
+			frame:SetPoint("CENTER", self)
+		end)
+
+		local function Enter(self)
+			if not M.db.rumouseover then return end
+			self:SetAlpha(1)
+		end
+
+		local function Leave(self)
+			if not M.db.rumouseover then return end
+			self:SetAlpha(0)
+		end
+
+		local function dropfix()
+			local point, anchor, point2, x, y = mover:GetPoint()
+			frame:ClearAllPoints()
+			if find(point, "BOTTOM") then
+				frame:SetPoint(point, anchor, point2, x, y)
+			else
+				frame:SetPoint(point, anchor, point2, x, y)
+			end
+		end
+
+		mover:HookScript("OnDragStop", dropfix)
+
+		if E.db.movers.RaidUtility_Mover == nil then
+			frame:ClearAllPoints()
+			frame:SetPoint("TOP", E.UIParent, "TOP", -400, E.Border)
+		else
+			dropfix()
+		end
+		frame:RegisterForDrag("")
+		frame:HookScript("OnEnter", Enter)
+		frame:HookScript("OnLeave", Leave)
+		Leave(frame)
+	end
+
+	hooksecurefunc(Tr, 'UpdatePosition', M.UpdateThreatPosition)
+	M:RegisterEvent("ADDON_LOADED", "LoadConfig")
+	M:UpdateThreatPosition()
+
+	M:SetViewport()
+
+	function M:ForUpdateAll()
+		M.db = E.db.sle.misc
+		M:UpdateThreatConfig()
+		M:UpdateThreatPosition()
+		M:SetViewport()
+	end
+end
+
+SLE:RegisterModule(M:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/nameplates.lua b/ElvUI_SLE/modules/nameplates.lua
index cbf0a9e..6e4217a 100644
--- a/ElvUI_SLE/modules/nameplates.lua
+++ b/ElvUI_SLE/modules/nameplates.lua
@@ -1,110 +1,130 @@
-local E, L, V, P, G = unpack(ElvUI);
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local NP = E:GetModule('NamePlates')
 local LSM = LibStub("LibSharedMedia-3.0")
-
-local UnitCanAttack, UnitDetailedThreatSituation, GetThreatStatusColor = UnitCanAttack, UnitDetailedThreatSituation, GetThreatStatusColor
-local GetNumGroupMembers, GetNumSubgroupMembers = GetNumGroupMembers, GetNumSubgroupMembers
-local IsInRaid, IsInGroup, UnitGUID, UnitName = IsInRaid, IsInGroup, UnitGUID, UnitName
-local format, twipe = string.format, table.wipe
+local N = SLE:NewModule("Nameplates", 'AceHook-3.0', 'AceEvent-3.0', 'AceTimer-3.0')
 local rosterTimer
+N.targetCount = 0

 local function Hex(r, g, b)
-	return format('|cFF%02x%02x%02x', r * 255, g * 255, b * 255)
+	return T.format('|cFF%02x%02x%02x', r * 255, g * 255, b * 255)
 end

-local GroupMembers = {}
+N.GroupMembers = {}

-hooksecurefunc(NP, 'CreatePlate', function(self, frame)
-	local myPlate = self.CreatedPlates[frame]
+hooksecurefunc(NP, 'NAME_PLATE_CREATED', function(self, event, frame)
+	local myPlate = frame.UnitFrame
 	if not myPlate then return end
-
+
 	if not myPlate.threatInfo then
-		myPlate.threatInfo = myPlate:CreateFontString(nil, "OVERLAY")
-		myPlate.threatInfo:SetPoint("BOTTOMLEFT", myPlate.healthBar, "BOTTOMLEFT", 1, 2)
+		myPlate.threatInfo = myPlate.HealthBar:CreateFontString(nil, "OVERLAY")
+		myPlate.threatInfo:SetPoint("BOTTOMLEFT", myPlate.HealthBar, "BOTTOMLEFT", 1, 2)
 		myPlate.threatInfo:SetJustifyH("LEFT")
 	end
 	if not frame.targetcount then
-		myPlate.targetcount = myPlate:CreateFontString(nil, "OVERLAY")
-		myPlate.targetcount:SetPoint('BOTTOMRIGHT', myPlate.healthBar, 'BOTTOMRIGHT', 1, 2)
+		myPlate.targetcount = myPlate.HealthBar:CreateFontString(nil, "OVERLAY")
+		myPlate.targetcount:SetPoint('BOTTOMRIGHT', myPlate.HealthBar, 'BOTTOMRIGHT', 1, 2)
 		myPlate.targetcount:SetJustifyH("RIGHT")
+		myPlate.targetCount = 0
 	end
 	myPlate.threatInfo:FontTemplate(LSM:Fetch("font", NP.db.font), NP.db.fontSize, NP.db.fontOutline)
 	myPlate.targetcount:FontTemplate(LSM:Fetch("font", NP.db.font), NP.db.fontSize, NP.db.fontOutline)
+	myPlate.targetcount:SetText()
 end)

-hooksecurefunc(NP, 'GetThreatReaction', function(self, frame)
-	local myPlate = self.CreatedPlates[frame]
+hooksecurefunc(NP, 'Update_ThreatList', function(self, myPlate)
 	if not myPlate then return end

 	if myPlate.threatInfo then
 		myPlate.threatInfo:SetText()

-		if E.db.sle.nameplate.showthreat then
-			local unit = frame.unit
+		if N.db.showthreat and frame.UnitType == "ENEMY_NPC" then
+			local unit = myPlate.unit
 			if not unit then
 				for i=1, 4 do
-					if frame.guid == UnitGUID(('boss%d'):format(i)) then
-						unit = ('boss%d'):format(i)
+					if myPlate.guid == T.UnitGUID(T.format('boss%d', i)) then
+						unit = T.format('boss%d', i)
 						break
 					end
 				end
 			end
-
-			if unit and not UnitIsPlayer(unit) and UnitCanAttack('player', unit) then
-				local status, percent = select(2, UnitDetailedThreatSituation('player', unit))
+			if unit and not T.UnitIsPlayer(unit) and T.UnitCanAttack('player', unit) then
+				local status, percent = T.select(2, T.UnitDetailedThreatSituation('player', unit))
 				if (status) then
-					myPlate.threatInfo:SetFormattedText('%s%.0f%%|r', Hex(GetThreatStatusColor(status)), percent)
-				else
-					myPlate.threatInfo:SetFormattedText('|cFF808080%s|r', L["None"])
+					myPlate.threatInfo:SetFormattedText('%s%.0f%%|r', Hex(T.GetThreatStatusColor(status)), percent)
 				end
 			end
 		end
 	end
-	if E.db.sle.nameplate.targetcount and myPlate.targetcount then
-		myPlate.targetcount:SetText()
-		if frame.guid then
-			local targetCount = 0
-			local target
-			for name, unitid in pairs(GroupMembers) do
-				target = ("%starget"):format(unitid)
-				if UnitExists(target) and UnitGUID(target) == frame.guid then
-					targetCount = targetCount + 1
+end)
+
+function N:UpdateCount(event,unit,force)
+	if (not T.find(unit, "raid") and not T.find(unit, "party") and not (unit == "player" and force) ) or T.find(unit, "pet") then return end
+	if force and (T.IsInRaid() or T.IsInGroup()) then N:UpdateRoster() end
+	local target
+	for _, frame in T.pairs(C_NamePlate.GetNamePlates()) do
+		if(frame and frame.UnitFrame) then
+			local plate = frame.UnitFrame
+			plate.targetcount:SetText("")
+			plate.targetCount = 0
+			if N.db.targetcount and plate.targetcount then
+				if T.IsInRaid() or T.IsInGroup() then
+					for name, unitid in T.pairs(N.GroupMembers) do
+						if not T.UnitIsUnit(unitid,"player") then
+							target = T.format("%starget", unitid)
+							plate.guid = T.UnitGUID(plate.unit)
+							if plate.guid and T.UnitExists(target) then
+								if T.UnitGUID(target) == plate.guid then plate.targetCount = plate.targetCount + 1 end
+							end
+							if not (plate.targetCount == 0) then
+								plate.targetcount:SetText(T.format('[%d]', plate.targetCount))
+							end
+						end
+					end
 				end
 			end
-			--Set the target count text
-			if not (targetCount == 0) then
-				myPlate.targetcount:SetText(('[%d]'):format(targetCount))
-			end
-		end
+		end
 	end
-end)
+end

 local function AddToRoster(unitId)
-	local unitName = UnitName(unitId)
+	local unitName = T.UnitName(unitId)
 	if unitName then
-		GroupMembers[unitName] = unitId
+		N.GroupMembers[unitName] = unitId
 	end
 end

-local function UpdateRoster()
-	twipe(GroupMembers)
+function N:UpdateRoster()
+	T.twipe(N.GroupMembers)

-	local groupSize = IsInRaid() and GetNumGroupMembers() or IsInGroup() and GetNumSubgroupMembers() or 0
-	local groupType = IsInRaid() and "raid" or IsInGroup() and "party" or "solo"
+	local groupSize = T.IsInRaid() and T.GetNumGroupMembers() or T.IsInGroup() and T.GetNumSubgroupMembers() or 0
+	local groupType = T.IsInRaid() and "raid" or T.IsInGroup() and "party" or "solo"

 	for index = 1, groupSize do
 		AddToRoster(groupType..index)
 	end
-
+
 	if groupType == 'party' then
 		AddToRoster('player')
 	end
 end

-local function StartRosterUpdate()
-	if not rosterTimer or NP:TimeLeft(rosterTimer) == 0 then
-		rosterTimer = NP:ScheduleTimer(UpdateRoster, 1)
+function N:StartRosterUpdate()
+	if not rosterTimer or N:TimeLeft(rosterTimer) == 0 then
+		rosterTimer = N:ScheduleTimer(N.UpdateRoster, 1)
+	end
+end
+
+function N:Initialize()
+	if not SLE.initialized then return end
+	N.db = E.db.sle.nameplate
+	N.viewPort = NP.viewPort
+	self:RegisterEvent("GROUP_ROSTER_UPDATE", "StartRosterUpdate")
+	self:RegisterEvent("UNIT_TARGET", "UpdateCount")
+
+	E:Delay(.3, function() N:UpdateCount(nil,"player", true) end)
+	function N:ForUpdateAll()
+		N.db = E.db.sle.nameplate
 	end
 end

-NP:RegisterEvent("GROUP_ROSTER_UPDATE", StartRosterUpdate)
\ No newline at end of file
+SLE:RegisterModule(N:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/professions/deconstruct.lua b/ElvUI_SLE/modules/professions/deconstruct.lua
new file mode 100644
index 0000000..e3b17ea
--- /dev/null
+++ b/ElvUI_SLE/modules/professions/deconstruct.lua
@@ -0,0 +1,339 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local Pr = SLE:GetModule("Professions")
+local B = E:GetModule("Bags")
+--GLOBALS: hooksecurefunc, CreateFrame
+local _G = _G
+local VIDEO_OPTIONS_ENABLED, VIDEO_OPTIONS_DISABLED = VIDEO_OPTIONS_ENABLED, VIDEO_OPTIONS_DISABLED
+local LOCKED = LOCKED
+local ActionButton_ShowOverlayGlow, ActionButton_HideOverlayGlow = ActionButton_ShowOverlayGlow, ActionButton_HideOverlayGlow
+local AutoCastShine_AutoCastStart, AutoCastShine_AutoCastStop = AutoCastShine_AutoCastStart, AutoCastShine_AutoCastStop
+
+Pr.DeconstructMode = false
+Pr.ItemTable = {
+	--Various lockboxes
+	["Pick"]={
+		["4632"]=1,["4633"]=25,["4634"]=70,["4636"]=125,["4637"]=175,["4638"]=225,
+		["5758"]=225,["5759"]=225,["5760"]=225,["6354"]=1,["6355"]=70,
+		["12033"]=275,["13875"]=175,["13918"]=250,["16882"]=1,["16883"]=70,
+		["16884"]=175,["16885"]=250,["29569"]=300,["31952"]=325,["43575"]=350,
+		["43622"]=375,["43624"]=400,["45986"]=400,["63349"]=425,["68729"]=425,
+		["88165"]=450,["88567"]=450,
+		["116920"] = 500,
+	},
+	--Stuff that can't be DEed or should not be by default
+	["DoNotDE"]={
+		["49715"] = true, --Rose helm
+		["44731"] = true, --Rose offhand
+		["21524"] = true, --Red winter veil hat
+		["51525"] = true, --Green winter vail hat
+		["70923"] = true, --Sweater
+		["34486"] = true, --Orgri achieve fish
+		["11287"] = true, --Lesser Magic Wand
+		["11288"] = true, --Greater Magic Wand
+	},
+	--Bnet bound treasures in Pandaria
+	["PandariaBoA"] = {
+		["85776"] = true,["85777"] = true,["86124"] = true,["86196"] = true,["86198"] = true,
+		["86199"] = true,["86218"] = true,["86394"] = true,["86518"] = true,["86519"] = true,
+		["86520"] = true,["86521"] = true,["86522"] = true,["86523"] = true,["86524"] = true,
+		["86527"] = true,["86529"] = true,["88723"] = true,
+		["86525"] = true, --Not really a BoA but still a powerful shit
+		["86526"] = true, --Not really a BoA but still a powerful shit
+	},
+	--Stuff with cooking bonus
+	["Cooking"] = {
+		["46349"] = true, --Chef's Hat
+		["86559"] = true, --Frying Pan
+		["86558"] = true, --Rolling Pin
+		["86468"] = true, --Apron
+	},
+	--Stuff for fishing
+	["Fishing"] = {
+		["33820"] = true, --Weather-Beaten Fishing Hat
+		["118393"] = true, --Tentacled Hat
+		["19022"] = true, --Nat Pagle's Extreme Angler FC-5000
+		["19970"] = true, --Arcanite Fishing Pole
+		["25978"] = true, --Seth's Graphite Fishing Pole
+		["44050"] = true, --Mastercraft Kalu'ak Fishing Pole
+		["45858"] = true, --Nat's Lucky Fishing Pole
+		["45991"] = true, --Bone Fishing Pole
+		["45992"] = true, --Jeweled Fishing Pole
+	},
+	--Cause this shit doesn't state it's millable
+	["CanDisentegrate"] = {
+		['109129']='OVERRIDE_MILLABLE',
+		['109128']='OVERRIDE_MILLABLE',
+		['109127']='OVERRIDE_MILLABLE',
+		['109126']='OVERRIDE_MILLABLE',
+		['109125']='OVERRIDE_MILLABLE',
+		['109124']='OVERRIDE_MILLABLE',
+	},
+	[ITEM_MILLABLE] = {},
+	['OVERRIDE_MILLABLE'] = {},
+	[ITEM_PROSPECTABLE] = {},
+}
+Pr.Keys = {
+	[T.GetSpell(130100)] = true, -- Ghostly Skeleton Key
+	[T.GetSpell(94574)] = true, -- Obsidium Skeleton Key
+	[T.GetSpell(59403)] = true, -- Titanium Skeleton Key
+	[T.GetSpell(59404)] = true, -- Colbat Skeleton Key
+	[T.GetSpell(20709)] = true, -- Arcanite Skeleton Key
+	[T.GetSpell(19651)] = true, -- Truesilver Skeleton Key
+	[T.GetSpell(19649)] = true, -- Golden Skeleton Key
+	[T.GetSpell(19646)] = true, -- Silver Skeleton Key
+}
+Pr.BlacklistDE = {}
+Pr.BlacklistLOCK = {}
+
+local function HaveKey()
+	for key in T.pairs(Pr.Keys) do
+		if(T.GetItemCount(key) > 0) then
+			return key
+		end
+	end
+end
+
+function Pr:Blacklisting(skill)
+	local ignoreItems = E.global.sle[skill].Blacklist
+	ignoreItems = T.gsub(ignoreItems, ',%s', ',') --remove spaces that follow a comma
+	Pr["BuildBlacklist"..skill](self, T.split(",", ignoreItems))
+end
+
+function Pr:BuildBlacklistDE(...)
+	T.twipe(Pr.BlacklistDE)
+	for index = 1, T.select('#', ...) do
+		local name = T.select(index, ...)
+		local isLink = T.GetItemInfo(name)
+		if isLink then
+			Pr.BlacklistDE[isLink] = true
+		end
+	end
+end
+
+function Pr:BuildBlacklistLOCK(...)
+	T.twipe(Pr.BlacklistLOCK)
+	for index = 1, T.select('#', ...) do
+		local name = T.select(index, ...)
+		local isLink = T.GetItemInfo(name)
+		if isLink then
+			Pr.BlacklistLOCK[isLink] = true
+		end
+	end
+end
+
+function Pr:ApplyDeconstruct(itemLink, spell, r, g, b)
+	local slot = T.GetMouseFocus()
+	local bag = slot:GetParent():GetID()
+	if not _G["ElvUI_ContainerFrame"].Bags[bag] then return end
+	Pr.DeconstructionReal.Bag = bag
+	Pr.DeconstructionReal.Slot = slot:GetID()
+	if (E.global.sle.LOCK.TradeOpen and T.GetTradeTargetItemLink(7) == itemLink and _G["GameTooltip"]:GetOwner():GetName() == "TradeRecipientItem7ItemButton") then
+			Pr.DeconstructionReal.ID = T.match(itemLink, 'item:(%d+):')
+			Pr.DeconstructionReal:SetAttribute('type1', 'macro')
+			Pr.DeconstructionReal:SetAttribute('macrotext', T.format('/cast %s\n/run ClickTargetTradeButton(7)', spell))
+			Pr.DeconstructionReal:SetAllPoints(_G["TradeRecipientItem7ItemButton"])
+			Pr.DeconstructionReal:Show()
+
+			if E.private.sle.professions.deconButton.style == "BIG" then
+				ActionButton_ShowOverlayGlow(Pr.DeconstructionReal)
+			elseif E.private.sle.professions.deconButton.style == "SMALL" then
+				AutoCastShine_AutoCastStart(Pr.DeconstructionReal, r, g, b)
+			end
+		-- end
+	elseif (T.GetContainerItemLink(bag, slot:GetID()) == itemLink) then
+		Pr.DeconstructionReal.ID = T.match(itemLink, 'item:(%d+):')
+		Pr.DeconstructionReal:SetAttribute("type1","spell")
+		Pr.DeconstructionReal:SetAttribute('spell', spell)
+		Pr.DeconstructionReal:SetAttribute('target-bag', bag)
+		Pr.DeconstructionReal:SetAttribute('target-slot', slot:GetID())
+		Pr.DeconstructionReal:SetAllPoints(slot)
+		Pr.DeconstructionReal:Show()
+
+		if E.private.sle.professions.deconButton.style == "BIG" then
+			ActionButton_ShowOverlayGlow(Pr.DeconstructionReal)
+		elseif E.private.sle.professions.deconButton.style == "SMALL" then
+			AutoCastShine_AutoCastStart(Pr.DeconstructionReal, r, g, b)
+		end
+	end
+end
+
+function Pr:IsBreakable(link)
+	local name, _, quality, ilvl,_,_,_,_,equipSlot = T.GetItemInfo(link)
+	if(T.IsEquippableItem(link) and quality and quality > 1 and quality < 5 and equipSlot ~= "INVTYPE_BAG") then
+		local item = T.match(link, 'item:(%d+):')
+		if E.global.sle.DE.IgnoreTabards and equipSlot == "INVTYPE_TABARD" then return false end
+		if Pr.ItemTable["DoNotDE"][item] then return false end
+		if Pr.ItemTable["PandariaBoA"][item] and E.global.sle.DE.IgnorePanda then return false end
+		if Pr.ItemTable["Cooking"][item] and E.global.sle.DE.IgnoreCooking then return false end
+		if Pr.ItemTable["Fishing"][item] and E.global.sle.DE.IgnoreFishing then return false end
+		if Pr.BlacklistDE[name] then return false end
+		for skill, level in T.pairs(Pr.EnchantSkillTable[quality]) do
+			if Pr.DErank < skill and ilvl >= level then return false end
+		end
+		return true
+	end
+	return false
+end
+
+function Pr:LockSkill(id)
+	if E.myclass == "ROGUE" then
+		if Pr.ItemTable["Pick"][id] <= (T.UnitLevel("player") * 5) then return true end
+	end
+	return false
+end
+
+function Pr:IsLocked(link)
+	local name = T.GetItemInfo(link)
+	local id = T.match(link, 'item:(%d+)')
+	if (Pr.ItemTable["Pick"][id] and not Pr.BlacklistLOCK[name] and Pr:LockSkill(id)) then return true end
+	return false
+end
+
+function Pr:IsUnlockable(itemLink)
+	local slot = T.GetMouseFocus()
+	local bag = slot:GetParent():GetID()
+	local item = _G["TradeFrame"]:IsShown() and T.GetTradeTargetItemLink(7) or T.select(7, T.GetContainerItemInfo(bag, slot:GetID()))
+	if(item == itemLink) then
+		for index = 1, _G["GameTooltip"]:NumLines() do
+			local info = _G['GameTooltipTextLeft' .. index]:GetText()
+			if info == LOCKED then
+				return true
+			end
+		end
+	end
+	return false
+end
+
+function Pr:DeconstructParser(...)
+	local item, link = self:GetItem()
+	if(item and not T.InCombatLockdown()) and (Pr.DeconstructMode == true or (E.global.sle.LOCK.TradeOpen and self:GetOwner():GetName() == "TradeRecipientItem7ItemButton")) then
+		local spell, r, g, b = Pr.DeconstructionReal.ScanTooltip(self, link)
+		if(spell) then
+			Pr:ApplyDeconstruct(link, spell, r, g, b)
+		else
+			if(Pr.DEname and Pr:IsBreakable(link)) then
+				r, g, b = 1, 0, 0
+				Pr:ApplyDeconstruct(link, Pr.DEname, r, g, b)
+			elseif(Pr.LOCKname and Pr:IsLocked(link) and Pr:IsUnlockable(link)) then
+				r, g, b = 0, 1, 1
+				Pr:ApplyDeconstruct(link, Pr.LOCKname, r, g, b)
+			elseif(Pr.SMITHname and Pr:IsLocked(link) and Pr:IsUnlockable(link)) then
+				r, g, b = 0, 1, 1
+				local hasKey = HaveKey()
+				Pr:ApplyDeconstruct(link, hasKey, r, g, b)
+			end
+		end
+	end
+end
+
+function Pr:GetDeconMode()
+	local text = ""
+	if Pr.DeconstructMode then
+		text = "|cff00FF00 "..VIDEO_OPTIONS_ENABLED.."|r"
+	else
+		text = "|cffFF0000 "..VIDEO_OPTIONS_DISABLED.."|r"
+	end
+	return text
+end
+
+function Pr:Construct_BagButton()
+	Pr.DeconstructButton = CreateFrame("Button", "SLE_DeconButton", _G["ElvUI_ContainerFrame"])
+	Pr.DeconstructButton:SetSize(16 + E.Border, 16 + E.Border)
+	Pr.DeconstructButton:SetTemplate()
+	Pr.DeconstructButton.ttText = L["Deconstruct Mode"]
+	Pr.DeconstructButton.ttText2 = T.format(L["Allow you to disenchant/mill/prospect/unlock items.\nClick to toggle.\nCurrent state: %s."], Pr:GetDeconMode())
+	Pr.DeconstructButton:SetScript("OnEnter", B.Tooltip_Show)
+	Pr.DeconstructButton:SetScript("OnLeave", B.Tooltip_Hide)
+	Pr.DeconstructButton:SetPoint("RIGHT", _G["ElvUI_ContainerFrame"].bagsButton, "LEFT", -5, 0)
+	Pr.DeconstructButton:SetNormalTexture("Interface\\ICONS\\INV_Rod_Cobalt")
+	Pr.DeconstructButton:GetNormalTexture():SetTexCoord(T.unpack(E.TexCoords))
+	Pr.DeconstructButton:GetNormalTexture():SetInside()
+
+	Pr.DeconstructButton:StyleButton(nil, true)
+	Pr.DeconstructButton:SetScript("OnClick", function(self,...)
+		if Pr.DeconstructMode == true then
+			Pr.DeconstructMode = false
+			Pr.DeconstructButton:SetNormalTexture("Interface\\ICONS\\INV_Rod_Cobalt")
+			ActionButton_HideOverlayGlow(Pr.DeconstructButton)
+		else
+			Pr.DeconstructMode = true
+			Pr.DeconstructButton:SetNormalTexture("Interface\\ICONS\\INV_Rod_EnchantedCobalt")
+			if E.private.sle.professions.deconButton.buttonGlow then ActionButton_ShowOverlayGlow(Pr.DeconstructButton) end
+		end
+		Pr.DeconstructButton.ttText2 = T.format(L["Allow you to disenchant/mill/prospect/unlock items.\nClick to toggle.\nCurrent state: %s."], Pr:GetDeconMode())
+		B.Tooltip_Show(self)
+	end)
+	--Moving Elv's stuff
+	_G["ElvUI_ContainerFrame"].vendorGraysButton:SetPoint("RIGHT", Pr.DeconstructButton, "LEFT", -5, 0)
+end
+
+function Pr:ConstructRealDecButton()
+	Pr.DeconstructionReal = CreateFrame('Button', "SLE_DeconReal", E.UIParent, 'SecureActionButtonTemplate, AutoCastShineTemplate')
+	Pr.DeconstructionReal:SetScript('OnEvent', function(self, event, ...) self[event](self, ...) end)
+	Pr.DeconstructionReal:RegisterForClicks('AnyUp')
+	Pr.DeconstructionReal:SetFrameStrata("TOOLTIP")
+	Pr.DeconstructionReal.TipLines = {}
+
+	Pr.DeconstructionReal.OnLeave = function(self)
+		if(T.InCombatLockdown()) then
+			self:SetAlpha(0)
+			self:RegisterEvent('PLAYER_REGEN_ENABLED')
+		else
+			self:ClearAllPoints()
+			self:SetAlpha(1)
+			if _G["GameTooltip"] then _G["GameTooltip"]:Hide() end
+			self:Hide()
+			AutoCastShine_AutoCastStop(self)
+			ActionButton_HideOverlayGlow(self)
+		end
+	end
+
+	Pr.DeconstructionReal.SetTip = function(self)
+		_G["GameTooltip"]:SetOwner(self,"ANCHOR_LEFT",0,4)
+		_G["GameTooltip"]:ClearLines()
+		_G["GameTooltip"]:SetBagItem(self.Bag, self.Slot)
+	end
+
+	Pr.DeconstructionReal.ScanTooltip = function(self, itemLink)
+		for index = 1, self:NumLines() do
+			local info = Pr.ItemTable[_G['GameTooltipTextLeft' .. index]:GetText()]
+			if(info) then
+				return T.unpack(info)
+			end
+		end
+		local itemID = itemLink:match(":(%w+)")
+		local override = Pr.ItemTable.CanDisentegrate[itemID]
+		if(override and Pr.ItemTable[override]) then
+			return T.unpack(Pr.ItemTable[override])
+		end
+	end
+
+	Pr.DeconstructionReal:SetScript("OnEnter", Pr.DeconstructionReal.SetTip)
+	Pr.DeconstructionReal:SetScript("OnLeave", function() Pr.DeconstructionReal:OnLeave() end)
+	Pr.DeconstructionReal:Hide()
+
+	function Pr.DeconstructionReal:PLAYER_REGEN_ENABLED()
+		self:UnregisterEvent('PLAYER_REGEN_ENABLED')
+		Pr.DeconstructionReal:OnLeave()
+	end
+end
+
+function Pr:InitializeDeconstruct()
+	Pr:Construct_BagButton()
+	Pr:ConstructRealDecButton()
+
+	local function Hiding()
+		Pr.DeconstructMode = false
+		Pr.DeconstructButton:SetNormalTexture("Interface\\ICONS\\INV_Rod_Cobalt")
+		ActionButton_HideOverlayGlow(Pr.DeconstructButton)
+		Pr.DeconstructionReal:OnLeave()
+	end
+
+	-- hooksecurefunc(B, "CloseBags", Hiding)
+	_G["ElvUI_ContainerFrame"]:HookScript("OnHide", Hiding)
+
+	_G["GameTooltip"]:HookScript('OnTooltipSetItem', Pr.DeconstructParser)
+
+	Pr:Blacklisting("DE")
+	Pr:Blacklisting("LOCK")
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/professions/enchant.lua b/ElvUI_SLE/modules/professions/enchant.lua
new file mode 100644
index 0000000..e54f18a
--- /dev/null
+++ b/ElvUI_SLE/modules/professions/enchant.lua
@@ -0,0 +1,91 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local Pr = SLE:GetModule("Professions")
+local S = E:GetModule("Skins")
+-- GLOBALS: CreateFrame
+local _G = _G
+local UseItemByName = UseItemByName
+local C_TradeSkillUI = C_TradeSkillUI
+Pr.DErank = 0
+Pr.EnchantSkillTable = {
+	[2] = { --Greens
+		[1] = 1,
+		[25] = 21,
+		[50] = 26,
+		[75] = 31,
+		[100] = 36,
+		[125] = 41,
+		[150] = 46,
+		[175] = 51,
+		[200] = 56,
+		[225] = 61,
+		[275] = 102,
+		[325] = 130,
+		[350] = 154,
+		[425] = 232,
+		[475] = 372,
+	},
+	[3] = { --Blues
+		[25] = 10,
+		[50] = 26,
+		[75] = 31,
+		[100] = 36,
+		[125] = 41,
+		[150] = 46,
+		[175] = 51,
+		[200] = 56,
+		[225] = 61,
+		[275] = 100,
+		[325] = 130,
+		[450] = 288,
+		[525] = 417,
+		[550] = 425,
+	},
+	[4] = { --Epics
+		[225] = 61,
+		[300] = 100,
+		[375] = 200,
+		[475] = 300,
+		[575] = 420,
+	},
+}
+
+function Pr:EnchantButton()
+	local button = CreateFrame("Button", "SLE_EnchScrollButton", _G["TradeSkillFrame"], "MagicButtonTemplate")
+	if E.private.skins.blizzard.tradeskill == true and E.private.skins.blizzard.enable == true then
+		S:HandleButton(button)
+		button:StripTextures()
+		button:SetTemplate('Default', true)
+		button:ClearAllPoints()
+		button:SetPoint("TOPRIGHT", _G["TradeSkillFrame"].DetailsFrame.CreateButton, "TOPLEFT", -1, 0)
+	else
+		button:SetPoint("TOPRIGHT", _G["TradeSkillFrame"].DetailsFrame.CreateButton, "TOPLEFT")
+	end
+	button:SetScript("OnClick", function()
+		C_TradeSkillUI.CraftRecipe(_G["TradeSkillFrame"].DetailsFrame.selectedRecipeID)
+		UseItemByName(38682)
+	end)
+	local EnchName = T.GetSpellInfo(7411)
+
+	local function UpdateScrollButton(frame)
+		if not frame.selectedRecipeID then return end
+		local _, CURRENT_TRADESKILL = C_TradeSkillUI.GetTradeSkillLine()
+		if CURRENT_TRADESKILL ~= EnchName then _G["SLE_EnchScrollButton"]:Hide() return end
+
+		local recipeInfo = C_TradeSkillUI.GetRecipeInfo(frame.selectedRecipeID)
+		if C_TradeSkillUI.IsTradeSkillGuild() or C_TradeSkillUI.IsTradeSkillLinked() then
+			_G["SLE_EnchScrollButton"]:Hide()
+		elseif recipeInfo.alternateVerb then
+			_G["SLE_EnchScrollButton"]:Show()
+			local scrollnum = T.GetItemCount(38682)
+			_G["SLE_EnchScrollButton"]:SetText(L['Scroll'].." ("..scrollnum..")")
+			if recipeInfo.craftable and scrollnum > 0 then
+				_G["SLE_EnchScrollButton"]:Enable()
+			else
+				_G["SLE_EnchScrollButton"]:Disable()
+			end
+		else
+			_G["SLE_EnchScrollButton"]:Hide()
+		end
+	end
+	hooksecurefunc(_G["TradeSkillFrame"].DetailsFrame, "Refresh", UpdateScrollButton)
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/professions/fishing.lua b/ElvUI_SLE/modules/professions/fishing.lua
new file mode 100644
index 0000000..3bbd1ce
--- /dev/null
+++ b/ElvUI_SLE/modules/professions/fishing.lua
@@ -0,0 +1,152 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local Pr = SLE:GetModule("Professions")
+-- GLOBALS: hooksecurefunc, CreateFrame
+local _G = _G
+local FL = LibStub("LibFishing-1.0-SLE");
+local SavedWFOnMouseDown
+local IsMounted = IsMounted
+local IsMouselooking = IsMouselooking
+local MouselookStop = MouselookStop
+local UnitChannelInfo = UnitChannelInfo
+
+function Pr:HijackFishingCheck()
+	if ( not Pr.AddingLure and not T.InCombatLockdown() and (not IsMounted() or E.private.sle.professions.fishing.FromMount) and
+	E.private.sle.professions.fishing.EasyCast and FL:IsFishingReady(E.private.sle.professions.fishing.IgnorePole)) then
+		return true
+	end
+end
+
+local function HideAwayAll(self, button, down)
+	Pr.FishingUpdateFrame:Show();
+end
+
+function Pr:GetUpdateLure()
+	local lureinventory, useinventory = FL:GetLureInventory();
+
+	if E.private.sle.professions.fishing.UseLures then
+		-- only apply a lure if we're actually fishing with a "real" pole
+		if (FL:IsFishingPole()) then
+			-- Let's wait a bit so that the enchant can show up before we lure again
+			if ( Pr.LastLure and Pr.LastLure.time and ((Pr.LastLure.time - T.GetTime()) > 0) ) then
+				return false;
+			end
+
+			if ( Pr.LastLure ) then
+				Pr.LastLure.time = nil;
+			end
+
+			local skill, _, _, _ = FL:GetCurrentSkill();
+			if (skill > 0) then
+				local NextLure, NextState;
+				local pole, tempenchant = FL:GetPoleBonus();
+				local state, bestlure = FL:FindBestLure(tempenchant, Pr.LureState);
+				if ( state and bestlure and tempenchant == 0 ) then
+					NextState = state;
+					NextLure = bestlure;
+				else
+					NextLure = nil;
+				end
+				local DoLure = NextLure;
+
+				if ( DoLure and DoLure.id ) then
+					-- if the pole has an enchantment, we can assume it's got a lure on it (so far, anyway)
+					-- remove the main hand enchantment (since it's a fishing pole, we know what it is)
+					local startTime, duration, enable = T.GetItemCooldown(DoLure.id);
+					if (startTime == 0) then
+						Pr.AddingLure = true;
+						Pr.LastLure = DoLure;
+						Pr.LureState = NextState;
+						Pr.LastLure.time = T.GetTime() + Pr.RELURE_DELAY;
+						local id = DoLure.id;
+						local name = DoLure.n;
+						return true, id, name;
+					elseif ( Pr.LastLure and not Pr.LastLure.time ) then
+						Pr.LastLure = nil;
+						Pr.LastState = 0;
+						Pr.AddingLure = false;
+					end
+				end
+			end
+		end
+	end
+	return false;
+end
+
+function Pr:FishCasting()
+	-- put on a lure if we need to
+	local key = Pr.FishingKey
+	if (key == "None" and FL:IsFishingReady(false)) or (not key ~= "None" and _G["Is"..key.."KeyDown"]()) then
+		local update, id, n = Pr:GetUpdateLure();
+		if (update and id) then
+			FL:InvokeLuring(id);
+		else
+			if ( not FL:GetLastTooltipText() or not FL:OnFishingBobber() ) then
+				-- watch for fishing holes
+				FL:SaveTooltipText();
+			end
+			Pr.LastCastTime = T.GetTime();
+			-- autopoleframe:Show();
+			FL:InvokeFishing();
+		end
+	FL:OverrideClick(HideAwayAll);
+	end
+end
+
+-- handle mouse up and mouse down in the WorldFrame so that we can steal the hardware events to implement 'Easy Cast'
+-- Thanks to the Cosmos team for figuring this one out
+local function WF_OnMouseDown(...)
+	-- Only steal 'right clicks' (self is arg #1!)
+	local button = T.select(2, ...);
+	if ( FL:CheckForDoubleClick(button) and Pr:HijackFishingCheck() ) then
+		 -- We're stealing the mouse-up event, make sure we exit MouseLook
+		if ( IsMouselooking() ) then
+			MouselookStop();
+		end
+		Pr:FishCasting();
+	end
+	if ( SavedWFOnMouseDown ) then
+		SavedWFOnMouseDown(...);
+	end
+end
+
+local function TrapWorldMouse()
+	if ( _G["WorldFrame"].OnMouseDown ) then
+		hooksecurefunc(_G["WorldFrame"], "OnMouseDown", WF_OnMouseDown)
+	else
+		SavedWFOnMouseDown = T.SafeHookScript(_G["WorldFrame"], "OnMouseDown", WF_OnMouseDown);
+	end
+end
+
+function Pr:FishingInitialize()
+	Pr.FishingKey = E.private.sle.professions.fishing.CastButton
+	Pr.AddingLure = false
+	Pr.LastLure = nil
+	Pr.LureState = 0
+	Pr.LastCastTime = nil
+	Pr.RELURE_DELAY = 8 --Wait before trying to lure again 3 (cast time) + 5 second wait
+	Pr.FishingUpdateFrame = CreateFrame("Frame", "SLE_FishingUpdateFrame", E.UIParent)
+	Pr.FishingUpdateFrame:SetScript("OnUpdate", function(self)
+		local stop = true;
+		if ( not T.InCombatLockdown() ) then
+			FL:ResetOverride();
+			if ( Pr.AddingLure ) then
+				local sp, sub, txt, tex, st, et, trade, int = UnitChannelInfo("player");
+				local _, lure = FL:GetPoleBonus();
+				if ( not sp or not Pr.LastLure or (lure and lure == Pr.LastLure.b) ) then
+					Pr.AddingLure = false;
+					FL:UpdateLureInventory();
+				else
+					stop = false;
+				end
+			end
+			if ( stop ) then
+				Pr.FishingUpdateFrame:Hide();
+			end
+		end
+	end)
+	Pr.FishingUpdateFrame:Hide()
+
+	FL:CreateSAButton()
+	FL:SetSAMouseEvent()
+	TrapWorldMouse()
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/professions/load_professions.xml b/ElvUI_SLE/modules/professions/load_professions.xml
new file mode 100644
index 0000000..a71566c
--- /dev/null
+++ b/ElvUI_SLE/modules/professions/load_professions.xml
@@ -0,0 +1,6 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<Script file='professions.lua'/>
+	<Script file='fishing.lua'/>
+	<Script file='enchant.lua'/>
+	<Script file='deconstruct.lua'/>
+</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/professions/professions.lua b/ElvUI_SLE/modules/professions/professions.lua
new file mode 100644
index 0000000..3868d5e
--- /dev/null
+++ b/ElvUI_SLE/modules/professions/professions.lua
@@ -0,0 +1,63 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local Pr = SLE:NewModule("Professions", "AceHook-3.0", "AceEvent-3.0")
+--GLOBALS: LoadAddOn, TradeSkillFrame_SetSelection
+local _G = _G
+local ITEM_MILLABLE, ITEM_PROSPECTABLE = ITEM_MILLABLE, ITEM_PROSPECTABLE
+
+Pr.DEname, Pr.LOCKname, Pr.SMITHname = false, false, false
+
+function Pr:UpdateSkills(event)
+	if event ~= "CHAT_MSG_SKILL" then
+		local spellName
+		Pr.DEname, Pr.LOCKname, Pr.SMITHname = false, false, false
+		T.twipe(Pr.ItemTable[ITEM_MILLABLE])
+		T.twipe(Pr.ItemTable['OVERRIDE_MILLABLE'])
+		T.twipe(Pr.ItemTable[ITEM_PROSPECTABLE])
+
+		if(T.IsSpellKnown(13262)) then Pr.DEname = T.GetSpell(13262) end --Enchant
+		if(T.IsSpellKnown(1804)) then Pr.LOCKname = T.GetSpell(1804) end --Lockpicking
+		if(T.IsSpellKnown(2018)) then Pr.SMITHname = T.GetSpellBookItemInfo((T.GetSpellInfo(2018))) end --Blacksmith
+
+		if(T.IsSpellKnown(51005)) then --Milling
+			spellName = T.GetSpell(51005)
+			Pr.ItemTable[ITEM_MILLABLE] = {spellName, 0.5, 1, 0.5}
+			Pr.ItemTable['OVERRIDE_MILLABLE'] = {spellName, 0.5, 1, 0.5}
+		end
+
+		if(T.IsSpellKnown(31252)) then --Prospecting
+			spellName = T.GetSpell(31252)
+			Pr.ItemTable[ITEM_PROSPECTABLE] = {spellName, 1, 0.33, 0.33}
+			-- Pr.ItemTable['OVERRIDE_PROSPECTABLE'] = {spellName, 1, 0.33, 0.33}
+		end
+	end
+
+	local prof1, prof2 = GetProfessions()
+	if prof1 then
+		local name, _, rank = GetProfessionInfo(prof1)
+		if name == T.GetSpell(7411) then
+			Pr.DErank = rank
+		end
+	end
+	if prof2 then
+		local name, _, rank = GetProfessionInfo(prof2)
+		if name == T.GetSpell(7411) then
+			Pr.DErank = rank
+		end
+	end
+end
+
+function Pr:Initialize()
+	if not SLE.initialized then return end
+
+	LoadAddOn("Blizzard_TradeSkillUI")
+	Pr:UpdateSkills()
+
+	if E.private.sle.professions.enchant.enchScroll then Pr:EnchantButton() end
+
+	self:RegisterEvent("TRADE_SKILL_UPDATE", "UpdateSkills")
+	self:RegisterEvent("CHAT_MSG_SKILL", "UpdateSkills")
+
+	if E.private.sle.professions.deconButton.enable then Pr:InitializeDeconstruct() end
+	if E.private.sle.professions.fishing.EasyCast then Pr:FishingInitialize() end
+end
+SLE:RegisterModule("Professions")
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/pvp.lua b/ElvUI_SLE/modules/pvp.lua
new file mode 100644
index 0000000..0cbef95
--- /dev/null
+++ b/ElvUI_SLE/modules/pvp.lua
@@ -0,0 +1,130 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local PvP = SLE:NewModule('PVP','AceHook-3.0', 'AceEvent-3.0')
+--GLOBALS: hooksecurefunc, CreateFrame
+local RepopMe, HasSoulstone = RepopMe, HasSoulstone
+local COMBATLOG_HONORGAIN, COMBATLOG_HONORGAIN_NO_RANK, COMBATLOG_HONORAWARD = COMBATLOG_HONORGAIN, COMBATLOG_HONORGAIN_NO_RANK, COMBATLOG_HONORAWARD
+local PVP_RANK_0_0 =PVP_RANK_0_0
+local GetCurrencyInfo = GetCurrencyInfo
+PvP.HonorStrings = {}
+local FactionToken = UnitFactionGroup("player")
+local bit_band = bit.band
+local BG_Opponents = {
+}
+local _G = _G
+local CancelDuel = CancelDuel
+local StaticPopup_Hide = StaticPopup_Hide
+local COMBATLOG_OBJECT_TYPE_PLAYER = COMBATLOG_OBJECT_TYPE_PLAYER
+local RAID_CLASS_COLORS = RAID_CLASS_COLORS
+local TopBannerManager_Show = TopBannerManager_Show
+local BossBanner_BeginAnims = BossBanner_BeginAnims
+local PlaySound = PlaySound
+
+
+
+
+function PvP:Release()
+	if (PvP.db.rebirth and not HasSoulstone()) or not PvP.db.rebirth then RepopMe() end
+end
+
+function PvP:Dead()
+	local inInstance, instanceType = T.IsInInstance()
+	if not PvP.db.autorelease then return end --Option disabled = do jack shit
+	if (inInstance and instanceType == "pvp") then
+		PvP:Release()
+		return --To prevent the rest of the function from execution when not needed
+	end
+	-- auto resurrection for world PvP area...when active
+	for index = 1, T.GetNumWorldPVPAreas() do
+		local _, localizedName, isActive, canQueue = T.GetWorldPVPAreaInfo(index)
+		if (T.GetRealZoneText() == localizedName and isActive) or (T.GetRealZoneText() == localizedName and canQueue) then PvP:Release() end
+	end
+end
+
+function PvP:UpdatePvPHolder()
+	if PvP.CaptureBar1 then
+		PvP.CaptureBar1:HookScript("OnShow", function(self) self:SetPoint("TOP", PvP.AlwaysUpFrame, "BOTTOM", 0, -10) end)
+		PvP.CaptureBar1:Hide()
+		PvP.CaptureBar1:Show()
+		PvP:UnregisterEvent("UPDATE_WORLD_STATES")
+	end
+end
+
+function PvP:Duels(event, name)
+	local cancelled = false
+	if event == "DUEL_REQUESTED" and PvP.db.duels.regular then
+		CancelDuel()
+		StaticPopup_Hide("DUEL_REQUESTED")
+		cancelled = "REGULAR"
+	elseif event == "PET_BATTLE_PVP_DUEL_REQUESTED" and PvP.db.duels.pet then
+		C_PetBattles.CancelPVPDuel()
+		StaticPopup_Hide("PET_BATTLE_PVP_DUEL_REQUESTED")
+		cancelled = "PET"
+	end
+	if cancelled then
+		SLE:Print(T.format(L["SLE_DuelCancel_"..cancelled], name))
+	end
+end
+
+function PvP:OpponentsTable()
+	T.twipe(BG_Opponents)
+	for index = 1, T.GetNumBattlefieldScores() do
+		local name, _, _, _, _, faction, _, _, classToken = T.GetBattlefieldScore(index)
+		if (FactionToken == "Horde" and faction == 1) or (FactionToken == "Alliance" and faction == 0) then
+			BG_Opponents[name] = classToken
+		end
+	end
+end
+
+function PvP:LogParse(event, ...)
+	local _, subevent, _, _, Caster, _, _, _, TargetName, TargetFlags = ...
+	if subevent == "PARTY_KILL" then
+		local mask = bit_band(TargetFlags, COMBATLOG_OBJECT_TYPE_PLAYER)
+		if Caster == E.myname and (BG_Opponents[TargetName] or mask > 0) then
+			if mask > 0 and BG_Opponents[TargetName] then TargetName = "|c"..RAID_CLASS_COLORS[BG_Opponents[TargetName]].colorStr..TargetName.."|r" end
+			TopBannerManager_Show(_G["BossBanner"], { name = TargetName, mode = "PVPKILL" });
+		end
+	end
+end
+
+function PvP:Initialize()
+	if not SLE.initialized then return end
+	PvP.db = E.db.sle.pvp
+	PvP.AlwaysUpFrame = WorldStateAlwaysUpFrame
+	PvP.CaptureBar1 = WorldStateCaptureBar1
+	--AutoRes event
+	self:RegisterEvent("PLAYER_DEAD", "Dead");
+	--Mover for pvp info
+	PvP.holder = CreateFrame("Frame", "SLE_PvPHolder", E.UIParent)
+	PvP.holder:SetSize(10, 58)
+	PvP.holder:SetPoint("TOP", E.UIParent, "TOP", -5, -15)
+	PvP.AlwaysUpFrame:ClearAllPoints()
+	PvP.AlwaysUpFrame:SetPoint("CENTER", PvP.holder)
+	self:RegisterEvent("UPDATE_WORLD_STATES", "UpdatePvPHolder")
+	E:CreateMover(PvP.holder, "PvPMover", "PvP", nil, nil, nil, "ALL,S&L,S&L MISC")
+
+	self:RegisterEvent("DUEL_REQUESTED", "Duels")
+	self:RegisterEvent("PET_BATTLE_PVP_DUEL_REQUESTED", "Duels")
+
+	function PvP:ForUpdateAll()
+		PvP.db = E.db.sle.pvp
+	end
+
+	if E.private.sle.pvp.KBbanner.enable then
+		hooksecurefunc(_G["BossBanner"], "PlayBanner", function(self, data)
+			if ( data ) then
+				if ( data.mode == "PVPKILL" ) then
+					self.Title:SetText(data.name);
+					self.Title:Show();
+					self.SubTitle:Hide();
+					self:Show();
+					BossBanner_BeginAnims(self);
+					if E.private.sle.pvp.KBbanner.sound then PlaySound("UI_Raid_Boss_Defeated") end
+				end
+			end
+		end)
+		self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED", "LogParse")
+		self:RegisterEvent("UPDATE_BATTLEFIELD_SCORE", "OpponentsTable")
+	end
+end
+
+SLE:RegisterModule(PvP:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/pvpmover.lua b/ElvUI_SLE/modules/pvpmover.lua
deleted file mode 100644
index 51ce9a9..0000000
--- a/ElvUI_SLE/modules/pvpmover.lua
+++ /dev/null
@@ -1,23 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local P = E:GetModule('SLE_PvPMover');
-local holder = CreateFrame("Frame", "SLE_PvP", E.UIParent)
-
-
-local function update()
-	if WorldStateCaptureBar1 then
-		local bar = WorldStateCaptureBar1
-		bar:HookScript("OnShow", function(self) self:SetPoint("TOP", WorldStateAlwaysUpFrame, "BOTTOM", 0, -10) end)
-		bar:Hide()
-		bar:Show()
-		P:UnregisterEvent("UPDATE_WORLD_STATES")
-	end
-end
-
-function P:Initialize()
-	holder:SetSize(10, 58)
-	holder:SetPoint("TOP", E.UIParent, "TOP", -5, -15)
-	WorldStateAlwaysUpFrame:ClearAllPoints()
-	WorldStateAlwaysUpFrame:SetPoint("CENTER", holder)
-	self:RegisterEvent("UPDATE_WORLD_STATES", update)
-	E:CreateMover(holder, "PvPMover", "PvP", nil, nil, nil, "ALL,S&L,S&L MISC")
-end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/quests.lua b/ElvUI_SLE/modules/quests.lua
deleted file mode 100644
index f82f16c..0000000
--- a/ElvUI_SLE/modules/quests.lua
+++ /dev/null
@@ -1,63 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local Q = E:GetModule("SLE_Quests")
-local frame
-local B = LibStub("LibBabble-SubZone-3.0")
-local BL = B:GetLookupTable()
-
-local statedriver = {
-	['FULL'] = function(frame)
-		ObjectiveTracker_Expand()
-		frame:Show()
-	end,
-	['COLLAPSED'] = function(frame)
-		ObjectiveTracker_Collapse()
-		frame:Show()
-	end,
-	['HIDE'] = function(frame)
-		frame:Hide()
-	end,
-}
-
-function Q:ChangeState(event)
-	if InCombatLockdown() then self:RegisterEvent("PLAYER_REGEN_ENABLED", "ChangeState") return end
-	if event == "PLAYER_REGEN_ENABLED" then self:UnregisterEvent("PLAYER_REGEN_ENABLED") end
-	if not Q.db then return end
-	if not Q.db.visibility then return end
-
-	if GetZoneText() == BL.Frostwall or GetZoneText() == BL.Lunarfall then
-		statedriver[Q.db.visibility.garrison](frame)
-	elseif IsResting() then
-		statedriver[Q.db.visibility.rested](frame)
-	else
-		local instance, instanceType = IsInInstance()
-		if instance then
-			if instanceType == 'pvp' then
-				statedriver[Q.db.visibility.bg](frame)
-			elseif instanceType == 'arena' then
-				statedriver[Q.db.visibility.arena](frame)
-			elseif instanceType == 'party' then
-				statedriver[Q.db.visibility.dungeon](frame)
-			elseif instanceType == 'scenario' then
-				statedriver[Q.db.visibility.scenario](frame)
-			elseif instanceType == 'raid' then
-				statedriver[Q.db.visibility.raid](frame)
-			end
-		else
-			statedriver["FULL"](frame)
-		end
-
-	end
-end
-
-function Q:Initialize()
-	Q.db = E.db.sle.quests
-	frame = ObjectiveTrackerFrame
-	self:RegisterEvent("PLAYER_ENTERING_WORLD", "ChangeState")
-	self:RegisterEvent("PLAYER_UPDATE_RESTING", "ChangeState")
-
-	hooksecurefunc(E, "UpdateAll", function()
-		Q.db = E.db.sle.quests
-		Q:ChangeState()
-		collectgarbage('collect');
-	end)
-end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/quests/load_quests.xml b/ElvUI_SLE/modules/quests/load_quests.xml
new file mode 100644
index 0000000..bb90d90
--- /dev/null
+++ b/ElvUI_SLE/modules/quests/load_quests.xml
@@ -0,0 +1,4 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<Script file='quests.lua'/>
+	<Include file='questking\load_questking.xml'/>
+</Ui>
diff --git a/ElvUI_SLE/modules/quests/questking/buttons/achievement.lua b/ElvUI_SLE/modules/quests/questking/buttons/achievement.lua
new file mode 100644
index 0000000..b874c84
--- /dev/null
+++ b/ElvUI_SLE/modules/quests/questking/buttons/achievement.lua
@@ -0,0 +1,288 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local QK = SLE:GetModule("QuestKingSkinner")
+local _G = _G
+
+if not SLE._Compatibility["QuestKing"] then return end
+local ACHIEVEMENTS = ACHIEVEMENTS
+local achievementTimers = {}
+local achievementTimersMeta = {}
+
+local mouseHandlerAchievement = {}
+
+local function Replace()
+local QuestKing = _G["QuestKing"]
+local WatchButton = QuestKing.WatchButton
+local opt = QuestKing.options
+local opt_colors = opt.colors
+
+	local function QuestKingClickTemplate(button, mouse)
+		if IsAltKeyDown() then
+			if mouse == "RightButton" then
+				RemoveTrackedAchievement(button.id)
+				QuestKing:UpdateTracker()
+				return
+			else
+				if _G["QuestKingDBPerChar"].collapsedAchievements[button.id] then
+					_G["QuestKingDBPerChar"].collapsedAchievements[button.id] = nil
+				else
+					_G["QuestKingDBPerChar"].collapsedAchievements[button.id] = true
+				end
+				QuestKing:UpdateTracker()
+				return
+			end
+		end
+
+		if (not AchievementFrame) then AchievementFrame_LoadUI() end
+
+		if (not AchievementFrame:IsShown()) then
+			AchievementFrame_ToggleAchievementFrame()
+			AchievementFrame_SelectAchievement(button.id)
+		else
+			if (AchievementFrameAchievements.selection ~= button.id) then
+				AchievementFrame_SelectAchievement(button.id)
+			else
+				AchievementFrame_ToggleAchievementFrame()
+			end
+		end
+	end
+
+	local function BlizzlikeClickTemplate(button, mouse)
+		if IsShiftKeyDown() then
+			if mouse == "RightButton" then
+				if (GetSuperTrackedQuestID() == button.id) then
+					QuestKing:SetSuperTrackedQuestID(0)
+					QuestKing:UpdateTracker()
+				else
+					QuestKing:SetSuperTrackedQuestID(button.id)
+					QuestKing:UpdateTracker()
+				end
+				return
+			else
+				RemoveTrackedAchievement(button.id)
+				QuestKing:UpdateTracker()
+				return
+			end
+		end
+		if IsControlKeyDown() then
+			if _G["QuestKingDBPerChar"].collapsedAchievements[button.id] then
+				_G["QuestKingDBPerChar"].collapsedAchievements[button.id] = nil
+			else
+				_G["QuestKingDBPerChar"].collapsedAchievements[button.id] = true
+			end
+			QuestKing:UpdateTracker()
+			return
+		end
+		if (not AchievementFrame) then AchievementFrame_LoadUI() end
+		if mouse == "RightButton" then
+			ObjectiveTracker_ToggleDropDown(button, AchievementObjectiveTracker_OnOpenDropDown)
+		else
+			if (not AchievementFrame:IsShown()) then
+				AchievementFrame_ToggleAchievementFrame()
+				AchievementFrame_SelectAchievement(button.id)
+			else
+				if (AchievementFrameAchievements.selection ~= button.id) then
+					AchievementFrame_SelectAchievement(button.id)
+				else
+					AchievementFrame_ToggleAchievementFrame()
+				end
+			end
+		end
+	end
+
+	function QuestKing:UpdateTrackerAchievements()
+		local trackedAchievements = { GetTrackedAchievements() }
+		local numTrackedAchievements = #trackedAchievements
+
+		-- header
+		local showAchievements = true
+		local SLE_HeaderColor = E.db.sle.skins.objectiveTracker.colorHeader
+		if (QuestKingDBPerChar.displayMode == "combined") then
+			local headerName = "|T"..QK.Icons["Achievement_small"]..":14|t "..ACHIEVEMENTS.." |T"..QK.Icons["Achievement_small"]..":14|t"
+			if numTrackedAchievements > 0 then
+				local button = WatchButton:GetKeyed("collapser", "Achievements")
+				button._headerName = headerName
+
+				if QuestKingDBPerChar.collapsedHeaders[headerName] then
+					button.title:SetTextIcon("|TInterface\\AddOns\\QuestKing\\textures\\UI-SortArrow_sm_right:8:8:0:-1:0:0:0:0:0:0:1:1:1|t "..headerName)
+				else
+					button.title:SetTextIcon("|TInterface\\AddOns\\QuestKing\\textures\\UI-SortArrow_sm_down:8:8:0:-1:0:0:0:0:0:0:1:1:1|t "..headerName)
+				end
+				button.title:SetTextColor(SLE_HeaderColor.r, SLE_HeaderColor.g, SLE_HeaderColor.b)
+			end
+
+			if QuestKingDBPerChar.collapsedHeaders[headerName] then
+				showAchievements = false
+			end
+		elseif (inScenario) and (QuestKingDBPerChar.displayMode == "achievements") then
+			local achheader = WatchButton:GetKeyed("header", "Achievements")
+			achheader.title:SetText(headerName)
+			achheader.title:SetTextColor(SLE_HeaderColor.r, SLE_HeaderColor.g, SLE_HeaderColor.b)
+		end
+
+		-- achievements
+		if showAchievements then
+			for i = 1, numTrackedAchievements do
+				local achievementID = trackedAchievements[i]
+
+				local button = WatchButton:GetKeyed("achievement", achievementID)
+				setButtonToAchievement(button, achievementID)
+			end
+		end
+	end
+
+	function setButtonToAchievement (button, achievementID)
+		button.mouseHandler = mouseHandlerAchievement
+
+		local id, achievementName, points, achievemntCompleted, _, _, _, achievementDesc, flags, image, rewardText, isGuildAch = GetAchievementInfo(achievementID)
+		button.id = achievementID
+
+		local collapseCriteria = QuestKingDBPerChar.collapsedAchievements[achievementID]
+
+		-- set title
+		button.title:SetText(achievementName)
+		if completed then
+			button.title:SetTextColor(opt_colors.AchievementTitleComplete[1], opt_colors.AchievementTitleComplete[2], opt_colors.AchievementTitleComplete[3])
+		else
+			if isGuildAch then
+				button.title:SetTextColor(opt_colors.AchievementTitleGuild[1], opt_colors.AchievementTitleGuild[2], opt_colors.AchievementTitleGuild[3])
+			else
+				button.title:SetTextColor(opt_colors.AchievementTitle[1], opt_colors.AchievementTitle[2], opt_colors.AchievementTitle[3])
+			end
+		end
+
+		if collapseCriteria then
+			button.title:SetAlpha(0.6)
+		end
+
+		-- criteria setup
+		local numCriteria = GetAchievementNumCriteria(achievementID)
+		local foundTimer = false
+		local timeNow -- avoid multiple calls to GetTime()
+
+		-- no criteria
+		if (numCriteria == 0) then
+			if (not collapseCriteria) then
+				button:AddLine("  "..achievementDesc, nil, opt_colors.AchievementDescription[1], opt_colors.AchievementDescription[2], opt_colors.AchievementDescription[3]) -- no criteria exist, show desc line
+			end
+		end
+
+		-- criteria loop
+		for i = 1, numCriteria do
+			local _
+			local criteriaString, criteriaType, criteriaCompleted, quantity, totalQuantity, name, flags, assetID, quantityString, criteriaID, eligible, duration, elapsed = GetAchievementCriteriaInfo(achievementID, i)
+
+			-- set string
+			if (bit.band(flags, EVALUATION_TREE_FLAG_PROGRESS_BAR) == EVALUATION_TREE_FLAG_PROGRESS_BAR) then
+				criteriaString = quantityString
+			else
+				if (criteriaType == CRITERIA_TYPE_ACHIEVEMENT and assetID) then -- meta achievement
+					_, criteriaString = GetAchievementInfo(assetID)
+				end
+			end
+
+			-- display criteria depending on timer state
+			-- kinda wanna seperate this out, but display is dependent on timer logic (e.g. timeLeft > 0 forces display)
+
+			--[[
+			local timerTable = achievementTimers[criteriaID]
+			if (timerTable) then
+				duration = timerTable.duration
+				elapsed = GetTime() - timerTable.startTime
+			end
+			if ((timerTable) and (duration) and (elapsed) and (elapsed < duration)) then
+			--]]
+			if ((duration) and (elapsed) and (elapsed < duration)) then
+				foundTimer = true
+
+				-- timer is running, force showing criteria
+				if criteriaCompleted then
+					button:AddLine("  "..criteriaString, nil, opt_colors.AchievementCriteriaComplete[1], opt_colors.AchievementCriteriaComplete[2], opt_colors.AchievementCriteriaComplete[3]) -- timer running, force showing completed objective
+				else
+					button:AddLine("  "..criteriaString, nil, opt_colors.AchievementCriteria[1], opt_colors.AchievementCriteria[2], opt_colors.AchievementCriteria[3]) -- timer running, force showing normal objective
+				end
+
+				-- adding timer line
+				local timerBar = button:AddTimerBar(duration, GetTime() - elapsed)
+				timerBar:SetStatusBarColor(opt_colors.AchievementTimer[1], opt_colors.AchievementTimer[2], opt_colors.AchievementTimer[3])
+
+			else
+				-- no timer exists / timer expired
+
+				local timerTable = achievementTimers[criteriaID]
+				if (timerTable) then
+					achievementTimers[criteriaID] = nil
+					achievementTimersMeta[achievementID] = nil
+				end
+
+				if (not criteriaCompleted) and (not collapseCriteria) then
+					button:AddLine("  "..criteriaString, nil, opt_colors.AchievementCriteria[1], opt_colors.AchievementCriteria[2], opt_colors.AchievementCriteria[3]) -- no timer, show normally unless completed/collapsed
+				end
+			end
+
+		end
+
+		-- show "meta" timer if there is a timer on this achievement, but no associated criteria are found in GetAchievementNumCriteria (Salt and Pepper?)
+		-- multiple timers would be a problem (it sets/unsets with whichever criteria timer fires last), but it's better than nothing
+		if ((foundTimer == false) and (achievementTimersMeta[achievementID])) then
+			local timerTable = achievementTimersMeta[achievementID]
+			local duration = timerTable.duration
+			local elapsed = GetTime() - timerTable.startTime
+
+			if ((duration) and (elapsed) and (elapsed < duration)) then
+				foundTimer = true
+
+				local timerBar = button:AddTimerBar(timerTable.duration, timerTable.startTime)
+				timerBar:SetStatusBarColor(opt_colors.AchievementTimerMeta[1], opt_colors.AchievementTimerMeta[2], opt_colors.AchievementTimerMeta[3])
+			end
+		end
+
+		-- D(achievementName, foundTimer)
+
+		if (foundTimer == false) then
+			button:SetBackdropColor(0, 0, 0, 0)
+			button:SetScript("OnUpdate", nil)
+		else
+			button.title:SetTextColor(opt_colors.AchievementTimedTitle[1], opt_colors.AchievementTimedTitle[2], opt_colors.AchievementTimedTitle[3])
+			button:SetBackdropColor(opt_colors.AchievementTimedBackground[1], opt_colors.AchievementTimedBackground[2], opt_colors.AchievementTimedBackground[3], opt_colors.AchievementTimedBackground[4])
+		end
+
+	end
+
+	function mouseHandlerAchievement:TitleButtonOnEnter (motion)
+		local button = self.parent
+
+		local link = GetAchievementLink(button.id)
+		if link then
+			_G["GameTooltip"]:SetOwner(self, E.private.sle.skins.QuestKing.tooltipAnchor)
+
+			if opt.tooltipScale then
+				if not GameTooltip.__QuestKingPreviousScale then
+					GameTooltip.__QuestKingPreviousScale = GameTooltip:GetScale()
+				end
+				GameTooltip:SetScale(opt.tooltipScale)
+			end
+
+			GameTooltip:SetHyperlink(link)
+			GameTooltip:Show()
+		end
+	end
+
+	function mouseHandlerAchievement:TitleButtonOnClick (mouse, down)
+		local button = self.parent
+
+		if (IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow()) then
+			local achievementLink = GetAchievementLink(button.id)
+			if (achievementLink) then
+				ChatEdit_InsertLink(achievementLink)
+				return
+			end
+		end
+		if E.private.sle.skins.QuestKing.clickTemplate == "QuestKing" then
+			QuestKingClickTemplate(button, mouse)
+		elseif E.private.sle.skins.QuestKing.clickTemplate == "Blizzlike" then
+			BlizzlikeClickTemplate(button, mouse)
+		end
+	end
+end
+
+T.tinsert(QK.Replaces, Replace)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/quests/questking/buttons/bonusobjective.lua b/ElvUI_SLE/modules/quests/questking/buttons/bonusobjective.lua
new file mode 100644
index 0000000..73871ca
--- /dev/null
+++ b/ElvUI_SLE/modules/quests/questking/buttons/bonusobjective.lua
@@ -0,0 +1,283 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local QK = SLE:GetModule("QuestKingSkinner")
+local _G = _G
+
+if not SLE._Compatibility["QuestKing"] then return end
+local addHeader
+local setButtonToBonusTask
+local mouseHandlerBonusTask = {}
+
+local function Replace()
+	local QuestKing = _G["QuestKing"]
+	local WatchButton = QuestKing.WatchButton
+	local getQuestTaggedTitle = QuestKing.GetQuestTaggedTitle
+	local getObjectiveColor = QuestKing.GetObjectiveColor
+	local opt = QuestKing.options
+	local opt_colors = opt.colors
+
+	function setButtonToBonusTask (button, questID)
+		button.mouseHandler = mouseHandlerBonusTask
+
+		local questIndex = GetQuestLogIndexByID(questID)
+		button.questID = questID
+		button.questIndex = questIndex
+
+		local taggedTitle, level = getQuestTaggedTitle(questIndex, true)
+		local color = GetQuestDifficultyColor(level)
+
+		if (GetSuperTrackedQuestID() == questID) then
+			taggedTitle = taggedTitle .. " |TInterface\\Scenarios\\ScenarioIcon-Combat:10:10:-1:0|t"
+		end
+
+		button.title:SetTextIcon(taggedTitle)
+		button.title:SetTextColor(color.r, color.g, color.b)
+
+		local isInArea, isOnMap, numObjectives = GetTaskInfo(questID)
+		local useNonBonusHeader = false
+
+		for i = 1, numObjectives do
+			local desc, objectiveType, isDone, displayAsObjective = GetQuestObjectiveInfo(questID, i, false)
+			useNonBonusHeader = useNonBonusHeader or displayAsObjective
+
+			if (desc == nil) then desc = "Unknown" end
+
+			local quantCur, quantMax, quantName = QuestKing.MatchObjective(desc)
+
+			if (objectiveType == "progressbar") then
+				local percent = GetQuestProgressBarPercent(questID)
+
+				local objectiveFraction = isDone and 1 or (percent / 100)
+				if (objectiveFraction >= 1) and (not isDone) then
+					objectiveFraction = 0.999
+				end
+
+				local r, g, b = getObjectiveColor(objectiveFraction)
+				button:AddLine(format("  %s", desc), nil, r, g, b)
+
+				local progressBar = button:AddProgressBar()
+				progressBar:SetPercent(percent)
+			elseif (quantName) then
+				local r, g, b = getObjectiveColor(quantCur / quantMax)
+				local line = button:AddLine(format("  %s", quantName), format(": %s/%s", quantCur, quantMax), r, g, b)
+
+				local lastQuant = line._lastQuant
+				if ((lastQuant) and (quantCur > lastQuant)) then
+					line:Flash()
+				end
+				line._lastQuant = quantCur
+			else
+				local r, g, b = getObjectiveColor(isDone and 1 or 0)
+				button:AddLine(format("  %s", desc), nil, r, g, b)
+			end
+
+		end
+
+		if (useNonBonusHeader) and (button._previousHeader)  then
+			button._previousHeader.title:SetText(TRACKER_HEADER_OBJECTIVE)
+		end
+
+		if (button.fresh) then
+			local lines = button.lines
+			for i = 1, #lines do
+				local line = lines[i]
+				line:Glow(opt_colors.ObjectiveAlertGlow[1], opt_colors.ObjectiveAlertGlow[2], opt_colors.ObjectiveAlertGlow[3])
+			end
+		end
+		-- button.titleButton:EnableMouse(false)
+		-- button:EnableMouse(true)
+	end
+
+	function addHeader ()
+		local header = WatchButton:GetKeyed("header", "Bonus Objectives")
+		header.title:SetText(TRACKER_HEADER_BONUS_OBJECTIVES)
+		local SLE_HeaderColor = E.db.sle.skins.objectiveTracker.colorHeader
+		if E.private.sle.skins.QuestKing.enable then
+			header.title:SetTextColor(SLE_HeaderColor.r, SLE_HeaderColor.g, SLE_HeaderColor.b)
+		else
+			header.title:SetTextColor(opt_colors.SectionHeader[1], opt_colors.SectionHeader[2], opt_colors.SectionHeader[3])
+		end
+		return header
+	end
+
+	function QuestKing:UpdateTrackerBonusObjectives ()
+		local tasksTable = GetTasksTable()
+		local header
+
+		if (dummyTaskID) then
+			header = addHeader()
+
+			local button = WatchButton:GetKeyed("bonus_task_dummy", questID)
+			button._previousHeader = header
+			setButtonToDummyTask(button, questID)
+		end
+
+		for i = 1, #tasksTable do
+			local questID = tasksTable[i]
+			local isInArea, isOnMap, numObjectives = GetTaskInfo(questID)
+
+			if (isInArea) and (questID ~= dummyTaskID) then
+				if (not header) then
+					header = addHeader()
+				end
+
+				local button = WatchButton:GetKeyed("bonus_task", questID)
+				button._previousHeader = header
+				setButtonToBonusTask(button, questID)
+			end
+		end
+
+		local inScenario = C_Scenario.IsInScenario()
+		if (not inScenario) then return end
+
+		local tblBonusSteps = C_Scenario.GetBonusSteps()
+
+		-- do superseding stuff
+		supersededObjectives = C_Scenario.GetSupersededObjectives()
+		if (supersededObjectives) and (opt.hideSupersedingObjectives) then
+			local hiddenSteps = {}
+
+			for i = 1, #tblBonusSteps do
+				local bonusStepIndex = tblBonusSteps[i]
+				local supersededIndex = getSupersedingStep(bonusStepIndex)
+				if (supersededIndex) then
+					local _, _, numCriteria, stepFailed = C_Scenario.GetStepInfo(bonusStepIndex)
+					local completed = true
+					if stepFailed then
+						completed = false
+					else
+						for criteriaIndex = 1, numCriteria do
+							local criteriaString, _, criteriaCompleted = C_Scenario.GetCriteriaInfoByStep(bonusStepIndex, criteriaIndex)
+							if (criteriaString) and (not criteriaCompleted) then
+								completed = false
+								break
+							end
+						end
+					end
+
+					if (not completed) then
+						hiddenSteps[#hiddenSteps+1] = supersededIndex
+					end
+				end
+			end
+
+			if (hiddenSteps) then
+				-- dumptable(hiddenSteps)
+				for i = 1, #hiddenSteps do
+					tDeleteItem(tblBonusSteps, hiddenSteps[i])
+				end
+			end
+		end
+
+		for i = 1, #tblBonusSteps do
+			-- each bonus step
+			local bonusStepIndex = tblBonusSteps[i]
+
+			if (not header) then
+				header = addHeader()
+			end
+
+			local button = WatchButton:GetKeyed("bonus_step", bonusStepIndex)
+			button._previousHeader = header
+			QuestKing.SetButtonToScenario(button, bonusStepIndex)
+		end
+	end
+
+	function mouseHandlerBonusTask:TitleButtonOnClick (mouse, down)
+		local button = self.parent
+
+		if (IsModifiedClick("CHATLINK")) and (ChatEdit_GetActiveWindow()) then
+			local questLink = GetQuestLink(button.questIndex)
+			if (questLink) then
+				ChatEdit_InsertLink(questLink)
+				return
+			end
+		end
+
+		if (IsShiftKeyDown()) and (ClassicQuestLog) then
+			SelectQuestLogEntry(button.questIndex)
+			if ClassicQuestLog:IsVisible() then
+				ClassicQuestLog:OnShow()
+			else
+				ClassicQuestLog:SetShown(true)
+			end
+			return
+		end
+
+		if (mouse == "RightButton") then
+			if (GetSuperTrackedQuestID() == button.questID) then
+				QuestKing:SetSuperTrackedQuestID(0)
+				QuestKing:UpdateTracker()
+			else
+				QuestKing:SetSuperTrackedQuestID(button.questID)
+				QuestKing:UpdateTracker()
+			end
+		else
+			QuestObjectiveTracker_OpenQuestMap(nil, button.questIndex)
+		end
+	end
+
+	function mouseHandlerBonusTask:TitleButtonOnEnter (motion)
+		local button = self.parent
+
+		local questID = button.questID
+
+		if ((HaveQuestData(questID)) and (GetQuestLogRewardXP(questID) == 0) and (GetNumQuestLogRewardCurrencies(questID) == 0)
+				and (GetNumQuestLogRewards(questID) == 0) and (GetQuestLogRewardMoney(questID) == 0)) then
+			GameTooltip:Hide()
+			return
+		end
+
+		GameTooltip:ClearAllPoints()
+		-- GameTooltip:SetPoint("TOPRIGHT", block, "TOPLEFT", 0, 0);
+		-- GameTooltip:SetOwner(block, "ANCHOR_PRESERVE");
+		_G["GameTooltip"]:SetOwner(self, E.private.sle.skins.QuestKing.tooltipAnchor)
+		GameTooltip:SetText(REWARDS, 1, 0.831, 0.380)
+
+		if (not HaveQuestData(questID)) then
+			GameTooltip:AddLine(RETRIEVING_DATA, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
+		else
+			GameTooltip:AddLine(BONUS_OBJECTIVE_TOOLTIP_DESCRIPTION, 1, 1, 1, 1)
+			GameTooltip:AddLine(" ")
+
+			-- xp
+			local xp = GetQuestLogRewardXP(questID)
+			if (xp > 0) then
+				GameTooltip:AddLine(string.format(BONUS_OBJECTIVE_EXPERIENCE_FORMAT, xp), 1, 1, 1)
+			end
+
+			-- currency
+			local numQuestCurrencies = GetNumQuestLogRewardCurrencies(questID)
+			for i = 1, numQuestCurrencies do
+				local name, texture, numItems = GetQuestLogRewardCurrencyInfo(i, questID)
+				local text = string.format(BONUS_OBJECTIVE_REWARD_WITH_COUNT_FORMAT, texture, numItems, name)
+				GameTooltip:AddLine(text, 1, 1, 1)
+			end
+
+			-- items
+			local numQuestRewards = GetNumQuestLogRewards(questID)
+			for i = 1, numQuestRewards do
+				local name, texture, numItems, quality, isUsable = GetQuestLogRewardInfo(i, questID)
+				local text
+				if (numItems > 1) then
+					text = string.format(BONUS_OBJECTIVE_REWARD_WITH_COUNT_FORMAT, texture, numItems, name)
+				elseif (texture and name) then
+					text = string.format(BONUS_OBJECTIVE_REWARD_FORMAT, texture, name)
+				end
+				if (text) then
+					local color = ITEM_QUALITY_COLORS[quality]
+					GameTooltip:AddLine(text, color.r, color.g, color.b)
+				end
+			end
+
+			-- money
+			local money = GetQuestLogRewardMoney(questID)
+			if (money > 0) then
+				SetTooltipMoney(GameTooltip, money, nil)
+			end
+		end
+
+		GameTooltip:Show()
+	end
+end
+
+T.tinsert(QK.Replaces, Replace)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/quests/questking/buttons/challengetimer.lua b/ElvUI_SLE/modules/quests/questking/buttons/challengetimer.lua
new file mode 100644
index 0000000..987d731
--- /dev/null
+++ b/ElvUI_SLE/modules/quests/questking/buttons/challengetimer.lua
@@ -0,0 +1,152 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local QK = SLE:GetModule("QuestKingSkinner")
+local _G = _G
+
+if not SLE._Compatibility["QuestKing"] then return end
+
+local LSM = LibStub("LibSharedMedia-3.0")
+
+local function Replace()
+	local QuestKing = _G["QuestKing"]
+	local WatchButton = QuestKing.WatchButton
+	local opt = QuestKing.options
+	local opt_buttonWidth = opt.buttonWidth
+	local opt_font = opt.font
+	local opt_fontChallengeTimer = opt.fontChallengeTimer
+	local opt_fontSize = opt.fontSize
+	local opt_fontStyle = opt.fontStyle
+
+	local function SetProgressBarsColor(challengeBar)
+		local COLOR
+		if E.private.sle.skins.objectiveTracker.class then
+			COLOR = classColor
+		else
+			COLOR = E.private.sle.skins.objectiveTracker.color
+		end
+		challengeBar:SetStatusBarColor(COLOR.r, COLOR.g, COLOR.b)
+	end
+
+	local cachedChallengeBar = nil
+	function WatchButton:AddChallengeBar()
+		local button = self
+
+		if (button.challengeBar) then
+			return button.challengeBar
+		end
+
+		local challengeBar
+		if (not cachedChallengeBar) then
+			challengeBar = CreateFrame("StatusBar", "QuestKing_ChallengeBar", QuestKing.Tracker)
+			challengeBar:SetStatusBarTexture(LSM:Fetch('statusbar', E.private.sle.skins.objectiveTracker.texture))
+			challengeBar:GetStatusBarTexture():SetHorizTile(false)
+			SetProgressBarsColor(challengeBar)
+			challengeBar:SetMinMaxValues(0, 1)
+			challengeBar:SetValue(1)
+			challengeBar:SetWidth(opt_buttonWidth - 36)
+			challengeBar:SetHeight(17)
+			challengeBar:CreateBackdrop("Transparent")
+
+			local barPulser = button:CreateTexture()
+			barPulser:SetAllPoints(challengeBar)
+			barPulser:SetTexture("Interface\\TargetingFrame\\UI-StatusBar")
+			barPulser:SetVertexColor(1, 0.9, 0.7, 0)
+			barPulser:SetBlendMode("ADD")
+			challengeBar.barPulser = barPulser
+
+			local animGroup = barPulser:CreateAnimationGroup()
+			local a1 = animGroup:CreateAnimation("Alpha")
+				a1:SetDuration(0.25); a1:SetChange(1); a1:SetOrder(1);
+			local a2 = animGroup:CreateAnimation("Alpha")
+				a2:SetDuration(0.3); a2:SetChange(-1); a2:SetOrder(2); a2:SetEndDelay(0.45);
+			animGroup.cycles = 0
+			animGroup:SetScript("OnFinished", function (self)
+				if (self.cycles > 0) then
+					self:Play()
+					self.cycles = self.cycles - 1
+				else
+					self.cycles = 0
+				end
+			end)
+			challengeBar.barPulserAnim = animGroup
+
+			-- <Alpha childKey="BorderAnim" change="1" duration="0.25" order="1"/>
+			-- <Alpha childKey="BorderAnim" endDelay="0.45" change="-1" duration="0.3" order="2"/>
+
+			local icon = challengeBar:CreateTexture(nil, "OVERLAY")
+			icon:SetTexture([[Interface\Challenges\challenges-plat-sm]])
+			icon:SetSize(22, 22)
+			icon:SetPoint("RIGHT", challengeBar, "LEFT", -6, 0)
+			icon:SetTexCoord(0.25, 0.7, 0.25, 0.7)
+			challengeBar.icon = icon
+
+			local text = challengeBar:CreateFontString(nil, "OVERLAY")
+			text:SetFont(opt_font, opt_fontSize, opt_fontStyle)
+			text:SetJustifyH("CENTER")
+			text:SetJustifyV("CENTER")
+			text:SetAllPoints(true)
+			text:SetTextColor(1, 1, 1)
+			text:SetShadowOffset(1, -1)
+			text:SetShadowColor(0, 0, 0, 1)
+			text:SetText(CHALLENGES_TIMER_NO_MEDAL)
+			challengeBar.text = text
+
+			local extraText = challengeBar:CreateFontString(nil, "OVERLAY")
+			extraText:SetFont(opt_font, opt_fontSize, opt_fontStyle)
+			extraText:SetPoint("BOTTOMLEFT", challengeBar, "TOPLEFT", 2, 4)
+			extraText:SetTextColor(1, 1, 1)
+			extraText:SetShadowOffset(1, -1)
+			extraText:SetShadowColor(0, 0, 0, 1)
+			extraText:SetText(PROVING_GROUNDS_WAVE.." 1/5")
+			extraText:Hide()
+			challengeBar.extraText = extraText
+
+			local score = challengeBar:CreateFontString(nil, "OVERLAY")
+			score:SetFont(opt_font, opt_fontSize, opt_fontStyle)
+			score:SetJustifyH("RIGHT")
+			score:SetPoint("BOTTOMRIGHT", challengeBar, "TOPRIGHT", -2, 4)
+			score:SetTextColor(1, 1, 1)
+			score:SetShadowOffset(1, -1)
+			score:SetShadowColor(0, 0, 0, 1)
+			score:SetText("0")
+			score:Hide()
+			challengeBar.score = score
+
+			challengeBar.bonusHeight = 18
+
+			challengeBar:SetScript("OnUpdate", nil)
+
+			cachedChallengeBar = challengeBar
+		else
+			challengeBar = cachedChallengeBar
+			challengeBar:ClearAllPoints()
+
+			challengeBar.extraText:Hide()
+			challengeBar.score:SetText("0")
+			challengeBar.score:Hide()
+			challengeBar.bonusHeight = 18
+
+			challengeBar.barPulserAnim:Stop()
+			challengeBar.barPulserAnim.cycles = 0
+
+			challengeBar:SetScript("OnUpdate", nil)
+
+			SetProgressBarsColor(challengeBar)
+			challengeBar.text:SetText(CHALLENGES_TIMER_NO_MEDAL)
+
+			challengeBar._medalTimes = nil
+			challengeBar._currentMedalTime = nil
+			challengeBar._startTime = nil
+		end
+
+		challengeBar:SetPoint("BOTTOMLEFT", button, "BOTTOMLEFT", 26, 5)
+		challengeBar:Show()
+
+		button.challengeBar = challengeBar
+		button.challengeBarIcon = challengeBar.icon
+		button.challengeBarText = challengeBar.text
+
+		return challengeBar
+	end
+end
+
+T.tinsert(QK.Replaces, Replace)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/quests/questking/buttons/quest.lua b/ElvUI_SLE/modules/quests/questking/buttons/quest.lua
new file mode 100644
index 0000000..420f1e5
--- /dev/null
+++ b/ElvUI_SLE/modules/quests/questking/buttons/quest.lua
@@ -0,0 +1,519 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local QK = SLE:GetModule("QuestKingSkinner")
+local _G = _G
+
+if not SLE._Compatibility["QuestKing"] then return end
+
+local IsShiftKeyDown = IsShiftKeyDown
+local IsAltKeyDown = IsAltKeyDown
+local RemoveQuestWatch = RemoveQuestWatch
+local GetNumQuestLogEntries = GetNumQuestLogEntries
+local GetQuestWatchInfo = GetQuestWatchInfo
+local GetQuestWatchIndex = GetQuestWatchIndex
+local IsQuestSequenced = IsQuestSequenced
+local GetQuestLogRequiredMoney = GetQuestLogRequiredMoney
+local GetMoneyString = GetMoneyString
+local GetNumQuestWatches = GetNumQuestWatches
+
+local prev_GetNumQuestLogEntries = 0
+local prev_GetNumQuestWatches = 0
+
+local buildQuestSortTable
+local setButtonToQuest
+local headerList = {}
+local questSortTable = {}
+local mouseHandlerQuest = {}
+
+local function Replace()
+	local QuestKing = _G["QuestKing"]
+	local WatchButton = QuestKing.WatchButton
+	local getObjectiveColor = QuestKing.GetObjectiveColor
+	local getQuestTaggedTitle = QuestKing.GetQuestTaggedTitle
+	local matchObjective = QuestKing.MatchObjective
+	local matchObjectiveRep = QuestKing.MatchObjectiveRep
+	-- options
+	local opt = QuestKing.options
+	local opt_colors = opt.colors
+	local opt_itemAnchorSide = opt.itemAnchorSide
+	local opt_showCompletedObjectives = opt.showCompletedObjectives
+
+	local function QuestKingClickTemplate(button, mouse)
+		if (IsShiftKeyDown()) and (_G["ClassicQuestLog"]) then
+			SelectQuestLogEntry(button.questLogIndex)
+			if _G["ClassicQuestLog"]:IsVisible() then
+				_G["ClassicQuestLog"]:OnShow()
+			else
+				_G["ClassicQuestLog"]:SetShown(true)
+			end
+			return
+		end
+
+		if IsAltKeyDown() then
+			if mouse == "RightButton" then
+				RemoveQuestWatch(button.questLogIndex)
+				QuestKing:UpdateTracker()
+				return
+			else
+				if _G["QuestKingDBPerChar"].collapsedQuests[button.questID] then
+					_G["QuestKingDBPerChar"].collapsedQuests[button.questID] = nil
+				else
+					_G["QuestKingDBPerChar"].collapsedQuests[button.questID] = true
+				end
+				QuestKing:UpdateTracker()
+				return
+			end
+		end
+
+		if mouse == "RightButton" then
+			-- WORLDMAP_SETTINGS.selectedQuestId = button.questID
+			if (GetSuperTrackedQuestID() == button.questID) then
+				QuestKing:SetSuperTrackedQuestID(0)
+				QuestKing:UpdateTracker()
+			else
+				QuestKing:SetSuperTrackedQuestID(button.questID)
+				QuestKing:UpdateTracker()
+			end
+			-- QuestPOIUpdateIcons()
+			-- if WorldMapFrame:IsShown() then
+			-- 	HideUIPanel(WorldMapFrame)
+			-- 	ShowUIPanel(WorldMapFrame)
+			-- end
+		else
+			-- if (QuestLogFrame:IsShown()) and (QuestLogFrame.selectedIndex == button.questLogIndex) then
+			-- 	HideUIPanel(QuestLogFrame)
+			-- else
+			-- 	QuestLog_OpenToQuest(button.questLogIndex)
+			-- 	ShowUIPanel(QuestLogFrame)
+			-- end
+			QuestObjectiveTracker_OpenQuestMap(nil, button.questLogIndex)
+		end
+	end
+
+	local function BlizzlikeClickTemplate(button, mouse)
+		if (not IsShiftKeyDown()) and (_G["ClassicQuestLog"]) then
+			SelectQuestLogEntry(button.questLogIndex)
+			if _G["ClassicQuestLog"]:IsVisible() then
+				_G["ClassicQuestLog"]:OnShow()
+			else
+				_G["ClassicQuestLog"]:SetShown(true)
+			end
+			return
+		end
+		if IsShiftKeyDown() then
+			if mouse == "RightButton" then
+				if (GetSuperTrackedQuestID() == button.questID) then
+					QuestKing:SetSuperTrackedQuestID(0)
+					QuestKing:UpdateTracker()
+				else
+					QuestKing:SetSuperTrackedQuestID(button.questID)
+					QuestKing:UpdateTracker()
+				end
+				return
+			else
+				RemoveQuestWatch(button.questLogIndex)
+				QuestKing:UpdateTracker()
+				return
+			end
+		end
+		if IsControlKeyDown() then
+			if _G["QuestKingDBPerChar"].collapsedQuests[button.questID] then
+				_G["QuestKingDBPerChar"].collapsedQuests[button.questID] = nil
+			else
+				_G["QuestKingDBPerChar"].collapsedQuests[button.questID] = true
+			end
+			QuestKing:UpdateTracker()
+			return
+		end
+		if mouse == "RightButton" then
+			ObjectiveTracker_ToggleDropDown(button, QuestObjectiveTracker_OnOpenDropDown)
+		else
+			CloseDropDownMenus();
+			if _G["ClassicQuestLog"] then
+				SelectQuestLogEntry(button.questLogIndex)
+				if _G["ClassicQuestLog"]:IsVisible() then
+					_G["ClassicQuestLog"]:OnShow()
+				else
+					_G["ClassicQuestLog"]:SetShown(true)
+				end
+				return
+			else
+				QuestObjectiveTracker_OpenQuestMap(nil, button.questLogIndex)
+				return
+			end
+		end
+	end
+
+	function buildQuestSortTable ()
+		for k,v in T.pairs(questSortTable) do
+			T.twipe(questSortTable[k])
+		end
+		T.twipe(headerList)
+
+		local numEntries = GetNumQuestLogEntries()
+		local currentHeader = "(Unknown 0)"
+
+		local numQuests = 0
+		for i = 1, numEntries do
+			local title, _, _, isHeader, isCollapsed, _, _, questID = GetQuestLogTitle(i)
+			if (not title) or (title == "") then
+				title = T.format("(Unknown %d)", i)
+			end
+
+			if (isHeader) then
+
+				if not questSortTable[title] then
+					questSortTable[title] = {}
+				end
+
+				if (title ~= currentHeader) then
+					-- new header found
+					-- note: quest "Safe Passage" in Frostfire Ridge is under a duplicate zone header
+					currentHeader = title
+					T.tinsert(headerList, title)
+				end
+
+			elseif (not isHeader) and (IsQuestWatched(i)) then
+				if (not questSortTable[currentHeader]) then
+					questSortTable[currentHeader] = {}
+				end
+
+				T.tinsert(questSortTable[currentHeader], i)
+			end
+
+			if (not isHeader) then
+				numQuests = numQuests + 1
+			end
+		end
+
+		-- totalQuestCount = numQuests
+	end
+
+	function setButtonToQuest(button, questLogIndex)
+		button.mouseHandler = mouseHandlerQuest
+
+		local questTitle, level, suggestedGroup, isHeader, isCollapsed, isComplete, frequency, questID, startEvent, displayQuestID, isOnMap, hasLocalPOI, isTask, isStory = GetQuestLogTitle(questLogIndex)
+
+		button.questLogIndex = questLogIndex
+		button.questID = questID
+
+		local collapseObjectives = QuestKingDBPerChar.collapsedQuests[questID]
+
+		-- set title
+		local taggedTitle = getQuestTaggedTitle(questLogIndex)
+
+		if (GetSuperTrackedQuestID() == questID) then
+			local icon = E.private.sle.skins.QuestKing.trackerIcon == "DEFAULT" and [[Interface\Scenarios\ScenarioIcon-Combat]] or E.private.sle.skins.QuestKing.trackerIcon == "CUSTOM" and E.private.sle.skins.QuestKing.trackerIconCustom or QK.Icons[E.private.sle.skins.QuestKing.trackerIcon]
+			local size =  E.private.sle.skins.QuestKing.trackerSize
+			taggedTitle = taggedTitle .. " |T"..icon..":"..size..":"..size..":-1:0|t"
+		end
+
+		if (isComplete == -1) then
+			button.title:SetFormattedTextIcon("|TInterface\\RAIDFRAME\\ReadyCheck-NotReady:0:0:1:0|t %s", taggedTitle)
+		else
+			button.title:SetTextIcon(taggedTitle)
+		end
+
+		-- add objectives
+		local numObj = GetNumQuestLeaderBoards(questLogIndex) or 0
+		local completedObj = 0
+		local displayedObj = 0
+
+		for i = 1, numObj do
+			local objectiveDesc, objectiveType, objectiveIsDone = GetQuestLogLeaderBoard(i, questLogIndex)
+
+			if (objectiveIsDone) then
+				completedObj = completedObj + 1
+			end
+
+			local displayObjective = true
+			if (collapseObjectives) then
+				-- hide for collapsed quest
+				displayObjective = false
+			elseif (isComplete == 1) and (opt_showCompletedObjectives ~= "always") then
+				-- hide for complete quest (unless show type is "always")
+				displayObjective = false
+			elseif (objectiveIsDone) and (opt_showCompletedObjectives == false) then
+				-- hide for completed objectives if showCompletedObjectives is false
+				displayObjective = false
+			elseif (objectiveDesc == nil) then
+				-- hide invalid objectives
+				displayObjective = false
+			end
+
+			-- types:
+			-- event, reputation, item, log(Direbrew's Dire Brew), monster, object?, spell(Frost Nova)
+			if (displayObjective) then
+				local quantCur, quantMax, quantName = matchObjective(objectiveDesc)
+
+				if (objectiveType == "reputation") then
+					quantCur, quantMax, quantName = matchObjectiveRep(objectiveDesc)
+
+					local r, g, b = getObjectiveColor(objectiveIsDone and 1 or 0)
+					local line
+					if (not quantName) then
+						line = button:AddLine(T.format("  %s", objectiveDesc), nil, r, g, b)
+					else
+						line = button:AddLine(T.format("  %s", quantName), T.format(": %s / %s", quantCur, quantMax), r, g, b)
+					end
+
+					objectiveIsDone = not not objectiveIsDone
+					if ((line._lastQuant == false) and (objectiveIsDone == true)) then
+						line:Flash()
+					end
+					line._lastQuant = objectiveIsDone
+
+					displayedObj = displayedObj + 1
+
+				elseif (not quantName) or (objectiveType == "spell") then
+					if ((displayObjective) or (not objectiveIsDone)) then
+						local r, g, b = getObjectiveColor(objectiveIsDone and 1 or 0)
+						local line = button:AddLine(T.format("  %s", objectiveDesc), nil, r, g, b)
+
+						---- FIXME: test this!
+						objectiveIsDone = not not objectiveIsDone
+						if ((line._lastQuant == false) and (objectiveIsDone == true)) then
+							line:Flash()
+						end
+						line._lastQuant = objectiveIsDone
+
+						displayedObj = displayedObj + 1
+					end
+
+				else
+					if ((displayObjective) or (not objectiveIsDone)) then
+						local r, g, b = getObjectiveColor(quantCur / quantMax)
+						local line = button:AddLine(T.format("  %s", quantName), T.format(": %s/%s", quantCur, quantMax), r, g, b)
+
+						local lastQuant = line._lastQuant
+						if ((lastQuant) and (quantCur > lastQuant)) then
+							line:Flash()
+						end
+						line._lastQuant = quantCur
+
+						displayedObj = displayedObj + 1
+					end
+				end
+			end
+
+		end
+
+		-- money
+		local requiredMoney = GetQuestLogRequiredMoney(questLogIndex)
+		if (requiredMoney > 0) then
+			QuestKing.watchMoney = true
+			local playerMoney = GetMoney()
+
+			-- not sure about this, but the default watch frame does it
+			-- (fake completion for gold-requiring connectors when gold req is met and no event begins)
+			if (numObj == 0 and playerMoney >= requiredMoney and not startEvent) then
+				isComplete = 1
+			end
+
+			numObj = numObj + 1 -- (questking only) ensure all gold-requiring quests aren't marked as connectors
+
+			if (not collapseObjectives) then -- hide entirely if objectives are collapsed
+				if playerMoney >= requiredMoney then
+					-- show met gold amounts only for incomplete quests
+					if (isComplete ~= 1) and (opt_showCompletedObjectives) then
+						local r, g, b = getObjectiveColor(1)
+						button:AddLine(L["SLE_QUESTKING_Required"]..GetMoneyString(requiredMoney), nil, r, g, b)
+					end
+				else
+					-- always show unmet gold amount
+					local r, g, b = getObjectiveColor(0)
+					button:AddLine(L["SLE_QUESTKING_Required"]..GetMoneyString(requiredMoney), nil, r, g, b)
+				end
+			end
+		end
+
+		local _, _, _, _, _, _, _, _, failureTime, timeElapsed = GetQuestWatchInfo(GetQuestWatchIndex(questLogIndex))
+
+		-- timer
+		if (failureTime) then
+			if (timeElapsed) then
+				local timerBar = button:AddTimerBar(failureTime, T.GetTime() - timeElapsed)
+				timerBar:SetStatusBarColor(opt_colors.QuestTimer[1], opt_colors.QuestTimer[2], opt_colors.QuestTimer[3])
+			end
+		end
+
+		-- set title colour
+		if (isComplete == -1) then
+			-- failed
+			button.title:SetTextColor(opt_colors.ObjectiveFailed[1], opt_colors.ObjectiveFailed[2], opt_colors.ObjectiveFailed[3])
+		elseif (isComplete == 1) then
+			if GetQuestLogIsAutoComplete(questLogIndex) then
+				-- autocomplete
+				button.title:SetTextColor(opt_colors.QuestCompleteAuto[1], opt_colors.QuestCompleteAuto[2], opt_colors.QuestCompleteAuto[3])
+			elseif (numObj == 0) then
+				-- connector quest [type c] (complete, 0/0 objectives)
+				button.title:SetTextColor(opt_colors.QuestConnector[1], opt_colors.QuestConnector[2], opt_colors.QuestConnector[3])
+			else
+				-- completed quest (complete, n/n objectives)
+				button.title:SetTextColor(opt_colors.ObjectiveComplete[1], opt_colors.ObjectiveComplete[2], opt_colors.ObjectiveComplete[3])
+			end
+		else
+			if numObj == 0 then
+				-- connector quest [type i] (incomplete, 0/0 objectives)
+				button.title:SetTextColor(opt_colors.QuestConnector[1], opt_colors.QuestConnector[2], opt_colors.QuestConnector[3])
+			elseif numObj == completedObj then
+				-- unknown state (incomplete, n/n objectives where n>0)
+				button.title:SetTextColor(1, 0, 1)
+			else
+				-- incomplete quest (incomplete, n/m objectives where m>n)
+				local color = GetQuestDifficultyColor(level)
+				button.title:SetTextColor(color.r, color.g, color.b)
+			end
+		end
+
+		if collapseObjectives then
+			button.title:SetAlpha(0.6)
+		end
+
+		-- add item button
+		local link, item, charges, showItemWhenComplete = GetQuestLogSpecialItemInfo(questLogIndex)
+		local itemButton
+		if opt_itemAnchorSide and item and ((isComplete ~= 1) or (showItemWhenComplete)) then
+			if T.InCombatLockdown() then
+				QuestKing:StartCombatTimer()
+			else
+				itemButton = button:SetItemButton(questLogIndex, link, item, charges, displayedObj)
+			end
+
+		else
+			if (button.itemButton) then
+				if T.InCombatLockdown() then
+					QuestKing:StartCombatTimer()
+				else
+					button:RemoveItemButton()
+				end
+			end
+		end
+
+		if (button.fresh) then
+			if (QuestKing.newlyAddedQuests[questID]) then
+				button:Pulse(0.9, 0.6, 0.2)
+				QuestKing.newlyAddedQuests[questID] = nil
+			end
+		end
+
+		-- quests enter a state of unknown completion (isComplete == nil) when zoning between instances.
+		-- since they also has no objectives in this state, we completely ignore completion changes for quests with no objectives
+		if (numObj > 0) then
+			if (isComplete == 1) and (button._questCompleted == false) then
+				button:Pulse(0.2, 0.6, 0.9)
+				QuestKing:OnQuestObjectivesCompleted(questID)
+			end
+			button._questCompleted = not not (isComplete == 1)
+		end
+
+		-- animate sequenced quests
+		if ((not button.fresh) and IsQuestSequenced(questID)) then
+			local lastNumObj = button._lastNumObj
+
+			if ((lastNumObj) and (lastNumObj > 0) and (numObj > lastNumObj)) then
+				-- do animations [FIXME: test this]
+				PlaySound("UI_QuestRollingForward_01")
+				local lines = button.lines
+				for i = 1, #lines do
+					if (i > lastNumObj) then
+						local line = lines[i]
+						line:Glow(opt_colors.ObjectiveChangedGlow[1], opt_colors.ObjectiveChangedGlow[2], opt_colors.ObjectiveChangedGlow[3])
+					end
+				end
+			end
+			button._lastNumObj = numObj
+		end
+
+	end
+
+	function QuestKing:UpdateTrackerQuests()
+		local headerName, questLogIndex
+		for i = 1, #headerList do
+			headerName = headerList[i]
+			-- header
+			if #questSortTable[headerName] > 0 then
+				local button = QuestKing.WatchButton:GetKeyed("collapser", headerName)
+				button._headerName = headerName
+
+				--|TTexturePath:size1:size2:xoffset:yoffset:dimx:dimy:coordx1:coordx2:coordy1:coordy2:red:green:blue|t
+				--[[Altered part to allow for using S&L's objective tracker skin options for colors]]
+				local SLE_HeaderColor = E.db.sle.skins.objectiveTracker.colorHeader
+				if QuestKingDBPerChar.collapsedHeaders[headerName] then
+					button.title:SetTextIcon("|TInterface\\AddOns\\QuestKing\\textures\\UI-SortArrow_sm_right:8:8:0:-1:0:0:0:0:0:0:1:1:1|t "..headerName)
+				else
+					button.title:SetTextIcon("|TInterface\\AddOns\\QuestKing\\textures\\UI-SortArrow_sm_down:8:8:0:-1:0:0:0:0:0:0:1:1:1|t "..headerName)
+				end
+				button.title:SetTextColor(SLE_HeaderColor.r, SLE_HeaderColor.g, SLE_HeaderColor.b)
+			end
+
+			-- quests
+
+			if not QuestKingDBPerChar.collapsedHeaders[headerName] then
+				for j = 1, #questSortTable[headerName] do
+					questLogIndex = questSortTable[headerName][j]
+					local _,_,_,_,_,_,_, questID = GetQuestLogTitle(questLogIndex)
+					local button = QuestKing.WatchButton:GetKeyed("quest", questID)
+					setButtonToQuest(button, questLogIndex)
+				end
+			end
+		end
+
+	end
+
+	function QuestKing:CheckQuestSortTable (forceBuild)
+		if (forceBuild) then
+			buildQuestSortTable()
+			prev_GetNumQuestLogEntries = GetNumQuestLogEntries()
+			prev_GetNumQuestWatches = GetNumQuestWatches()
+		else
+			local numEntries = GetNumQuestLogEntries()
+			local numWatches = GetNumQuestWatches()
+
+			if (numEntries ~= prev_GetNumQuestLogEntries) or (numWatches ~= prev_GetNumQuestWatches) then
+				buildQuestSortTable()
+				prev_GetNumQuestLogEntries = numEntries
+				prev_GetNumQuestWatches = numWatches
+			end
+		end
+	end
+
+	function mouseHandlerQuest:TitleButtonOnEnter (motion)
+		local button = self.parent
+
+		local link = GetQuestLink(button.questLogIndex)
+		if link then
+			_G["GameTooltip"]:SetOwner(self, E.private.sle.skins.QuestKing.tooltipAnchor)
+
+			if opt.tooltipScale then
+				if not _G["GameTooltip"].__QuestKingPreviousScale then
+					_G["GameTooltip"].__QuestKingPreviousScale = GameTooltip:GetScale()
+				end
+				_G["GameTooltip"]:SetScale(E.private.sle.skins.QuestKing.enable and E.private.sle.skins.QuestKing.tooltipScale or opt.tooltipScale)
+			end
+
+			_G["GameTooltip"]:SetHyperlink(link)
+			_G["GameTooltip"]:Show()
+		end
+	end
+
+	function mouseHandlerQuest:TitleButtonOnClick (mouse, down)
+		local button = self.parent
+
+		if (IsModifiedClick("CHATLINK") and ChatEdit_GetActiveWindow()) then
+			local questLink = GetQuestLink(button.questLogIndex)
+			if (questLink) then
+				ChatEdit_InsertLink(questLink)
+				return
+			end
+		end
+
+		if E.private.sle.skins.QuestKing.clickTemplate == "QuestKing" then
+			QuestKingClickTemplate(button, mouse)
+		elseif E.private.sle.skins.QuestKing.clickTemplate == "Blizzlike" then
+			BlizzlikeClickTemplate(button, mouse)
+		end
+	end
+
+end
+
+T.tinsert(QK.Replaces, Replace)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/quests/questking/buttons/scenario.lua b/ElvUI_SLE/modules/quests/questking/buttons/scenario.lua
new file mode 100644
index 0000000..bc2fe4a
--- /dev/null
+++ b/ElvUI_SLE/modules/quests/questking/buttons/scenario.lua
@@ -0,0 +1,290 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local QK = SLE:GetModule("QuestKingSkinner")
+local _G = _G
+
+if not SLE._Compatibility["QuestKing"] then return end
+
+local mouseHandlerScenario = {}
+
+local function Replace()
+	local QuestKing = _G["QuestKing"]
+	local WatchButton = QuestKing.WatchButton
+	local getObjectiveColor = QuestKing.GetObjectiveColor
+	local opt = QuestKing.options
+	local opt_colors = opt.colors
+
+	function QuestKing:UpdateTrackerScenarios ()
+		local scenarioName, currentStage, numStages, flags, hasBonusStep, isBonusStepComplete, completed, xp, money = C_Scenario.GetInfo()
+		local inChallengeMode = bit.band(flags, SCENARIO_FLAG_CHALLENGE_MODE) == SCENARIO_FLAG_CHALLENGE_MODE;
+		local inProvingGrounds = bit.band(flags, SCENARIO_FLAG_PROVING_GROUNDS) == SCENARIO_FLAG_PROVING_GROUNDS;
+		local dungeonDisplay = bit.band(flags, SCENARIO_FLAG_USE_DUNGEON_DISPLAY) == SCENARIO_FLAG_USE_DUNGEON_DISPLAY;
+		-- D("updateTrackerScenarios:", dungeonDisplay)
+
+		local _, _, _, _, _, _, _, mapID = GetInstanceInfo()
+		if (mapID == 1148) then
+			inProvingGrounds = true
+		end
+
+		if (inProvingGrounds) then
+			local diffID, currWave, maxWave, duration = C_Scenario.GetProvingGroundsInfo()
+			if (duration ~= 0) then
+				return
+			end
+		end
+
+		local stageName, stageDescription, numCriteria = C_Scenario.GetStepInfo()
+		local inChallengeMode = C_Scenario.IsChallengeMode()
+		local SLE_HeaderColor = E.db.sle.skins.objectiveTracker.colorHeader
+		if (currentStage > 0) then
+			if (currentStage <= numStages) then
+				-- scenario type header
+				local header = WatchButton:GetKeyed("header", scenarioName)
+
+				if (inProvingGrounds) then
+					header.title:SetText(TRACKER_HEADER_PROVINGGROUNDS)
+				else
+					local displayText = TRACKER_HEADER_SCENARIO
+
+					if (dungeonDisplay) then
+						displayText = TRACKER_HEADER_DUNGEON
+					elseif (inChallengeMode) then
+						displayText = CHALLENGE_MODE
+					end
+
+					if (numStages > 1) then
+						if (currentStage == numStages) then
+							header.title:SetFormattedText("%s: "..SCENARIO_STAGE_FINAL, displayText)
+						else
+							header.title:SetFormattedText("%s: "..SCENARIO_STAGE_STATUS, displayText, currentStage, numStages)
+						end
+					else
+						header.title:SetText(displayText)
+					end
+				end
+				header.title:SetTextColor(SLE_HeaderColor.r, SLE_HeaderColor.g, SLE_HeaderColor.b)
+
+				-- scenario stage
+				local button = WatchButton:GetKeyed("scenario", scenarioName)
+				QuestKing.SetButtonToScenario(button)
+
+			elseif (currentStage > numStages) then
+				-- scenario complete header
+				local header = WatchButton:GetKeyed("header", scenarioName)
+				if (not inChallengeMode) then
+					if (dungeonDisplay) then
+						header.title:SetText(DUNGEON_COMPLETED)
+					else
+						header.title:SetText(SCENARIO_COMPLETED)
+					end
+				else
+					header.title:SetText(CHALLENGE_MODE_COMPLETED)
+				end
+				header.title:SetTextColor(SLE_HeaderColor.r, SLE_HeaderColor.g, SLE_HeaderColor.b)
+			end
+		end
+	end
+
+	function QuestKing.SetButtonToScenario(button, stepIndex)
+		button.mouseHandler = mouseHandlerScenario
+
+		local scenarioName, currentStage, numStages, flags, hasBonusStep, isBonusStepComplete, completed, xp, money = C_Scenario.GetInfo()
+
+		if (not stepIndex) then
+			stepIndex = currentStage
+		end
+		button.stepIndex = stepIndex
+
+		local lastStepIndex = button._lastStepIndex
+		local isNewStep = false
+		if (lastStepIndex) and (stepIndex > lastStepIndex) and (not button.fresh) then
+			isNewStep = true
+			-- D("isNewStep")
+		end
+		button._lastStepIndex = stepIndex
+
+		local stageName, stageDescription, numCriteria, stepFailed, isBonusStep, isForCurrentStepOnly = C_Scenario.GetStepInfo(stepIndex)
+
+		-- pre-parse
+		local stepFinished = (numCriteria > 0) and true or false
+		for i = 1, numCriteria do
+			local criteriaString, criteriaType, criteriaCompleted, quantity, totalQuantity, flags, assetID, quantityString, criteriaID, duration, elapsed, criteriaFailed = C_Scenario.GetCriteriaInfoByStep(stepIndex, i)
+			if (not criteriaCompleted) then
+				stepFinished = false
+			end
+		end
+
+		if (stepFailed) then
+			button.title:SetFormattedTextIcon("|TInterface\\RAIDFRAME\\ReadyCheck-NotReady:0:0:1:0|t %s", stageName)
+			button.title:SetTextColor(opt_colors.ObjectiveFailed[1], opt_colors.ObjectiveFailed[2], opt_colors.ObjectiveFailed[3])
+			stepFinished = true
+		elseif (stepFinished) then
+			button.title:SetFormattedTextIcon("|TInterface\\RAIDFRAME\\ReadyCheck-Ready:0:0:1:1|t %s", stageName)
+			button.title:SetTextColor(opt_colors.ObjectiveComplete[1], opt_colors.ObjectiveComplete[2], opt_colors.ObjectiveComplete[3])
+		else
+			button.title:SetText(stageName)
+			button.title:SetTextColor(opt_colors.ScenarioStageTitle[1], opt_colors.ScenarioStageTitle[2], opt_colors.ScenarioStageTitle[3])
+		end
+
+		if (not stepFinished) then
+			for i = 1, numCriteria do
+				local criteriaString, criteriaType, criteriaCompleted, quantity, totalQuantity, flags, assetID, quantityString, criteriaID, duration, elapsed, criteriaFailed = C_Scenario.GetCriteriaInfoByStep(stepIndex, i)
+				local line
+
+				if (criteriaCompleted) then
+					if (opt_showCompletedObjectives) then
+						line = button:AddLine(
+							format("  %s", criteriaString),
+							format(": %s/%s", quantity, totalQuantity),
+							opt_colors.ObjectiveGradientComplete[1], opt_colors.ObjectiveGradientComplete[2], opt_colors.ObjectiveGradientComplete[3])
+					end
+				elseif (criteriaFailed) then
+					line = button:AddLineIcon(
+						format("  |TInterface\\RAIDFRAME\\ReadyCheck-NotReady:0|t %s", criteriaString),
+						format(": %s/%s", quantity, totalQuantity),
+						opt_colors.ObjectiveFailed[1], opt_colors.ObjectiveFailed[2], opt_colors.ObjectiveFailed[3])
+				else
+					local r, g, b = getObjectiveColor(quantity / totalQuantity)
+					line = button:AddLine(
+						format("  %s", criteriaString),
+						format(": %s/%s", quantity, totalQuantity),
+						r, g, b)
+				end
+				if not line then return end
+				local lastQuant = line._lastQuant
+				if ((lastQuant) and (quantity > lastQuant) and (not isNewStep)) then
+					-- line:Glow(opt_colors.ObjectiveProgressFlash[1], opt_colors.ObjectiveProgressFlash[2], opt_colors.ObjectiveProgressFlash[3])
+					line:Flash()
+				end
+				line._lastQuant = quantity
+
+				if ((duration) and (elapsed) and (elapsed < duration)) then
+					local timerBar = button:AddTimerBar(duration, GetTime() - elapsed)
+					local COLOR
+					if E.private.sle.skins.objectiveTracker.class then
+						COLOR = classColor
+					else
+						COLOR = E.private.sle.skins.objectiveTracker.color
+					end
+					timerBar:SetStatusBarColor(COLOR.r, COLOR.g, COLOR.b)
+				end
+			end
+
+			if (isNewStep) or (button.fresh) then
+				local lines = button.lines
+				for i = 1, #lines do
+					local line = lines[i]
+					line:Glow(0.1, 0.7, 0.4)
+				end
+				-- D("glowed lines")
+			end
+		end
+	end
+
+	function mouseHandlerScenario:TitleButtonOnEnter (motion)
+		local button = self.parent
+		local stepIndex = button.stepIndex
+
+		local scenarioName, currentStage, numStages, flags, hasBonusStep, isBonusStepComplete, completed, xp, money = C_Scenario.GetInfo()
+		local stageName, stageDescription, numCriteria, stepFailed, isBonusStep, isForCurrentStepOnly = C_Scenario.GetStepInfo(stepIndex)
+
+		_G["GameTooltip"]:SetOwner(self, E.private.sle.skins.QuestKing.tooltipAnchor)
+
+		if opt.tooltipScale then
+			if not GameTooltip.__QuestKingPreviousScale then
+				GameTooltip.__QuestKingPreviousScale = GameTooltip:GetScale()
+			end
+			GameTooltip:SetScale(opt.tooltipScale)
+		end
+
+		GameTooltip:AddLine(scenarioName, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, 1)
+		GameTooltip:AddLine(stageName, opt_colors.ScenarioStageTitle[1], opt_colors.ScenarioStageTitle[2], opt_colors.ScenarioStageTitle[3], 1)
+
+		if (isBonusStep) then
+			GameTooltip:AddLine("Bonus Objective", 1, 0.914, 0.682, 1)
+		else
+			GameTooltip:AddLine(string.format(SCENARIO_STAGE_STATUS, currentStage, numStages), 1, 0.914, 0.682, 1)
+		end
+		GameTooltip:AddLine(" ")
+
+		GameTooltip:AddLine(stageDescription, 1, 1, 1, 1)
+		GameTooltip:AddLine(" ")
+
+		GameTooltip:AddLine(QUEST_TOOLTIP_REQUIREMENTS, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, 1)
+		for i = 1, numCriteria do
+			local criteriaString, criteriaType, criteriaCompleted, quantity, totalQuantity, flags, assetID, quantityString, criteriaID, duration, elapsed, criteriaFailed = C_Scenario.GetCriteriaInfoByStep(stepIndex, i)
+			if criteriaCompleted then
+				GameTooltip:AddLine(format("- %s: %s/%s |cff808080(%s)|r", criteriaString, quantity, totalQuantity, COMPLETE), 0.2, 0.9, 0.2)
+			elseif criteriaFailed then
+				GameTooltip:AddLine(format("- %s: %s/%s |cff808080(%s)|r", criteriaString, quantity, totalQuantity, FAILED), 1, 0.2, 0.2)
+			else
+				GameTooltip:AddLine(format("- %s: %s/%s", criteriaString, quantity, totalQuantity), 1, 1, 1)
+			end
+
+		end
+
+		local blankLine = false
+
+		if (isBonusStep) then
+			local questID = C_Scenario.GetBonusStepRewardQuestID(stepIndex)
+			if (not HaveQuestData(questID)) then
+				-- GameTooltip:AddLine(RETRIEVING_DATA, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
+			else
+				-- xp
+				local xp = GetQuestLogRewardXP(questID)
+				if ( xp > 0 ) then
+					if (not blankLine) then GameTooltip:AddLine(" "); blankLine = true end
+					GameTooltip:AddLine(string.format(BONUS_OBJECTIVE_EXPERIENCE_FORMAT, xp), 1, 1, 1)
+				end
+
+				-- currency
+				local numQuestCurrencies = GetNumQuestLogRewardCurrencies(questID)
+				for i = 1, numQuestCurrencies do
+					local name, texture, numItems = GetQuestLogRewardCurrencyInfo(i, questID)
+					local text = string.format(BONUS_OBJECTIVE_REWARD_WITH_COUNT_FORMAT, texture, numItems, name)
+					if (not blankLine) then GameTooltip:AddLine(" "); blankLine = true end
+					GameTooltip:AddLine(text, 1, 1, 1)
+				end
+
+				-- items
+				local numQuestRewards = GetNumQuestLogRewards(questID)
+				for i = 1, numQuestRewards do
+					local name, texture, numItems, quality, isUsable = GetQuestLogRewardInfo(i, questID)
+					local text
+
+					if (numItems > 1) then
+						text = string.format(BONUS_OBJECTIVE_REWARD_WITH_COUNT_FORMAT, texture, numItems, name)
+					elseif (texture) and (name) then
+						text = string.format(BONUS_OBJECTIVE_REWARD_FORMAT, texture, name)
+					end
+
+					if (text) then
+						local color = ITEM_QUALITY_COLORS[quality]
+						if (not blankLine) then GameTooltip:AddLine(" "); blankLine = true end
+						GameTooltip:AddLine(text, color.r, color.g, color.b)
+					end
+				end
+
+				-- money
+				local money = GetQuestLogRewardMoney(questID)
+				if (money > 0) then
+					if (not blankLine) then GameTooltip:AddLine(" "); blankLine = true end
+					SetTooltipMoney(GameTooltip, money, nil)
+				end
+			end
+		else
+			if (xp > 0) then
+				if (not blankLine) then GameTooltip:AddLine(" "); blankLine = true end
+				GameTooltip:AddLine(string.format(BONUS_OBJECTIVE_EXPERIENCE_FORMAT, xp), 1, 1, 1)
+		  end
+		  if (money > 0) then
+			if (not blankLine) then GameTooltip:AddLine(" "); blankLine = true end
+				SetTooltipMoney(GameTooltip, money, nil)
+		  end
+		end
+
+		GameTooltip:Show()
+	end
+
+end
+
+T.tinsert(QK.Replaces, Replace)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/quests/questking/core/core.lua b/ElvUI_SLE/modules/quests/questking/core/core.lua
new file mode 100644
index 0000000..619f7ed
--- /dev/null
+++ b/ElvUI_SLE/modules/quests/questking/core/core.lua
@@ -0,0 +1,150 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local QK = SLE:GetModule("QuestKingSkinner")
+local _G = _G
+
+if not SLE._Compatibility["QuestKing"] then return end
+
+local function Replace()
+	local QuestKing = _G["QuestKing"]
+	local WatchButton = QuestKing.WatchButton
+	local Tracker = QuestKing.Tracker
+	local opt = QuestKing.options
+	local opt_colors = opt.colors
+
+	function QuestKing:UpdateTracker(forceBuild, postCombat)
+		--D("!QuestKing:UpdateTracker")
+
+		QuestKing:CheckQuestSortTable(forceBuild)
+		QuestKing.watchMoney = false
+
+		QuestKing:PreCheckQuestTracking()
+
+		WatchButton:StartOrder()
+
+		-- titlebar
+		local trackerCollapsed = QuestKingDBPerChar.trackerCollapsed
+		if (trackerCollapsed == 2) then
+			QuestKing_TrackerMinimizeButton.label:SetText("x")
+		elseif (trackerCollapsed == 1) then
+			QuestKing_TrackerMinimizeButton.label:SetText("+")
+		else
+			QuestKing_TrackerMinimizeButton.label:SetText("-")
+		end
+
+		if (QuestKingDBPerChar.trackerCollapsed <= 1) then
+			QuestKing:UpdateTrackerPopups()
+
+			-- challenge timers
+			QuestKing:UpdateTrackerChallengeTimers()
+
+			-- scenarios
+			local inScenario = C_Scenario.IsInScenario()
+			if inScenario then
+				QuestKing:UpdateTrackerScenarios()
+			end
+
+			-- bonus objectives
+			QuestKing:UpdateTrackerBonusObjectives()
+		end
+
+		local displayMode = QuestKingDBPerChar.displayMode
+
+		if (trackerCollapsed == 0) then
+			if (displayMode == "combined") or (displayMode == "achievements") then
+				QuestKing:UpdateTrackerAchievements()
+			end
+
+			if (displayMode == "combined") or (displayMode == "quests") then
+				QuestKing:UpdateTrackerQuests()
+			end
+		end
+
+		local numAch = GetNumTrackedAchievements()
+		local numWatches = GetNumQuestWatches()
+		local totalLogLines, totalQuestCount = GetNumQuestLogEntries()
+
+		if displayMode == "combined" then
+			QuestKing_TrackerModeButton.label:SetText("C")
+			if numAch > 0 then
+				Tracker.titlebarText:SetText(format("%d/%d | %d", totalQuestCount, MAX_QUESTS, numAch))
+			else
+				Tracker.titlebarText:SetText(format("%d/%d", totalQuestCount, MAX_QUESTS))
+			end
+			if (numWatches == 0) and (numAch == 0) then
+				Tracker.titlebarText:SetTextColor(opt_colors.TrackerTitlebarTextDimmed[1], opt_colors.TrackerTitlebarTextDimmed[2], opt_colors.TrackerTitlebarTextDimmed[3])
+			else
+				Tracker.titlebarText:SetTextColor(opt_colors.TrackerTitlebarText[1], opt_colors.TrackerTitlebarText[2], opt_colors.TrackerTitlebarText[3])
+			end
+
+		elseif displayMode == "achievements" then
+			QuestKing_TrackerModeButton.label:SetText("A")
+			Tracker.titlebarText:SetText(numAch)
+			if (numAch == 0) then
+				Tracker.titlebarText:SetTextColor(opt_colors.TrackerTitlebarTextDimmed[1], opt_colors.TrackerTitlebarTextDimmed[2], opt_colors.TrackerTitlebarTextDimmed[3])
+			else
+				Tracker.titlebarText:SetTextColor(opt_colors.TrackerTitlebarText[1], opt_colors.TrackerTitlebarText[2], opt_colors.TrackerTitlebarText[3])
+			end
+
+		else
+			QuestKing_TrackerModeButton.label:SetText("Q")
+			Tracker.titlebarText:SetText(format("%d/%d", totalQuestCount, MAX_QUESTS))
+			if (numWatches == 0) then
+				Tracker.titlebarText:SetTextColor(opt_colors.TrackerTitlebarTextDimmed[1], opt_colors.TrackerTitlebarTextDimmed[2], opt_colors.TrackerTitlebarTextDimmed[3])
+			else
+				Tracker.titlebarText:SetTextColor(opt_colors.TrackerTitlebarText[1], opt_colors.TrackerTitlebarText[2], opt_colors.TrackerTitlebarText[3])
+			end
+		end
+
+
+		-- LAYOUT
+		local requestOrder = WatchButton.requestOrder
+		local requestCount = WatchButton.requestCount
+		local lastShown = nil
+		for i = 1, requestCount do
+			-- loop over watch buttons
+			local button = requestOrder[i]
+			button:ClearAllPoints()
+
+			-- layout shown buttons
+			if (lastShown == nil) then
+				button:SetPoint("TOPLEFT", Tracker.titlebar, "BOTTOMLEFT", 0, -1)
+			else
+				if (button.type == "header") or (button.type == "collapser") then
+					button:SetPoint("TOPLEFT", lastShown, "BOTTOMLEFT", 0, -4)
+				elseif (lastShown.type == "header") or (lastShown.type == "collapser") then
+					button:SetPoint("TOPLEFT", lastShown, "BOTTOMLEFT", 0, -3)
+				else
+					button:SetPoint("TOPLEFT", lastShown, "BOTTOMLEFT", 0, -2)
+				end
+			end
+			button:Render()
+
+			lastShown = button
+		end
+
+		if (postCombat) then -- we already check for combat in timer func, no need here
+			local freePool = WatchButton.freePool
+			for i = 1, #freePool do
+				local button = freePool[i]
+				if (button.itemButton) then
+					button:RemoveItemButton()
+				end
+			end
+		end
+
+		WatchButton:FreeUnused()
+
+		Tracker:Resize(lastShown)
+
+		QuestKing:PostCheckQuestTracking()
+
+		local hooks = QuestKing.updateHooks
+		if (#hooks) then
+			for i = 1, #hooks do
+				hooks[i]()
+			end
+		end
+	end
+end
+
+T.tinsert(QK.Replaces, Replace)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/quests/questking/core/util.lua b/ElvUI_SLE/modules/quests/questking/core/util.lua
new file mode 100644
index 0000000..87b8e77
--- /dev/null
+++ b/ElvUI_SLE/modules/quests/questking/core/util.lua
@@ -0,0 +1,179 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local QK = SLE:GetModule("QuestKingSkinner")
+local _G = _G
+
+if not SLE._Compatibility["QuestKing"] then return end
+
+local function Replace()
+local QuestKing = _G["QuestKing"]
+
+local knownTypesTag = {
+	[0] = "",     -- Normal
+	[1] = "G",    -- Group
+	[21] = "C",	  -- Class
+	[41] = "P",   -- PVP
+	[62] = "R",   -- Raid
+	[81] = "D",   -- Dungeon
+	[82] = "V",   -- World Event (?)
+	[83] = "L",   -- Legendary
+	[84] = "E",   -- Escort (?)
+	[85] = "H",   -- Heroic
+	[88] = "R10", -- 10 Player (?)
+	[89] = "R25", -- 25 Player (?)
+	[98] = "S",   -- Scenario
+	[102] = "A",  -- Account
+	-- Y = Daily
+	-- W = Weekly
+	-- F = Faction (Alliance/Horde)
+	-- e = Starts event
+	-- a = Autocomplete
+}
+
+local knownTypesTagFull = {
+	[0] = "",     -- Normal
+	[1] = GROUP,    -- Group
+	[21] = CLASS,  -- Class
+	[41] = "PvP",   -- PVP
+	[62] = RAID,   -- Raid
+	[81] = TRACKER_HEADER_DUNGEON,   -- Dungeon
+	[82] = "V",   -- World Event (?)
+	[83] = ITEM_QUALITY5_DESC,   -- Legendary
+	[84] = "E",   -- Escort (?)
+	[85] = PLAYER_DIFFICULTY2,   -- Heroic
+	[88] = RAID.."10", -- 10 Player (?)
+	[89] = RAID.."25", -- 25 Player (?)
+	[98] = TRACKER_HEADER_SCENARIO,   -- Scenario
+	[102] = "A",  -- Account
+	-- Y = Daily
+	-- W = Weekly
+	-- F = Faction (Alliance/Horde)
+	-- e = Starts event
+	-- a = Autocomplete
+}
+
+function QuestKing.GetQuestTaggedTitle (questIndex, isBonus)
+	local questTitle, level, suggestedGroup, _, _, _, frequency, questID, startEvent = GetQuestLogTitle(questIndex)
+	local questType = GetQuestLogQuestType(questIndex)
+	-- local questTagID, questTag = GetQuestTagInfo(questID)
+
+	local levelString
+	local typeTag = knownTypesTag[questType]
+	local typeTagFull = knownTypesTagFull[questType]
+
+	if (typeTag == nil) then
+		typeTag = format("|cffff00ff(%d)|r", questType) -- Alert user to unknown tags
+	end
+
+	-- Add primary tags
+	if (questType == 1) and (suggestedGroup) and (suggestedGroup > 1) then
+		-- Group
+		if E.private.sle.skins.QuestKing.questTypes.group == "DEFAULT" then
+			levelString = format("%d%s%d", level, typeTag, suggestedGroup)
+		else
+			levelString = format("%d %s(%d)", level, typeTagFull, suggestedGroup)
+		end
+	elseif (questType == 1) and (suggestedGroup) and (suggestedGroup == 0) then
+		-- Group
+		if E.private.sle.skins.QuestKing.questTypes.group == "DEFAULT" then
+			levelString = format("%d%s", level, typeTag)
+		else
+			levelString = format("%d %s", level, typeTagFull)
+		end
+	elseif (questType == 102) then
+		-- Account
+		local factionGroup = GetQuestFactionGroup(questID)
+		if (factionGroup) then
+			levelString = format("%d%s", level, "F")
+		else
+			levelString = format("%d %s", level, typeTag)
+		end
+	elseif (questType == 62) or (questType == 88) or (questType == 89) then
+		if E.private.sle.skins.QuestKing.questTypes.raid == "DEFAULT" then
+			levelString = format("%d%s", level, typeTag)
+		else
+			levelString = format("%d %s", level, typeTagFull)
+		end
+	elseif (questType == 81) then
+		if E.private.sle.skins.QuestKing.questTypes.dungeon == "DEFAULT" then
+			levelString = format("%d%s", level, typeTag)
+		else
+			levelString = format("%d %s", level, typeTagFull)
+		end
+	elseif (questType == 85) then
+		if E.private.sle.skins.QuestKing.questTypes.heroic == "DEFAULT" then
+			levelString = format("%d%s", level, typeTag)
+		else
+			levelString = format("%d %s", level, typeTagFull)
+		end
+	elseif (questType == 83) then
+		if E.private.sle.skins.QuestKing.questTypes.legend == "DEFAULT" then
+			levelString = format("%d%s", level, typeTag)
+		else
+			levelString = format("%d %s", level, typeTagFull)
+		end
+	elseif (questType == 98) then
+		if E.private.sle.skins.QuestKing.questTypes.scenario == "DEFAULT" then
+			levelString = format("%d%s", level, typeTag)
+		else
+			levelString = format("%d %s", level, typeTagFull)
+		end
+	elseif (questType > 0) then
+		-- Other types
+		levelString = format("%d%s", level, typeTag)
+	else
+		-- Normal
+		levelString = tostring(level)
+	end
+
+	-- Extra tags
+	local hasIcon = false
+	local icon = ""
+	if (frequency == LE_QUEST_FREQUENCY_DAILY) then
+		if E.private.sle.skins.QuestKing.questTypes.daily == "DEFAULT" then
+			levelString = format("%sY", levelString)
+		elseif E.private.sle.skins.QuestKing.questTypes.daily == "FULL" then
+			levelString = format("%s "..DAILY, levelString)
+		else
+			hasIcon = true
+			icon = "|T"..QK.Icons["Daily"]..":14|t"
+		end
+	elseif (frequency == LE_QUEST_FREQUENCY_WEEKLY) then
+		if E.private.sle.skins.QuestKing.questTypes.weekly == "DEFAULT" then
+			levelString = format("%sW", levelString)
+		elseif E.private.sle.skins.QuestKing.questTypes.weekly == "FULL" then
+			levelString = format("%s "..WEEKLY, levelString)
+		else
+			hasIcon = true
+			icon = "|T"..QK.Icons["Weekly"]..":14|t"
+		end
+		-- levelString = format("%s Weekly", levelString)
+	end
+
+	if (startEvent) then
+		levelString = format("%se", levelString)
+	end
+
+	if (GetQuestLogIsAutoComplete(questIndex)) and (not isBonus) then
+		levelString = format("%sa", levelString)
+	end
+
+	-- Return
+	if (isBonus) then
+		questTitle = gsub(questTitle, BONUS_OBJECTIVE_BANNER..": ", "")
+		if hasIcon then
+			return format("%s[%s] %s", icon,  levelString, questTitle), level
+		else
+			return format("[%s] %s", levelString, questTitle), level
+		end
+	else
+		if hasIcon then
+			return format("%s[%s] %s", icon,  levelString, questTitle)
+		else
+			return format("[%s] %s", levelString, questTitle)
+		end
+	end
+end
+
+end
+
+T.tinsert(QK.Replaces, Replace)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/quests/questking/load_questking.xml b/ElvUI_SLE/modules/quests/questking/load_questking.xml
new file mode 100644
index 0000000..7949909
--- /dev/null
+++ b/ElvUI_SLE/modules/quests/questking/load_questking.xml
@@ -0,0 +1,14 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<Script file='questking.lua'/>
+	<Script file='core\util.lua'/>
+	<Script file='ui\rewardsframe.lua'/>
+	<Script file='ui\timerbar.lua'/>
+	<Script file='ui\progressbar.lua'/>
+	<Script file='ui\tracker.lua'/>
+	<Script file='buttons\quest.lua'/>
+	<Script file='buttons\scenario.lua'/>
+	<Script file='buttons\achievement.lua'/>
+	<Script file='buttons\challengetimer.lua'/>
+	<Script file='buttons\bonusobjective.lua'/>
+	<Script file='core\core.lua'/>
+</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/quests/questking/questking.lua b/ElvUI_SLE/modules/quests/questking/questking.lua
new file mode 100644
index 0000000..e9aef75
--- /dev/null
+++ b/ElvUI_SLE/modules/quests/questking/questking.lua
@@ -0,0 +1,35 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local QK = SLE:NewModule("QuestKingSkinner", "AceEvent-3.0")
+
+QK.Replaces = {}
+QK.Icons = {
+	["Achievement_small"] = [[Interface\AddOns\ElvUI_SLE\media\textures\Achievement_small]],
+	["Daily"] = [[Interface\AddOns\ElvUI_SLE\media\textures\Daily]],
+	["Factions"] = [[Interface\AddOns\ElvUI_SLE\media\textures\Factions]],
+	["Flightmaster"] = [[Interface\AddOns\ElvUI_SLE\media\textures\Flightmaster]],
+	["Legendary"] = [[Interface\AddOns\ElvUI_SLE\media\textures\Legendary]],
+	["LFG"] = [[Interface\LFGFRAME\BattlenetWorking0]],
+	["Portal_Blue"] = [[Interface\AddOns\ElvUI_SLE\media\textures\Portal_Blue]],
+	["Portal_Red"] = [[Interface\AddOns\ElvUI_SLE\media\textures\Portal_Red]],
+	["Quest"] = [[Interface\AddOns\ElvUI_SLE\media\textures\Quest]],
+	["Raid"] = [[Interface\LFGFRAME\UI-LFR-PORTRAIT]],
+	["Skull"] = [[Interface\AddOns\ElvUI_SLE\media\textures\Skull]],
+	["Skull_Event"] = [[Interface\AddOns\ElvUI_SLE\media\textures\Skull_Event]],
+	["Swords"] = [[Interface\AddOns\ElvUI_SLE\media\textures\Swords]],
+	["Swords_Event"] = [[Interface\AddOns\ElvUI_SLE\media\textures\Swords_Event]],
+	["Weekly"] = [[Interface\AddOns\ElvUI_SLE\media\textures\Weekly]],
+}
+
+local function StartReplacement()
+	if #QK.Replaces == 0 then E:Delay(1, function() StartReplacement() return end) end
+	for i = 1, #QK.Replaces do
+		QK.Replaces[i]()
+	end
+end
+
+function QK:Initialize()
+	if not E.private.sle.skins.QuestKing.enable or not SLE._Compatibility["QuestKing"] then return end
+	StartReplacement()
+end
+
+SLE:RegisterModule(QK:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/quests/questking/ui/progressbar.lua b/ElvUI_SLE/modules/quests/questking/ui/progressbar.lua
new file mode 100644
index 0000000..3e56afc
--- /dev/null
+++ b/ElvUI_SLE/modules/quests/questking/ui/progressbar.lua
@@ -0,0 +1,182 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local QK = SLE:GetModule("QuestKingSkinner")
+local _G = _G
+
+if not SLE._Compatibility["QuestKing"] then return end
+
+local LSM = LibStub("LibSharedMedia-3.0")
+local classColor = RAID_CLASS_COLORS[E.myclass]
+local progressBarPool = {}
+QK.numProgressBars = 0
+local freeProgressBar
+
+local function Replace()
+	local QuestKing = _G["QuestKing"]
+	local opt = QuestKing.options
+	local opt_buttonWidth = opt.buttonWidth
+	local opt_lineHeight = opt.lineHeight
+	local opt_itemButtonScale = opt.itemButtonScale
+	local opt_font = opt.font
+	local opt_fontSize = opt.fontSize
+	local opt_fontStyle = opt.fontStyle
+
+	local function SetProgressBarsColor(progressBar)
+		local COLOR
+		if E.private.sle.skins.objectiveTracker.class then
+			COLOR = classColor
+		else
+			COLOR = E.private.sle.skins.objectiveTracker.color
+		end
+		progressBar:SetStatusBarColor(COLOR.r, COLOR.g, COLOR.b)
+	end
+
+	function freeProgressBar (self)
+		self:Hide()
+		self:ClearAllPoints()
+
+		self.baseLine.progressBar = nil
+		self.baseLine = nil
+		self.baseButton = nil
+
+		self._lastPercent = nil
+
+		T.tinsert(progressBarPool, self)
+	end
+
+	function QuestKing.WatchButton:AddProgressBar(duration, startTime)
+		local line = self:AddLine()
+		local progressBar = line.progressBar
+
+		if (not progressBar) then
+			if (#progressBarPool > 0) then
+				progressBar = tremove(progressBarPool)
+			else
+				QK.numProgressBars = QK.numProgressBars + 1
+
+				progressBar = CreateFrame("StatusBar", "QuestKing_ProgressBar"..QK.numProgressBars, QuestKing.Tracker)
+				progressBar:SetStatusBarTexture(LSM:Fetch('statusbar', E.private.sle.skins.objectiveTracker.texture))
+				progressBar:GetStatusBarTexture():SetHorizTile(false)
+				SetProgressBarsColor(progressBar)
+				progressBar:SetMinMaxValues(0, 100)
+				progressBar:SetValue(100)
+				progressBar:SetWidth(opt_buttonWidth - 36)
+				progressBar:SetHeight(15)
+				progressBar:CreateBackdrop("Transparent")
+				progressBar.sle_skinned = true
+
+				local text = progressBar:CreateFontString(nil, "OVERLAY")
+				text:SetFont(opt_font, opt_fontSize - 1, opt_fontStyle)
+				text:SetJustifyH("CENTER")
+				text:SetJustifyV("CENTER")
+
+				text:SetPoint("TOPLEFT", progressBar, "TOPLEFT", 0, 0)
+				text:SetPoint("BOTTOMRIGHT", progressBar, "BOTTOMRIGHT", 0, 2)
+
+				text:SetTextColor(1, 1, 1)
+				text:SetShadowOffset(1, -1)
+				text:SetShadowColor(0, 0, 0, 1)
+				text:SetWordWrap(false)
+				text:SetVertexColor(0.8, 0.8, 0.8)
+				text:SetText("0%")
+				progressBar.text = text
+
+				local glow = progressBar:CreateTexture(nil, "OVERLAY")
+				glow:SetPoint("RIGHT", progressBar, "LEFT", 0, 0)
+				glow:SetWidth(5)
+				glow:SetHeight(progressBar:GetHeight() - 4)
+				glow:SetTexture([[Interface\AddOns\QuestKing\textures\Full-Line-Glow-White]])
+				glow:SetVertexColor(0.6, 0.8, 1, 0)
+				glow:SetBlendMode("ADD")
+				progressBar.glow = glow
+
+				local animGroup = glow:CreateAnimationGroup()
+				local a0 = animGroup:CreateAnimation("Alpha")
+					a0:SetStartDelay(0); a0:SetChange(1); a0:SetDuration(0.25); a0:SetOrder(1);
+				local a1 = animGroup:CreateAnimation("Alpha")
+					a1:SetStartDelay(0.3); a1:SetChange(-1); a1:SetDuration(0.2); a1:SetOrder(1);
+				glow.animGroup = animGroup
+
+				local topLineBurst = progressBar:CreateTexture(nil, "OVERLAY")
+				topLineBurst:SetPoint("CENTER", glow, "TOP", -3, 0)
+				topLineBurst:SetWidth(progressBar:GetWidth() * 0.6)
+				topLineBurst:SetHeight(8)
+				topLineBurst:SetTexture([[Interface\QuestFrame\ObjectiveTracker]])
+				topLineBurst:SetTexCoord(0.1640625, 0.33203125, 0.66796875, 0.74609375)
+				topLineBurst:SetVertexColor(0.6, 0.8, 1, 0)
+				topLineBurst:SetBlendMode("ADD")
+				progressBar.topLineBurst = topLineBurst
+
+				local animGroup = topLineBurst:CreateAnimationGroup()
+				local a0 = animGroup:CreateAnimation("Alpha")
+					a0:SetStartDelay(0); a0:SetChange(1); a0:SetDuration(0.25); a0:SetOrder(1);
+				local a1 = animGroup:CreateAnimation("Alpha")
+					a1:SetStartDelay(0.3); a1:SetChange(-1); a1:SetDuration(0.2); a1:SetOrder(1);
+				local a2 = animGroup:CreateAnimation("Translation")
+					a2:SetStartDelay(0); a2:SetOffset(5, 0); a2:SetDuration(0.25); a2:SetOrder(1);
+				topLineBurst.animGroup = animGroup
+
+				local bottomLineBurst = progressBar:CreateTexture(nil, "OVERLAY")
+				bottomLineBurst:SetPoint("CENTER", glow, "BOTTOM", -3, 0)
+				bottomLineBurst:SetWidth(progressBar:GetWidth() * 0.6)
+				bottomLineBurst:SetHeight(8)
+				bottomLineBurst:SetTexture([[Interface\QuestFrame\ObjectiveTracker]])
+				bottomLineBurst:SetTexCoord(0.1640625, 0.33203125, 0.66796875, 0.74609375)
+				bottomLineBurst:SetVertexColor(0.6, 0.8, 1, 0)
+				bottomLineBurst:SetBlendMode("ADD")
+				progressBar.bottomLineBurst = bottomLineBurst
+
+				local animGroup = bottomLineBurst:CreateAnimationGroup()
+				local a0 = animGroup:CreateAnimation("Alpha")
+					a0:SetStartDelay(0); a0:SetChange(1); a0:SetDuration(0.25); a0:SetOrder(1);
+				local a1 = animGroup:CreateAnimation("Alpha")
+					a1:SetStartDelay(0.3); a1:SetChange(-1); a1:SetDuration(0.2); a1:SetOrder(1);
+				local a2 = animGroup:CreateAnimation("Translation")
+					a2:SetStartDelay(0); a2:SetOffset(5, 0); a2:SetDuration(0.25); a2:SetOrder(1);
+				bottomLineBurst.animGroup = animGroup
+
+				local pulse = progressBar:CreateTexture(nil, "OVERLAY")
+				pulse:SetAllPoints(progressBar)
+				pulse:SetTexture([[Interface\QuestFrame\UI-QuestLogTitleHighlight]])
+				pulse:SetVertexColor(0.6, 0.8, 1, 0)
+				pulse:SetBlendMode("ADD")
+				progressBar.pulse = pulse
+
+				local animGroup = pulse:CreateAnimationGroup()
+				local a1 = animGroup:CreateAnimation("Alpha")
+					a1:SetStartDelay(0); a1:SetDuration(0.25); a1:SetChange(1); a1:SetOrder(1);
+				local a2 = animGroup:CreateAnimation("Alpha")
+					a2:SetStartDelay(0.3); a2:SetDuration(0.2); a2:SetChange(-1); a2:SetOrder(1);
+				pulse.animGroup = animGroup
+
+				progressBar.Free = freeProgressBar
+				progressBar.SetPercent = setPercent
+			end
+
+			line.progressBar = progressBar
+			line.progressBarText = progressBarText
+
+			progressBar.baseButton = self
+			progressBar.baseLine = line
+
+			progressBar._lastPercent = nil
+
+			progressBar:SetPoint("TOPLEFT", line, "TOPLEFT", 16, -3)
+			progressBar:Show()
+		end
+
+		return progressBar
+	end
+
+	for i = 1, 3 do
+		local progressBar = _G["QuestKing_ProgressBar"..i]
+		if progressBar and not progressBar.sle_skinned then
+			progressBar:StripTextures()
+			progressBar:SetStatusBarTexture(LSM:Fetch('statusbar', E.private.sle.skins.objectiveTracker.texture))
+			progressBar:SetWidth(opt_buttonWidth - 36)
+			SetProgressBarsColor(progressBar)
+			progressBar:CreateBackdrop("Transparent")
+		end
+	end
+end
+
+T.tinsert(QK.Replaces, Replace)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/quests/questking/ui/rewardsframe.lua b/ElvUI_SLE/modules/quests/questking/ui/rewardsframe.lua
new file mode 100644
index 0000000..6472de8
--- /dev/null
+++ b/ElvUI_SLE/modules/quests/questking/ui/rewardsframe.lua
@@ -0,0 +1,191 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local QK = SLE:GetModule("QuestKingSkinner")
+local _G = _G
+
+if not SLE._Compatibility["QuestKing"] then return end
+
+local function Replace()
+	local QuestKing = _G["QuestKing"]
+	local rewardQueue = {}
+	local animatingData
+
+	function QuestKing:AddReward (button, questID, xp, money)
+		local data = {}
+		data.button = button
+		data.questID = questID
+
+		-- save all the rewards
+		data.rewards = {}
+
+		-- xp
+		if ((not xp) and (questID)) then
+			xp = GetQuestLogRewardXP(questID)
+		end
+
+		if ((xp) and (xp > 0) and (UnitLevel("player") < MAX_PLAYER_LEVEL)) then
+			local t = {}
+			t.label = xp
+			t.texture = "Interface\\Icons\\XP_Icon"
+			t.count = 0
+			t.font = "NumberFontNormal"
+			tinsert(data.rewards, t)
+		end
+
+		if (questID) then
+			-- currencies
+			local numCurrencies = GetNumQuestLogRewardCurrencies(questID)
+			for i = 1, numCurrencies do
+				local name, texture, count = GetQuestLogRewardCurrencyInfo(i, questID)
+				local t = {}
+				t.label = name
+				t.texture = texture
+				t.count = count
+				t.font = "GameFontHighlightSmall"
+				tinsert(data.rewards, t)
+			end
+
+			-- items
+			local numItems = GetNumQuestLogRewards(questID)
+			for i = 1, numItems do
+				local name, texture, count, quality, isUsable = GetQuestLogRewardInfo(i, questID)
+				local t = { }
+				t.label = name
+				t.texture = texture
+				t.count = count
+				t.font = "GameFontHighlightSmall"
+				tinsert(data.rewards, t)
+			end
+		end
+
+		-- money
+		if ((not money) and (questID)) then
+			money = GetQuestLogRewardMoney(questID)
+		end
+		if (money) and (money > 0) then
+			local t = {}
+			t.label = GetMoneyString(money)
+			t.texture = "Interface\\Icons\\inv_misc_coin_01"
+			t.count = 0
+			t.font = "GameFontHighlight"
+			tinsert(data.rewards, t)
+		end
+
+		-- try to play it
+		if (#data.rewards > 0) then
+			tinsert(rewardQueue, data)
+			QuestKing:AnimateReward()
+		elseif (questID) then
+			C_Timer.After(10, function ()
+				QuestKing:ClearDummyTask(questID)
+				QuestKing:UpdateTracker()
+			end)
+		end
+	end
+
+	local function IsFramePositionedLeft(frame)
+		local x = frame:GetCenter()
+		local screenWidth = GetScreenWidth()
+		local screenHeight = GetScreenHeight()
+		local positionedLeft = false
+
+		if x and x < (screenWidth / 2) then
+			positionedLeft = true;
+		end
+
+		return positionedLeft;
+	end
+
+	function QuestKing:AnimateReward (block)
+		local rewardsFrame = QuestKing_RewardsFrame
+
+		if (rewardsFrame.Anim:IsPlaying()) then
+			return
+		end
+
+		if (#rewardQueue == 0) then
+			rewardsFrame:Hide()
+			return
+		end
+
+		local data = tremove(rewardQueue, 1)
+		animatingData = data
+
+		local button = data.button
+		if ((not button) or (not button:IsVisible())) then
+			button = QuestKing.Tracker
+			data.button = button
+		end
+
+		-- rewardsFrame:SetParent(button)
+		rewardsFrame:ClearAllPoints()
+		-- rewardsFrame:SetPoint("TOPRIGHT", button, "TOPLEFT", 10, -4)
+		local scale = QuestKing.Tracker:GetScale()
+
+		if E.db.general.bonusObjectivePosition == "RIGHT" or (E.db.general.bonusObjectivePosition == "AUTO" and IsFramePositionedLeft(ObjectiveTrackerFrame)) then
+			rewardsFrame:SetPoint("TOPLEFT", UIParent, "BOTTOMLEFT", button:GetRight() * scale - 10, button:GetTop() * scale + 0)
+		else
+			rewardsFrame:SetPoint("TOPRIGHT", UIParent, "BOTTOMLEFT", button:GetLeft() * scale + 10, button:GetTop() * scale + 0)
+		end
+		rewardsFrame:Show()
+
+		local numRewards = #data.rewards
+		local contentsHeight = 12 + numRewards * 36
+
+		rewardsFrame.Anim.RewardsBottomAnim:SetOffset(0, -contentsHeight)
+		rewardsFrame.Anim.RewardsShadowAnim:SetToScale(0.8, contentsHeight / 16)
+		rewardsFrame.Anim:Play()
+
+		PlaySoundKitID(45142) --UI_BonusEventSystemVignettes
+
+		-- configure reward frames
+		for i = 1, numRewards do
+			local rewardItem = rewardsFrame.Rewards[i]
+			if (not rewardItem) then
+				rewardItem = CreateFrame("FRAME", nil, rewardsFrame, "QuestKing_RewardTemplate")
+				rewardItem:SetPoint("TOPLEFT", rewardsFrame.Rewards[i-1], "BOTTOMLEFT", 0, -4)
+			end
+
+			local rewardData = data.rewards[i]
+			if (rewardData.count > 1) then
+				rewardItem.Count:Show()
+				rewardItem.Count:SetText(rewardData.count)
+			else
+				rewardItem.Count:Hide()
+			end
+
+			rewardItem.Label:SetFontObject(rewardData.font)
+			rewardItem.Label:SetText(rewardData.label)
+			rewardItem.ItemIcon:SetTexture(rewardData.texture)
+			rewardItem:Show()
+
+			if (rewardItem.Anim:IsPlaying()) then
+				rewardItem.Anim:Stop()
+			end
+
+			rewardItem.Anim:Play()
+		end
+
+		-- hide unused reward items
+		for i = numRewards + 1, #rewardsFrame.Rewards do
+			rewardsFrame.Rewards[i]:Hide()
+		end
+	end
+
+	function QuestKing_OnAnimateRewardDone()
+		local completedData = animatingData
+		if (completedData.questID) then
+			local questID = completedData.questID
+			C_Timer.After(3, function ()
+				QuestKing:ClearDummyTask(questID)
+				QuestKing:UpdateTracker()
+			end)
+		end
+
+		animatingData = nil
+		QuestKing:AnimateReward()
+	end
+
+	QuestKing_RewardsFrame.Anim:SetScript("OnFinished", QuestKing_OnAnimateRewardDone)
+end
+
+T.tinsert(QK.Replaces, Replace)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/quests/questking/ui/timerbar.lua b/ElvUI_SLE/modules/quests/questking/ui/timerbar.lua
new file mode 100644
index 0000000..7226b7a
--- /dev/null
+++ b/ElvUI_SLE/modules/quests/questking/ui/timerbar.lua
@@ -0,0 +1,124 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local QK = SLE:GetModule("QuestKingSkinner")
+local _G = _G
+
+if not SLE._Compatibility["QuestKing"] then return end
+
+local LSM = LibStub("LibSharedMedia-3.0")
+local classColor = RAID_CLASS_COLORS[E.myclass]
+
+-- local functions
+local freeTimerBar
+local timerBarPool = {}
+local numTimerBars = 0
+local timerBar_OnUpdate
+
+local function Replace()
+	local QuestKing = _G["QuestKing"]
+	local GetTimeStringFromSecondsShort = QuestKing.GetTimeStringFromSecondsShort
+	local opt = QuestKing.options
+	local opt_buttonWidth = opt.buttonWidth
+	local opt_lineHeight = opt.lineHeight
+	local opt_itemButtonScale = opt.itemButtonScale
+	local opt_font = opt.font
+	local opt_fontSize = opt.fontSize
+	local opt_fontStyle = opt.fontStyle
+
+	local function SetProgressBarsColor(timerBar)
+		local COLOR
+		if E.private.sle.skins.objectiveTracker.class then
+			COLOR = classColor
+		else
+			COLOR = E.private.sle.skins.objectiveTracker.color
+		end
+		timerBar:SetStatusBarColor(COLOR.r, COLOR.g, COLOR.b)
+	end
+
+	function freeTimerBar (self)
+		self:Hide()
+		self:ClearAllPoints()
+
+		self.baseLine.timerBar = nil
+		self.baseLine = nil
+		self.baseButton = nil
+
+		tinsert(timerBarPool, self)
+	end
+
+	function timerBar_OnUpdate(self, elapsed)
+		local timeNow = GetTime()
+		local timeRemaining = self.duration - (timeNow - self.startTime)
+		self:SetValue(timeRemaining)
+
+		if (timeRemaining < 0) then
+			-- hold at 0 for a moment
+			if (timeRemaining > -0.5) then
+				timeRemaining = 0
+			else
+				QuestKing:UpdateTracker()
+				return
+			end
+		end
+
+		self.text:SetText(GetTimeStringFromSecondsShort(timeRemaining))
+		-- self.text:SetTextColor(ObjectiveTrackerTimerBar_GetTextColor(self.duration, self.duration - timeRemaining));
+	end
+
+	function QuestKing.WatchButton:AddTimerBar (duration, startTime)
+		local line = self:AddLine()
+		local timerBar = line.timerBar
+
+		if (not timerBar) then
+			if (#timerBarPool > 0) then
+				timerBar = tremove(timerBarPool)
+			else
+				numTimerBars = numTimerBars + 1
+
+				timerBar = CreateFrame("StatusBar", "QuestKing_TimerBar"..numTimerBars, QuestKing.Tracker)
+				timerBar:SetStatusBarTexture(LSM:Fetch('statusbar', E.private.sle.skins.objectiveTracker.texture))
+				timerBar:GetStatusBarTexture():SetHorizTile(false)
+				SetProgressBarsColor(timerBar)
+				timerBar:SetMinMaxValues(0, 100)
+				timerBar:SetValue(100)
+				timerBar:SetWidth(opt_buttonWidth - 36)
+				timerBar:SetHeight(15)
+				timerBar:CreateBackdrop("Transparent")
+				-- timerBar.sle_skinned = true
+
+				local text = timerBar:CreateFontString(nil, "OVERLAY")
+				text:SetFont(opt_font, opt_fontSize, opt_fontStyle)
+				text:SetJustifyH("CENTER")
+				text:SetJustifyV("CENTER")
+				text:SetAllPoints(true)
+				text:SetTextColor(1, 1, 1)
+				text:SetShadowOffset(1, -1)
+				text:SetShadowColor(0, 0, 0, 1)
+				text:SetWordWrap(false)
+				text:SetText("0:00")
+				timerBar.text = text
+
+				timerBar:SetScript("OnUpdate", timerBar_OnUpdate)
+
+				timerBar.Free = freeTimerBar
+			end
+
+			line.timerBar = timerBar
+			line.timerBarText = timerBarText
+
+			timerBar.baseButton = self
+			timerBar.baseLine = line
+
+			timerBar:SetPoint("TOPLEFT", line, "TOPLEFT", 16, -3)
+			timerBar:Show()
+		end
+
+		timerBar:SetMinMaxValues(0, duration)
+		timerBar.duration = duration
+		timerBar.startTime = startTime
+		timerBar.block = block
+
+		return timerBar
+	end
+end
+
+T.tinsert(QK.Replaces, Replace)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/quests/questking/ui/tracker.lua b/ElvUI_SLE/modules/quests/questking/ui/tracker.lua
new file mode 100644
index 0000000..0a9ef99
--- /dev/null
+++ b/ElvUI_SLE/modules/quests/questking/ui/tracker.lua
@@ -0,0 +1,29 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local QK = SLE:GetModule("QuestKingSkinner")
+local _G = _G
+
+if not SLE._Compatibility["QuestKing"] then return end
+
+local function Replace()
+	local QuestKing = _G["QuestKing"]
+	local Tracker = QuestKing.Tracker
+	function Tracker:ToggleDrag()
+		DEFAULT_CHAT_FRAME:AddMessage(T.format("|cff99ccffQuestKing|cff6090ff:|r This option is no longer available"))
+		return true
+	end
+
+	function Tracker:CheckDrag()
+		self.titlebarText2:Hide()
+		self:EnableMouse(false)
+		self:SetMovable(false)
+		self:RegisterForDrag()
+		self:SetScript("OnDragStart", nil)
+		self:SetScript("OnDragStop", nil)
+	end
+
+	Tracker.titlebar:ClearAllPoints()
+	Tracker.titlebar:SetPoint("TOP", ObjectiveFrameHolder)
+	Tracker:CheckDrag()
+end
+
+T.tinsert(QK.Replaces, Replace)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/quests/questking/ui/watchbutton.lua b/ElvUI_SLE/modules/quests/questking/ui/watchbutton.lua
new file mode 100644
index 0000000..e69de29
diff --git a/ElvUI_SLE/modules/quests/quests.lua b/ElvUI_SLE/modules/quests/quests.lua
new file mode 100644
index 0000000..06ac32c
--- /dev/null
+++ b/ElvUI_SLE/modules/quests/quests.lua
@@ -0,0 +1,107 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local Q = SLE:NewModule("Quests", "AceEvent-3.0")
+local B = LibStub("LibBabble-SubZone-3.0")
+local BL = B:GetLookupTable()
+local ObjectiveTracker_Expand, ObjectiveTracker_Collapse = ObjectiveTracker_Expand, ObjectiveTracker_Collapse
+local statedriver = {
+	["FULL"] = function(frame)
+		ObjectiveTracker_Expand()
+		frame:Show()
+	end,
+	["COLLAPSED"] = function(frame)
+		ObjectiveTracker_Collapse()
+		frame:Show()
+	end,
+	["HIDE"] = function(frame)
+		frame:Hide()
+	end,
+}
+
+function Q:ChangeState(event)
+	if T.InCombatLockdown() then self:RegisterEvent("PLAYER_REGEN_ENABLED", "ChangeState") return end
+	if event == "PLAYER_REGEN_ENABLED" then self:UnregisterEvent("PLAYER_REGEN_ENABLED") end
+	if not Q.db then return end
+	if not Q.db.visibility then return end
+
+	if T.GetZoneText() == BL.Frostwall or T.GetZoneText() == BL.Lunarfall then
+		statedriver[Q.db.visibility.garrison](Q.frame)
+	elseif IsResting() then
+		statedriver[Q.db.visibility.rested](Q.frame)
+	else
+		local instance, instanceType = T.IsInInstance()
+		if instance then
+			if instanceType == 'pvp' then
+				statedriver[Q.db.visibility.bg](Q.frame)
+			elseif instanceType == 'arena' then
+				statedriver[Q.db.visibility.arena](Q.frame)
+			elseif instanceType == 'party' then
+				statedriver[Q.db.visibility.dungeon](Q.frame)
+			elseif instanceType == 'scenario' then
+				statedriver[Q.db.visibility.scenario](Q.frame)
+			elseif instanceType == 'raid' then
+				statedriver[Q.db.visibility.raid](Q.frame)
+			end
+		else
+			statedriver["FULL"](Q.frame)
+		end
+
+	end
+end
+
+function Q:SelectQuestReward(index)
+	local frame = QuestInfoFrame.rewardsFrame;
+
+	local button = QuestInfo_GetRewardButton(frame, index)
+	if (button.type == "choice") then
+		QuestInfoItemHighlight:ClearAllPoints()
+		QuestInfoItemHighlight:SetOutside(button.Icon)
+
+		if E.private.skins.blizzard.enable ~= true or E.private.skins.blizzard.quest ~= true then
+			QuestInfoItemHighlight:SetPoint("TOPLEFT", button, "TOPLEFT", -8, 7);
+		else
+			button.Name:SetTextColor(1, 1, 0)
+		end
+		QuestInfoItemHighlight:Show()
+
+		-- set choice
+		QuestInfoFrame.itemChoice = button:GetID()
+	end
+end
+
+function Q:QUEST_COMPLETE()
+	if not Q.db.autoReward then return end
+	local choice, highest = 1, 0
+	local num = GetNumQuestChoices()
+
+	if num <= 0 then return end -- no choices
+
+	for index = 1, num do
+		local link = GetQuestItemLink("choice", index);
+		if link then
+			local price = select(11, GetItemInfo(link))
+			if price and price > highest then
+				highest = price
+				choice = index
+			end
+		end
+	end
+
+	Q:SelectQuestReward(choice)
+end
+
+function Q:Initialize()
+	if not SLE.initialized then return end
+	Q.db = E.db.sle.quests
+	Q.frame = ObjectiveTrackerFrame
+	self:RegisterEvent("PLAYER_ENTERING_WORLD", "ChangeState")
+	self:RegisterEvent("PLAYER_UPDATE_RESTING", "ChangeState")
+
+	self:RegisterEvent("QUEST_COMPLETE");
+
+	function Q:ForUpdateAll()
+		Q.db = E.db.sle.quests
+		Q:ChangeState()
+	end
+end
+
+SLE:RegisterModule(Q:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/raidmarkers.lua b/ElvUI_SLE/modules/raidmarkers.lua
index d3e186d..def9615 100644
--- a/ElvUI_SLE/modules/raidmarkers.lua
+++ b/ElvUI_SLE/modules/raidmarkers.lua
@@ -1,9 +1,27 @@
-local E, L, V, P, G = unpack(ElvUI);
-local RM = E:GetModule('SLE_RaidMarkers');
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local RM = SLE:NewModule('RaidMarkers');
+local _G = _G
+local GameTooltip = GameTooltip
+
+RM.VisibilityStates = {
+	["DEFAULT"] = "[noexists, nogroup] hide; show",
+	["INPARTY"] = "[group] show; [petbattle] hide; hide",
+	["ALWAYS"] = "[petbattle] hide; show",
+}

-BINDING_HEADER_RAIDFLARE = "|cff1784d1Shadow & Light|r"
+local layouts = {
+	[1] = {RT = 1, WM = 5}, -- Star
+	[2] = {RT = 2, WM = 6}, -- Circle
+	[3] = {RT = 3, WM = 3}, -- Diamond
+	[4] = {RT = 4, WM = 2}, -- Triangle
+	[5] = {RT = 5, WM = 7}, -- Moon
+	[6] = {RT = 6, WM = 1}, -- Square
+	[7] = {RT = 7, WM = 4}, -- Cross
+	[8] = {RT = 8, WM = 8}, -- Skull
+	[9] = {RT = 0, WM = 0}, -- clear target/worldmarker
+}

-local function make(name, command, description)
+function RM:Make(name, command, description)
 	_G["BINDING_NAME_CLICK "..name..":LeftButton"] = description
 	local btn = CreateFrame("Button", name, nil, "SecureActionButtonTemplate")
 	btn:SetAttribute("type", "macro")
@@ -11,45 +29,22 @@ local function make(name, command, description)
 	btn:RegisterForClicks("AnyDown")
 end

-make("RaidFlare1", "/clearworldmarker 1\n/worldmarker 1", "Blue Flare")
-make("RaidFlare2", "/clearworldmarker 2\n/worldmarker 2", "Green Flare")
-make("RaidFlare3", "/clearworldmarker 3\n/worldmarker 3", "Purple Flare")
-make("RaidFlare4", "/clearworldmarker 4\n/worldmarker 4", "Red Flare")
-make("RaidFlare5", "/clearworldmarker 5\n/worldmarker 5", "Yellow Flare")
-make("RaidFlare6", "/clearworldmarker 6\n/worldmarker 6", "Orange Flare")
-make("RaidFlare7", "/clearworldmarker 7\n/worldmarker 7", "White Flare")
-make("RaidFlare8", "/clearworldmarker 8\n/worldmarker 8", "Skull Flare")
-
-make("ClearRaidFlares", "/clearworldmarker 0", "Clear All Flares")
-
-local layouts = {
-	[1] = {RT = 1, WM = 5},	-- Star
-	[2] = {RT = 2, WM = 6},	-- Circle
-	[3] = {RT = 3, WM = 3},	-- Diamond
-	[4] = {RT = 4, WM = 2},	-- Triangle
-	[5] = {RT = 5, WM = 7},	-- Moon
-	[6] = {RT = 6, WM = 1},	-- Square
-	[7] = {RT = 7, WM = 4},	-- Cross
-	[8] = {RT = 8, WM = 8},	-- Skull
-	[9] = {RT = 0, WM = 0},	-- clear target/worldmarker
-}
-
 function RM:CreateButtons()
-	for k, layout in ipairs(layouts) do
-		local button = CreateFrame("Button", ("RaidMarkerBarButton%d"):format(k), self.frame, "SecureActionButtonTemplate")
-		button:SetHeight(self.db.buttonSize)
-		button:SetWidth(self.db.buttonSize)
+	for k, layout in T.ipairs(layouts) do
+		local button = CreateFrame("Button", T.format("RaidMarkerBarButton%d", k), RM.frame, "SecureActionButtonTemplate")
+		button:SetHeight(E.db.sle.raidmarkers.buttonSize)
+		button:SetWidth(E.db.sle.raidmarkers.buttonSize)
 		button:SetTemplate('Transparent')

 		local image = button:CreateTexture(nil, "ARTWORK")
 		image:SetAllPoints()
-		image:SetTexture(k == 9 and "Interface\\BUTTONS\\UI-GroupLoot-Pass-Up" or ("Interface\\TargetingFrame\\UI-RaidTargetingIcon_%d"):format(k))
+		image:SetTexture(k == 9 and "Interface\\BUTTONS\\UI-GroupLoot-Pass-Up" or T.format("Interface\\TargetingFrame\\UI-RaidTargetingIcon_%d", k))

 		local target, worldmarker = layout.RT, layout.WM

 		if target then
 			button:SetAttribute("type1", "macro")
-			button:SetAttribute("macrotext1", ("/tm %d"):format(k == 9 and 0 or k))
+			button:SetAttribute("macrotext1", T.format("/tm %d", k == 9 and 0 or k))
 		end

 		button:RegisterForClicks("AnyDown")
@@ -67,42 +62,41 @@ function RM:UpdateWorldMarkersAndTooltips()
 				self:SetBackdropBorderColor(.7, .7, 0)
 				GameTooltip:SetOwner(self, "ANCHOR_BOTTOM")
 				GameTooltip:SetText(L["Raid Markers"])
-				GameTooltip:AddLine(k == 9 and L["Click to clear the mark."] or L["Click to mark the target."], 1, 1, 1)
+				GameTooltip:AddLine(i == 9 and L["Click to clear the mark."] or L["Click to mark the target."], 1, 1, 1)
 				GameTooltip:Show()
 			end)
 		else
-			local modifier = self.db.modifier or "shift-"
-			button:SetAttribute(("%stype1"):format(modifier), "macro")
+			local modifier = E.db.sle.raidmarkers.modifier or "shift-"
+			button:SetAttribute(T.format("%stype1", modifier), "macro")
 			button.modifier = modifier
-			button:SetAttribute(("%smacrotext1"):format(modifier), worldmarker == 0 and "/cwm all" or ("/cwm %d\n/wm %d"):format(worldmarker, worldmarker))
+			button:SetAttribute(T.format("%smacrotext1", modifier), worldmarker == 0 and "/cwm all" or T.format("/cwm %d\n/wm %d", worldmarker, worldmarker))

 			button:SetScript("OnEnter", function(self)
 				self:SetBackdropBorderColor(.7, .7, 0)
 				GameTooltip:SetOwner(self, "ANCHOR_BOTTOM")
 				GameTooltip:SetText(L["Raid Markers"])
-				GameTooltip:AddLine(k == 9 and ("%s\n%s"):format(L["Click to clear the mark."], (L["%sClick to remove all worldmarkers."]):format(button.modifier:upper()))
-					or ("%s\n%s"):format(L["Click to mark the target."], (L["%sClick to place a worldmarker."]):format(button.modifier:upper())), 1, 1, 1)
+				GameTooltip:AddLine(i == 9 and T.format("%s\n%s", L["Click to clear the mark."], T.format(L["%sClick to remove all worldmarkers."], button.modifier:upper()))
+					or T.format("%s\n%s", L["Click to mark the target."], T.format(L["%sClick to place a worldmarker."], button.modifier:upper())), 1, 1, 1)
 				GameTooltip:Show()
-			end)
+			end)
 		end

 		button:SetScript("OnLeave", function(self)
 			self:SetBackdropBorderColor(0, 0, 0)
 			GameTooltip:Hide()
-		end)
+		end)
 	end
 end

 function RM:UpdateBar(update)
-	if update then self.db = E.db.sle.raidmarkers end
 	local height, width

-	if self.db.orientation == "VERTICAL" then
-		width = self.db.buttonSize + 4
-		height = (self.db.buttonSize * 9) + (self.db.spacing * 8) + 4
+	if E.db.sle.raidmarkers.orientation == "VERTICAL" then
+		width = E.db.sle.raidmarkers.buttonSize + 4
+		height = (E.db.sle.raidmarkers.buttonSize * 9) + (E.db.sle.raidmarkers.spacing * 8) + 4
 	else
-		width = (self.db.buttonSize * 9) + (self.db.spacing * 8) + 4
-		height = self.db.buttonSize + 4
+		width = (E.db.sle.raidmarkers.buttonSize * 9) + (E.db.sle.raidmarkers.spacing * 8) + 4
+		height = E.db.sle.raidmarkers.buttonSize + 4
 	end

 	self.frame:SetWidth(width)
@@ -113,50 +107,65 @@ function RM:UpdateBar(update)
 		local prev = self.frame.buttons[i + 1]
 		button:ClearAllPoints()

-		button:SetWidth(self.db.buttonSize)
-		button:SetHeight(self.db.buttonSize)
+		button:SetWidth(E.db.sle.raidmarkers.buttonSize)
+		button:SetHeight(E.db.sle.raidmarkers.buttonSize)

-		if self.db.orientation == "VERTICAL" then
-			head = self.db.reverse and "BOTTOM" or "TOP"
-			tail = self.db.reverse and "TOP" or "BOTTOM"
+		if E.db.sle.raidmarkers.orientation == "VERTICAL" then
+			head = E.db.sle.raidmarkers.reverse and "BOTTOM" or "TOP"
+			tail = E.db.sle.raidmarkers.reverse and "TOP" or "BOTTOM"
 			if i == 9 then
-				button:SetPoint(head, 0, (self.db.reverse and 2 or -2))
+				button:SetPoint(head, 0, (E.db.sle.raidmarkers.reverse and 2 or -2))
 			else
-				button:SetPoint(head, prev, tail, 0, self.db.spacing*(self.db.reverse and 1 or -1))
+				button:SetPoint(head, prev, tail, 0, E.db.sle.raidmarkers.spacing*(E.db.sle.raidmarkers.reverse and 1 or -1))
 			end
 		else
-			head = self.db.reverse and "RIGHT" or "LEFT"
-			tail = self.db.reverse and "LEFT" or "RIGHT"
+			head = E.db.sle.raidmarkers.reverse and "RIGHT" or "LEFT"
+			tail = E.db.sle.raidmarkers.reverse and "LEFT" or "RIGHT"
 			if i == 9 then
-				button:SetPoint(head, (self.db.reverse and -2 or 2), 0)
+				button:SetPoint(head, (E.db.sle.raidmarkers.reverse and -2 or 2), 0)
 			else
-				button:SetPoint(head, prev, tail, self.db.spacing*(self.db.reverse and -1 or 1), 0)
+				button:SetPoint(head, prev, tail, E.db.sle.raidmarkers.spacing*(E.db.sle.raidmarkers.reverse and -1 or 1), 0)
 			end
 		end
 	end

-	if self.db.enable then self.frame:Show() else self.frame:Hide() end
+	if E.db.sle.raidmarkers.enable then self.frame:Show() else self.frame:Hide() end
 end

-function RM:ToggleSettings()
-	if self.db.enable then
-		RegisterStateDriver(self.frame, "visibility", self.db.visibility == 'DEFAULT' and '[noexists, nogroup] hide; show' or self.db.visibility == 'ALWAYS' and '[petbattle] hide; show' or self.db.visibility == 'CUSTOM' and self.db.customVisibility or '[group] show; [petbattle] hide; hide')
+function RM:Visibility()
+	local db = E.db.sle.raidmarkers
+	if db.enable then
+		-- RegisterStateDriver(self.frame, "visibility", E.db.sle.raidmarkers.visibility == 'DEFAULT' and '[noexists, nogroup] hide; show' or E.db.sle.raidmarkers.visibility == 'ALWAYS' and '[petbattle] hide; show' or E.db.sle.raidmarkers.visibility == 'CUSTOM' and E.db.sle.raidmarkers.customVisibility or '[group] show; [petbattle] hide; hide')
+		RegisterStateDriver(self.frame, "visibility", db.visibility == 'CUSTOM' and db.customVisibility or RM.VisibilityStates[db.visibility])
+		E:EnableMover(self.frame.mover:GetName())
 	else
 		UnregisterStateDriver(self.frame, "visibility")
 		self.frame:Hide()
+		E:DisableMover(self.frame.mover:GetName())
 	end
-	if self.db.backdrop then
+end
+
+function RM:Backdrop()
+	if E.db.sle.raidmarkers.backdrop then
 		self.frame.backdrop:Show()
 	else
 		self.frame.backdrop:Hide()
 	end
-
-	self:UpdateBar()
-	self:UpdateWorldMarkersAndTooltips()
 end

 function RM:Initialize()
-	self.db = E.db.sle.raidmarkers
+	if not SLE.initialized then return end
+
+	RM:Make("SLE_RaidFlare1", "/clearworldmarker 1\n/worldmarker 1", "Blue Flare")
+	RM:Make("SLE_RaidFlare2", "/clearworldmarker 2\n/worldmarker 2", "Green Flare")
+	RM:Make("SLE_RaidFlare3", "/clearworldmarker 3\n/worldmarker 3", "Purple Flare")
+	RM:Make("SLE_RaidFlare4", "/clearworldmarker 4\n/worldmarker 4", "Red Flare")
+	RM:Make("SLE_RaidFlare5", "/clearworldmarker 5\n/worldmarker 5", "Yellow Flare")
+	RM:Make("SLE_RaidFlare6", "/clearworldmarker 6\n/worldmarker 6", "Orange Flare")
+	RM:Make("SLE_RaidFlare7", "/clearworldmarker 7\n/worldmarker 7", "White Flare")
+	RM:Make("SLE_RaidFlare8", "/clearworldmarker 8\n/worldmarker 8", "Skull Flare")
+
+	RM:Make("SLE_ClearRaidFlares", "/clearworldmarker 0", "Clear All Flares")

 	self.frame = CreateFrame("Frame", "RaidMarkerBar", E.UIParent, "SecureHandlerStateTemplate")
 	self.frame:SetResizable(false)
@@ -164,13 +173,24 @@ function RM:Initialize()
 	self.frame:SetFrameStrata('LOW')
 	self.frame:CreateBackdrop('Transparent')
 	self.frame:ClearAllPoints()
-	self.frame:Point("BOTTOMRIGHT", E.UIParent, "TOPRIGHT", -1, 200)
+	self.frame:Point("BOTTOMRIGHT", E.UIParent, "BOTTOMRIGHT", -1, 200)
 	self.frame.buttons = {}

 	self.frame.backdrop:SetAllPoints()

-	E:CreateMover(self.frame, "RaidMarkerBarAnchor", L['Raid Marker Bar'], nil, nil, nil, "ALL,S&L,S&L MISC")
+	E:CreateMover(self.frame, "RaidMarkerBarAnchor", L["Raid Marker Bar"], nil, nil, nil, "ALL,S&L,S&L MISC")

 	self:CreateButtons()
-	self:ToggleSettings()
-end
\ No newline at end of file
+
+	function RM:ForUpdateAll()
+		RM.db = E.db.sle.quests
+		self:Visibility()
+		self:Backdrop()
+		self:UpdateBar()
+		self:UpdateWorldMarkersAndTooltips()
+	end
+
+	self:ForUpdateAll()
+end
+
+SLE:RegisterModule(RM:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/raidroleicons.lua b/ElvUI_SLE/modules/raidroleicons.lua
index c3bc96b..97f04d9 100644
--- a/ElvUI_SLE/modules/raidroleicons.lua
+++ b/ElvUI_SLE/modules/raidroleicons.lua
@@ -1,11 +1,12 @@
-local E, L, V, P, G = unpack(ElvUI);
-local SLE = E:GetModule('SLE')
-local B = E:GetModule("SLE_BlizzRaid")
-local GetNumGroupMembers, IsInGroup, IsInRaid = GetNumGroupMembers, IsInGroup, IsInRaid
-local PLAYER_REALM = gsub(E.myrealm,'[%s%-]','')
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local B = SLE:NewModule("BlizzRaid", 'AceEvent-3.0')
+local PLAYER_REALM = T.gsub(E.myrealm,'[%s%-]','')
+local _G = _G

 function B:CreateAndUpdateIcons()
-	local members = GetNumGroupMembers()
+	if not SLE.initialized then return end
+	local RaiseFrameLevel = RaiseFrameLevel
+	local members = T.GetNumGroupMembers()
 	for i = 1, members do
 		local frame = _G["RaidGroupButton"..i]
 		if (frame and not frame.subframes) or not E.db.sle.raidmanager then E:Delay(1, B.CreateAndUpdateIcons); return end
@@ -24,13 +25,13 @@ function B:CreateAndUpdateIcons()
 			frame.sleicon.texture:SetAllPoints(frame.sleicon)
 		end
 		frame.sleicon:SetPoint("RIGHT", parent, "LEFT", 2, 0)
-		local unit = IsInRaid() and "raid" or "party"
-		local role = UnitGroupRolesAssigned(unit..i)
-		local name, realm = UnitName(unit..i)
+		local unit = T.IsInRaid() and "raid" or "party"
+		local role = T.UnitGroupRolesAssigned(unit..i)
+		local name, realm = T.UnitName(unit..i)
 		local texture = ""
-		if (role and role ~= "NONE") and name and E.db.sle.roleicons and E.db.sle.raidmanager.roles then
+		if (role and role ~= "NONE") and name and E.db.sle.unitframes.roleicons and E.db.sle.raidmanager.roles then
 			name = (realm and realm ~= '') and name..'-'..realm or name ..'-'..PLAYER_REALM;
-			texture = SLE.rolePaths[E.db.sle.roleicons][role]
+			texture = SLE.rolePaths[E.db.sle.unitframes.roleicons][role]
 		end
 		frame.sleicon.texture:SetTexture(texture)
 	end
@@ -44,7 +45,12 @@ function B:RaidLoaded(event, addon)
 	end
 end

-if not SLE.oraenabled then
+if not SLE._Compatibility["oRA3"] then
 	B:RegisterEvent("ADDON_LOADED", "RaidLoaded")
 end

+function B:Initialize()
+	if not SLE.initialized then return end
+end
+
+SLE:RegisterModule(B:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/raidutility.lua b/ElvUI_SLE/modules/raidutility.lua
deleted file mode 100644
index be353a2..0000000
--- a/ElvUI_SLE/modules/raidutility.lua
+++ /dev/null
@@ -1,56 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local M = E:GetModule('Misc');
-
-local function Enter(self)
-	if not E.db.sle.rumouseover then return end
-	self:SetAlpha(1)
-end
-
-local function Leave(self)
-	if not E.db.sle.rumouseover then return end
-	self:SetAlpha(0)
-end
-
-function M:RUReset()
-	local a = E.db.sle.rumouseover and 0 or 1
-	RaidUtility_ShowButton:SetAlpha(a)
-end
-
---For moving raid utility button
-local function MoreInit()
-	if not RaidUtility_ShowButton then return end
-	E:CreateMover(RaidUtility_ShowButton, "RaidUtility_Mover", L["Raid Utility"], nil, nil, nil, "ALL,S&L,S&L MISC")
-	local mover = RaidUtility_Mover
-	local frame = RaidUtility_ShowButton
-	if E.db.movers == nil then E.db.movers = {} end
-
-	mover:HookScript("OnDragStart", function(self)
-		frame:ClearAllPoints()
-		frame:SetPoint("CENTER", self)
-	end)
-
-	local function dropfix()
-		local point, anchor, point2, x, y = mover:GetPoint()
-		frame:ClearAllPoints()
-		if string.find(point, "BOTTOM") then
-			frame:SetPoint(point, anchor, point2, x, y)
-		else
-			frame:SetPoint(point, anchor, point2, x, y)
-		end
-	end
-
-	mover:HookScript("OnDragStop", dropfix)
-
-	if E.db.movers.RaidUtility_Mover == nil then
-		frame:ClearAllPoints()
-		frame:SetPoint("TOP", E.UIParent, "TOP", -400, E.Border)
-	else
-		dropfix()
-	end
-	frame:RegisterForDrag("")
-	frame:HookScript("OnEnter", Enter)
-	frame:HookScript("OnLeave", Leave)
-	Leave(frame)
-end
-
-hooksecurefunc(M, "Initialize", MoreInit)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/screensaver.lua b/ElvUI_SLE/modules/screensaver.lua
deleted file mode 100644
index 9ded54b..0000000
--- a/ElvUI_SLE/modules/screensaver.lua
+++ /dev/null
@@ -1,356 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI); --Inport: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
-local SLE = E:GetModule('SLE');
-local S = E:GetModule("SLE_ScreenSaver")
-local LSM = LibStub("LibSharedMedia-3.0")
-local Sk = E:GetModule("Skins")
-local ACD = LibStub("AceConfigDialog-3.0-ElvUI")
-
-local SS
-local ru = false
-local Months = {}
-local Week = {}
-
-if GetLocale() == "ruRU" then
-	ru = true
-	Months = {
-		"Января",
-		"Февраля",
-		"Марта",
-		"Апреля",
-		"Мая",
-		"Июня",
-		"Июля",
-		"Августа",
-		"Сентября",
-		"Октября",
-		"Ноября",
-		"Декабря",
-	}
-
-	Week = {
-		"Воскресенье",
-		"Понедельник",
-		"Вторник",
-		"Среда",
-		"Четверг",
-		"Пятница",
-		"Суббота",
-	}
-end
-
--- Blizzard Unit Functions - OnShow / OnEvent
-local UnitLevel, IsInGuild, GetGuildInfo, UnitPVPName, UnitIsAFK = UnitLevel, IsInGuild, GetGuildInfo, UnitPVPName, UnitIsAFK
-local GetScreenWidth, GetScreenHeight = GetScreenWidth, GetScreenHeight
-local FlipCameraYaw = FlipCameraYaw
-
--- Blizzard Lua Helpers - OnUpdate
-local format, random, date = format, random, date
-
-local Name, Level, GuildName, GuildRank
-local Class, ClassToken = UnitClass("player")
-local Race, RaceToken = UnitRace("player")
-local FactionToken, Faction = UnitFactionGroup("player")
-local Color = RAID_CLASS_COLORS[ClassToken]
-local CrestPath = [[Interface\AddOns\ElvUI_SLE\media\textures\crests\]]
-local crestSize, month, week
-local TipsElapsed, TipNum, TipThrottle, OldTip = 0, 1, 10, 0
-local degree = 0
-local fading = false
-
-function S:Media()
-	local db = E.db.sle.media.screensaver
-	SS.Top.Title:SetFont(LSM:Fetch('font', db.title.font), db.title.size, db.title.outline)
-	SS.Top.Quote:SetFont(LSM:Fetch('font', db.subtitle.font), db.subtitle.size, db.subtitle.outline)
-	SS.Top.Date:SetFont(LSM:Fetch('font', db.date.font), db.date.size, db.date.outline)
-	SS.Top.Time:SetFont(LSM:Fetch('font', db.date.font), db.date.size, db.date.outline)
-	SS.Top.PlayerName:SetFont(LSM:Fetch('font', db.player.font), db.player.size, db.player.outline)
-	SS.Top.PlayerInfo:SetFont(LSM:Fetch('font', db.player.font), db.player.size, db.player.outline)
-	SS.Top.GuildR:SetFont(LSM:Fetch('font', db.player.font), db.player.size, db.player.outline)
-	SS.Top.Guild:SetFont(LSM:Fetch('font', db.player.font), db.player.size, db.player.outline)
-	SS.ScrollFrame:SetFont(LSM:Fetch('font', db.tips.font), db.tips.size, db.tips.outline)
-
-	SS.FactCrest:SetSize(db.crest, db.crest)
-	SS.RaceCrest:SetSize(db.crest, db.crest)
-	SS.ExPack:SetSize(E.db.sle.media.screensaver.xpack, E.db.sle.media.screensaver.xpack/2)
-	SS.Elv:SetSize(E.db.sle.media.screensaver.xpack, E.db.sle.media.screensaver.xpack/2)
-	SS.sle:SetSize(E.db.sle.media.screensaver.xpack, E.db.sle.media.screensaver.xpack/2)
-end
-
-function S:Setup()
-	SS.startTime = GetTime()
-	--Creating stuff
-	SS.Top = CreateFrame("Frame", nil, SS)
-	SS.Top:SetTemplate("Transparent")
-	SS.Bottom = CreateFrame("Frame", nil, SS)
-	SS.Bottom:SetTemplate("Transparent")
-	SS.FactCrest = SS.Top:CreateTexture(nil, 'OVERLAY')
-	SS.FactCrest:SetTexture(CrestPath..FactionToken)
-	SS.RaceCrest = SS.Top:CreateTexture(nil, 'ARTWORK')
-	SS.RaceCrest:SetTexture(CrestPath..RaceToken)
-	SS.Elv = SS.Bottom:CreateTexture(nil, 'OVERLAY')
-	SS.Elv:SetTexture("Interface\\AddOns\\ElvUI\\media\\textures\\logo.tga")
-	SS.sle = SS.Bottom:CreateTexture(nil, 'OVERLAY')
-	SS.sle:SetTexture("Interface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Banner")
-	SS.ExPack = CreateFrame("Button", "SLE_SS_Expack", SS.Top)
-	SS.ExPack.Texture = SS.ExPack:CreateTexture(nil, 'OVERLAY')
-	SS.ExPack.Texture:SetAllPoints(SS.ExPack)
-	SS.ExPack.Texture:SetTexture([[Interface\Glues\Common\Glues-WoW-WoDLogo.blp]])
-	SS.ExPack:SetScript("OnClick", S.Escape)
-	SS.model = CreateFrame("PlayerModel", "ScreenModel", SS)
-	-- SS.model:CreateBackdrop("Transparent") --For checking size and borders
-	SS.Top.Title = SS.Top:CreateFontString(nil, "OVERLAY")
-	SS.Top.Quote = SS.Top:CreateFontString(nil, "OVERLAY")
-	SS.Top.Quote:SetJustifyH("LEFT")
-	SS.Top.Date = SS.Top:CreateFontString(nil, "OVERAY")
-	SS.Top.Time = SS.Top:CreateFontString(nil, "OVERLAY")
-	SS.Top.PlayerName = SS.Top:CreateFontString(nil, "OVERLAY")
-	SS.Top.PlayerInfo = SS.Top:CreateFontString(nil, "OVERLAY")
-	SS.Top.Guild = SS.Top:CreateFontString(nil, "OVERLAY")
-	SS.Top.GuildR = SS.Top:CreateFontString(nil, "OVERLAY")
-	SS.ScrollFrame = CreateFrame("ScrollingMessageFrame", nil, SS)
-
-	SS.testmodel = CreateFrame("PlayerModel", "ScreenTestModel", E.UIParent)
-	SS.testmodel:SetPoint("RIGHT", E.UIParent, "RIGHT", -5, 0)
-	-- SS.testmodel:CreateBackdrop("Transparent")
-	SS.testmodel:Hide()
-
-	-- SS.ScrollFrame:SetShadowColor(0, 0, 0, 0)
-	SS.ScrollFrame:SetFading(false)
-	SS.ScrollFrame:SetFadeDuration(0)
-	SS.ScrollFrame:SetTimeVisible(1)
-	SS.ScrollFrame:SetMaxLines(1)
-	SS.ScrollFrame:SetSpacing(2)
-
-	--Calling for fonts and shit updating
-	self:Media()
-
-	--Positioning stuff
-	SS.Top:SetPoint("TOPLEFT", E.UIParent, "TOPLEFT", 0, 0)
-	SS.Top:SetPoint("TOPRIGHT", E.UIParent, "TOPRIGHT", 0, 0)
-	SS.Bottom:SetPoint("BOTTOMLEFT", E.UIParent, "BOTTOMLEFT", 0, 0)
-	SS.Bottom:SetPoint("BOTTOMRIGHT", E.UIParent, "BOTTOMRIGHT", 0, 0)
-	SS.Top.Date:SetPoint("RIGHT", SS.Top, "RIGHT", -40, 10)
-	SS.Top.Time:SetPoint("TOP", SS.Top.Date, "BOTTOM", 0, -2)
-	SS.Top.PlayerInfo:SetPoint("LEFT", SS.Top, "LEFT", 50, 10)
-	SS.Top.PlayerName:SetPoint("BOTTOM", SS.Top.PlayerInfo, "TOP", 0, 2)
-	SS.Top.Guild:SetPoint("TOP", SS.Top.PlayerInfo, "BOTTOM", 0, -2)
-	SS.Top.GuildR:SetPoint("TOP", SS.Top.Guild, "BOTTOM", 0, -2)
-	SS.FactCrest:SetPoint("CENTER", SS.Top, "BOTTOM", -(GetScreenWidth()/6), 0)
-	SS.RaceCrest:SetPoint("CENTER", SS.Top, "BOTTOM", (GetScreenWidth()/6), 0)
-	SS.Elv:SetPoint("CENTER", SS.Bottom, "TOP", -(GetScreenWidth()/10), 0)
-	SS.sle:SetPoint("CENTER", SS.Bottom, "TOP", (GetScreenWidth()/10), 0)
-	SS.ExPack:SetPoint("CENTER", SS.Top, "BOTTOM", 0, 0)
-	SS.Top.Title:SetPoint("TOP", SS.Top, "TOP", 0, -10)
-	SS.Top.Quote:SetPoint("TOP", SS.Top.Title, "BOTTOM", 0, -2)
-	SS.ScrollFrame:SetPoint("CENTER", SS.Bottom, "CENTER", 0, 0)
-
-	-- SS.button:SetPoint("TOP", SS.Bottom, "TOP")
-
-	SS.Top.Title:SetText("|cff00AAFF"..L['You Are Away From Keyboard'].."|r")
-	-----
-	local point = E.db.sle.media.screensaver.playermodel.position
-	SS.Top:SetHeight(E.db.sle.media.screensaver.height)
-	SS.Bottom:SetHeight(E.db.sle.media.screensaver.height)
-	SS.model:SetWidth(E.db.sle.media.screensaver.playermodel.width)
-	if point ~= "CENTER" then
-		SS.model:SetPoint("TOP"..point, SS.Top,"BOTTOM"..point, 0,0)
-		SS.model:SetPoint("BOTTOM"..point, SS.Bottom, "TOP"..point, 0, 0)
-	else
-		SS.model:SetPoint("TOP", SS.Top,"BOTTOM", 0,0)
-		SS.model:SetPoint("BOTTOM", SS.Bottom, "TOP", 0, 0)
-	end
-end
-
-local AnimTime, testM
-
-function S:TestShow()
-	if AnimTime then AnimTime:Cancel() end
-	testM = E.db.sle.media.screensaver.playermodel.anim
-	SS.testmodel:Show()
-	SS.testmodel:SetUnit("player")
-	SS.testmodel:SetSize(SS.model:GetWidth(), SS.model:GetHeight())
-	SS.testmodel:SetPosition(-E.db.sle.media.screensaver.playermodel.distance, E.db.sle.media.screensaver.playermodel.xaxis, E.db.sle.media.screensaver.playermodel.yaxis)
-	if SS.testmodel:GetFacing() ~= (E.db.sle.media.screensaver.playermodel.rotation / 60) then
-		SS.testmodel:SetFacing(E.db.sle.media.screensaver.playermodel.rotation / 60)
-	end
-	SS.testmodel:SetAnimation(testM)
-	SS.testmodel:SetScript("OnAnimFinished", S.AnimTestFinished)
-
-	AnimTime = C_Timer.NewTimer(10, S.TestHide)
-end
-
-function S:TestHide()
-	SS.testmodel:Hide()
-end
-
-function S:AnimFinished()
-	SS.model:SetAnimation(E.db.sle.media.screensaver.playermodel.anim)
-end
-
-function S:AnimTestFinished()
-	SS.testmodel:SetAnimation(testM)
-end
-
-function S:Shown()
-	Level, Name, TipNum = UnitLevel("player"), UnitPVPName("player"), random(1, #L["SLE_TIPS"])
-	if IsInGuild() then
-		GuildName, GuildRank = GetGuildInfo("player")
-	end
-	self.startTime = GetTime()
-	self.model:SetUnit("player")
-	local x = E.db.sle.media.screensaver.playermodel.position == "RIGHT" and -1 or 1
-	local point = E.db.sle.media.screensaver.playermodel.position
-	self.model:SetPosition(-E.db.sle.media.screensaver.playermodel.distance, -x*E.db.sle.media.screensaver.playermodel.xaxis, E.db.sle.media.screensaver.playermodel.yaxis) --(pos/neg) first number moves closer/farther, second right/left, third up/down
-	if self.model:GetFacing() ~= (E.db.sle.media.screensaver.playermodel.rotation / 60) then
-		self.model:SetFacing(E.db.sle.media.screensaver.playermodel.rotation / 60)
-	end
-	self.model:SetAnimation(E.db.sle.media.screensaver.playermodel.anim)
-	self.model:SetScript("OnAnimFinished", S.AnimFinished)
-
-	self.Top:SetHeight(E.db.sle.media.screensaver.height)
-	self.Bottom:SetHeight(E.db.sle.media.screensaver.height)
-	self.ScrollFrame:SetSize(self.Bottom:GetWidth(), 24)
-
-	--Positioning model
-	SS.model:ClearAllPoints()
-	SS.model:SetWidth(E.db.sle.media.screensaver.playermodel.width)
-	if point ~= "CENTER" then
-		SS.model:SetPoint("TOP"..point, SS.Top,"BOTTOM"..point, 0,0)
-		SS.model:SetPoint("BOTTOM"..point, SS.Bottom, "TOP"..point, 0, 0)
-	else
-		SS.model:SetPoint("TOP", SS.Top,"BOTTOM", 0,0)
-		SS.model:SetPoint("BOTTOM", SS.Bottom, "TOP", 0, 0)
-	end
-
-	self.Top.Quote:SetText(L["Take care of yourself, Master!"])
-
-	self.Top.PlayerName:SetText(format("|c%s%s|r", Color.colorStr, Name))
-	self.Top.Guild:SetText(format(GuildName and "|cff00AAFF<%s>|r" or "", GuildName))
-	self.Top.GuildR:SetText(format(GuildRank and "|cff00AAFF"..RANK..": %s|r" or "", GuildRank))
-	self.Top.PlayerInfo:SetText(format("|c%s%s|r, %s %s", Color.colorStr, Class, LEVEL, Level))
-
-	self.ScrollFrame:AddMessage(L["SLE_TIPS"][TipNum], 1, 1, 1)
-	S:UpdateTimer()
-	self.timer = S:ScheduleRepeatingTimer('UpdateTimer', 1)
-end
-
-function S:UpdateCamera(elapsed)
-	FlipCameraYaw(elapsed*10)
-	degree = degree + elapsed*10
-end
-
-function S:UpdateTimer()
-	TipsElapsed = TipsElapsed + 1
-	if ru then
-		month = Months[tonumber(date("%m"))]
-		week = Week[tonumber(date("%w"))+1]
-	else
-		month = date("%B")
-		week = date("%A")
-	end
-	SS.Top.Time:SetText(format("%s", date("%H|cff00AAFF:|r%M|cff00AAFF:|r%S")))
-	SS.Top.Date:SetText(date("%d").." "..month.." |cff00AAFF"..week.."|r")
-
-	if TipsElapsed > TipThrottle then
-		TipNum = random(1, #L["SLE_TIPS"])
-		if TipNum == OldTip then TipNum = random(1, #L["SLE_TIPS"]) end
-		SS.ScrollFrame:AddMessage(L["SLE_TIPS"][TipNum], 1, 1, 1)
-		OldTip = TipNum
-		TipsElapsed = 0
-	end
-end
-
-function S:Event(event, unit)
-	if event == "PLAYER_FLAGS_CHANGED" and unit ~= "player" then return end
-	if UnitIsAFK("player") then
-		SS:Show()
-		Minimap:Hide()
-		if not fading then
-			fading = true
-			UIFrameFadeIn(UIParent, 0.5, 1, 0)
-		end
-		UIParent:Hide()
-	else
-		FlipCameraYaw(-degree)
-		degree = 0
-		SS:Hide()
-		S:CancelTimer(SS.timer)
-		TipsElapsed = 0
-		if InCombatLockdown() then
-			self:RegisterEvent("PLAYER_REGEN_ENABLED", "Event")
-		else
-			Minimap:Show()
-		end
-		if fading then
-			fading = false
-			UIFrameFadeIn(UIParent, 0.5, 0, 1)
-		end
-	end
-	if event == "PLAYER_REGEN_ENABLED" then self:UnregisterEvent(event) end
-	if event == "PLAYER_ENTERING_WORLD" then self:UnregisterEvent(event) end
-end
-
-function S:UpdateConfig()
-	if IsAddOnLoaded("ElvUI_Config") then
-		if E.db.sle.media.screensaver.enable then
-			E.Options.args.general.args.general.args.afk = {
-				order = 15,
-				name = L["AFK Mode"],
-				desc = L["This option have been disabled by Shadow & Light. To return it you need to disable S&L's option. Click here to see it's location."],
-				type = "execute",
-				func = function() ACD:SelectGroup("ElvUI", "sle", "screensaver") end,
-			}
-		else
-			E.Options.args.general.args.general.args.afk = {
-				order = 15,
-				type = 'toggle',
-				name = L["AFK Mode"],
-				desc = L["When you go AFK display the AFK screen."],
-				get = function(info) return E.db.general.afk end,
-				set = function(info, value) E.db.general.afk = value; E:GetModule('AFK'):Toggle() end
-			}
-		end
-	end
-end
-
-local function LoadConfig(event, addon)
-	if addon ~= "ElvUI_Config" then return end
-
-	S:UpdateConfig()
-	S:UnregisterEvent("ADDON_LOADED")
-end
-
-function S:Reg(opt)
-	if E.db.sle.media.screensaver.enable then
-		if E.db.general then E.db.general.afk = false E:GetModule("AFK"):Toggle() end
-		self:RegisterEvent("PLAYER_ENTERING_WORLD", "Event")
-		self:RegisterEvent("PLAYER_FLAGS_CHANGED", "Event")
-		self:RegisterEvent("PLAYER_LOGIN", "Event")
-	else
-		self:UnregisterEvent("PLAYER_ENTERING_WORLD")
-		self:UnregisterEvent("PLAYER_FLAGS_CHANGED")
-		self:UnregisterEvent("PLAYER_LOGIN")
-	end
-	if opt then self:Media() end
-end
-
-function S:Escape()
-	if E.db.sle.media.screensaver.enable and UnitIsAFK("player") then
-		SendChatMessage("" ,"AFK" )
-	end
-end
-
-function S:Initialize()
-	SS = CreateFrame("Frame", "SLE_SS", WorldFrame)
-	SS:Hide()
-	SS:SetFrameStrata("FULLSCREEN")
-	SS:SetScale(SLE:Scale(1))
-	self:Setup()
-	SS:SetScript("OnShow", self.Shown)
-	SS:SetScript("OnUpdate", self.UpdateCamera)
-	-- SS:SetScript("OnKeyDown", S.Escape)
-	self:Reg()
-	self:RegisterEvent("ADDON_LOADED", LoadConfig)
-	self:RegisterEvent("LFG_PROPOSAL_SHOW", S.Escape)
-	self:RegisterEvent("UPDATE_BATTLEFIELD_STATUS", S.Escape)
-end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/sledatatexts/agility.lua b/ElvUI_SLE/modules/sledatatexts/agility.lua
index 95c12a2..c0bae71 100644
--- a/ElvUI_SLE/modules/sledatatexts/agility.lua
+++ b/ElvUI_SLE/modules/sledatatexts/agility.lua
@@ -1,21 +1,22 @@
-local E, L, V, P, G = unpack(ElvUI)
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local DT = E:GetModule('DataTexts')
+local AGILITY_COLON = AGILITY_COLON

 local displayNumberString = ''
 local lastPanel

 local function OnEvent(self, event, ...)
-	self.text:SetFormattedText(displayNumberString, AGILITY_COLON, select(2, UnitStat("player", 2)))
+	self.text:SetFormattedText(displayNumberString, AGILITY_COLON, T.select(2, T.UnitStat("player", 2)))
 	lastPanel = self
 end

 local function ValueColorUpdate(hex, r, g, b)
-	displayNumberString = strjoin("", "%s ", hex, "%.f|r")
+	displayNumberString = T.join("", "%s ", hex, "%.f|r")

 	if lastPanel ~= nil then
 		OnEvent(lastPanel)
 	end
 end
-E['valueColorUpdateFuncs'][ValueColorUpdate] = true
+E["valueColorUpdateFuncs"][ValueColorUpdate] = true

 DT:RegisterDatatext('Agility', { "UNIT_STATS", "UNIT_AURA", "FORGE_MASTER_ITEM_CHANGED", "ACTIVE_TALENT_GROUP_CHANGED", "PLAYER_TALENT_UPDATE"}, OnEvent)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/sledatatexts/currency.lua b/ElvUI_SLE/modules/sledatatexts/currency.lua
index e79918f..ea4b795 100644
--- a/ElvUI_SLE/modules/sledatatexts/currency.lua
+++ b/ElvUI_SLE/modules/sledatatexts/currency.lua
@@ -1,23 +1,35 @@
-local E, L, V, P, G = unpack(ElvUI)
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local DT = E:GetModule('DataTexts')
-local SLE = E:GetModule('SLE')
+local DTP = SLE:GetModule('Datatexts')

-local format, floor, abs, mod, pairs, tinsert = format, floor, abs, mod, pairs, tinsert
-local GetMoney, GetCurrencyInfo, GetNumWatchedTokens, GetBackpackCurrencyInfo, UnitLevel, GetCurrencyListInfo = GetMoney, GetCurrencyInfo, GetNumWatchedTokens, GetBackpackCurrencyInfo, UnitLevel, GetCurrencyListInfo
-
-local join = string.join
+local abs, mod = abs, mod
+local GetMoney, GetCurrencyInfo, GetNumWatchedTokens, GetBackpackCurrencyInfo, GetCurrencyListInfo = GetMoney, GetCurrencyInfo, GetNumWatchedTokens, GetBackpackCurrencyInfo, GetCurrencyListInfo

 local defaultColor = { 1, 1, 1 }
 local Profit = 0
 local Spent	= 0
-local copperFormatter = join("", "%d", L.copperabbrev)
-local silverFormatter = join("", "%d", L.silverabbrev, " %.2d", L.copperabbrev)
-local goldFormatter =  join("", "%s", L.goldabbrev, " %.2d", L.silverabbrev, " %.2d", L.copperabbrev)
-local resetInfoFormatter = join("", "|cffaaaaaa", L["Reset Data: Hold Shift + Right Click"], "|r")
+local copperFormatter = T.join("", "%d", L.copperabbrev)
+local silverFormatter = T.join("", "%d", L.silverabbrev, " %.2d", L.copperabbrev)
+local goldFormatter =  T.join("", "%s", L.goldabbrev, " %.2d", L.silverabbrev, " %.2d", L.copperabbrev)
+local resetInfoFormatter = T.join("", "|cffaaaaaa", L["Reset Data: Hold Shift + Right Click"], "|r")
 local JEWELCRAFTING, COOKING, ARCHAEOLOGY
+--Strings and shit
+local SHOW_CONQUEST_LEVEL = SHOW_CONQUEST_LEVEL
+local FACTION_HORDE = FACTION_HORDE
+local FACTION_ALLIANCE = FACTION_ALLIANCE
+local ARCHAEOLOGY_RUNE_STONES = ARCHAEOLOGY_RUNE_STONES
+local CALENDAR_TYPE_DUNGEON = CALENDAR_TYPE_DUNGEON
+local CALENDAR_TYPE_RAID = CALENDAR_TYPE_RAID
+local PLAYER_V_PLAYER = PLAYER_V_PLAYER
+local MISCELLANEOUS = MISCELLANEOUS
+local RAID_CLASS_COLORS = RAID_CLASS_COLORS
+local IsLoggedIn = IsLoggedIn
+local BreakUpLargeNumbers = BreakUpLargeNumbers
+local IsShiftKeyDown = IsShiftKeyDown
+local ToggleAllBags = ToggleAllBags

 local ArchaeologyFragments = {
-	398, -- Draenai
+	398, -- Draenei
 	384, -- Dwarf
 	393, -- Fossil
 	677, -- Mogu
@@ -31,7 +43,10 @@ local ArchaeologyFragments = {
 	399, -- Vrykul
 	754, -- Mantid
 	829, -- Arakkoa
-	821, -- Draenai Clan
+	821, -- Draenor Clans
+	1174, --Demonic
+	1172, --Highborn
+	1173, --Highmountain tauren
 }

 local CookingAwards = {
@@ -55,12 +70,12 @@ local DungeonRaid = {
 	1129, -- Seal of Inavitable Fate
 	1166, --Timewarped Badge
 	1191, -- Valor
+	1273, --Seal of Broken Fate
 }

 local PvPPoints = {
-	390, -- Conquest
-	392, -- Honor
 	391, -- Tol Barad
+	1149, --Sightless Eye
 }

 local MiscellaneousCurrency = {
@@ -74,10 +89,16 @@ local MiscellaneousCurrency = {
 	980, -- Dingy Iron Coins
 	824, -- Garrison
 	1101, -- Oil
+	1220, --Order resousces
+	1226, --Nethershard
+	1275, --Curious Coin
+	1155, --Ancient Mana
+	1154, --Shadowy Coins
+	1268, --Timeworn Artifact
 }

-local HordeColor = RAID_CLASS_COLORS['DEATHKNIGHT']
-local AllianceColor = RAID_CLASS_COLORS['SHAMAN']
+local HordeColor = RAID_CLASS_COLORS["DEATHKNIGHT"]
+local AllianceColor = RAID_CLASS_COLORS["SHAMAN"]

 local function OrderedPairs(t, f)
 	local function orderednext(t, n)
@@ -88,47 +109,34 @@ local function OrderedPairs(t, f)
 	end

 	local keys, kn = {__source = t, __next = 1}, 1
-	for k in pairs(t) do
+	for k in T.pairs(t) do
 		keys[kn], kn = k, kn + 1
 	end
-	sort(keys, f)
+	T.sort(keys, f)
 	return orderednext, keys
 end

-V['ElvUI_Currency'] = {
-	['Archaeology'] = true,
-	['Jewelcrafting'] = true,
-	['PvP'] = true,
-	['Raid'] = true,
-	['Cooking'] = true,
-	['Miscellaneous'] = true,
-	['Zero'] = true,
-	['Icons'] = true,
-	['Faction'] = true,
-	['Unused'] = true,
-}
-
 local function ToggleOption(name)
-	if E.private['ElvUI_Currency'][name] then
-		E.private['ElvUI_Currency'][name] = false
+	if E.db.sle.dt.currency[name] then
+		E.db.sle.dt.currency[name] = false
 	else
-		E.private['ElvUI_Currency'][name] = true
+		E.db.sle.dt.currency[name] = true
 	end
 end

 local function GetOption(name)
-	return E.private['ElvUI_Currency'][name]
+	return E.db.sle.dt.currency[name]
 end

 local HiddenCurrency = {}

 local function UnusedCheck()
 	if GetOption('Unused') then HiddenCurrency = {}; return end
-	for i = 1, GetCurrencyListSize() do
+	for i = 1, T.GetCurrencyListSize() do
 		local name, _, _, isUnused = GetCurrencyListInfo(i)
 		if isUnused then
 			if not SLE:SimpleTable(HiddenCurrency, name) then
-				table.insert(HiddenCurrency,#(HiddenCurrency)+1, name)
+				T.tinsert(HiddenCurrency,#(HiddenCurrency)+1, name)
 			end
 		else
 			if SLE:SimpleTable(HiddenCurrency, name) then
@@ -141,24 +149,14 @@ end
 local function GetCurrency(CurrencyTable, Text)
 	local Seperator = false
 	UnusedCheck()
-	for key, id in pairs(CurrencyTable) do
+	for key, id in T.pairs(CurrencyTable) do
 		local name, amount, texture, week, weekmax, maxed, discovered = GetCurrencyInfo(id)
-		local LeftString = GetOption('Icons') and format('%s %s', format('|T%s:14:14:0:0:64:64:4:60:4:60|t', texture), name) or name
+		local LeftString = GetOption('Icons') and T.format('%s %s', T.format('|T%s:14:14:0:0:64:64:4:60:4:60|t', texture), name) or name
 		local RightString = amount
 		local unused = SLE:SimpleTable(HiddenCurrency, name) or nil
-
-		if id == 392 or id == 395 then
-			maxed = 4000
-		elseif id == 396 then
-			maxed = 3000
-		end

-		if id == 390 then
-			discovered = UnitLevel('player') >= SHOW_CONQUEST_LEVEL
-			RightString = format('%s %s | %s %s / %s', L['Current:'], amount, L['Weekly:'], week, weekmax)
-		-- elseif maxed <= 4000 and maxed > 0 then
-		elseif maxed > 0 then
-			RightString = format('%s / %s', amount, maxed)
+		if maxed > 0 then
+			RightString = T.format('%s / %s', amount, maxed)
 		end

 		local r1, g1, b1 = 1, 1, 1
@@ -182,38 +180,38 @@ local function GetCurrency(CurrencyTable, Text)
 end

 local function FormatMoney(money)
-	local gold, silver, copper = floor(abs(money / 10000)), abs(mod(money / 100, 100)), abs(mod(money, 100))
+	local gold, silver, copper = T.floor(abs(money / 10000)), abs(mod(money / 100, 100)), abs(mod(money, 100))
 	if gold ~= 0 then
-		return format(goldFormatter, BreakUpLargeNumbers(gold), silver, copper)
+		return T.format(goldFormatter, BreakUpLargeNumbers(gold), silver, copper)
 	elseif silver ~= 0 then
-		return format(silverFormatter, silver, copper)
+		return T.format(silverFormatter, silver, copper)
 	else
-		return format(copperFormatter, copper)
+		return T.format(copperFormatter, copper)
 	end
 end

 local function FormatTooltipMoney(money)
 	if not money then return end
-	local gold, silver, copper = floor(abs(money / 10000)), abs(mod(money / 100, 100)), abs(mod(money, 100))
-	return format(goldFormatter, BreakUpLargeNumbers(gold), silver, copper)
+	local gold, silver, copper = T.floor(abs(money / 10000)), abs(mod(money / 100, 100)), abs(mod(money, 100))
+	return T.format(goldFormatter, BreakUpLargeNumbers(gold), silver, copper)
 end

 local function OnEvent(self, event, ...)
 	if not IsLoggedIn() then return end
 	local NewMoney = GetMoney();
 	ElvDB = ElvDB or { };
-	ElvDB['gold'] = ElvDB['gold'] or {};
-	ElvDB['gold'][E.myrealm] = ElvDB['gold'][E.myrealm] or {};
-	ElvDB['gold'][E.myrealm][E.myname] = ElvDB['gold'][E.myrealm][E.myname] or NewMoney;
-	ElvDB['class'] = ElvDB['class'] or {};
-	ElvDB['class'][E.myrealm] = ElvDB['class'][E.myrealm] or {};
-	ElvDB['class'][E.myrealm][E.myname] = select(2, UnitClass('player'))
-	ElvDB['faction'] = ElvDB['faction'] or {};
-	ElvDB['faction'][E.myrealm] = ElvDB['faction'][E.myrealm] or {};
-	ElvDB['faction'][E.myrealm][FACTION_HORDE] = ElvDB['faction'][E.myrealm][FACTION_HORDE] or {};
-	ElvDB['faction'][E.myrealm][FACTION_ALLIANCE] = ElvDB['faction'][E.myrealm][FACTION_ALLIANCE] or {};
-
-	local OldMoney = ElvDB['gold'][E.myrealm][E.myname] or NewMoney
+	ElvDB["gold"] = ElvDB["gold"] or {};
+	ElvDB["gold"][E.myrealm] = ElvDB["gold"][E.myrealm] or {};
+	ElvDB["gold"][E.myrealm][E.myname] = ElvDB["gold"][E.myrealm][E.myname] or NewMoney;
+	ElvDB["class"] = ElvDB["class"] or {};
+	ElvDB["class"][E.myrealm] = ElvDB["class"][E.myrealm] or {};
+	ElvDB["class"][E.myrealm][E.myname] = T.select(2, T.UnitClass('player'))
+	ElvDB["faction"] = ElvDB["faction"] or {};
+	ElvDB["faction"][E.myrealm] = ElvDB["faction"][E.myrealm] or {};
+	ElvDB["faction"][E.myrealm]["Horde"] = ElvDB["faction"][E.myrealm]["Horde"] or {};
+	ElvDB["faction"][E.myrealm]["Alliance"] = ElvDB["faction"][E.myrealm]["Alliance"] or {};
+
+	local OldMoney = ElvDB["gold"][E.myrealm][E.myname] or NewMoney

 	local calculateChange = false;

@@ -240,19 +238,19 @@ local function OnEvent(self, event, ...)

 		self.text:SetText(FormatMoney(NewMoney))

-		local FactionToken, Faction = UnitFactionGroup('player')
+		local FactionToken, Faction = T.UnitFactionGroup('player')

-		ElvDB['gold'][E.myrealm][E.myname] = NewMoney
+		ElvDB["gold"][E.myrealm][E.myname] = NewMoney
 		if (FactionToken ~= "Neutral") then
-			ElvDB['faction'][E.myrealm][Faction][E.myname] = NewMoney
+			ElvDB["faction"][E.myrealm][FactionToken][E.myname] = NewMoney
 		end
 	end

 	if event == 'PLAYER_ENTERING_WORLD' or event == 'SPELLS_CHANGED' then
 		JEWELCRAFTING = nil
-		for k, v in pairs({GetProfessions()}) do
+		for k, v in T.pairs({T.GetProfessions()}) do
 			if v then
-				local name, _, _, _, _, _, skillid = GetProfessionInfo(v)
+				local name, _, _, _, _, _, skillid = T.GetProfessionInfo(v)
 				if skillid == 755 then
 					JEWELCRAFTING = name
 				elseif skillid == 185 then
@@ -278,10 +276,9 @@ local function Click(self, btn)
 end

 local function OnEnter(self)
-	if SLE_SS:IsShown() then return end
 	DT:SetupTooltip(self)

-	DT.tooltip:AddLine(L['Session:'])
+	DT.tooltip:AddLine(L["Session:"])
 	DT.tooltip:AddDoubleLine(L["Earned:"], FormatMoney(Profit), 1, 1, 1, 1, 1, 1)
 	DT.tooltip:AddDoubleLine(L["Spent:"], FormatMoney(Spent), 1, 1, 1, 1, 1, 1)
 	if Profit < Spent then
@@ -293,52 +290,54 @@ local function OnEnter(self)

 	local totalGold, AllianceGold, HordeGold = 0, 0, 0
 	DT.tooltip:AddLine(L["Character: "])
-	for k,_ in OrderedPairs(ElvDB['gold'][E.myrealm]) do
-		if ElvDB['gold'][E.myrealm][k] then
-			local class = ElvDB['class'][E.myrealm][k]
-			local color = RAID_CLASS_COLORS[class or 'PRIEST']
-			DT.tooltip:AddDoubleLine(k, FormatTooltipMoney(ElvDB['gold'][E.myrealm][k]), color.r, color.g, color.b, 1, 1, 1)
-			if ElvDB['faction'][E.myrealm][FACTION_ALLIANCE][k] then
-				AllianceGold = AllianceGold + ElvDB['gold'][E.myrealm][k]
+	for k,_ in OrderedPairs(ElvDB["gold"][E.myrealm]) do
+		if ElvDB["gold"][E.myrealm][k] then
+			local class = ElvDB["class"][E.myrealm][k]
+			local color = RAID_CLASS_COLORS[class or "PRIEST"]
+			DT.tooltip:AddDoubleLine(k, FormatTooltipMoney(ElvDB["gold"][E.myrealm][k]), color.r, color.g, color.b, 1, 1, 1)
+			if ElvDB["faction"][E.myrealm]["Alliance"][k] then
+				AllianceGold = AllianceGold + ElvDB["gold"][E.myrealm][k]
 			end
-			if ElvDB['faction'][E.myrealm][FACTION_HORDE][k] then
-				HordeGold = HordeGold + ElvDB['gold'][E.myrealm][k]
+			if ElvDB["faction"][E.myrealm]["Horde"][k] then
+				HordeGold = HordeGold + ElvDB["gold"][E.myrealm][k]
 			end
-			totalGold = totalGold + ElvDB['gold'][E.myrealm][k]
+			totalGold = totalGold + ElvDB["gold"][E.myrealm][k]
 		end
 	end

 	DT.tooltip:AddLine' '
 	DT.tooltip:AddLine(L["Server: "])
 	if GetOption('Faction') then
-		DT.tooltip:AddDoubleLine(format('%s: ', FACTION_HORDE), FormatTooltipMoney(HordeGold), HordeColor.r, HordeColor.g, HordeColor.b, 1, 1, 1)
-		DT.tooltip:AddDoubleLine(format('%s: ', FACTION_ALLIANCE), FormatTooltipMoney(AllianceGold), AllianceColor.r, AllianceColor.g, AllianceColor.b, 1, 1, 1)
+		DT.tooltip:AddDoubleLine(T.format('%s: ', FACTION_HORDE), FormatTooltipMoney(HordeGold), HordeColor.r, HordeColor.g, HordeColor.b, 1, 1, 1)
+		DT.tooltip:AddDoubleLine(T.format('%s: ', FACTION_ALLIANCE), FormatTooltipMoney(AllianceGold), AllianceColor.r, AllianceColor.g, AllianceColor.b, 1, 1, 1)
 	end
 	DT.tooltip:AddDoubleLine(L["Total: "], FormatTooltipMoney(totalGold), 1, 1, 1, 1, 1, 1)

 	if ARCHAEOLOGY ~= nil and GetOption('Archaeology') then
-		GetCurrency(ArchaeologyFragments, format('%s %s:', ARCHAEOLOGY, ARCHAEOLOGY_RUNE_STONES))
+		GetCurrency(ArchaeologyFragments, T.format('%s %s:', ARCHAEOLOGY, ARCHAEOLOGY_RUNE_STONES))
 	end
 	if COOKING ~= nil and GetOption('Cooking') then
-		GetCurrency(CookingAwards, format("%s:", COOKING))
+		GetCurrency(CookingAwards, T.format("%s:", COOKING))
 	end
 	if JEWELCRAFTING ~= nil and GetOption('Jewelcrafting') then
-		GetCurrency(JewelcraftingTokens, format("%s:", JEWELCRAFTING))
+		GetCurrency(JewelcraftingTokens, T.format("%s:", JEWELCRAFTING))
 	end
 	if GetOption('Raid') then
-		GetCurrency(DungeonRaid, format('%s & %s:', CALENDAR_TYPE_DUNGEON, CALENDAR_TYPE_RAID))
+		GetCurrency(DungeonRaid, T.format('%s & %s:', CALENDAR_TYPE_DUNGEON, CALENDAR_TYPE_RAID))
 	end
 	if GetOption('PvP') then
-		GetCurrency(PvPPoints, format("%s:", PLAYER_V_PLAYER))
+		GetCurrency(PvPPoints, T.format("%s:", PLAYER_V_PLAYER))
 	end
 	if GetOption('Miscellaneous') then
-		GetCurrency(MiscellaneousCurrency, format("%s:", MISCELLANEOUS))
+		GetCurrency(MiscellaneousCurrency, T.format("%s:", MISCELLANEOUS))
 	end
-
+
 	DT.tooltip:AddLine' '
 	DT.tooltip:AddLine(resetInfoFormatter)

 	DT.tooltip:Show()
 end

-DT:RegisterDatatext('S&L Currency', {'PLAYER_ENTERING_WORLD', 'PLAYER_MONEY', 'SEND_MAIL_MONEY_CHANGED', 'SEND_MAIL_COD_CHANGED', 'PLAYER_TRADE_MONEY', 'TRADE_MONEY_CHANGED', 'SPELLS_CHANGED'}, OnEvent, nil, Click, OnEnter)
\ No newline at end of file
+function DTP:CreateCurrencyDT()
+	DT:RegisterDatatext('S&L Currency', {'PLAYER_ENTERING_WORLD', 'PLAYER_MONEY', 'SEND_MAIL_MONEY_CHANGED', 'SEND_MAIL_COD_CHANGED', 'PLAYER_TRADE_MONEY', 'TRADE_MONEY_CHANGED', 'SPELLS_CHANGED'}, OnEvent, nil, Click, OnEnter)
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/sledatatexts/durability.lua b/ElvUI_SLE/modules/sledatatexts/durability.lua
index 4058d36..85a7d69 100644
--- a/ElvUI_SLE/modules/sledatatexts/durability.lua
+++ b/ElvUI_SLE/modules/sledatatexts/durability.lua
@@ -1,75 +1,77 @@
-local E, L, V, P, G = unpack(ElvUI); --Inport: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local DT = E:GetModule('DataTexts')
+local DTP = SLE:GetModule('Datatexts')
+local HEADSLOT, SHOULDERSLOT, CHESTSLOT, WRISTSLOT, HANDSSLOT, WAISTSLOT, LEGSSLOT, FEETSLOT, MAINHANDSLOT, SECONDARYHANDSLOT = HEADSLOT, SHOULDERSLOT, CHESTSLOT, WRISTSLOT, HANDSSLOT, WAISTSLOT, LEGSSLOT, FEETSLOT, MAINHANDSLOT, SECONDARYHANDSLOT
+local DURABILITY = DURABILITY
+local ToggleCharacter = ToggleCharacter
+function DTP:HookDurabilityDT()
+	local displayString = ""
+	local tooltipString = "%d%%"
+	local totalDurability = 0
+	local current, max, lastPanel
+	local invDurability = {}
+	local slots = {
+		["SecondaryHandSlot"] = SECONDARYHANDSLOT,
+		["MainHandSlot"] = MAINHANDSLOT,
+		["FeetSlot"] = FEETSLOT,
+		["LegsSlot"] = LEGSSLOT,
+		["HandsSlot"] = HANDSSLOT,
+		["WristSlot"] = WRISTSLOT,
+		["WaistSlot"] = WAISTSLOT,
+		["ChestSlot"] = CHESTSLOT,
+		["ShoulderSlot"] = SHOULDERSLOT,
+		["HeadSlot"] = HEADSLOT,
+	}

-local join = string.join
-
-local displayString = ""
-local tooltipString = "%d%%"
-local totalDurability = 0
-local current, max, lastPanel
-local invDurability = {}
-local slots = {
-	["SecondaryHandSlot"] = L["Offhand"],
-	["MainHandSlot"] = L["Main Hand"],
-	["FeetSlot"] = L["Feet"],
-	["LegsSlot"] = L["Legs"],
-	["HandsSlot"] = L["Hands"],
-	["WristSlot"] = L["Wrist"],
-	["WaistSlot"] = L["Waist"],
-	["ChestSlot"] = L["Chest"],
-	["ShoulderSlot"] = L["Shoulder"],
-	["HeadSlot"] = L["Head"],
-}
+	local function OnEvent(self, event, ...)
+		lastPanel = self
+		totalDurability = 100
+		for index, value in T.pairs(slots) do
+			local slot = T.GetInventorySlotInfo(index)
+			current, max = T.GetInventoryItemDurability(slot)
+			if current then
+				invDurability[value] = (current/max)*100
+				if ((current/max) * 100) < totalDurability then
+					totalDurability = (current/max) * 100
+				end
+			end
+		end
+		if totalDurability <= E.db.sle.dt.durability.threshold then
+			E:Flash(self, 0.53, true)
+		else
+			E:StopFlash(self)
+		end
+		if E.db.sle.dt.durability.gradient then
+			local r,g,b = E:ColorGradient(totalDurability/100, .9,.2,.2, .9,.9,.2, .2,.9,.2)
+			local hex = E:RGBToHex(r,g,b)
+			self.text:SetFormattedText("%s: %s%d%%|r", DURABILITY, hex, totalDurability)
+		else
+			self.text:SetFormattedText(displayString, totalDurability)
+		end
+	end

-local function OnEvent(self, event, ...)
-    lastPanel = self
-    totalDurability = 100
-    for index, value in pairs(slots) do
-        local slot = GetInventorySlotInfo(index)
-        current, max = GetInventoryItemDurability(slot)
-        if current then
-            invDurability[value] = (current/max)*100
-            if ((current/max) * 100) < totalDurability then
-                totalDurability = (current/max) * 100
-            end
-        end
-    end
-    if totalDurability <= E.db.sle.dt.durability.threshold then
-        E:Flash(self, 0.53, true)
-    else
-        E:StopFlash(self)
-    end
-	if E.db.sle.dt.durability.gradient then
-		local r,g,b = E:ColorGradient(totalDurability/100, .9,.2,.2, .9,.9,.2, .2,.9,.2)
-		local hex = E:RGBToHex(r,g,b)
-		self.text:SetFormattedText("%s: %s%d%%|r", DURABILITY, hex, totalDurability)
-	else
-		self.text:SetFormattedText(displayString, totalDurability)
+	local function Click()
+		ToggleCharacter("PaperDollFrame")
 	end
-end

-local function Click()
-	ToggleCharacter("PaperDollFrame")
-end
+	local function OnEnter(self)
+		DT:SetupTooltip(self)

-local function OnEnter(self)
-	DT:SetupTooltip(self)
+		for slot, durability in T.pairs(invDurability) do
+			DT.tooltip:AddDoubleLine(slot, T.format(tooltipString, durability), 1, 1, 1, E:ColorGradient(durability * 0.01, 1, 0, 0, 1, 1, 0, 0, 1, 0))
+		end

-	for slot, durability in pairs(invDurability) do
-		DT.tooltip:AddDoubleLine(slot, format(tooltipString, durability), 1, 1, 1, E:ColorGradient(durability * 0.01, 1, 0, 0, 1, 1, 0, 0, 1, 0))
+		DT.tooltip:Show()
 	end

-	DT.tooltip:Show()
-end
+	local function ValueColorUpdate(hex, r, g, b)
+		displayString = T.join("", DURABILITY, ": ", hex, "%d%%|r")

-local function ValueColorUpdate(hex, r, g, b)
-	displayString = join("", DURABILITY, ": ", hex, "%d%%|r")
-
-	if lastPanel ~= nil then
-		OnEvent(lastPanel, 'ELVUI_COLOR_UPDATE')
+		if lastPanel ~= nil then
+			OnEvent(lastPanel, 'ELVUI_COLOR_UPDATE')
+		end
 	end
-end
-E['valueColorUpdateFuncs'][ValueColorUpdate] = true
-
-DT:RegisterDatatext('Durability', {'PLAYER_ENTERING_WORLD', "UPDATE_INVENTORY_DURABILITY", "MERCHANT_SHOW"}, OnEvent, nil, Click, OnEnter)
+	E["valueColorUpdateFuncs"][ValueColorUpdate] = true

+	DT:RegisterDatatext('Durability', {'PLAYER_ENTERING_WORLD', "UPDATE_INVENTORY_DURABILITY", "MERCHANT_SHOW"}, OnEvent, nil, Click, OnEnter)
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/sledatatexts/energyregen.lua b/ElvUI_SLE/modules/sledatatexts/energyregen.lua
index 65d0ca9..2987b18 100644
--- a/ElvUI_SLE/modules/sledatatexts/energyregen.lua
+++ b/ElvUI_SLE/modules/sledatatexts/energyregen.lua
@@ -1,6 +1,7 @@
-local E, L, V, P, G = unpack(ElvUI)
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local DT = E:GetModule('DataTexts')
-
+local STAT_ENERGY_REGEN = STAT_ENERGY_REGEN
+local GetPowerRegen = GetPowerRegen
 local displayNumberString = ''
 local lastPanel

@@ -10,12 +11,12 @@ local function OnEvent(self, event, ...)
 end

 local function ValueColorUpdate(hex, r, g, b)
-	displayNumberString = strjoin("", "%s: ", hex, "%.f|r")
+	displayNumberString = T.join("", "%s: ", hex, "%.f|r")

 	if lastPanel ~= nil then
 		OnEvent(lastPanel)
 	end
 end
-E['valueColorUpdateFuncs'][ValueColorUpdate] = true
+E["valueColorUpdateFuncs"][ValueColorUpdate] = true

 DT:RegisterDatatext('Energy Regen', { "UNIT_STATS", "UNIT_AURA", "FORGE_MASTER_ITEM_CHANGED", "ACTIVE_TALENT_GROUP_CHANGED", "PLAYER_TALENT_UPDATE"}, OnEvent)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/sledatatexts/friends.lua b/ElvUI_SLE/modules/sledatatexts/friends.lua
index 9b7f4b2..f6d8c6f 100644
--- a/ElvUI_SLE/modules/sledatatexts/friends.lua
+++ b/ElvUI_SLE/modules/sledatatexts/friends.lua
@@ -1,7 +1,6 @@
-local E, L, V, P, G = unpack(ElvUI);
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local LibQTip = LibStub('LibQTip-1.0')
-local ACD = LibStub("AceConfigDialog-3.0-ElvUI")
-local DT = E:GetModule('DataTexts')
+local DTP = SLE:GetModule('Datatexts')
 local LDB = LibStub("LibDataBroker-1.1"):NewDataObject("S&L Friends",
 {
 	type	= "data source",
@@ -9,35 +8,45 @@ local LDB = LibStub("LibDataBroker-1.1"):NewDataObject("S&L Friends",
 	label	= "S&L Friends",
 	text	= "S&L Friends"
 })
-local _G = getfenv(0)
-local string = _G.string
-local pairs = _G.pairs
+local _G = _G
 local ONE_MINUTE = 60;
 local ONE_HOUR = 60 * ONE_MINUTE;
 local ONE_DAY = 24 * ONE_HOUR;
 local ONE_MONTH = 30 * ONE_DAY;
 local ONE_YEAR = 12 * ONE_MONTH;

+local MINIMIZE = MINIMIZE
+local BNET_BROADCAST_SENT_TIME = BNET_BROADCAST_SENT_TIME
+local RED_FONT_COLOR_CODE = RED_FONT_COLOR_CODE
+local CHAT_FLAG_AFK = CHAT_FLAG_AFK
+local CHAT_FLAG_DND = CHAT_FLAG_DND
+local LASTONLINE_SECS, LASTONLINE_MINUTES, LASTONLINE_HOURS, LASTONLINE_DAYS, LASTONLINE_MONTHS, LASTONLINE_YEARS = LASTONLINE_SECS, LASTONLINE_MINUTES, LASTONLINE_HOURS, LASTONLINE_DAYS, LASTONLINE_MONTHS, LASTONLINE_YEARS
+
+local ShowFriends = ShowFriends
+local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown
+local SetItemRef = SetItemRef
+local StaticPopup_Show = StaticPopup_Show
+
 local realid_table = {}

 local function sletime_Conversion(timeDifference, isAbsolute)
    if ( not isAbsolute ) then
-      timeDifference = time() - timeDifference;
+      timeDifference = T.time() - timeDifference;
    end
    local year, month, day, hour, minute;

    if ( timeDifference < ONE_MINUTE ) then
       return LASTONLINE_SECS;
    elseif ( timeDifference >= ONE_MINUTE and timeDifference < ONE_HOUR ) then
-      return format(LASTONLINE_MINUTES, floor(timeDifference / ONE_MINUTE));
+      return T.format(LASTONLINE_MINUTES, T.floor(timeDifference / ONE_MINUTE));
    elseif ( timeDifference >= ONE_HOUR and timeDifference < ONE_DAY ) then
-      return format(LASTONLINE_HOURS, floor(timeDifference / ONE_HOUR));
+      return T.format(LASTONLINE_HOURS, T.floor(timeDifference / ONE_HOUR));
    elseif ( timeDifference >= ONE_DAY and timeDifference < ONE_MONTH ) then
-      return format(LASTONLINE_DAYS, floor(timeDifference / ONE_DAY));
+      return T.format(LASTONLINE_DAYS, T.floor(timeDifference / ONE_DAY));
    elseif ( timeDifference >= ONE_MONTH and timeDifference < ONE_YEAR ) then
-      return format(LASTONLINE_MONTHS, floor(timeDifference / ONE_MONTH));
+      return T.format(LASTONLINE_MONTHS, T.floor(timeDifference / ONE_MONTH));
    else
-      return format(LASTONLINE_YEARS, floor(timeDifference / ONE_YEAR));
+      return T.format(LASTONLINE_YEARS, T.floor(timeDifference / ONE_YEAR));
    end
 end

@@ -149,9 +158,9 @@ local list_sort = {
 }

 local function inGroup(name)
-	if GetNumSubgroupMembers() > 0 and UnitInParty(name) then
+	if T.GetNumSubgroupMembers() > 0 and T.UnitInParty(name) then
 		return true
-	elseif GetNumGroupMembers() > 0 and UnitInRaid(name) then
+	elseif T.GetNumGroupMembers() > 0 and T.UnitInRaid(name) then
 		return true
 	end

@@ -161,8 +170,8 @@ end
 local function nameIndex(name)
 	local lookupname

-	for i = 1, GetNumFriends() do
-		lookupname = GetFriendInfo(i)
+	for i = 1, T.GetNumFriends() do
+		lookupname = T.GetFriendInfo(i)
 		if lookupname == name then
 			return i
 		end
@@ -171,8 +180,8 @@ end

 local function ColoredLevel(level)
 	if level ~= "" then
-		local color = GetQuestDifficultyColor(level)
-		return string.format("|cff%02x%02x%02x%d|r", color.r * 255, color.g * 255, color.b * 255, level)
+		local color = T.GetQuestDifficultyColor(level)
+		return T.format("|cff%02x%02x%02x%d|r", color.r * 255, color.g * 255, color.b * 255, level)
 	end
 end

@@ -182,53 +191,53 @@ local classes_female, classes_male = {}, {}
 FillLocalizedClassList(classes_female, true)
 FillLocalizedClassList(classes_male, false)

-for token, localizedName in pairs(classes_female) do
+for token, localizedName in T.pairs(classes_female) do
 	color = RAID_CLASS_COLORS[token]
-	CLASS_COLORS[localizedName] = string.format("%02x%02x%02x", color.r * 255, color.g * 255, color.b * 255)
+	CLASS_COLORS[localizedName] = T.format("%02x%02x%02x", color.r * 255, color.g * 255, color.b * 255)
 end

-for token, localizedName in pairs(classes_male) do
+for token, localizedName in T.pairs(classes_male) do
 	color = RAID_CLASS_COLORS[token]
-	CLASS_COLORS[localizedName] = string.format("%02x%02x%02x", color.r * 255, color.g * 255, color.b * 255)
+	CLASS_COLORS[localizedName] = T.format("%02x%02x%02x", color.r * 255, color.g * 255, color.b * 255)
 end

 local function valueColor(totals)
 	if totals ~= "" then
 		local color = E.db.general.valuecolor
-		return string.format("|cff%02x%02x%02x%d|r", color.r * 255, color.g * 255, color.b * 255, totals)
+		return T.format("|cff%02x%02x%02x%d|r", color.r * 255, color.g * 255, color.b * 255, totals)
 	end
 end

-function DT:update_Friends()
+function DTP:update_Friends()
 	ShowFriends()
-	local friendsTotal, friendsOnline = GetNumFriends()
-	local bnTotal, bnOnline = BNGetNumFriends()
+	local friendsTotal, friendsOnline = T.GetNumFriends()
+	local bnTotal, bnOnline = T.BNGetNumFriends()
 	local totalOnline = friendsOnline + bnOnline
 	local totalFriends = friendsTotal + bnTotal

 	if E.db.sle.dt.friends.totals then
-		LDB.text = "|cffffffff"..L['Friends']..": |r"..valueColor(totalOnline).."/"..valueColor(totalFriends)
+		LDB.text = "|cffffffff"..L["Friends"]..": |r"..valueColor(totalOnline).."/"..valueColor(totalFriends)
 	else
-		LDB.text = "|cffffffff"..L['Friends']..": |r"..valueColor(totalOnline)
+		LDB.text = "|cffffffff"..L["Friends"]..": |r"..valueColor(totalOnline)
 	end
 end

 local function Entry_OnMouseUp(frame, info, button)
-	local i_type, toon_name, full_name, presence_id = string.split(":", info)
+	local i_type, toon_name, full_name, presence_id = T.split(":", info)

 	if button == "LeftButton" then
 		if IsAltKeyDown() then
 			if i_type == "realid" then
-				local presenceID, presenceName, battleTag, isBattleTagPresence, toonName, toonID = BNGetFriendInfo(BNGetFriendIndex(presence_id))
-				local _, toonName, client, realmName, realmID, faction, race, class, guild, zoneName, level, gameText = BNGetGameAccountInfo(toonID or 0)
+				local presenceID, presenceName, battleTag, isBattleTagPresence, toonName, toonID = T.BNGetFriendInfo(T.BNGetFriendIndex(presence_id))
+				local _, toonName, client, realmName, realmID, faction, race, class, guild, zoneName, level, gameText = T.BNGetGameAccountInfo(toonID or 0)
 				if E.myrealm == realmName then
-					InviteUnit(toon_name)
+					T.InviteUnit(toon_name)
 				else
-					InviteUnit(toon_name.."-"..realmName)
+					T.InviteUnit(toon_name.."-"..realmName)
 				end
 				return
 			else
-				InviteUnit(toon_name)
+				T.InviteUnit(toon_name)
 				return
 			end
 		end
@@ -241,7 +250,7 @@ local function Entry_OnMouseUp(frame, info, button)
 		if IsControlKeyDown() then
 			if i_type == "friends" then
 				FriendsFrame.NotesID = nameIndex(toon_name)
- 				StaticPopup_Show("SET_FRIENDNOTE", GetFriendInfo(FriendsFrame.NotesID))
+ 				StaticPopup_Show("SET_FRIENDNOTE", T.GetFriendInfo(FriendsFrame.NotesID))
  				return
 			end

@@ -254,16 +263,16 @@ local function Entry_OnMouseUp(frame, info, button)

 		if i_type == "realid" then
 			local name
-			for _, player in ipairs(realid_table) do
+			for _, player in T.ipairs(realid_table) do
 				if player["GIVENNAME"] == presence_id and player["CLIENT"] == "Hero" then
 					name = presence_id..":"..player["PRESENCEID"]
 					break
 				end
 			end
 			if not name then name = full_name..":"..presence_id end
-			SetItemRef( "BNplayer:"..name, ("|HBNplayer:%1$s|h[%1$s]|h"):format(name), "LeftButton" )
+			SetItemRef( "BNplayer:"..name, T.format("|HBNplayer:%1$s|h[%1$s]|h", name), "LeftButton" )
 		else
-			SetItemRef( "player:"..full_name, ("|Hplayer:%1$s|h[%1$s]|h"):format(full_name), "LeftButton" )
+			SetItemRef( "player:"..full_name, T.format("|Hplayer:%1$s|h[%1$s]|h", full_name), "LeftButton" )
 		end
 	elseif button == "RightButton" then
 		if IsControlKeyDown() then
@@ -297,15 +306,14 @@ function LDB:OnClick(button)

 	if button == "RightButton" then
 		ElvConfigToggle:Click();
-		ACD:SelectGroup("ElvUI", "sle", "sldatatext", "slfriends")
+		SLE.ACD:SelectGroup("ElvUI", "sle", "modules", "datatext", "sldatatext", "slfriends")
 	end
 end

 function LDB.OnLeave() end

 function LDB.OnEnter(self)
-	if SLE_SS:IsShown() then return end
-	if E.db.sle.dt.friends.combat and InCombatLockdown() then return end
+	if E.db.sle.dt.friends.combat and T.InCombatLockdown() then return end
 	LDB_ANCHOR = self

 	if LibQTip:IsAcquired("ShadowLightFriends") then
@@ -327,8 +335,8 @@ function LDB.OnEnter(self)
 	tooltip:SetCell(line, 1, "Shadow & Light Friends", ssTitleFont, "CENTER", 0)
 	tooltip:AddLine(" ")

-	local _, numBNOnline = BNGetNumFriends()
-	local _, numFriendsOnline = GetNumFriends()
+	local _, numBNOnline = T.BNGetNumFriends()
+	local _, numFriendsOnline = T.GetNumFriends()

 	if (numBNOnline > 0) or (numFriendsOnline > 0) then
 		line = tooltip:AddLine()
@@ -361,13 +369,13 @@ function LDB.OnEnter(self)
 			tooltip:AddSeparator()

 			if numBNOnline > 0 then
-				wipe(realid_table)
+				T.twipe(realid_table)
 				for i = 1, numBNOnline do
-					local presenceID, givenName, bTag, _, _, toonID, gameClient, isOnline, lastOnline, isAFK, isDND, broadcast, note, _, castTime = BNGetFriendInfo(i)
-					local _, toonName, client, realmName, realmID, faction, race, class, guild, zoneName, level, gameText = BNGetGameAccountInfo(toonID or 0)
+					local presenceID, givenName, bTag, _, _, toonID, gameClient, isOnline, lastOnline, isAFK, isDND, broadcast, note, _, castTime = T.BNGetFriendInfo(i)
+					local _, toonName, client, realmName, realmID, faction, race, class, guild, zoneName, level, gameText = T.BNGetGameAccountInfo(toonID or 0)
 					local broadcastTime = ""
 					if castTime then
-						broadcastTime = string.format(BNET_BROADCAST_SENT_TIME, sletime_Conversion(castTime));
+						broadcastTime = T.format(BNET_BROADCAST_SENT_TIME, sletime_Conversion(castTime));
 					end

 					local fcolor
@@ -388,7 +396,7 @@ function LDB.OnEnter(self)
 						end
 						if note and note ~= "" then note = "|cffff8800{"..note.."}|r" end

-						table.insert(realid_table, {
+						T.tinsert(realid_table, {
 							GIVENNAME = givenName,
 							SURNAME = bTag or "",
 							LEVEL = level,
@@ -409,10 +417,10 @@ function LDB.OnEnter(self)
 				end

 				if (E.db.sle.dt.friends["sortBN"] ~= "REALID") and (E.db.sle.dt.friends["sortBN"] ~= "revREALID") then
-					table.sort(realid_table, list_sort[E.db.sle.dt.friends["sortBN"]])
+					T.sort(realid_table, list_sort[E.db.sle.dt.friends["sortBN"]])
 				end

-				for _, player in ipairs(realid_table) do
+				for _, player in T.ipairs(realid_table) do
 					local broadcast_flag
 					if not E.db.sle.dt.friends.expandBNBroadcast and player["BROADCAST_TEXT"] ~= "" then
 						broadcast_flag = " " .. BROADCAST_ICON
@@ -425,10 +433,10 @@ function LDB.OnEnter(self)
 					line = tooltip:SetCell(line, 2, player["STATUS"])
 					if player["CLIENT"] ~= "Hero" then
 						line = tooltip:SetCell(line, 3,
-						string.format("|cff%s%s",CLASS_COLORS[player["CLASS"]] or "B8B8B8", player["TOONNAME"] .. "|r")..
+						T.format("|cff%s%s",CLASS_COLORS[player["CLASS"]] or "B8B8B8", player["TOONNAME"] .. "|r")..
 						(inGroup(player["TOONNAME"]) and GROUP_CHECKMARK or ""))
 					else
-						line = tooltip:SetCell(line, 3, string.format(""))
+						line = tooltip:SetCell(line, 3, T.format(""))
 					end
 					line = tooltip:SetCell(line, 4,
 						"|cff82c5ff" .. player["GIVENNAME"] .. "|r" .. broadcast_flag)
@@ -456,7 +464,7 @@ function LDB.OnEnter(self)
 							line = tooltip:SetCell(line, 6, "|cff82c5ffHeroes of The Storm|r")
 						end
 						if player["CLIENT"] == "Pro" then
-							line = tooltip:SetCell(line, 6, "|cffff6600Overwatch|r");
+							line = tooltip:SetCell(line, 6, "|cff82c5ffOverwatch|r")
 						end
 					end

@@ -464,12 +472,12 @@ function LDB.OnEnter(self)
 						line = tooltip:SetCell(line, 7, player["NOTE"])
 					end

-					tooltip:SetLineScript(line, "OnMouseUp", Entry_OnMouseUp, string.format("realid:%s:%s:%d", player["TOONNAME"], player["GIVENNAME"], player["PRESENCEID"]))
+					tooltip:SetLineScript(line, "OnMouseUp", Entry_OnMouseUp, T.format("realid:%s:%s:%d", player["TOONNAME"], player["GIVENNAME"], player["PRESENCEID"]))

 					if E.db.sle.dt.friends.expandBNBroadcast and player["BROADCAST_TEXT"] ~= "" then
 						line = tooltip:AddLine()
 						line = tooltip:SetCell(line, 1, BROADCAST_ICON .. " |cff7b8489" .. player["BROADCAST_TEXT"] .. "|r "..player["BROADCAST_TIME"], "LEFT", 0)
-						tooltip:SetLineScript(line, "OnMouseUp", Entry_OnMouseUp, string.format("realid:%s:%s:%d", player["TOONNAME"], player["GIVENNAME"], player["PRESENCEID"]))
+						tooltip:SetLineScript(line, "OnMouseUp", Entry_OnMouseUp, T.format("realid:%s:%s:%d", player["TOONNAME"], player["GIVENNAME"], player["PRESENCEID"]))
 					end
 				end
 				tooltip:AddLine(" ")
@@ -478,7 +486,7 @@ function LDB.OnEnter(self)
 			if numFriendsOnline > 0 then
 				local friend_table = {}
 				for i = 1,numFriendsOnline do
-					local toonName, level, class, zoneName, connected, status, note = GetFriendInfo(i)
+					local toonName, level, class, zoneName, connected, status, note = T.GetFriendInfo(i)
 					note = note and "|cffff8800{"..note.."}|r" or ""

 					if status == CHAT_FLAG_AFK then
@@ -487,7 +495,7 @@ function LDB.OnEnter(self)
 						status = BUSY_ICON
 					end

-					table.insert(friend_table, {
+					T.tinsert(friend_table, {
 						TOONNAME = toonName,
 						LEVEL = level,
 						CLASS = class,
@@ -499,22 +507,22 @@ function LDB.OnEnter(self)
 				end

 				if (E.db.sle.dt.friends["sortBN"] ~= "REALID") and (E.db.sle.dt.friends["sortBN"] ~= "revREALID") then
-					table.sort(friend_table, list_sort[E.db.sle.dt.friends["sortBN"]])
+					T.sort(friend_table, list_sort[E.db.sle.dt.friends["sortBN"]])
 				else
-					table.sort(friend_table, list_sort["TOONNAME"])
+					T.sort(friend_table, list_sort["TOONNAME"])
 				end

-				for _, player in ipairs(friend_table) do
+				for _, player in T.ipairs(friend_table) do
 					line = tooltip:AddLine()
 					line = tooltip:SetCell(line, 1, ColoredLevel(player["LEVEL"]))
 					line = tooltip:SetCell(line, 2, player["STATUS"])
 					line = tooltip:SetCell(line, 3,
-						string.format("|cff%s%s", CLASS_COLORS[player["CLASS"]] or "ffffff", player["TOONNAME"] .. "|r") .. (inGroup(player["TOONNAME"]) and GROUP_CHECKMARK or ""));
+						T.format("|cff%s%s", CLASS_COLORS[player["CLASS"]] or "ffffff", player["TOONNAME"] .. "|r") .. (inGroup(player["TOONNAME"]) and GROUP_CHECKMARK or ""));
 					line = tooltip:SetCell(line, 5, player["ZONENAME"])
 					if not E.db.sle.dt.friends.hideFriendsNotes then
 						line = tooltip:SetCell(line, 7, player["NOTE"])
 					end
-					tooltip:SetLineScript(line, "OnMouseUp", Entry_OnMouseUp, string.format("friends:%s:%s", player["TOONNAME"], player["TOONNAME"]))
+					tooltip:SetLineScript(line, "OnMouseUp", Entry_OnMouseUp, T.format("friends:%s:%s", player["TOONNAME"], player["TOONNAME"]))
 				end
 			end
 		end
@@ -533,20 +541,20 @@ function LDB.OnEnter(self)
 		if not E.db.sle.dt.friends.minimize_hintline then
 			line = tooltip:AddLine()
 			tooltip:SetCell(line, 1, "", "LEFT", 1)
-			tooltip:SetCell(line, 2, "|cffeda55fLeft Click|r to open the friends panel.", "LEFT", 3)
-			tooltip:SetCell(line, 5, "|cffeda55fRight Click|r to open configuration panel.", "LEFT", 3)
+			tooltip:SetCell(line, 2, L["|cffeda55fLeft Click|r to open the friends panel."], "LEFT", 3)
+			tooltip:SetCell(line, 5, L["|cffeda55fRight Click|r to open configuration panel."], "LEFT", 3)
 			line = tooltip:AddLine()
 			tooltip:SetCell(line, 1, "", "LEFT", 1)
-			tooltip:SetCell(line, 2, "|cffeda55fLeft Click|r a line to whisper a player.", "LEFT", 3)
-			tooltip:SetCell(line, 5, "|cffeda55fShift+Left Click|r a line to lookup a player.", "LEFT", 3)
+			tooltip:SetCell(line, 2, L["|cffeda55fLeft Click|r a line to whisper a player."], "LEFT", 3)
+			tooltip:SetCell(line, 5, L["|cffeda55fShift+Left Click|r a line to lookup a player."], "LEFT", 3)
 			line = tooltip:AddLine()
 			tooltip:SetCell(line, 1, "", "LEFT", 1)
-			tooltip:SetCell(line, 2, "|cffeda55fCtrl+Left Click|r a line to edit a note.", "LEFT", 3)
-			tooltip:SetCell(line, 5, "|cffeda55fMiddleClick|r a line to expand RealID.", "LEFT", 3)
+			tooltip:SetCell(line, 2, L["|cffeda55fCtrl+Left Click|r a line to edit a note."], "LEFT", 3)
+			tooltip:SetCell(line, 5, L["|cffeda55fMiddleClick|r a line to expand RealID."], "LEFT", 3)
 			line = tooltip:AddLine()
 			tooltip:SetCell(line, 1, "", "LEFT", 1)
-			tooltip:SetCell(line, 2, "|cffeda55fAlt+Left Click|r a line to invite.", "LEFT", 3)
-			tooltip:SetCell(line, 5, "|cffeda55fLeft Click|r a Header to hide it or sort it.", "LEFT", 3)
+			tooltip:SetCell(line, 2, L["|cffeda55fAlt+Left Click|r a line to invite."], "LEFT", 3)
+			tooltip:SetCell(line, 5, L["|cffeda55fLeft Click|r a Header to hide it or sort it."], "LEFT", 3)
 		end
 	end

@@ -560,6 +568,20 @@ frame:SetScript("OnEvent", function(self, event, ...)
 	end
 end)

+function frame:PLAYER_LOGIN()
+	local _, numBNOnline = T.BNGetNumFriends()
+	local _, numFriendsOnline = T.GetNumFriends()
+
+	if (numBNOnline > 0) or (numFriendsOnline > 0) then
+		if numBNOnline > 0 then
+			for i = 1, numBNOnline do
+					local presenceID, givenName, bTag, _, _, toonID, gameClient, isOnline, lastOnline, isAFK, isDND, broadcast, note, _, castTime = T.BNGetFriendInfo(i)
+					local _, toonName, client, realmName, realmID, faction, race, class, guild, zoneName, level, gameText = T.BNGetGameAccountInfo(toonID or 0)
+			end
+		end
+	end
+end
+
 local DELAY = 15  --  Update every 15 seconds
 local elapsed = DELAY - 5

@@ -568,7 +590,7 @@ frame:SetScript("OnUpdate", function (self, elapse)

 	if elapsed >= DELAY then
 		elapsed = 0
-		DT:update_Friends()
+		DTP:update_Friends()
 	end
 end)

diff --git a/ElvUI_SLE/modules/sledatatexts/guild.lua b/ElvUI_SLE/modules/sledatatexts/guild.lua
index 9a27aee..3ee8fd9 100644
--- a/ElvUI_SLE/modules/sledatatexts/guild.lua
+++ b/ElvUI_SLE/modules/sledatatexts/guild.lua
@@ -1,7 +1,6 @@
-local E, L, V, P, G = unpack(ElvUI);
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local LibQTip = LibStub('LibQTip-1.0')
-local ACD = LibStub("AceConfigDialog-3.0-ElvUI")
-local DT = E:GetModule('DataTexts')
+local DTP = SLE:GetModule('Datatexts')
 local LDB = LibStub("LibDataBroker-1.1"):NewDataObject("S&L Guild",
 {
 	type	= "data source",
@@ -9,9 +8,7 @@ local LDB = LibStub("LibDataBroker-1.1"):NewDataObject("S&L Guild",
 	label	= "S&L Guild",
 	text	= "S&L Guild"
 })
-local _G = getfenv(0)
-local string = _G.string
-local pairs = _G.pairs
+local _G = _G
 local MyRealm = E.myrealm
 local frame = CreateFrame("frame")

@@ -26,6 +23,13 @@ local MINIMIZE		= "|TInterface\\BUTTONS\\UI-PlusButton-Up:0|t"

 local FACTION_COLOR_HORDE = RED_FONT_COLOR_CODE
 local FACTION_COLOR_ALLIANCE = "|cff0070dd"
+local MINIMIZE = MINIMIZE
+local GUILD = GUILD
+local IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown = IsShiftKeyDown, IsControlKeyDown, IsAltKeyDown
+local SetItemRef = SetItemRef
+local StaticPopup_Show = StaticPopup_Show
+local SetGuildRosterSelection = SetGuildRosterSelection
+local ToggleGuildFrame = ToggleGuildFrame

 -- Setup the Title Font. 14
 local ssTitleFont = CreateFont("ssTitleFont")
@@ -106,9 +110,9 @@ local list_sort = {
 }

 local function inGroup(name)
-	if GetNumSubgroupMembers() > 0 and UnitInParty(name) then
+	if T.GetNumSubgroupMembers() > 0 and T.UnitInParty(name) then
 		return true
-	elseif GetNumGroupMembers() > 0 and UnitInRaid(name) then
+	elseif T.GetNumGroupMembers() > 0 and T.UnitInRaid(name) then
 		return true
 	end

@@ -118,8 +122,8 @@ end
 local function guild_name_to_index(name)
 	local lookupname

-	for i = 1, GetNumGuildMembers() do
-		lookupname = GetGuildRosterInfo(i)
+	for i = 1, T.GetNumGuildMembers() do
+		lookupname = T.GetGuildRosterInfo(i)

 		if lookupname == name then
 			return i
@@ -129,8 +133,8 @@ end

 local function ColoredLevel(level)
 	if level ~= "" then
-		local color = GetQuestDifficultyColor(level)
-		return string.format("|cff%02x%02x%02x%d|r", color.r * 255, color.g * 255, color.b * 255, level)
+		local color = T.GetQuestDifficultyColor(level)
+		return T.format("|cff%02x%02x%02x%d|r", color.r * 255, color.g * 255, color.b * 255, level)
 	end
 end

@@ -140,29 +144,29 @@ local classes_female, classes_male = {}, {}
 FillLocalizedClassList(classes_female, true)
 FillLocalizedClassList(classes_male, false)

-for token, localizedName in pairs(classes_female) do
+for token, localizedName in T.pairs(classes_female) do
 	color = RAID_CLASS_COLORS[token]
-	CLASS_COLORS[localizedName] = string.format("%02x%02x%02x", color.r * 255, color.g * 255, color.b * 255)
+	CLASS_COLORS[localizedName] = T.format("%02x%02x%02x", color.r * 255, color.g * 255, color.b * 255)
 end

-for token, localizedName in pairs(classes_male) do
+for token, localizedName in T.pairs(classes_male) do
 	color = RAID_CLASS_COLORS[token]
-	CLASS_COLORS[localizedName] = string.format("%02x%02x%02x", color.r * 255, color.g * 255, color.b * 255)
+	CLASS_COLORS[localizedName] = T.format("%02x%02x%02x", color.r * 255, color.g * 255, color.b * 255)
 end

 local function valueColor(totals)
 	if totals ~= "" then
 		local color = E.db.general.valuecolor
-		return string.format("|cff%02x%02x%02x%d|r", color.r * 255, color.g * 255, color.b * 255, totals)
+		return T.format("|cff%02x%02x%02x%d|r", color.r * 255, color.g * 255, color.b * 255, totals)
 	end
 end

-function DT:update_Guild()
-	if IsInGuild() then
-		GuildRoster()
-		local guildTotal, online = GetNumGuildMembers()
-			for i = 1, GetNumGuildMembers() do
-				local _, _, _, _, _, _, _, _, connected, _, _, _, _, isMobile = GetGuildRosterInfo(i)
+function DTP:update_Guild()
+	if T.IsInGuild() then
+		T.GuildRoster()
+		local guildTotal, online = T.GetNumGuildMembers()
+			for i = 1, T.GetNumGuildMembers() do
+				local _, _, _, _, _, _, _, _, connected, _, _, _, _, isMobile = T.GetGuildRosterInfo(i)
 				if isMobile then
 					online = online + 1
 				end
@@ -173,16 +177,16 @@ function DT:update_Guild()
 			LDB.text = "|cffffffff"..GUILD..": |r"..valueColor(online)
 		end
 	else
-		LDB.text = "|cffffffff"..L['No Guild'].."|r"
+		LDB.text = "|cffffffff"..L["No Guild"].."|r"
 	end
 end

 local function Entry_OnMouseUp(frame, info, button)
-	local i_type, toon_name, full_name, presence_id = string.split(":", info)
+	local i_type, toon_name, full_name, presence_id = T.split(":", info)

 	if button == "LeftButton" then
 		if IsAltKeyDown() then
-			InviteUnit(toon_name)
+			T.InviteUnit(toon_name)
 			return
 		end

@@ -192,17 +196,17 @@ local function Entry_OnMouseUp(frame, info, button)
 		end

 		if IsControlKeyDown() then
-			if i_type == "guild" and CanEditPublicNote() then
+			if i_type == "guild" and T.CanEditPublicNote() then
 				SetGuildRosterSelection(guild_name_to_index(toon_name))
 				StaticPopup_Show("SET_GUILDPLAYERNOTE")
 				return
 			end
 		end

-		SetItemRef( "player:"..full_name, ("|Hplayer:%1$s|h[%1$s]|h"):format(full_name), "LeftButton" )
+		SetItemRef( "player:"..full_name, T.format("|Hplayer:%1$s|h[%1$s]|h", full_name), "LeftButton" )
 	elseif button == "RightButton" then
 		if IsControlKeyDown() then
-			if i_type == "guild" and CanEditOfficerNote() then
+			if i_type == "guild" and T.CanEditOfficerNote() then
 				SetGuildRosterSelection(guild_name_to_index(toon_name))
 				StaticPopup_Show("SET_GUILDOFFICERNOTE")
 			end
@@ -231,15 +235,14 @@ function LDB:OnClick(button)

 	if button == "RightButton" then
 		ElvConfigToggle:Click();
-		ACD:SelectGroup("ElvUI", "sle", "sldatatext", "slguild")
+		SLE.ACD:SelectGroup("ElvUI", "sle", "modules", "datatext", "sldatatext", "slguild")
 	end
 end

 function LDB.OnLeave() end

 function LDB.OnEnter(self)
-	if SLE_SS:IsShown() then return end
-	if E.db.sle.dt.guild.combat and InCombatLockdown() then return end
+	if E.db.sle.dt.guild.combat and T.InCombatLockdown() then return end
 	LDB_ANCHOR = self

 	if LibQTip:IsAcquired("ShadowLightGuild") then
@@ -261,7 +264,7 @@ function LDB.OnEnter(self)
 	tooltip:SetCell(line, 1, "Shadow & Light Guild", ssTitleFont, "CENTER", 0)
 	tooltip:AddLine(" ")

-	if IsInGuild() then
+	if T.IsInGuild() then
 		local guild_table = {}
 		if not E.db.sle.dt.guild.hide_gmotd then
 			line = tooltip:AddLine()
@@ -274,7 +277,7 @@ function LDB.OnEnter(self)

 			if not E.db.sle.dt.guild.minimize_gmotd then
 				line = tooltip:AddLine()
-				tooltip:SetCell(line, 1, "|cff00ff00"..GetGuildRosterMOTD().."|r", "LEFT", 0, nil, nil, nil, 100)
+				tooltip:SetCell(line, 1, "|cff00ff00"..T.GetGuildRosterMOTD().."|r", "LEFT", 0, nil, nil, nil, 100)
 			end

 			tooltip:AddLine(" ")
@@ -282,7 +285,7 @@ function LDB.OnEnter(self)

 		local ssGuildName
 		if not E.db.sle.dt.guild.hide_guildname then
-			ssGuildName = GetGuildInfo("player")
+			ssGuildName = T.GetGuildInfo("player")
 		else
 			ssGuildName = _G.GUILD
 		end
@@ -315,9 +318,9 @@ function LDB.OnEnter(self)

 			tooltip:AddSeparator()

-			for i = 1, GetNumGuildMembers() do
-				local toonName, rank, rankindex, level, class, zoneName, note, onote, connected, status, classFileName, achievementPoints, achievementRank, isMobile = GetGuildRosterInfo(i)
-				local toonShortName, toonRealm = string.split("-", toonName)
+			for i = 1, T.GetNumGuildMembers() do
+				local toonName, rank, rankindex, level, class, zoneName, note, onote, connected, status, classFileName, achievementPoints, achievementRank, isMobile = T.GetGuildRosterInfo(i)
+				local toonShortName, toonRealm = T.split("-", toonName)
 				if MyRealm == toonRealm then toonName = toonShortName end
 				if connected or isMobile then
 					if note and note ~= '' then note="|cff00ff00["..note.."]|r" end
@@ -336,7 +339,7 @@ function LDB.OnEnter(self)
 						zoneName = "Remote Chat"
 					end

-					table.insert(guild_table, {
+					T.tinsert(guild_table, {
 						TOONNAME = toonName,
 						RANK = rank,
 						RANKINDEX = rankindex,
@@ -350,21 +353,21 @@ function LDB.OnEnter(self)
 				end
 			end

-			table.sort(guild_table, list_sort[E.db.sle.dt.guild["sortGuild"]])
+			T.sort(guild_table, list_sort[E.db.sle.dt.guild["sortGuild"]])

-			for _, player in ipairs(guild_table) do
+			for _, player in T.ipairs(guild_table) do
 					line = tooltip:AddLine()
 					line = tooltip:SetCell(line, 1, ColoredLevel(player["LEVEL"]))
 					line = tooltip:SetCell(line, 2, player["STATUS"])
 					line = tooltip:SetCell(line, 3,
-						string.format("|cff%s%s", CLASS_COLORS[player["CLASS"]] or "ffffff", player["TOONNAME"] .. "|r") .. (inGroup(player["TOONNAME"]) and GROUP_CHECKMARK or ""))
+						T.format("|cff%s%s", CLASS_COLORS[player["CLASS"]] or "ffffff", player["TOONNAME"] .. "|r") .. (inGroup(player["TOONNAME"]) and GROUP_CHECKMARK or ""))
 					line = tooltip:SetCell(line, 5, player["ZONENAME"] or "???")
 					line = tooltip:SetCell(line, 6, player["RANK"])
 					if not E.db.sle.dt.guild.hide_guild_onotes then
 						line = tooltip:SetCell(line, 7, player["NOTE"] .. player["ONOTE"])
 					end

-					tooltip:SetLineScript(line, "OnMouseUp", Entry_OnMouseUp, string.format("guild:%s:%s", player["TOONNAME"], player["TOONNAME"]))
+					tooltip:SetLineScript(line, "OnMouseUp", Entry_OnMouseUp, T.format("guild:%s:%s", player["TOONNAME"], player["TOONNAME"]))
 			end
 		end
 		tooltip:AddLine(" ")
@@ -382,20 +385,20 @@ function LDB.OnEnter(self)
 		if not E.db.sle.dt.guild.minimize_hintline then
 			line = tooltip:AddLine()
 			tooltip:SetCell(line, 1, "", "LEFT", 1)
-			tooltip:SetCell(line, 2, "|cffeda55fLeft Click|r to open the guild panel.", "LEFT", 3)
-			tooltip:SetCell(line, 5, "|cffeda55fRight Click|r to open configuration panel.", "LEFT", 3)
+			tooltip:SetCell(line, 2, L["|cffeda55fLeft Click|r to open the guild panel."], "LEFT", 3)
+			tooltip:SetCell(line, 5, L["|cffeda55fRight Click|r to open configuration panel."], "LEFT", 3)
 			line = tooltip:AddLine()
 			tooltip:SetCell(line, 1, "", "LEFT", 1)
-			tooltip:SetCell(line, 2, "|cffeda55fLeft Click|r a line to whisper a player.", "LEFT", 3)
-			tooltip:SetCell(line, 5, "|cffeda55fShift+Left Click|r a line to lookup a player.", "LEFT", 3)--
+			tooltip:SetCell(line, 2, L["|cffeda55fLeft Click|r a line to whisper a player."], "LEFT", 3)
+			tooltip:SetCell(line, 5, L["|cffeda55fShift+Left Click|r a line to lookup a player."], "LEFT", 3)--
 			line = tooltip:AddLine()
 			tooltip:SetCell(line, 1, "", "LEFT", 1)
-			tooltip:SetCell(line, 2, "|cffeda55fCtrl+Left Click|r a line to edit note.", "LEFT", 3)
-			tooltip:SetCell(line, 5, "|cffeda55fCtrl+Right Click|r a line to edit officer note.", "LEFT", 3)
+			tooltip:SetCell(line, 2, L["|cffeda55fCtrl+Left Click|r a line to edit note."], "LEFT", 3)
+			tooltip:SetCell(line, 5, L["|cffeda55fCtrl+Right Click|r a line to edit officer note."], "LEFT", 3)
 			line = tooltip:AddLine()
 			tooltip:SetCell(line, 1, "", "LEFT", 1)
-			tooltip:SetCell(line, 2, "|cffeda55fAlt+Left Click|r a line to invite.", "LEFT", 3)--
-			tooltip:SetCell(line, 5, "|cffeda55fLeft Click|r a Header to hide it or sort it.", "LEFT", 3)--
+			tooltip:SetCell(line, 2, L["|cffeda55fAlt+Left Click|r a line to invite."], "LEFT", 3)--
+			tooltip:SetCell(line, 5, L["|cffeda55fLeft Click|r a Header to hide it or sort it."], "LEFT", 3)--
 		end
 	end

@@ -417,7 +420,7 @@ frame:SetScript("OnUpdate", function (self, elapse)

 	if elapsed >= DELAY then
 		elapsed = 0
-		DT:update_Guild()
+		DTP:update_Guild()
 	end
 end)

diff --git a/ElvUI_SLE/modules/sledatatexts/intellect.lua b/ElvUI_SLE/modules/sledatatexts/intellect.lua
index 32a26ce..0be7737 100644
--- a/ElvUI_SLE/modules/sledatatexts/intellect.lua
+++ b/ElvUI_SLE/modules/sledatatexts/intellect.lua
@@ -1,21 +1,21 @@
-local E, L, V, P, G = unpack(ElvUI)
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local DT = E:GetModule('DataTexts')
-
+local INTELLECT_COLON = INTELLECT_COLON
 local displayNumberString = ''
 local lastPanel

 local function OnEvent(self, event, ...)
-	self.text:SetFormattedText(displayNumberString, INTELLECT_COLON, select(2, UnitStat("player", 4)))
+	self.text:SetFormattedText(displayNumberString, INTELLECT_COLON, T.select(2, T.UnitStat("player", 4)))
 	lastPanel = self
 end

 local function ValueColorUpdate(hex, r, g, b)
-	displayNumberString = strjoin("", "%s ", hex, "%.f|r")
+	displayNumberString = T.join("", "%s ", hex, "%.f|r")

 	if lastPanel ~= nil then
 		OnEvent(lastPanel)
 	end
 end
-E['valueColorUpdateFuncs'][ValueColorUpdate] = true
+E["valueColorUpdateFuncs"][ValueColorUpdate] = true

 DT:RegisterDatatext('Intellect', { "UNIT_STATS", "UNIT_AURA", "FORGE_MASTER_ITEM_CHANGED", "ACTIVE_TALENT_GROUP_CHANGED", "PLAYER_TALENT_UPDATE"}, OnEvent)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/sledatatexts/itemlevel.lua b/ElvUI_SLE/modules/sledatatexts/itemlevel.lua
index 7fb704a..19a419b 100644
--- a/ElvUI_SLE/modules/sledatatexts/itemlevel.lua
+++ b/ElvUI_SLE/modules/sledatatexts/itemlevel.lua
@@ -1,10 +1,11 @@
-local E, L, V, P, G = unpack(ElvUI)
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local DT = E:GetModule('DataTexts')
-
+local HEADSLOT, NECKSLOT, SHOULDERSLOT, BACKSLOT, CHESTSLOT, WRISTSLOT, HANDSSLOT, WAISTSLOT, LEGSSLOT, FEETSLOT, FINGER0SLOT_UNIQUE, FINGER1SLOT_UNIQUE, TRINKET0SLOT_UNIQUE, TRINKET1SLOT_UNIQUE, MAINHANDSLOT, SECONDARYHANDSLOT = HEADSLOT, NECKSLOT, SHOULDERSLOT, BACKSLOT, CHESTSLOT, WRISTSLOT, HANDSSLOT, WAISTSLOT, LEGSSLOT, FEETSLOT, FINGER0SLOT_UNIQUE, FINGER1SLOT_UNIQUE, TRINKET0SLOT_UNIQUE, TRINKET1SLOT_UNIQUE, MAINHANDSLOT, SECONDARYHANDSLOT
 local displayString = ''
 local lastPanel
-local floor = floor
-local GetInventoryItemLink, GetInventorySlotInfo = GetInventoryItemLink, GetInventorySlotInfo
+local ITEM_LEVEL_ABBR = ITEM_LEVEL_ABBR
+local GMSURVEYRATING3 = GMSURVEYRATING3
+local TOTAL = TOTAL

 local slots = {
 	[1] = { "HeadSlot", HEADSLOT },
@@ -183,23 +184,35 @@ local heirlooms = {
 		105692, --Hellscream's Decapitator (Heroic)
 		105693, --Hellscream's Shield Wall (Heroic)
 	},
+	[100] = {
+		133585, --Judgment of the Naaru
+		133595, --Gronntooth War Horn
+		133596, --Orb of Voidsight
+		133597, --Infallible Tracking Charm
+		133598, --Purified Shard of the Third Moon
+	},
 }

 local function HeirLoomLevel(itemLink)
-	local ItemID, _, _, _, _, _, _, _, level = strmatch(itemLink, '|Hitem:(%d+):(%d+):(%d+):(%d+):(%d+):(%d+):(%d+):(%d+):(%d+)')
-	ItemID, level = tonumber(ItemID), tonumber(level)
-	for _, ID in pairs(heirlooms[90]) do
+	local ItemID, _, _, _, _, _, _, _, level = T.match(itemLink, '|Hitem:(%d+):(%d*):(%d*):(%d*):(%d*):(%d*):(%d*):(%d*):(%d*)')
+	ItemID, level = T.tonumber(ItemID), T.tonumber(level)
+	for _, ID in pairs(heirlooms[100]) do
+		if ID == ItemID then
+			return (715 + (10 * (level - 100)));
+		end
+	end
+	for _, ID in T.pairs(heirlooms[90]) do
 		if ID == ItemID then
-			return select(4, GetItemInfo(itemLink))
+			return T.select(4, T.GetItemInfo(itemLink))
 		end
 	end
-	for _, ID in pairs(heirlooms[85]) do
+	for _, ID in T.pairs(heirlooms[85]) do
 		if ID == ItemID and level > 85 then
 			level = 85
 			break
 		end
 	end
-	for _, ID in pairs(heirlooms[80]) do
+	for _, ID in T.pairs(heirlooms[80]) do
 		if ID == ItemID and level > 80 then
 			level = 80
 			break
@@ -217,12 +230,26 @@ local function HeirLoomLevel(itemLink)
 	end
 end

+local function ArtifactLevel(itemLink)
+	local itemLevel = select(4, T.GetItemInfo(itemLink));
+	for i = 1, 3 do
+		local relicLink = select(4, C_ArtifactUI.GetEquippedArtifactRelicInfo(i));
+		if (relicLink and T.match(relicLink, "item:")) then
+			itemLevel = itemLevel + C_ArtifactUI.GetItemLevelIncreaseProvidedByRelic(relicLink);
+		end
+	end
+
+	return itemLevel;
+end
+
 local function GetItemLevel(itemLink)
-	local rarity, itemLevel = select(3, GetItemInfo(itemLink))
-	if rarity == 7 then
+	local rarity, itemLevel = T.select(3, T.GetItemInfo(itemLink))
+	if rarity == 6 then
+		itemLevel = ArtifactLevel(itemLink);
+	elseif rarity == 7 then
 		itemLevel = HeirLoomLevel(itemLink)
 	end
-	local upgrade = strmatch(itemLink, ":(%d+)\124h%[")
+	local upgrade = T.match(itemLink, ":(%d+)\124h%[")
 	if itemLevel and upgrade and levelAdjust[upgrade] then
 		itemLevel = itemLevel + levelAdjust[upgrade]
 	end
@@ -230,19 +257,19 @@ local function GetItemLevel(itemLink)
 end

 local function OnEvent(self)
-	self.avgItemLevel, self.avgEquipItemLevel = GetAverageItemLevel()
-	self.text:SetFormattedText(displayString, ITEM_LEVEL_ABBR, floor(self.avgEquipItemLevel), floor(self.avgItemLevel))
+	self.avgItemLevel, self.avgEquipItemLevel = T.GetAverageItemLevel()
+	self.text:SetFormattedText(displayString, ITEM_LEVEL_ABBR, T.floor(self.avgEquipItemLevel), T.floor(self.avgItemLevel))
 end

 local function OnEnter(self)
 	local avgItemLevel, avgEquipItemLevel = self.avgItemLevel, self.avgEquipItemLevel
-
+	local itemLevel
 	DT:SetupTooltip(self)
-	DT.tooltip:AddDoubleLine(TOTAL, floor(avgItemLevel), 1, 1, 1, 0, 1, 0)
-	DT.tooltip:AddDoubleLine(GMSURVEYRATING3, floor(avgEquipItemLevel), 1, 1, 1, 0, 1, 0)
+	DT.tooltip:AddDoubleLine(TOTAL, T.floor(avgItemLevel), 1, 1, 1, 0, 1, 0)
+	DT.tooltip:AddDoubleLine(GMSURVEYRATING3, T.floor(avgEquipItemLevel), 1, 1, 1, 0, 1, 0)
 	DT.tooltip:AddLine(" ")
 	for i = 1, 16 do
-		local itemLink = GetInventoryItemLink("player", GetInventorySlotInfo(slots[i][1]))
+		local itemLink = T.GetInventoryItemLink("player", T.GetInventorySlotInfo(slots[i][1]))
 		if itemLink then
 			itemLevel = GetItemLevel(itemLink)
 			if itemLevel and avgEquipItemLevel then
@@ -255,7 +282,7 @@ local function OnEnter(self)
 end

 local function ValueColorUpdate(hex, r, g, b)
-	displayString = string.join("", "|cffffffff%s:|r", " ", hex, "%d / %d|r")
+	displayString = T.join("", "|cffffffff%s:|r", " ", hex, "%d / %d|r")
 	if lastPanel ~= nil then OnEvent(lastPanel) end
 end
 E["valueColorUpdateFuncs"][ValueColorUpdate] = true
diff --git a/ElvUI_SLE/modules/sledatatexts/lfr.lua b/ElvUI_SLE/modules/sledatatexts/lfr.lua
deleted file mode 100755
index f90f877..0000000
--- a/ElvUI_SLE/modules/sledatatexts/lfr.lua
+++ /dev/null
@@ -1,702 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
---LFR boss status calculations--
-local DT = E:GetModule('DataTexts')
-
-local GetLFGDungeonEncounterInfo = GetLFGDungeonEncounterInfo
-local AddLine = AddLine
-local AddDoubleLine = AddDoubleLine
-local GetMapNameByID = GetMapNameByID
-local bossName, _, isKilled, isIneligible
-local twipe = table.wipe
-
---For 4 boss raid
-local function FourKill(id)
-	local killNum = 0
-	for i =1,4 do
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	if killNum == 4 then
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/4", RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
-	else
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/4", GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b)
-	end
-end
-
-local function FourShift(id)
-	for i =1,4 do --1st part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif (isIneligible) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-end
-
---For 6 boss raid
-local function SixKill(id1, id2)
-	local killNum = 0
-	for i =1,3 do --1st part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id1, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	for i =4,6 do --2nd part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id2, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	if killNum == 6 then
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/6", RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
-	else
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/6", GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b)
-	end
-end
-
-local function SixShift(id1, id2)
-	for i =1,3 do --1st part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id1, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif ( isIneligible ) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	for i =4,6 do --2nd part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id2, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif (isIneligible) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-end
-
---For 7 boss raid
-local function SevenKill(id1, id2, id3)
-	local killNum = 0
-	for i =1,3 do --1st part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id1, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	for i =4,6 do --2nd part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id2, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-
-	-- 3rd part
-	_, _, isKilled = GetLFGDungeonEncounterInfo(id3, 7);
-	if (isKilled) then
-		killNum = killNum+1;
-	end
-
-	if killNum == 7 then
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/7", RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
-	else
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/7", GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b)
-	end
-end
-
-local function SevenShift(id1, id2, id3)
-	for i =1,3 do --1st part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id1, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif ( isIneligible ) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	for i =4,6 do --2nd part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id2, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif (isIneligible) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	-- 3rd part
-	bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id3, 7);
-	if (isKilled) then
-		DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-	elseif ( isIneligible ) then
-		DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-	else
-		DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-	end
-end
-
---For 8 boss raid
-local function EightKill(id1, id2)
-	local killNum = 0
-	for i =1,4 do --1st part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id1, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	for i =5,8 do --2nd part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id2, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	if killNum == 8 then
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/8", RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
-	else
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/8", GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b)
-	end
-end
-
-local function EightShift(id1, id2)
-	for i =1,4 do --1st part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id1, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif (isIneligible) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	for i =5,8 do --2nd part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id2, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif (isIneligible) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-end
-
---For 10 boss raid
-local function TenKill(id1, id2, id3, id4)
-	local killNum = 0
-	local bosses = {} --cause fuck blizz ordering
-	--1st part
-	bosses = {1, 2, 7}
-	for i =1, #bosses do
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id1, bosses[i]);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	twipe(bosses)
-	--2nd part
-	bosses = {3, 5, 8}
-	for i =1, #bosses do
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id2, bosses[i]);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	twipe(bosses)
-	--3rd part
-	bosses = {4, 6, 9}
-	for i =1, #bosses do
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id3, bosses[i]);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-
-	-- 4th part
-	_, _, isKilled = GetLFGDungeonEncounterInfo(id4, 10);
-	if (isKilled) then
-		killNum = killNum + 1
-	end
-	if killNum == 10 then
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/10", RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
-	else
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/10", GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b)
-	end
-end
-
-local function TenShift(id1, id2, id3, id4)
-
-	local bosses = {} --cause fuck blizz ordering
-	--1st part
-	bosses = {1, 2, 7}
-	for i =1, #bosses do
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id1, bosses[i]);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif ( isIneligible ) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	twipe(bosses)
-	--2nd part
-	bosses = {3, 5, 8}
-	for i =1, #bosses do
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id2, bosses[i]);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif (isIneligible) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	twipe(bosses)
-	--3rd part
-	bosses = {4, 6, 9}
-	for i =1, #bosses do
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id3, bosses[i]);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif (isIneligible) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	--4th part
-	bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id4, 10);
-	if (isKilled) then
-		DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-	elseif (isIneligible) then
-		DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-	else
-		DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-	end
-end
-
---For 12 boss raid
-local function TwelveKill(id1, id2, id3, id4)
-	local killNum = 0
-	for i =1,3 do --1st part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id1, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	for i =4,6 do --2nd part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id2, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	for i =7,9 do --3rd part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id3, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	for i =10,12 do --4th part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id4, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	if killNum == 12 then
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/12", RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
-	else
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/12", GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b)
-	end
-end
-
-local function TwelveShift(id1, id2, id3, id4)
-	for i =1,3 do --1st part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id1, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif ( isIneligible ) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	for i =4,6 do --2nd part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id2, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif (isIneligible) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	for i =7,9 do --3rd part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id3, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif (isIneligible) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	for i =10,12 do --4th part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id4, i);
-		if bossName then
-			if (isKilled) then
-				DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-			elseif (isIneligible) then
-				DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-			else
-				DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-			end
-		end
-	end
-end
-
---For 13 boss raid (HFC)
-local function HFCKill(id1, id2, id3, id4, id5)
-	local killNum = 0
-	for i =1,3 do --1st part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id1, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	for i =4,6 do --2nd part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id2, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	for i =7,9 do --3rd part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id3, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	for i =10,12 do --4th part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id4, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	_, _, isKilled = GetLFGDungeonEncounterInfo(id5, 13);
-	if (isKilled) then
-		killNum = killNum + 1
-	end
-	if killNum == 13 then
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/13", RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
-	else
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/13", GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b)
-	end
-end
-
-local function HFCShift(id1, id2, id3, id4, id5)
-	for i =1,3 do --1st part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id1, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif ( isIneligible ) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	for i =4,6 do --2nd part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id2, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif (isIneligible) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	for i =7,9 do --3rd part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id3, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif (isIneligible) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	for i =10,12 do --4th part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id4, i);
-		if bossName then
-			if (isKilled) then
-				DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-			elseif (isIneligible) then
-				DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-			else
-				DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-			end
-		end
-	end
-	bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id5, 13);
-		if bossName then
-			if (isKilled) then
-				DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-			elseif (isIneligible) then
-				DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-			else
-				DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-			end
-		end
-end
-
---For 14 boss raid
-local function FourteenKill(id1, id2, id3, id4)
-	local killNum = 0
-	for i =1,4 do --1st part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id1, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	for i =5,8 do --2nd part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id2, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	for i =9,11 do --3rd part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id3, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	for i =12,14 do --4th part
-		_, _, isKilled = GetLFGDungeonEncounterInfo(id4, i);
-		if (isKilled) then
-			killNum = killNum + 1
-		end
-	end
-	if killNum == 14 then
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/14", RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
-	else
-		DT.tooltip:AddLine(" "..L["Bosses killed: "]..killNum.."/14", GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b)
-	end
-end
-
-local function FourteenShift(id1, id2, id3, id4)
-	for i =1,4 do --1st part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id1, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif (isIneligible) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	for i =5,8 do --2nd part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id2, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif (isIneligible) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	for i =9,11 do --3rd part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id3, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif (isIneligible) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-	for i =12,14 do --4th part
-		bossName, _, isKilled, isIneligible = GetLFGDungeonEncounterInfo(id4, i);
-		if (isKilled) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_DEAD, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b, RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b);
-		elseif (isIneligible) then
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE_INELIGIBLE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		else
-			DT.tooltip:AddDoubleLine(" "..bossName, BOSS_ALIVE, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b, GREEN_FONT_COLOR.r, GREEN_FONT_COLOR.g, GREEN_FONT_COLOR.b);
-		end
-	end
-end
-
-local function DragonSoul(id1, id2)
-	if IsShiftKeyDown() then
-		EightShift(id1, id2)
-	else
-		EightKill(id1, id2)
-	end
-end
-
-local function Mogushan(id1, id2)
-	if IsShiftKeyDown() then
-		SixShift(id1, id2)
-	else
-		SixKill(id1, id2)
-	end
-end
-
-local function HoF(id1, id2)
-	if IsShiftKeyDown() then
-		SixShift(id1, id2)
-	else
-		SixKill(id1, id2)
-	end
-end
-
-local function ToES(id)
-	if IsShiftKeyDown() then
-		FourShift(id)
-	else
-		FourKill(id)
-	end
-end
-
-local function ToT(id1, id2, id3, id4)
-	if IsShiftKeyDown() then
-		TwelveShift(id1, id2, id3, id4)
-	else
-		TwelveKill(id1, id2, id3, id4)
-	end
-end
-
-local function SoO(id1, id2, id3, id4)
-	if IsShiftKeyDown() then
-		FourteenShift(id1, id2, id3, id4)
-	else
-		FourteenKill(id1, id2, id3, id4)
-	end
-end
-
-local function HM(id1, id2, id3)
-	if IsShiftKeyDown() then
-		SevenShift(id1, id2, id3);
-	else
-		SevenKill(id1, id2, id3);
-	end
-end
-
-local function BRF(id1, id2, id3, id4)
-	if IsShiftKeyDown() then
-		TenShift(id1, id2, id3, id4);
-	else
-		TenKill(id1, id2, id3, id4);
-	end
-end
-
-local function HFC(id1, id2, id3, id4, id5)
-	if IsShiftKeyDown() then
-		HFCShift(id1, id2, id3, id4, id5);
-	else
-		HFCKill(id1, id2, id3, id4, id5);
-	end
-end
-
-function DT:LFRShow()
-	local lvl = UnitLevel("player")
-	local ilvl = GetAverageItemLevel()
-	DT.tooltip:AddLine(" ")
-	DT.tooltip:AddLine(RAID_FINDER.." / "..L["Raid Saves"])
-	if E.db.sle.lfrshow.ds then
-		DT.tooltip:AddLine(" "..GetMapNameByID(824))
-		if lvl == 85 and ilvl >= 372 then
-			DragonSoul(416, 417)
-		else
-			DT.tooltip:AddLine(" "..L["This LFR isn't available for your level/gear."])
-		end
-		DT.tooltip:AddLine(" ")
-	end
-		if E.db.sle.lfrshow.mv then
-		DT.tooltip:AddLine(" "..GetMapNameByID(896))
-		if lvl == 90 and ilvl >= 460 then
-			Mogushan(527, 528)
-		else
-			DT.tooltip:AddLine(" "..L["This LFR isn't available for your level/gear."])
-		end
-		DT.tooltip:AddLine(" ")
-	end
-
-	if E.db.sle.lfrshow.hof then
-			DT.tooltip:AddLine(" "..GetMapNameByID(897))
-		if lvl == 90 and ilvl >= 470 then
-			HoF(529, 530)
-		else
-			DT.tooltip:AddLine(" "..L["This LFR isn't available for your level/gear."])
-		end
-		DT.tooltip:AddLine(" ")
-	end
-
-	if E.db.sle.lfrshow.toes then
-		DT.tooltip:AddLine(" "..GetMapNameByID(886))
-		if lvl == 90 and ilvl >= 470 then
-			ToES(526)
-		else
-			DT.tooltip:AddLine(" "..L["This LFR isn't available for your level/gear."])
-		end
-		DT.tooltip:AddLine(" ")
-	end
-
-	if E.db.sle.lfrshow.tot then
-		DT.tooltip:AddLine(" "..GetMapNameByID(930))
-		if lvl == 90 and ilvl >= 480 then
-			ToT(610, 611, 612, 613)
-		else
-			DT.tooltip:AddLine(" "..L["This LFR isn't available for your level/gear."])
-		end
-		DT.tooltip:AddLine(" ")
-	end
-
-	if E.db.sle.lfrshow.soo then
-		DT.tooltip:AddLine(" "..GetMapNameByID(953))
-		if lvl == 90 and ilvl >= 496 then
-			SoO(716, 717, 724, 725)
-		else
-			DT.tooltip:AddLine(" "..L["This LFR isn't available for your level/gear."])
-		end
-		DT.tooltip:AddLine(" ")
-	end
-
-	if E.db.sle.lfrshow.hm then
-		DT.tooltip:AddLine(" "..GetMapNameByID(994))
-		if lvl == 100 and ilvl >= 615 then
-			HM(849, 850, 851);
-		else
-			DT.tooltip:AddLine(" "..L["This LFR isn't available for your level/gear."])
-		end
-	end
-
-	if E.db.sle.lfrshow.brf then
-		DT.tooltip:AddLine(" "..GetMapNameByID(988))
-		if lvl == 100 and ilvl >= 635 then
-			BRF(847, 846, 848, 823)
-		else
-			DT.tooltip:AddLine(" "..L["This LFR isn't available for your level/gear."])
-		end
-	end
-
-	if E.db.sle.lfrshow.hfc then
-		DT.tooltip:AddLine(" "..GetMapNameByID(1026))
-		if lvl == 100 and ilvl >= 650 then
-			HFC(982, 983, 984, 985, 986)
-		else
-			DT.tooltip:AddLine(" "..L["This LFR isn't available for your level/gear."])
-		end
-	end
-
-	if not E.db.sle.lfrshow.ds and not E.db.sle.lfrshow.mv and not E.db.sle.lfrshow.hof and not E.db.sle.lfrshow.toes and not E.db.sle.lfrshow.tot and not E.db.sle.lfrshow.soo and not E.db.sle.lfrshow.hm and not E.db.sle.lfrshow.brf and not E.db.sle.lfrshow.hfc then
-		DT.tooltip:AddLine(" "..L["You didn't select any instance to track."])
-	end
-end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/sledatatexts/load_datatexts.xml b/ElvUI_SLE/modules/sledatatexts/load_datatexts.xml
index ad43dd1..989c242 100644
--- a/ElvUI_SLE/modules/sledatatexts/load_datatexts.xml
+++ b/ElvUI_SLE/modules/sledatatexts/load_datatexts.xml
@@ -7,7 +7,6 @@
 	<Script file='energyregen.lua'/>
 	<Script file='intellect.lua'/>
 	<Script file='stamina.lua'/>
-	<Script file='spirit.lua'/>
 	<Script file='time.lua'/>
 	<Script file='friends.lua'/>
 	<Script file='guild.lua'/>
diff --git a/ElvUI_SLE/modules/sledatatexts/mail.lua b/ElvUI_SLE/modules/sledatatexts/mail.lua
index 215a03b..066b7bc 100644
--- a/ElvUI_SLE/modules/sledatatexts/mail.lua
+++ b/ElvUI_SLE/modules/sledatatexts/mail.lua
@@ -1,9 +1,14 @@
-local E, L, V, P, G = unpack(ElvUI);
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local DT = E:GetModule('DataTexts')
+local DTP = SLE:GetModule('Datatexts')
+local HAVE_MAIL_FROM = HAVE_MAIL_FROM

-local Mail_Icon = "|TInterface\\MINIMAP\\TRACKING\\Mailbox.blp:14:14|t";
-local OldShow = MiniMapMailFrame.Show
-
+local Mail_Icon = [[|TInterface\MINIMAP\TRACKING\Mailbox.blp:14:14|t]];
+local frame = MiniMapMailFrame
+local OldShow = frame.Show
+local HasNewMail = HasNewMail
+local GetInboxNumItems = GetInboxNumItems
+local GetLatestThreeSenders = GetLatestThreeSenders
 local Read;
 local AddLine = AddLine

@@ -14,52 +19,53 @@ local function MakeIconString()
 	return str
 end

-function DT:SLEmailUp(newmail)
+function DTP:MailUp(newmail)
 	if not E.db.sle.dt.mail.icon then
-		MiniMapMailFrame:Hide()
-		MiniMapMailFrame.Show = nil
+		frame:Hide()
+		frame.Show = nil
 	else
-		if not MiniMapMailFrame.Show then
-			MiniMapMailFrame.Show = OldShow
+		if not frame.Show then
+			frame.Show = OldShow
 		end
 		if newmail then
-			MiniMapMailFrame:Show()
+			frame:Show()
 		end
 	end
 end

+local unreadMail
 local function OnEvent(self, event, ...)
 	local newMail = false
-
+
 	if event == "UPDATE_PENDING_MAIL" or event == "PLAYER_ENTERING_WORLD" or event =="PLAYER_LOGIN" then
-
+
 		newMail = HasNewMail()
-
+
 		if unreadMail ~= newMail then
 			unreadMail = newMail
 		end
-
-		DT:SLEmailUp(newmail)
-
+
+		DTP:MailUp(newMail)
+
 		self:UnregisterEvent("PLAYER_ENTERING_WORLD")
 		self:UnregisterEvent("PLAYER_LOGIN")
 	end
-
+
 	if event == "MAIL_INBOX_UPDATE" or event == "MAIL_SHOW" or event == "MAIL_CLOSED" then
 		for i = 1, GetInboxNumItems() do
-			local _, _, _, _, _, _, _, _, wasRead = GetInboxHeaderInfo(i);
+			local _, _, _, _, _, _, _, _, wasRead = T.GetInboxHeaderInfo(i);
 			if( not wasRead ) then
 				newMail = true;
 				break;
 			end
 		end
 	end
-
+
 	if newMail then
-		self.text:SetText(MakeIconString().."New Mail")
+		self.text:SetText(MakeIconString()..L["New Mail"])
 		Read = false;
 	else
-		self.text:SetText("No Mail")
+		self.text:SetText(L["No Mail"])
 		Read = true;
 	end

@@ -74,15 +80,16 @@ local function OnEnter(self)
 	DT:SetupTooltip(self)

 	local sender1, sender2, sender3 = GetLatestThreeSenders()
-
-	if not Read then
+
+	if not Read then
 		DT.tooltip:AddLine(HAVE_MAIL_FROM)
 		if sender1 then DT.tooltip:AddLine("    "..sender1) end
 		if sender2 then DT.tooltip:AddLine("    "..sender2) end
 		if sender3 then DT.tooltip:AddLine("    "..sender3) end
-
 	end
 	DT.tooltip:Show()
 end

-DT:RegisterDatatext('S&L Mail', {'PLAYER_ENTERING_WORLD', 'MAIL_INBOX_UPDATE', 'UPDATE_PENDING_MAIL', 'MAIL_CLOSED', 'PLAYER_LOGIN','MAIL_SHOW'}, OnEvent, OnUpdate, nil, OnEnter)
\ No newline at end of file
+function DTP:CreateMailDT()
+	DT:RegisterDatatext('S&L Mail', {'PLAYER_ENTERING_WORLD', 'MAIL_INBOX_UPDATE', 'UPDATE_PENDING_MAIL', 'MAIL_CLOSED', 'PLAYER_LOGIN','MAIL_SHOW'}, OnEvent, OnUpdate, nil, OnEnter)
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/sledatatexts/played.lua b/ElvUI_SLE/modules/sledatatexts/played.lua
index 62601ec..0e1be9c 100644
--- a/ElvUI_SLE/modules/sledatatexts/played.lua
+++ b/ElvUI_SLE/modules/sledatatexts/played.lua
@@ -1,37 +1,44 @@
-local E, L, V, P, G = unpack(ElvUI);
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local DT = E:GetModule('DataTexts')
-
-local format, GetTime, ChatFrame_TimeBreakDown, InCombatLockdown = format, GetTime, ChatFrame_TimeBreakDown, InCombatLockdown
+--GLOBALS: ElvDB
+local ChatFrame_TimeBreakDown = ChatFrame_TimeBreakDown
 local PlayedTimeFormatFull = '%d '..L["D"]..' %02d:%02d:%02d'
 local PlayedTimeFormatNoDay = '%02d:%02d:%02d'
 local TotalPlayTime, LevelPlayTime, SessionPlayTime, LevelPlayedOffset, LastLevelTime
 local MyRealm = E.myrealm
 local MyName = E.myname
 local MyClass = E.myclass
-local AddLine, AddDoubleLine = AddLine, AddDoubleLine
+local TIME_PLAYED_MSG = TIME_PLAYED_MSG
+local LEVEL = LEVEL
+local TOTAL = TOTAL
+local MAX_PLAYER_LEVEL = MAX_PLAYER_LEVEL
+local RAID_CLASS_COLORS = RAID_CLASS_COLORS
+local RequestTimePlayed = RequestTimePlayed
+local IsShiftKeyDown = IsShiftKeyDown
+local LevelPlayTimeOffset

 local OnEnter = function(self)
-	if not InCombatLockdown() and SessionPlayTime then
+	if not T.InCombatLockdown() and SessionPlayTime then
 	DT:SetupTooltip(self)
-		local SessionDay, SessionHour, SessionMinute, SessionSecond = ChatFrame_TimeBreakDown(GetTime() - SessionPlayTime)
-		local TotalDay, TotalHour, TotalMinute, TotalSecond = ChatFrame_TimeBreakDown(TotalPlayTime + (GetTime() - SessionPlayTime))
-		local LevelDay, LevelHour, LevelMinute, LevelSecond = ChatFrame_TimeBreakDown(LevelPlayTime + (GetTime() - LevelPlayTimeOffset))
+		local SessionDay, SessionHour, SessionMinute, SessionSecond = ChatFrame_TimeBreakDown(T.GetTime() - SessionPlayTime)
+		local TotalDay, TotalHour, TotalMinute, TotalSecond = ChatFrame_TimeBreakDown(TotalPlayTime + (T.GetTime() - SessionPlayTime))
+		local LevelDay, LevelHour, LevelMinute, LevelSecond = ChatFrame_TimeBreakDown(LevelPlayTime + (T.GetTime() - LevelPlayTimeOffset))
 		local LastLevelDay, LastLevelHour, LastLevelMinute, LastLevelSecond = ChatFrame_TimeBreakDown(LastLevelTime)
 		DT.tooltip:ClearLines()
 		DT.tooltip:AddLine(TIME_PLAYED_MSG, 1, 1, 1)
 		DT.tooltip:AddLine(' ')
-		DT.tooltip:AddDoubleLine(L["Session:"], SessionDay > 0 and format(PlayedTimeFormatFull, SessionDay, SessionHour, SessionMinute, SessionSecond) or format(PlayedTimeFormatNoDay, SessionHour, SessionMinute, SessionSecond), 1, 1, 1, 1, 1, 1)
+		DT.tooltip:AddDoubleLine(L["Session:"], SessionDay > 0 and T.format(PlayedTimeFormatFull, SessionDay, SessionHour, SessionMinute, SessionSecond) or T.format(PlayedTimeFormatNoDay, SessionHour, SessionMinute, SessionSecond), 1, 1, 1, 1, 1, 1)
 		if LastLevelSecond > 0 then
-			DT.tooltip:AddDoubleLine(L["Previous Level:"], LastLevelDay > 0 and format(PlayedTimeFormatFull, LastLevelDay. LastLevelHour, LastLevelMinute, LastLevelSecond) or format(PlayedTimeFormatNoDay, LastLevelHour, LastLevelMinute, LastLevelSecond), 1, 1, 1, 1, 1, 1)
+			DT.tooltip:AddDoubleLine(L["Previous Level:"], LastLevelDay > 0 and T.format(PlayedTimeFormatFull, LastLevelDay. LastLevelHour, LastLevelMinute, LastLevelSecond) or T.format(PlayedTimeFormatNoDay, LastLevelHour, LastLevelMinute, LastLevelSecond), 1, 1, 1, 1, 1, 1)
 		end
-		DT.tooltip:AddDoubleLine(LEVEL..':', LevelDay > 0 and format(PlayedTimeFormatFull, LevelDay, LevelHour, LevelMinute, LevelSecond) or format(PlayedTimeFormatNoDay, LevelHour, LevelMinute, LevelSecond), 1, 1, 1, 1, 1, 1)
-		DT.tooltip:AddDoubleLine(TOTAL..':', TotalDay > 0 and format(PlayedTimeFormatFull, TotalDay, TotalHour, TotalMinute, TotalSecond) or format(PlayedTimeFormatNoDay, TotalHour, TotalMinute, TotalSecond), 1, 1, 1, 1, 1, 1)
+		DT.tooltip:AddDoubleLine(LEVEL..':', LevelDay > 0 and T.format(PlayedTimeFormatFull, LevelDay, LevelHour, LevelMinute, LevelSecond) or T.format(PlayedTimeFormatNoDay, LevelHour, LevelMinute, LevelSecond), 1, 1, 1, 1, 1, 1)
+		DT.tooltip:AddDoubleLine(TOTAL..':', TotalDay > 0 and T.format(PlayedTimeFormatFull, TotalDay, TotalHour, TotalMinute, TotalSecond) or T.format(PlayedTimeFormatNoDay, TotalHour, TotalMinute, TotalSecond), 1, 1, 1, 1, 1, 1)
 		DT.tooltip:AddLine(' ')
 		DT.tooltip:AddLine(L["Account Time Played"], 1, 1, 1)
 		DT.tooltip:AddLine(' ')
 		local Class, Level, AccountDay, AccountHour, AccountMinute, AccountSecond, TotalAccountTime
-		for player, subtable in pairs(ElvDB['sle']['TimePlayed'][MyRealm]) do
-			for k, v in pairs(subtable) do
+		for player, subtable in T.pairs(ElvDB["sle"]["TimePlayed"][MyRealm]) do
+			for k, v in T.pairs(subtable) do
 				if k == 'TotalTime' then
 					AccountDay, AccountHour, AccountMinute, AccountSecond = ChatFrame_TimeBreakDown(v)
 					TotalAccountTime = (TotalAccountTime or 0) + v
@@ -40,11 +47,11 @@ local OnEnter = function(self)
 				if k == 'Level' then Level = v end
 			end
 			local color = RAID_CLASS_COLORS[Class]
-			DT.tooltip:AddDoubleLine(format('%s |cFFFFFFFF- %s %d', player, LEVEL, Level), format(PlayedTimeFormatFull, AccountDay, AccountHour, AccountMinute, AccountSecond), color.r, color.g, color.b, 1, 1, 1)
+			DT.tooltip:AddDoubleLine(T.format('%s |cFFFFFFFF- %s %d', player, LEVEL, Level), T.format(PlayedTimeFormatFull, AccountDay, AccountHour, AccountMinute, AccountSecond), color.r, color.g, color.b, 1, 1, 1)
 		end
 		DT.tooltip:AddLine(' ')
 		local TotalAccountDay, TotalAccountHour, TotalAccountMinute, TotalAccountSecond = ChatFrame_TimeBreakDown(TotalAccountTime)
-		DT.tooltip:AddDoubleLine(TOTAL, format(PlayedTimeFormatFull, TotalAccountDay, TotalAccountHour, TotalAccountMinute, TotalAccountSecond), 1, 0, 1, 1, 1, 1)
+		DT.tooltip:AddDoubleLine(TOTAL, T.format(PlayedTimeFormatFull, TotalAccountDay, TotalAccountHour, TotalAccountMinute, TotalAccountSecond), 1, 0, 1, 1, 1, 1)
 		DT.tooltip:AddLine(' ')
 		DT.tooltip:AddLine(L["Reset Data: Hold Shift + Right Click"])
 		DT.tooltip:Show()
@@ -56,17 +63,17 @@ local OnUpdate = function(self, elapsed)
 	ElapsedTimer = ElapsedTimer + elapsed
 	if (not self.text) then
 		local text = self:CreateFontString(nil, 'OVERLAY')
-		text:SetFont(DataText.Font, DataText.Size, DataText.Flags)
+		text:FontTemplate()
 		text:SetText(TIME_PLAYED_MSG)
 		self.text = text
 	end

 	if TotalPlayTime and LevelPlayTime and SessionPlayTime then
 		local Day, Hour, Minute, Second
-		if UnitLevel('player') ~= MAX_PLAYER_LEVEL then
-			Day, Hour, Minute, Second = ChatFrame_TimeBreakDown(LevelPlayTime + (GetTime() - LevelPlayTimeOffset))
+		if T.UnitLevel('player') ~= MAX_PLAYER_LEVEL then
+			Day, Hour, Minute, Second = ChatFrame_TimeBreakDown(LevelPlayTime + (T.GetTime() - LevelPlayTimeOffset))
 		else
-			Day, Hour, Minute, Second = ChatFrame_TimeBreakDown(TotalPlayTime + (GetTime() - SessionPlayTime))
+			Day, Hour, Minute, Second = ChatFrame_TimeBreakDown(TotalPlayTime + (T.GetTime() - SessionPlayTime))
 		end
 		if Day > 0 then
 			self.text:SetFormattedText('%d '..L["D"]..' %02d:%02d', Day, Hour, Minute)
@@ -82,32 +89,32 @@ local OnUpdate = function(self, elapsed)
 end

 local OnEvent = function(self, event, ...)
-	if not ElvDB['sle'] then ElvDB['sle'] = {} end
-	if not ElvDB['sle']['TimePlayed'] then ElvDB['sle']['TimePlayed'] = {} end
-	if not ElvDB['sle']['TimePlayed'][MyRealm] then ElvDB['sle']['TimePlayed'][MyRealm] = {} end
-	if not ElvDB['sle']['TimePlayed'][MyRealm][MyName] then ElvDB['sle']['TimePlayed'][MyRealm][MyName] = {} end
-	ElvDB['sle']['TimePlayed'][MyRealm][MyName]['Class'] = MyClass
-	ElvDB['sle']['TimePlayed'][MyRealm][MyName]['Level'] = UnitLevel('player')
-	LastLevelTime = ElvDB['sle']['TimePlayed'][MyRealm][MyName]['LastLevelTime'] or 0
+	if not ElvDB["sle"] then ElvDB["sle"] = {} end
+	if not ElvDB["sle"]["TimePlayed"] then ElvDB["sle"]["TimePlayed"] = {} end
+	if not ElvDB["sle"]["TimePlayed"][MyRealm] then ElvDB["sle"]["TimePlayed"][MyRealm] = {} end
+	if not ElvDB["sle"]["TimePlayed"][MyRealm][MyName] then ElvDB["sle"]["TimePlayed"][MyRealm][MyName] = {} end
+	ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["Class"] = MyClass
+	ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["Level"] = T.UnitLevel('player')
+	LastLevelTime = ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["LastLevelTime"] or 0
 	if event == 'TIME_PLAYED_MSG' then
 		local TotalTime, LevelTime = ...
 		TotalPlayTime = TotalTime
 		LevelPlayTime = LevelTime
-		if SessionPlayTime == nil then SessionPlayTime = GetTime() end
-		LevelPlayTimeOffset = GetTime()
-		ElvDB['sle']['TimePlayed'][MyRealm][MyName]['TotalTime'] = TotalTime
-		ElvDB['sle']['TimePlayed'][MyRealm][MyName]['LevelTime'] = LevelTime
+		if SessionPlayTime == nil then SessionPlayTime = T.GetTime() end
+		LevelPlayTimeOffset = T.GetTime()
+		ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["TotalTime"] = TotalTime
+		ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["LevelTime"] = LevelTime
 	end
 	if event == 'PLAYER_LEVEL_UP' then
-		LastLevelTime = floor(LevelPlayTime + (GetTime() - LevelPlayTimeOffset))
-		ElvDB['sle']['TimePlayed'][MyRealm][MyName]['LastLevelTime'] = LastLevelTime
+		LastLevelTime = T.floor(LevelPlayTime + (T.GetTime() - LevelPlayTimeOffset))
+		ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["LastLevelTime"] = LastLevelTime
 		LevelPlayTime = 1
-		LevelPlayTimeOffset = GetTime()
-		ElvDB['sle']['TimePlayed'][MyRealm][MyName]['Level'] = UnitLevel('player')
+		LevelPlayTimeOffset = T.GetTime()
+		ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["Level"] = T.UnitLevel('player')
 	end
 	if event == 'PLAYER_ENTERING_WORLD' then
 		self:UnregisterEvent(event)
-		if not IsAddOnLoaded('DataStore_Characters') then
+		if not T.IsAddOnLoaded('DataStore_Characters') then
 			RequestTimePlayed()
 		end
 	end
@@ -117,13 +124,13 @@ local OnEvent = function(self, event, ...)
 end

 local function Reset()
-	ElvDB['sle']['TimePlayed'][MyRealm] = {}
-	ElvDB['sle']['TimePlayed'][MyRealm][MyName] = {}
-	ElvDB['sle']['TimePlayed'][MyRealm][MyName]['Level'] = UnitLevel('player')
-	ElvDB['sle']['TimePlayed'][MyRealm][MyName]['LastLevelTime'] = LastLevelTime
-	ElvDB['sle']['TimePlayed'][MyRealm][MyName]['Class'] = MyClass
+	ElvDB["sle"]["TimePlayed"][MyRealm] = {}
+	ElvDB["sle"]["TimePlayed"][MyRealm][MyName] = {}
+	ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["Level"] = T.UnitLevel('player')
+	ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["LastLevelTime"] = LastLevelTime
+	ElvDB["sle"]["TimePlayed"][MyRealm][MyName]["Class"] = MyClass
 	RequestTimePlayed()
-	print(': Time Played has been reset!')
+	T.print(': Time Played has been reset!')
 end

 local OnMouseDown = function(self, button)
diff --git a/ElvUI_SLE/modules/sledatatexts/range.lua b/ElvUI_SLE/modules/sledatatexts/range.lua
index f90b2b9..212421b 100644
--- a/ElvUI_SLE/modules/sledatatexts/range.lua
+++ b/ElvUI_SLE/modules/sledatatexts/range.lua
@@ -1,6 +1,6 @@
-local E, L, V, P, G = unpack(ElvUI)
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local DT = E:GetModule('DataTexts')
-
+local SPELL_FAILED_BAD_IMPLICIT_TARGETS = SPELL_FAILED_BAD_IMPLICIT_TARGETS
 local RC = LibStub("LibRangeCheck-2.0")
 local displayString = ''
 local lastPanel
@@ -23,7 +23,7 @@ local function OnUpdate(self, t)
 	curMax = max

 	if min and max then
-		self.text:SetFormattedText(displayString, "Range", min, max)
+		self.text:SetFormattedText(displayString, L["Range"], min, max)
 	else
 		self.text:SetText(SPELL_FAILED_BAD_IMPLICIT_TARGETS)
 	end
@@ -32,7 +32,7 @@ local function OnUpdate(self, t)
 end

 local function OnEvent(self, event)
-	updateTargetRange = UnitName("target") ~= nil
+	updateTargetRange = T.UnitName("target") ~= nil
 	int = 0
 	if updateTargetRange then
 		forceUpdate = true
@@ -42,7 +42,7 @@ local function OnEvent(self, event)
 end

 local function ValueColorUpdate(hex, r, g, b)
-	displayString = string.join("", "%s: ", hex, "%d|r-", hex, "%d|r")
+	displayString = T.join("", "%s: ", hex, "%d|r-", hex, "%d|r")

 	if lastPanel ~= nil then
 		OnEvent(lastPanel)
diff --git a/ElvUI_SLE/modules/sledatatexts/regen.lua b/ElvUI_SLE/modules/sledatatexts/regen.lua
index 07da3cc..87f803b 100644
--- a/ElvUI_SLE/modules/sledatatexts/regen.lua
+++ b/ElvUI_SLE/modules/sledatatexts/regen.lua
@@ -1,28 +1,28 @@
-local E, L, V, P, G = unpack(ElvUI);
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local DT = E:GetModule('DataTexts')
-
+local MANA_REGEN = MANA_REGEN
 local displayNumberString = ''
 local lastPanel;
-local join = string.join
+local GetManaRegen = GetManaRegen

 local function OnEvent(self, event, unit)
 	local baseMR, castingMR = GetManaRegen()
-	if InCombatLockdown() then
-		self.text:SetFormattedText(displayNumberString, "MP5", castingMR*5)
+	if T.InCombatLockdown() then
+		self.text:SetFormattedText(displayNumberString, E.db.sle.dt.regen.short and "Mp5" or MANA_REGEN, castingMR*5)
 	else
-		self.text:SetFormattedText(displayNumberString, "MP5", baseMR*5)
+		self.text:SetFormattedText(displayNumberString, E.db.sle.dt.regen.short and "Mp5" or MANA_REGEN, baseMR*5)
 	end

 	lastPanel = self
 end

 local function ValueColorUpdate(hex, r, g, b)
-	displayNumberString = join("", "%s: ", hex, "%.2f|r")
+	displayNumberString = T.join("", "%s: ", hex, "%.2f|r")

 	if lastPanel ~= nil then
 		OnEvent(lastPanel)
 	end
 end
-E['valueColorUpdateFuncs'][ValueColorUpdate] = true
+E["valueColorUpdateFuncs"][ValueColorUpdate] = true

-DT:RegisterDatatext('MP5', {"UNIT_STATS", "UNIT_AURA", "FORGE_MASTER_ITEM_CHANGED", "ACTIVE_TALENT_GROUP_CHANGED", "PLAYER_TALENT_UPDATE"}, OnEvent)
\ No newline at end of file
+DT:RegisterDatatext('Mana Regen', {"UNIT_STATS", "UNIT_AURA", "FORGE_MASTER_ITEM_CHANGED", "ACTIVE_TALENT_GROUP_CHANGED", "PLAYER_TALENT_UPDATE"}, OnEvent)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/sledatatexts/spirit.lua b/ElvUI_SLE/modules/sledatatexts/spirit.lua
deleted file mode 100644
index 3a4eaf8..0000000
--- a/ElvUI_SLE/modules/sledatatexts/spirit.lua
+++ /dev/null
@@ -1,21 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI)
-local DT = E:GetModule('DataTexts')
-
-local displayNumberString = ''
-local lastPanel
-
-local function OnEvent(self, event, ...)
-	self.text:SetFormattedText(displayNumberString, SPIRIT_COLON, select(2, UnitStat("player", 5)))
-	lastPanel = self
-end
-
-local function ValueColorUpdate(hex, r, g, b)
-	displayNumberString = strjoin("", "%s ", hex, "%.f|r")
-
-	if lastPanel ~= nil then
-		OnEvent(lastPanel)
-	end
-end
-E['valueColorUpdateFuncs'][ValueColorUpdate] = true
-
-DT:RegisterDatatext('Spirit', { "UNIT_STATS", "UNIT_AURA", "FORGE_MASTER_ITEM_CHANGED", "ACTIVE_TALENT_GROUP_CHANGED", "PLAYER_TALENT_UPDATE"}, OnEvent)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/sledatatexts/stamina.lua b/ElvUI_SLE/modules/sledatatexts/stamina.lua
index c295cc0..18ab361 100644
--- a/ElvUI_SLE/modules/sledatatexts/stamina.lua
+++ b/ElvUI_SLE/modules/sledatatexts/stamina.lua
@@ -1,21 +1,21 @@
-local E, L, V, P, G = unpack(ElvUI)
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local DT = E:GetModule('DataTexts')
-
+local STAMINA_COLON = STAMINA_COLON
 local displayNumberString = ''
 local lastPanel

 local function OnEvent(self, event, ...)
-	self.text:SetFormattedText(displayNumberString, STAMINA_COLON, select(2, UnitStat("player", 3)))
+	self.text:SetFormattedText(displayNumberString, STAMINA_COLON, T.select(2, T.UnitStat("player", 3)))
 	lastPanel = self
 end

 local function ValueColorUpdate(hex, r, g, b)
-	displayNumberString = strjoin("", "%s ", hex, "%.f|r")
+	displayNumberString = T.join("", "%s ", hex, "%.f|r")

 	if lastPanel ~= nil then
 		OnEvent(lastPanel)
 	end
 end
-E['valueColorUpdateFuncs'][ValueColorUpdate] = true
+E["valueColorUpdateFuncs"][ValueColorUpdate] = true

 DT:RegisterDatatext('Stamina', { "UNIT_STATS", "UNIT_AURA", "FORGE_MASTER_ITEM_CHANGED", "ACTIVE_TALENT_GROUP_CHANGED", "PLAYER_TALENT_UPDATE"}, OnEvent)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/sledatatexts/strength.lua b/ElvUI_SLE/modules/sledatatexts/strength.lua
index d05c3e8..e4b25c8 100644
--- a/ElvUI_SLE/modules/sledatatexts/strength.lua
+++ b/ElvUI_SLE/modules/sledatatexts/strength.lua
@@ -1,21 +1,21 @@
-local E, L, V, P, G = unpack(ElvUI)
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local DT = E:GetModule('DataTexts')
-
+local STRENGTH_COLON = STRENGTH_COLON
 local displayNumberString = ''
 local lastPanel

 local function OnEvent(self, event, ...)
-	self.text:SetFormattedText(displayNumberString, STRENGTH_COLON, select(2, UnitStat("player", 1)))
+	self.text:SetFormattedText(displayNumberString, STRENGTH_COLON, T.select(2, T.UnitStat("player", 1)))
 	lastPanel = self
 end

 local function ValueColorUpdate(hex, r, g, b)
-	displayNumberString = strjoin("", "%s ", hex, "%.f|r")
+	displayNumberString = T.join("", "%s ", hex, "%.f|r")

 	if lastPanel ~= nil then
 		OnEvent(lastPanel)
 	end
 end
-E['valueColorUpdateFuncs'][ValueColorUpdate] = true
+E["valueColorUpdateFuncs"][ValueColorUpdate] = true

 DT:RegisterDatatext('Strength', { "UNIT_STATS", "UNIT_AURA", "FORGE_MASTER_ITEM_CHANGED", "ACTIVE_TALENT_GROUP_CHANGED", "PLAYER_TALENT_UPDATE"}, OnEvent)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/sledatatexts/time.lua b/ElvUI_SLE/modules/sledatatexts/time.lua
index b495ba3..a4e5b67 100644
--- a/ElvUI_SLE/modules/sledatatexts/time.lua
+++ b/ElvUI_SLE/modules/sledatatexts/time.lua
@@ -1,206 +1,46 @@
-local E, L, V, P, G = unpack(ElvUI);
---Replacement of Elv's time datatext with some additions
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local DT = E:GetModule('DataTexts')
+local DTP = SLE:GetModule('Datatexts')
+local LFR = SLE:GetModule("LFR")

-local format = string.format
-local join = string.join
-local floor = math.floor
-local wipe = table.wipe
-
-local APM = { TIMEMANAGER_PM, TIMEMANAGER_AM }
-local europeDisplayFormat = '';
-local ukDisplayFormat = '';
-local europeDisplayFormat_nocolor = join("", "%02d", ":|r%02d")
-local ukDisplayFormat_nocolor = join("", "", "%d", ":|r%02d", " %s|r")
-local timerLongFormat = "%d:%02d:%02d"
-local timerShortFormat = "%d:%02d"
-local lockoutInfoFormat = "%s%s |cffaaaaaa(%s, %s/%s)"
-local lockoutInfoFormatNoEnc = "%s%s |cffaaaaaa(%s)"
-local formatBattleGroundInfo = "%s: "
-local lockoutColorExtended, lockoutColorNormal = { r=0.3,g=1,b=0.3 }, { r=.8,g=.8,b=.8 }
-local lockoutFormatString = { "%dd %02dh %02dm", "%dd %dh %02dm", "%02dh %02dm", "%dh %02dm", "%dh %02dm", "%dm" }
-local curHr, curMin, curAmPm
+function DTP:HookTimeDT()
 local enteredFrame = false;

-local level = UnitLevel("player")
-
-local Update, lastPanel; -- UpValue
-local localizedName, isActive, canQueue, startTime, canEnter
-local name, reset, locked, extended, isRaid, maxPlayers, difficulty, numEncounters, encounterProgress
-
-local function ValueColorUpdate(hex, r, g, b)
-	europeDisplayFormat = join("", "%02d", hex, ":|r%02d")
-	ukDisplayFormat = join("", "", "%d", hex, ":|r%02d", hex, " %s|r")
-
-	if lastPanel ~= nil then
-		Update(lastPanel, 20000)
+local function OnEnter(self)
+	if(not enteredFrame) then
+		enteredFrame = true;
 	end
-end
-E['valueColorUpdateFuncs'][ValueColorUpdate] = true
-
-local function ConvertTime(h, m)
-	local AmPm
-	if E.db.datatexts.time24 == true then
-		return h, m, -1
-	else
-		if h >= 12 then
-			if h > 12 then h = h - 12 end
-			AmPm = 1
-		else
-			if h == 0 then h = 12 end
-			AmPm = 2
-		end
+	if LFR.db.enabled then
+		LFR:Show()
 	end
-	return h, m, AmPm
-end
-
-local function CalculateTimeValues(tooltip)
-	if (tooltip and E.db.datatexts.localtime) or (not tooltip and not E.db.datatexts.localtime) then
-		return ConvertTime(GetGameTime())
-	else
-		local	dateTable =	date("*t")
-		return ConvertTime(dateTable["hour"], dateTable["min"])
-	end
-end
-
-local function CalculateTimeLeft(time)
-	local hour = floor(time / 3600)
-	local min = floor(time / 60 - (hour*60))
-	local sec = time - (hour * 3600) - (min * 60)
-
-	return hour, min, sec
-end
-
-local function Click()
-	GameTimeFrame:Click();
+	DT.tooltip:Show()
 end

 local function OnLeave(self)
-	DT.tooltip:Hide();
 	enteredFrame = false;
 end

-local function OnEvent()
+local function OnEvent(self, event)
 	if event == "UPDATE_INSTANCE_INFO" and enteredFrame then
-		RequestRaidInfo()
-	end
-end
-
-local function OnEnter(self)
-	DT:SetupTooltip(self)
-
-	if(not enteredFrame) then
-		enteredFrame = true;
-		RequestRaidInfo()
-	end
-
-	DT.tooltip:AddLine(VOICE_CHAT_BATTLEGROUND);
-	for i = 1, GetNumWorldPVPAreas() do
-		_, localizedName, isActive, canQueue, startTime, canEnter = GetWorldPVPAreaInfo(i)
-		if canEnter then
-			if isActive then
-				startTime = WINTERGRASP_IN_PROGRESS
-			elseif startTime == nil then
-				startTime = QUEUE_TIME_UNAVAILABLE
-			else
-				startTime = SecondsToTime(startTime, false, nil, 3)
-			end
-			DT.tooltip:AddDoubleLine(format(formatBattleGroundInfo, localizedName), startTime, 1, 1, 1, lockoutColorNormal.r, lockoutColorNormal.g, lockoutColorNormal.b)
-		end
-	end
-
-	--LFR lockout text
-	if E.db.sle.lfrshow.enabled then
-		DT:LFRShow()
-	end
-
-	local oneraid, lockoutColor
-	for i = 1, GetNumSavedInstances() do
-		name, _, reset, difficultyId, locked, extended, _, isRaid, maxPlayers, difficulty, numEncounters, encounterProgress  = GetSavedInstanceInfo(i)
-		if isRaid and (locked or extended) and name then
-			if not oneraid then
-				DT.tooltip:AddLine(" ")
-				DT.tooltip:AddLine(L["Saved Raid(s)"])
-				oneraid = true
-			end
-			if extended then
-				lockoutColor = lockoutColorExtended
-			else
-				lockoutColor = lockoutColorNormal
-			end
-
-			local _, _, isHeroic, _, displayHeroic, displayMythic = GetDifficultyInfo(difficultyId)
-			if (numEncounters and numEncounters > 0) and (encounterProgress and encounterProgress > 0) then
-				DT.tooltip:AddDoubleLine(format(lockoutInfoFormat, maxPlayers, (displayMythic and "M" or (isHeroic or displayHeroic) and "H" or "N"), name, encounterProgress, numEncounters), SecondsToTime(reset, false, nil, 3), 1, 1, 1, lockoutColor.r, lockoutColor.g, lockoutColor.b)
-			else
-				DT.tooltip:AddDoubleLine(format(lockoutInfoFormatNoEnc, maxPlayers, (displayMythic and "M" or (isHeroic or displayHeroic) and "H" or "N"), name), SecondsToTime(reset, false, nil, 3), 1, 1, 1, lockoutColor.r, lockoutColor.g, lockoutColor.b)
-			end
-		end
-	end
-
-	local addedLine = false
-	for i = 1, GetNumSavedWorldBosses() do
-		name, instanceID, reset = GetSavedWorldBossInfo(i)
-		if(reset) then
-			if(not addedLine) then
-				DT.tooltip:AddLine(' ')
-				DT.tooltip:AddLine(RAID_INFO_WORLD_BOSS.."(s)")
-				addedLine = true
-			end
-			DT.tooltip:AddDoubleLine(name, SecondsToTime(reset, true, nil, 3), 1, 1, 1, 0.8, 0.8, 0.8)
-		end
+		OnEnter(self)
 	end
-
-	local timeText
-	local Hr, Min, AmPm = CalculateTimeValues(true)
-
-	DT.tooltip:AddLine(" ")
-	if AmPm == -1 then
-		DT.tooltip:AddDoubleLine(E.db.datatexts.localtime and TIMEMANAGER_TOOLTIP_REALMTIME or TIMEMANAGER_TOOLTIP_LOCALTIME,
-		format(europeDisplayFormat_nocolor, Hr, Min), 1, 1, 1, lockoutColorNormal.r, lockoutColorNormal.g, lockoutColorNormal.b)
-	else
-		DT.tooltip:AddDoubleLine(E.db.datatexts.localtime and TIMEMANAGER_TOOLTIP_REALMTIME or TIMEMANAGER_TOOLTIP_LOCALTIME,
-		format(ukDisplayFormat_nocolor, Hr, Min, APM[AmPm]), 1, 1, 1, lockoutColorNormal.r, lockoutColorNormal.g, lockoutColorNormal.b)
-	end
-
-	DT.tooltip:Show()
 end

 local int = 3
-function Update(self, t)
+local function OnUpdate(self, t)
 	int = int - t
-
+
 	if int > 0 then return end
-
-	if GameTimeFrame.flashInvite then
-		E:Flash(self, 0.53, true)
-	else
-		E:StopFlash(self)
-	end

 	if enteredFrame then
 		OnEnter(self)
 	end
-
-	local Hr, Min, AmPm = CalculateTimeValues(false)
-
-	-- no update quick exit
-	if (Hr == curHr and Min == curMin and AmPm == curAmPm) and not (int < -15000) then
-		int = 5
-		return
-	end

-	curHr = Hr
-	curMin = Min
-	curAmPm = AmPm
-
-	if AmPm == -1 then
-		self.text:SetFormattedText(europeDisplayFormat, Hr, Min)
-	else
-		self.text:SetFormattedText(ukDisplayFormat, Hr, Min, APM[AmPm])
-	end
-	lastPanel = self
 	int = 5
 end

-DT:RegisterDatatext('Time', {"UPDATE_INSTANCE_INFO"}, OnEvent, Update, Click, OnEnter, OnLeave)
\ No newline at end of file
+hooksecurefunc(DT.RegisteredDataTexts["Time"], 'onEnter', OnEnter)
+hooksecurefunc(DT.RegisteredDataTexts["Time"], 'onLeave', OnLeave)
+hooksecurefunc(DT.RegisteredDataTexts["Time"], 'onUpdate', OnUpdate)
+hooksecurefunc(DT.RegisteredDataTexts["Time"], 'eventFunc', OnEvent)
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/sledatatexts/version.lua b/ElvUI_SLE/modules/sledatatexts/version.lua
index e85970c..9eda63a 100644
--- a/ElvUI_SLE/modules/sledatatexts/version.lua
+++ b/ElvUI_SLE/modules/sledatatexts/version.lua
@@ -1,45 +1,37 @@
-local E, L, V, P, G = unpack(ElvUI);
---Version datatext. Only in Russian for now.
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local DT = E:GetModule('DataTexts')
-local SLE = E:GetModule('SLE')
-local ACD = LibStub("AceConfigDialog-3.0-ElvUI")
-
+local GAME_VERSION_LABEL = GAME_VERSION_LABEL
 local displayString = '';
 local lastPanel;
 local self = lastPanel
-local join = string.join
-local AddLine = AddLine
-local AddDoubleLine =AddDoubleLine
-local Eversion = E.version
-local format = format

 local function OnEvent(self, event, ...)
-	self.text:SetFormattedText(displayString, 'ElvUI v', Eversion, SLE.version);
+	self.text:SetFormattedText(displayString, 'ElvUI v', E.version, SLE.version);
 end

 local function Click()
 	ElvConfigToggle:Click();
-	ACD:SelectGroup("ElvUI", "sle")
+	SLE.ACD:SelectGroup("ElvUI", "sle")
 end

 local function OnEnter(self)
 	DT:SetupTooltip(self)

-	DT.tooltip:AddDoubleLine("ElvUI "..GAME_VERSION_LABEL..format(": |cff99ff33%s|r", Eversion))
-	DT.tooltip:AddLine(L["SLE_AUTHOR_INFO"]..". "..GAME_VERSION_LABEL..format(": |cff99ff33%s|r", SLE.version))
+	DT.tooltip:AddDoubleLine("ElvUI "..GAME_VERSION_LABEL..T.format(": |cff99ff33%s|r", E.version))
+	DT.tooltip:AddLine(L["SLE_AUTHOR_INFO"]..". "..GAME_VERSION_LABEL..T.format(": |cff99ff33%s|r", SLE.version))
 	DT.tooltip:AddLine(" ")
-	DT.tooltip:AddLine(L['SLE_CONTACTS'])
-
+	DT.tooltip:AddLine(L["SLE_CONTACTS"])
+
 	DT.tooltip:Show()
 end

 local function ValueColorUpdate(hex, r, g, b)
-	displayString = join("", "%s", hex, "%s|r", " : Shadow & Light v", hex, "%s|r")
+	displayString = T.join("", "%s", hex, "%s|r", " : Shadow & Light v", hex, "%s|r")

 	if lastPanel ~= nil then
 		OnEvent(lastPanel)
 	end
 end
-E['valueColorUpdateFuncs'][ValueColorUpdate] = true
+E["valueColorUpdateFuncs"][ValueColorUpdate] = true

 DT:RegisterDatatext("Version", {'PLAYER_ENTERING_WORLD'}, OnEvent, Update, Click, OnEnter)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/threat.lua b/ElvUI_SLE/modules/threat.lua
deleted file mode 100644
index abf952b..0000000
--- a/ElvUI_SLE/modules/threat.lua
+++ /dev/null
@@ -1,35 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local SLT = E:GetModule('SLE_Threat');
-local T = E:GetModule('Threat');
-
-function SLT:UpdatePosition()
-	if not E.db.general.threat.enable or not E.db.sle.threat.enable then return end
-
-	T.bar:SetInside(E.db.sle.threat.position)
-	T.bar:SetParent(E.db.sle.threat.position)
-
-	T.bar.text:FontTemplate(nil, E.db.general.threat.textSize)
-	T.bar:SetFrameStrata('MEDIUM')
-	T.bar:SetAlpha(1)
-end
-
-local function LoadConfig(event, addon)
-	if addon ~= "ElvUI_Config" then return end
-
-	SLT:Update()
-	SLT:UnregisterEvent("ADDON_LOADED")
-end
-
-function SLT:Update()
-	if E.db.sle.threat.enable then
-		E.Options.args.general.args.threat.args.position.disabled = function() return true end
-	else
-		E.Options.args.general.args.threat.args.position.disabled = function() return false end
-	end
-end
-
-function SLT:Initialize()
-	hooksecurefunc(T, 'UpdatePosition', SLT.UpdatePosition)
-	SLT:RegisterEvent("ADDON_LOADED", LoadConfig)
-	SLT:UpdatePosition()
-end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/toolbars.lua b/ElvUI_SLE/modules/toolbars.lua
new file mode 100644
index 0000000..af8512f
--- /dev/null
+++ b/ElvUI_SLE/modules/toolbars.lua
@@ -0,0 +1,719 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local B = LibStub("LibBabble-SubZone-3.0")
+local BL = B:GetLookupTable()
+local S = E:GetModule("Skins")
+local Tools = SLE:NewModule("Toolbars", 'AceHook-3.0', 'AceEvent-3.0')
+
+local SeedAnchor, ToolAnchor, PortalAnchor, SalvageAnchor, MineAnchor
+local farmzones = { BL["Sunsong Ranch"], BL["The Halfhill Market"] }
+local garrisonzones = { BL["Salvage Yard"], BL["Frostwall Mine"], BL["Lunarfall Excavation"]}
+local size
+local Zcheck = false
+local playerFaction = T.UnitFactionGroup('player')
+local _G = _G
+local GameTooltip = GameTooltip
+local ActionButton_ShowOverlayGlow, ActionButton_HideOverlayGlow = ActionButton_ShowOverlayGlow, ActionButton_HideOverlayGlow
+local PickupContainerItem, DeleteCursorItem = PickupContainerItem, DeleteCursorItem
+
+
+--MoP Farm
+Tools.Seeds = {
+	--Seeds general
+	[79102] = { 1 }, -- Green Cabbage
+	[89328] = { 1 }, -- Jade Squash
+	[80590] = { 1 }, -- Juicycrunch Carrot
+	[80592] = { 1 }, -- Mogu Pumpkin
+	[80594] = { 1 }, -- Pink Turnip
+	[80593] = { 1 }, -- Red Blossom Leek
+	[80591] = { 1 }, -- Scallion
+	[89329] = { 1 }, -- Striped Melon
+	[80595] = { 1 }, -- White Turnip
+	[89326] = { 1 }, -- Witchberry
+	--Bags general
+	[80809] = { 2 }, -- Green Cabbage
+	[89848] = { 2 }, -- Jade Squash
+	[84782] = { 2 }, -- Juicycrunch Carrot
+	[85153] = { 2 }, -- Mogu Pumpkin
+	[85162] = { 2 }, -- Pink Turnip
+	[85158] = { 2 }, -- Red Blossom Leek
+	[84783] = { 2 }, -- Scallion
+	[89849] = { 2 }, -- Striped Melon
+	[85163] = { 2 }, -- White Turnip
+	[89847] = { 2 }, -- Witchberry
+	--Seeds special
+	[85216] = { 3 }, -- Enigma
+	[85217] = { 3 }, -- Magebulb
+	[85219] = { 3 }, -- Ominous
+	[89202] = { 3 }, -- Raptorleaf
+	[85215] = { 3 }, -- Snakeroot
+	[89233] = { 3 }, -- Songbell
+	[91806] = { 3 }, -- Unstable Portal
+	[89197] = { 3 }, -- Windshear Cactus
+	--Bags special
+	[95449] = { 4 }, -- Enigma
+	[95451] = { 4 }, -- Magebulb
+	[95457] = { 4 }, -- Raptorleaf
+	[95447] = { 4 }, -- Snakeroot
+	[95445] = { 4 }, -- Songbell
+	[95454] = { 4 }, -- Windshear Cactus
+	--Trees lol
+	[85267] = { 5 }, -- Autumn Blossom Sapling
+	[85268] = { 5 }, -- Spring Blossom Sapling
+	[85269] = { 5 }, -- Winter Blossom Sapling
+}
+Tools.AddSeeds = {
+	[95434] = { 80809 }, -- Green Cabbage
+	[95437] = { 89848 }, -- Jade Squash
+	[95436] = { 84782 }, -- Juicycrunch Carrot
+	[95438] = { 85153 }, -- Mogu Pumpkin
+	[95439] = { 85162 }, -- Pink Turnip
+	[95440] = { 85158 }, -- Red Blossom Leek
+	[95441] = { 84783 }, -- Scallion
+	[95442] = { 89849 }, -- Striped Melon
+	[95443] = { 85163 }, -- White Turnip
+	[95444] = { 89847 }, -- Witchberry
+
+	[95450] = { 95449 }, -- Enigma
+	[95452] = { 95451 }, -- Magebulb
+	[95458] = { 95457 }, -- Raptorleaf
+	[95448] = { 95447 }, -- Snakeroot
+	[95446] = { 95445 }, -- Songbell
+	[95456] = { 95454 }, -- Windshear Cactus
+}
+Tools.FarmTools = {
+	[79104]	= { 1 }, -- Rusy Watering Can
+	[80513] = { 1 }, -- Vintage Bug Sprayer
+	[89880] = { 1 }, -- Dented Shovel
+	[89815] = { 1 }, -- Master Plow
+}
+Tools.FarmPortals = {
+	[91850] = { "Horde" }, -- Orgrimmar Portal Shard
+	[91861] = { "Horde" }, -- Thunder Bluff Portal Shard
+	[91862] = { "Horde" }, -- Undercity Portal Shard
+	[91863] = { "Horde" }, -- Silvermoon Portal Shard
+
+	[91860] = { "Alliance" }, -- Stormwind Portal Shard
+	[91864] = { "Alliance" }, -- Ironforge Portal Shard
+	[91865] = { "Alliance" }, -- Darnassus Portal Shard
+	[91866] = { "Alliance" }, -- Exodar Portal Shard
+}
+Tools.FarmQuests = {
+	--Tillers counsil
+	[31945] = {80591, 84783}, -- Gina, Scallion
+	[31946] = {80590, 84782}, -- Mung-Mung, Juicycrunch Carrot
+	[31947] = {79102, 80809}, -- Farmer Fung, Green Cabbage
+	[31949] = {89326, 89847}, -- Nana, Witchberry
+	[30527] = {89329, 89849}, -- Haohan, Striped Melon
+	--Farmer Yoon
+	[31943] = {89326, 89847}, -- Witchberry
+	[31942] = {89329, 89849}, -- Striped Melon
+	[31941] = {89328, 89848}, -- Jade Squash
+	[31669] = {79102, 80809}, -- Green Cabbage
+	[31670] = {80590, 84782}, -- Juicycrunch Carrot
+	[31672] = {80592, 85153}, -- Mogu Pumpkin
+	[31673] = {80593, 85158}, -- Red Blossom Leek
+	[31674] = {80594, 85162}, -- Pink Turnip
+	[31675] = {80595, 85163}, -- White Turnip
+	[31671] = {80591, 84783}, -- Scallion
+	--Work Orders
+	[32645] = {89326, 89847}, -- Witchberry (Alliance Only)
+	[32653] = {89329, 89849}, -- Striped Melon
+	--[31941] = {89328, 89848}, -- Jade Squash
+	[32649] = {79102, 80809}, -- Green Cabbage
+	--[31670] = {80590, 84782}, -- Juicycrunch Carrot
+	[32658] = {80592, 85153}, -- Mogu Pumpkin
+	[32642] = {80593, 85158}, -- Red Blossom Leek (Horde Only)
+	--[31674] = {80594, 85162}, -- Pink Turnip
+	[32647] = {80595, 85163}, -- White Turnip
+	--[31671] = {80591, 84783}, -- Scallion
+}
+Tools.FseedButtons = {}
+Tools.FtoolButtons = {}
+Tools.FportalButtons = {}
+
+
+--WoD Garrison
+Tools.Salvage = {
+	[114116] = { 1 }, -- Bag of Salvaged Goods
+	[114119] = { 1 }, -- Crate of Salvage
+	[114120] = { 1 }, -- Big Crate of Salvage
+}
+Tools.GarMine = {
+	[118903] = { 1 }, -- Minepick
+	[118897] = { 1 }, -- Coffee
+}
+Tools.GsalvageButtons = {}
+Tools.GminingButtons = {}
+
+Tools.buttoncounts = {} --To kepp number of itams
+Tools.Bars = {
+	["SeedBars"] = {},
+}
+
+local function CanSeed()
+	-- local subzone = T.GetSubZoneText()
+	-- for _, zone in T.ipairs(farmzones) do
+		-- if (zone == subzone) then
+			-- return true
+		-- end
+	-- end
+	-- return false
+	return true
+end
+
+local function OnFarm()
+	return T.GetSubZoneText() == farmzones[1]
+end
+
+local function InSalvageYard()
+	return T.GetMinimapZoneText() == garrisonzones[1]
+end
+
+local function InMine()
+	return T.GetMinimapZoneText() == garrisonzones[playerFaction == "Horde" and 2 or 3]
+end
+
+function Tools:InventoryUpdate(event)
+	if T.InCombatLockdown() then
+		Tools:RegisterEvent("PLAYER_REGEN_ENABLED", "InventoryUpdate")
+		return
+	else
+		Tools:UnregisterEvent("PLAYER_REGEN_ENABLED")
+ 	end
+
+ 	local SeedChange = false
+	for i = 1, 5 do
+		for _, button in T.ipairs(Tools.FseedButtons[i]) do
+			button.items = T.GetItemCount(button.itemId, nil, true)
+			if i == 2 or i == 4 then
+				for id, v in T.pairs(Tools.AddSeeds) do
+					if button.itemId == Tools.AddSeeds[id][1] then
+						local nCount = T.GetItemCount(id, nil, true)
+						button.items = button.items + nCount
+					end
+				end
+			end
+			if not Tools.buttoncounts[button.itemId] then
+				Tools.buttoncounts[button.itemId] = button.items
+			end
+			if button.items ~= Tools.buttoncounts[button.itemId] then
+				SeedChange = true
+				Tools.buttoncounts[button.itemId] = button.items
+			end
+			button.text:SetText(button.items)
+			button.icon:SetDesaturated(button.items == 0)
+			button.icon:SetAlpha(button.items == 0 and .25 or 1)
+		end
+	end
+
+	for _, button in T.ipairs(Tools.FtoolButtons) do
+		button.items = T.GetItemCount(button.itemId)
+		if not Tools.buttoncounts[button.itemId] then
+			Tools.buttoncounts[button.itemId] = button.items
+		end
+		if button.items ~= Tools.buttoncounts[button.itemId] then
+			SeedChange = true
+			Tools.buttoncounts[button.itemId] = button.items
+		end
+		button.icon:SetDesaturated(button.items == 0)
+		button.icon:SetAlpha(button.items == 0 and .25 or 1)
+	end
+
+	for _, button in T.ipairs(Tools.FportalButtons) do
+		button.items = T.GetItemCount(button.itemId)
+		if not Tools.buttoncounts[button.itemId] then
+			Tools.buttoncounts[button.itemId] = button.items
+		end
+		if button.items ~= Tools.buttoncounts[button.itemId] then
+			SeedChange = true
+			Tools.buttoncounts[button.itemId] = button.items
+		end
+		button.text:SetText(button.items)
+		button.icon:SetDesaturated(button.items == 0)
+		button.icon:SetAlpha(button.items == 0 and .25 or 1)
+	end
+
+	for _, button in T.ipairs(Tools.GsalvageButtons) do
+		button.items = T.GetItemCount(button.itemId)
+		if not Tools.buttoncounts[button.itemId] then
+			Tools.buttoncounts[button.itemId] = button.items
+		end
+		if button.items ~= Tools.buttoncounts[button.itemId] then
+			SeedChange = true
+			Tools.buttoncounts[button.itemId] = button.items
+		end
+		button.text:SetText(button.items)
+		button.icon:SetDesaturated(button.items == 0)
+		button.icon:SetAlpha(button.items == 0 and .25 or 1)
+	end
+	for _, button in T.ipairs(Tools.GminingButtons) do
+		button.items = T.GetItemCount(button.itemId)
+		if not Tools.buttoncounts[button.itemId] then
+			Tools.buttoncounts[button.itemId] = button.items
+		end
+		if button.items ~= Tools.buttoncounts[button.itemId] then
+			SeedChange = true
+			Tools.buttoncounts[button.itemId] = button.items
+		end
+		button.text:SetText(button.items)
+		button.icon:SetDesaturated(button.items == 0)
+		button.icon:SetAlpha(button.items == 0 and .25 or 1)
+	end
+	if event and event ~= "BAG_UPDATE_COOLDOWN" and SeedChange == true then
+		Tools:UpdateLayout()
+	end
+end
+
+local function UpdateBarLayout(bar, anchor, buttons, category, db)
+	if not db.enable then return end
+	local count = 0
+	bar:ClearAllPoints()
+	bar:Point("LEFT", anchor, "LEFT", 0, 0)
+
+	for i, button in T.ipairs(buttons) do
+		button:ClearAllPoints()
+		if not button.items then Tools:InventoryUpdate() end
+		if not db.active or button.items > 0 then
+			button:Point("TOPLEFT", bar, "TOPLEFT", (count * (db.buttonsize+(2 - E.Spacing)))+(1 - E.Spacing), -1)
+			button:Show()
+			button:Size(db.buttonsize, db.buttonsize)
+			count = count + 1
+		else
+			button:Hide()
+		end
+	end
+
+	bar:Width(1)
+	bar:Height(db.buttonsize+2)
+
+	return count
+end
+
+local function QuestItems(itemID)
+	for i = 1, T.GetNumQuestLogEntries() do
+		for qid, sid in T.pairs(Tools.FarmQuests) do
+			if qid == T.select(9,T.GetQuestLogTitle(i)) then
+				if itemID == sid[1] or itemID == sid[2] then
+					return true
+				end
+			end
+		end
+	end
+
+	return false
+end
+
+local function UpdateButtonCooldown(button)
+	if button.cooldown then
+		button.cooldown:SetCooldown(T.GetItemCooldown(button.itemId))
+	end
+end
+
+local function UpdateCooldown()
+	if not CanSeed() and not InSalvageYard() and not InMine() then return end
+
+	for i = 1, 5 do
+		for _, button in T.ipairs(Tools.FseedButtons[i]) do
+			UpdateButtonCooldown(button)
+		end
+	end
+	for _, button in T.ipairs(Tools.FtoolButtons) do
+		UpdateButtonCooldown(button)
+	end
+	for _, button in T.ipairs(Tools.FportalButtons) do
+		UpdateButtonCooldown(button)
+	end
+	for _, button in T.ipairs(Tools.GsalvageButtons) do
+		UpdateButtonCooldown(button)
+	end
+	for _, button in T.ipairs(Tools.GminingButtons) do
+		UpdateButtonCooldown(button)
+	end
+end
+
+local function UpdateSeedBarLayout(Bar, anchor, buttons, category, db)
+	if not db.enable then return end
+	local count = 0
+	size = db.buttonsize
+	local seedor = db.seedor
+	local id
+	Bar:ClearAllPoints()
+	if category == 1 then
+		if seedor == "TOP" or seedor == "BOTTOM" then
+			Bar:Point(seedor.."LEFT", anchor, -2*E.Spacing, seedor == "TOP" and 0 or (2 - E.Spacing*2))
+		elseif seedor == "LEFT" or seedor ==  "RIGHT" then
+			Bar:Point("TOP"..seedor, anchor, (seedor == "LEFT" and 0 or 2), -2)
+		end
+
+	else
+		if _G["SLEFarmSeedBar"..(category-1)]:IsShown() then
+			if seedor == "TOP" or seedor == "BOTTOM" then
+				Bar:Point("TOPLEFT", _G["SLEFarmSeedBar"..(category-1)], "TOPRIGHT", -E.Spacing, 0)
+			elseif seedor == "LEFT" or seedor ==  "RIGHT" then
+				Bar:Point("TOPLEFT", _G["SLEFarmSeedBar"..(category-1)], "BOTTOMLEFT", 0, E.Spacing)
+			end
+		else
+			UpdateSeedBarLayout(Bar, anchor, buttons, category-1, db)
+		end
+	end
+
+
+	for i, button in T.ipairs(buttons) do
+		id = T.gsub(button:GetName(), "FarmButton", "")
+		id = T.tonumber(id)
+		button:ClearAllPoints()
+		if not db.active or button.items > 0 then
+			if seedor == "TOP" or seedor == "BOTTOM" then
+				local mult = seedor == "TOP" and -1 or 1
+				button:Point(seedor.."LEFT", Bar, 1 + E.Spacing, mult*(count * (size+(2 - E.Spacing))) - 1 + E.Spacing)
+			elseif seedor == "LEFT" or seedor == "RIGHT" then
+				local mult = seedor == "RIGHT" and -1 or 1
+				button:Point("TOPLEFT", Bar, "TOPLEFT", mult*(count * (size+(2 - E.Spacing))) - 1 + E.Spacing, 1 + E.Spacing)
+			end
+			button:Show()
+			button:Size(size, size)
+			count = count + 1
+		else
+			button:Hide()
+		end
+		if db.quest then
+			if not CanSeed() then
+				Bar:Width(size+2)
+				Bar:Height(size+2)
+				return count
+			end
+			if QuestItems(id) then
+				ActionButton_ShowOverlayGlow(button)
+			else
+				ActionButton_HideOverlayGlow(button)
+			end
+		else
+			ActionButton_HideOverlayGlow(button)
+		end
+	end
+
+	Bar:Width(size+2)
+	Bar:Height(size+2)
+
+	return count
+end
+
+local function UpdateBar(bar, layoutfunc, zonecheck, anchor, buttons, category, db)
+	bar:Show()
+
+	local count = layoutfunc(bar, anchor, buttons, category, db)
+	if (db.enable and (count and count > 0) and zonecheck() and not T.InCombatLockdown()) then
+		bar:Show()
+	else
+		bar:Hide()
+	end
+end
+
+function Tools:BAG_UPDATE_COOLDOWN()
+	Tools:InventoryUpdate()
+	UpdateCooldown()
+end
+
+local function Zone(event)
+	if CanSeed() or InSalvageYard() or InMine() then
+		Tools:RegisterEvent("BAG_UPDATE", "InventoryUpdate")
+		Tools:RegisterEvent("BAG_UPDATE_COOLDOWN")
+		Tools:RegisterEvent("UNIT_QUEST_LOG_CHANGED", "UpdateLayout")
+		Tools:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED", "InventoryUpdate")
+
+		Tools:InventoryUpdate(event)
+		Tools:UpdateLayout()
+		Zcheck = true
+	else
+		Tools:UnregisterEvent("BAG_UPDATE")
+		Tools:UnregisterEvent("BAG_UPDATE_COOLDOWN")
+		Tools:UnregisterEvent("UNIT_QUEST_LOG_CHANGED")
+		Tools:UnregisterEvent("UNIT_SPELLCAST_SUCCEEDED")
+		if Zcheck then
+			Tools:UpdateLayout()
+			Zcheck = false
+		end
+	end
+end
+
+local function ResizeFrames()
+	local seedor = E.db.sle.legacy.farm.seedor
+	if seedor == "TOP" or seedor == "BOTTOM" then
+		SeedAnchor:Size((E.db.sle.legacy.farm.buttonsize+(2 - E.Spacing))*5 - E.Spacing, (E.db.sle.legacy.farm.buttonsize+(2 - E.Spacing))*10 - E.Spacing)
+	elseif seedor == "LEFT" or seedor == "RIGHT" then
+		SeedAnchor:Size((E.db.sle.legacy.farm.buttonsize+(2 - E.Spacing))*10 - E.Spacing, (E.db.sle.legacy.farm.buttonsize+(2 - E.Spacing))*5 - E.Spacing)
+	end
+	ToolAnchor:Size((E.db.sle.legacy.farm.buttonsize+(2 - E.Spacing))*5 - E.Spacing, E.db.sle.legacy.farm.buttonsize+(2 - E.Spacing) - E.Spacing)
+	PortalAnchor:Size((E.db.sle.legacy.farm.buttonsize+(2 - E.Spacing))*5 - E.Spacing, E.db.sle.legacy.farm.buttonsize+(2 - E.Spacing) - E.Spacing)
+	SalvageAnchor:Size((E.db.sle.legacy.garrison.toolbar.buttonsize+(2 - E.Spacing))*3 - E.Spacing, E.db.sle.legacy.garrison.toolbar.buttonsize+(2 - E.Spacing) - E.Spacing)
+	MineAnchor:Size((E.db.sle.legacy.garrison.toolbar.buttonsize+(2 - E.Spacing))*2 - E.Spacing, E.db.sle.legacy.garrison.toolbar.buttonsize+(2 - E.Spacing) - E.Spacing)
+end
+
+function Tools:UpdateLayout(event, unit) --don't touch
+	-- if not SeedAnchor then return end
+	--For updating borders after quest was complited. for some reason events fires before quest disappeares from log
+	if event == "UNIT_QUEST_LOG_CHANGED" then
+		if unit == "player" then
+			E:Delay(1, Tools.UpdateLayout)
+		else
+			return
+		end
+	end
+	if T.InCombatLockdown() then
+		Tools:RegisterEvent("PLAYER_REGEN_ENABLED", "UpdateLayout")
+		return
+	else
+		Tools:UnregisterEvent("PLAYER_REGEN_ENABLED")
+ 	end
+	if E.db.sle.legacy.farm.enable then
+		E:EnableMover(SeedAnchor.mover:GetName())
+		E:EnableMover(ToolAnchor.mover:GetName())
+		E:EnableMover(PortalAnchor.mover:GetName())
+	else
+		E:DisableMover(SeedAnchor.mover:GetName())
+		E:DisableMover(ToolAnchor.mover:GetName())
+		E:DisableMover(PortalAnchor.mover:GetName())
+	end
+	UpdateBar(_G["SLEFarmToolsBar"], UpdateBarLayout, OnFarm, ToolAnchor, Tools.FtoolButtons, nil, E.db.sle.legacy.farm)
+	UpdateBar(_G["SLEFarmPortalBar"], UpdateBarLayout, OnFarm, PortalAnchor, Tools.FportalButtons, nil, E.db.sle.legacy.farm)
+	for i=1, 5 do
+		UpdateBar(_G["SLEFarmSeedBar"..i], UpdateSeedBarLayout, CanSeed, SeedAnchor, Tools.FseedButtons[i], i, E.db.sle.legacy.farm)
+	end
+	if E.db.sle.legacy.garrison.toolbar.enable then
+		E:EnableMover(SalvageAnchor.mover:GetName())
+	else
+		E:DisableMover(SalvageAnchor.mover:GetName())
+	end
+
+	UpdateBar(_G["SLEGarrisonSalvageBar"], UpdateBarLayout, InSalvageYard, SalvageAnchor, Tools.GsalvageButtons, nil, E.db.sle.legacy.garrison.toolbar);
+	UpdateBar(_G["SLEGarrisonMiningBar"], UpdateBarLayout, InMine, MineAnchor, Tools.GminingButtons, nil, E.db.sle.legacy.garrison.toolbar);
+	ResizeFrames()
+end
+
+local function AutoTarget(button)
+	local container, slot = SLE:BagSearch(button.itemId)
+	if container and slot then
+		button:SetAttribute("type", "macro")
+		button:SetAttribute("macrotext", T.format("/targetexact %s \n/use %s %s", L["Tilled Soil"], container, slot))
+	end
+end
+
+local function onClick(self, mousebutton)
+	if mousebutton == "LeftButton" then
+		if T.InCombatLockdown() and not self.macro then
+			SLE:Print(L["We are sorry, but you can't do this now. Try again after the end of this combat."])
+			return
+		end
+		self:SetAttribute("type", self.buttonType)
+		self:SetAttribute(self.buttonType, self.sortname)
+		if self.id and self.id ~= 2 and self.id ~= 4 and E.db.sle.legacy.farm.autotarget and T.UnitName("target") ~= L["Tilled Soil"] then
+			AutoTarget(self)
+		end
+		if self.cooldown then
+			self.cooldown:SetCooldown(T.GetItemCooldown(self.itemId))
+		end
+		if not self.macro then self.macro = true end
+	elseif mousebutton == "RightButton" and self.allowDrop then
+		self:SetAttribute("type", "click")
+		local container, slot = SLE:BagSearch(self.itemId)
+		if container and slot then
+			PickupContainerItem(container, slot)
+			DeleteCursorItem()
+		end
+	end
+	Tools:InventoryUpdate()
+end
+
+local function onEnter(self)
+	GameTooltip:SetOwner(self, 'ANCHOR_TOPLEFT', 2, 4)
+	GameTooltip:ClearLines()
+	GameTooltip:AddLine(" ")
+	GameTooltip:SetItemByID(self.itemId)
+	if self.allowDrop then
+		GameTooltip:AddLine(L["Right-click to drop the item."])
+	end
+	GameTooltip:Show()
+end
+
+local function onLeave()
+	GameTooltip:Hide()
+end
+
+local function CreateToolsButton(index, owner, buttonType, name, texture, allowDrop, id, db)
+	size = db.buttonsize
+	local button = CreateFrame("Button", T.format("ToolsButton%d", index), owner, "SecureActionButtonTemplate")
+	button:Size(size, size)
+	S:HandleButton(button)
+
+	button.sortname = name
+	button.itemId = index
+	button.allowDrop = allowDrop
+	button.buttonType = buttonType
+	button.id = id
+	button.macro = false
+
+	button.icon = button:CreateTexture(nil, "OVERLAY")
+	button.icon:SetTexture(texture)
+	button.icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
+	button.icon:SetInside()
+
+	button.text = button:CreateFontString(nil, "OVERLAY")
+	button.text:SetFont(E.media.normFont, 12, "OUTLINE")
+	button.text:SetPoint("BOTTOMRIGHT", button, 1, 2)
+
+	if T.select(3, T.GetItemCooldown(button.itemId)) == 1 then
+		button.cooldown = CreateFrame("Cooldown", T.format("ToolsButton%dCooldown", index), button)
+		button.cooldown:SetAllPoints(button)
+	end
+
+	button:HookScript("OnEnter", onEnter)
+	button:HookScript("OnLeave", onLeave)
+	button:SetScript("OnMouseDown", onClick)
+
+	return button
+end
+
+local function FramesPosition()
+	SeedAnchor:Point("LEFT", E.UIParent, "LEFT", 24, -160)
+	ToolAnchor:Point("BOTTOMLEFT", SeedAnchor, "TOPLEFT", 0, 1 + E.Spacing*4)
+	PortalAnchor:Point("BOTTOMLEFT", ToolAnchor, "TOPLEFT", 0, 1 + E.Spacing*4)
+	SalvageAnchor:Point("LEFT", E.UIParent, "LEFT", 24, 0);
+	MineAnchor:Point("LEFT", SalvageAnchor, "LEFT", 0, 0)
+end
+
+function Tools:CreateFrames()
+	SeedAnchor = CreateFrame("Frame", "SeedAnchor", E.UIParent)
+	SeedAnchor:SetFrameStrata("BACKGROUND")
+
+	ToolAnchor = CreateFrame("Frame", "ToolAnchor", E.UIParent)
+	ToolAnchor:SetFrameStrata("BACKGROUND")
+
+	PortalAnchor = CreateFrame("Frame", "PortalAnchor", E.UIParent)
+	PortalAnchor:SetFrameStrata("BACKGROUND")
+
+	SalvageAnchor = CreateFrame("Frame", "SalvageAnchor", E.UIParent)
+	SalvageAnchor:SetFrameStrata("BACKGROUND")
+
+	MineAnchor = CreateFrame("Frame", "MineAnchor", E.UIParent)
+	MineAnchor:SetFrameStrata("BACKGROUND")
+
+	ResizeFrames()
+	FramesPosition()
+
+	E:CreateMover(SeedAnchor, "FarmSeedMover", L["Farm Seed Bars"], nil, nil, nil, "ALL,S&L,S&L MISC")
+	E:CreateMover(ToolAnchor, "FarmToolMover", L["Farm Tool Bar"], nil, nil, nil, "ALL,S&L,S&L MISC")
+	E:CreateMover(PortalAnchor, "FarmPortalMover", L["Farm Portal Bar"], nil, nil, nil, "ALL,S&L,S&L MISC")
+	E:CreateMover(SalvageAnchor, "SalvageCrateMover", L["Garrison Tools Bar"], nil, nil, nil, "ALL,S&L,S&L MISC")
+
+	for id, v in T.pairs(Tools.Seeds) do
+		Tools.Seeds[id] = { v[1], T.GetItemInfo(id) }
+	end
+
+	for id, v in T.pairs(Tools.FarmTools) do
+		Tools.FarmTools[id] = { T.GetItemInfo(id) }
+	end
+
+	for id, v in T.pairs(Tools.FarmPortals) do
+		Tools.FarmPortals[id] = { v[1], T.GetItemInfo(id) }
+	end
+
+	for id, v in T.pairs(Tools.Salvage) do
+		Tools.Salvage[id] = { T.GetItemInfo(id) }
+	end
+
+	for id, v in T.pairs(Tools.GarMine) do
+		Tools.GarMine[id] = { T.GetItemInfo(id) }
+	end
+
+	for i = 1, 5 do
+		local seedBar = CreateFrame("Frame", "SLEFarmSeedBar"..i, UIParent)
+		seedBar:SetFrameStrata("BACKGROUND")
+
+		seedBar:SetPoint("CENTER", SeedAnchor, "CENTER", 0, 0)
+
+		Tools.FseedButtons[i] = Tools.FseedButtons[i] or {}
+
+		for id, v in T.pairs(Tools.Seeds) do
+			if v[1] == i then
+				T.tinsert(Tools.FseedButtons[i], CreateToolsButton(id, seedBar, "item", v[2], v[11], true, i, E.db.sle.legacy.farm))
+			end
+			T.sort(Tools.FseedButtons[i], function(a, b) return a.sortname < b.sortname end)
+		end
+	end
+
+	local toolBar = CreateFrame("Frame", "SLEFarmToolsBar", UIParent)
+	toolBar:SetFrameStrata("BACKGROUND")
+	toolBar:SetPoint("CENTER", ToolAnchor, "CENTER", 0, 0)
+	for id, v in T.pairs(Tools.FarmTools) do
+		T.tinsert(Tools.FtoolButtons, CreateToolsButton(id, toolBar, "item", v[1], v[10], true, nil, E.db.sle.legacy.farm))
+	end
+
+	local portalBar = CreateFrame("Frame", "SLEFarmPortalBar", UIParent)
+	portalBar:SetFrameStrata("BACKGROUND")
+	portalBar:SetPoint("CENTER", PortalAnchor, "CENTER", 0, 0)
+	for id, v in T.pairs(Tools.FarmPortals) do
+		if v[1] == playerFaction then
+			T.tinsert(Tools.FportalButtons, CreateToolsButton(id, portalBar, "item", v[2], v[11], false, nil, E.db.sle.legacy.farm))
+		end
+	end
+
+	local salvageBar = CreateFrame("Frame", "SLEGarrisonSalvageBar", UIParent);
+	salvageBar:SetFrameStrata("BACKGROUND")
+	salvageBar:SetPoint("CENTER", SalvageAnchor, "CENTER", 0, 0)
+	for id, v in T.pairs(Tools.Salvage) do
+		T.tinsert(Tools.GsalvageButtons, CreateToolsButton(id, salvageBar, "item", v[1], v[10], false, nil, E.db.sle.legacy.garrison.toolbar));
+	end
+
+	local mineBar = CreateFrame("Frame", "SLEGarrisonMiningBar", UIParent);
+	mineBar:SetFrameStrata("BACKGROUND")
+	mineBar:SetPoint("CENTER", MineAnchor, "CENTER", 0, 0)
+	for id, v in T.pairs(Tools.GarMine) do
+		T.tinsert(Tools.GminingButtons, CreateToolsButton(id, mineBar, "item", v[1], v[10], false, nil, E.db.sle.legacy.garrison.toolbar));
+	end
+
+	Tools:RegisterEvent("ZONE_CHANGED", Zone)
+	Tools:RegisterEvent("ZONE_CHANGED_NEW_AREA", Zone)
+	Tools:RegisterEvent("ZONE_CHANGED_INDOORS", Zone)
+	Tools:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED", "InventoryUpdate")
+
+	E:Delay(10, Zone)
+end
+
+function Tools:StartBarLoader()
+	Tools:UnregisterEvent("PLAYER_ENTERING_WORLD")
+
+	local noItem = false
+	-- preload item links to prevent errors
+	for id, _ in T.pairs(Tools.Seeds) do
+		if T.select(2, T.GetItemInfo(id)) == nil then noItem = true end
+	end
+	for id, _ in T.pairs(Tools.FarmTools) do
+		if T.select(2, T.GetItemInfo(id)) == nil then noItem = true end
+	end
+	for id, _ in T.pairs(Tools.FarmPortals) do
+		if T.select(2, T.GetItemInfo(id)) == nil then noItem = true end
+	end
+	for id, _ in T.pairs(Tools.Salvage) do
+		if T.select(2, T.GetItemInfo(id)) == nil then noItem = true end
+	end
+	for id, _ in T.pairs(Tools.GarMine) do
+		if T.select(2, T.GetItemInfo(id)) == nil then noItem = true end
+	end
+	if noItem then
+		E:Delay(5, Tools.StartBarLoader)
+	else
+		Tools:CreateFrames()
+	end
+end
+
+function Tools:Initialize()
+	if not SLE.initialized then return end
+
+	self:RegisterEvent("PLAYER_ENTERING_WORLD", "StartBarLoader")
+
+	function Tools:ForUpdateAll()
+		Tools:UpdateLayout()
+	end
+end
+
+SLE:RegisterModule(Tools:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/tooltip.lua b/ElvUI_SLE/modules/tooltip.lua
deleted file mode 100644
index 7fe2376..0000000
--- a/ElvUI_SLE/modules/tooltip.lua
+++ /dev/null
@@ -1,61 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local TT = E:GetModule('Tooltip');
-
---Defaults (Need to be moved.)
-P['tooltip']['overrideCombat'] = false
-
-local iconPath = [[Interface\AddOns\ElvUI_SLE\media\textures\]]
-
-local function AnchorFrameToMouse()
-	if not E.db.tooltip.cursorAnchor or (E.db.sle.tooltip.xOffset == 0 and E.db.sle.tooltip.yOffset == 0) then return end
-
-	local frame = GameTooltip
-	if frame:GetAnchorType() ~= "ANCHOR_CURSOR" then return end
-
-	local x, y = GetCursorPosition();
-	local scale = frame:GetEffectiveScale();
-	local tipWidth = frame:GetWidth();
-
-	frame:ClearAllPoints();
-	frame:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", (x/scale + (E.db.sle.tooltip.xOffset - tipWidth/2)), (y/scale + E.db.sle.tooltip.yOffset));
-end
-
-local function SetDefaultAnchor(self, tt, parent)
-	if (tt:GetAnchorType() ~= "ANCHOR_CURSOR") then
-		return
-	end
-	if InCombatLockdown() and self.db.visibility.combat then
-		tt:Hide()
-		return
-	end
-	if (parent) then
-		if(self.db.cursorAnchor) then
-			AnchorFrameToMouse(tt);
-			return
-		end
-	end
-end
-
-local function OnTooltipSetUnit(self, tt)
-	if not E.db.sle.tooltip.showFaction then return end
-
-	local unit = select(2, tt:GetUnit())
-	if (UnitIsPlayer(unit)) then
-		local text = GameTooltipTextLeft1:GetText()
-		local faction = UnitFactionGroup(unit)
-
-		if not faction then faction = "Neutral" end
-
-		GameTooltipTextLeft1:SetText("|T"..iconPath..faction..".blp:15:15:0:0:64:64:2:56:2:56|t "..text)
-	end
-end
-
-local function Init()
-	if not E.private.tooltip.enable then return end
-	hooksecurefunc(TT, "GameTooltip_OnTooltipSetUnit", OnTooltipSetUnit)
-
-	--if not E.db.tooltip.cursorAnchor then return end
-	hooksecurefunc(TT, "CheckBackdropColor", AnchorFrameToMouse)
-	--hooksecurefunc(TT, "GameTooltip_SetDefaultAnchor", SetDefaultAnchor)
-end
-hooksecurefunc(TT, "Initialize", Init)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/tooltips/load_tooltips.xml b/ElvUI_SLE/modules/tooltips/load_tooltips.xml
new file mode 100644
index 0000000..ac2396f
--- /dev/null
+++ b/ElvUI_SLE/modules/tooltips/load_tooltips.xml
@@ -0,0 +1,4 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<Script file='tooltip.lua'/>
+	<Script file='raidprogress.lua'/>
+</Ui>
diff --git a/ElvUI_SLE/modules/tooltips/raidprogress.lua b/ElvUI_SLE/modules/tooltips/raidprogress.lua
new file mode 100644
index 0000000..8894852
--- /dev/null
+++ b/ElvUI_SLE/modules/tooltips/raidprogress.lua
@@ -0,0 +1,194 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local RP = SLE:NewModule("RaidProgress", "AceHook-3.0", "AceEvent-3.0")
+local TT = E:GetModule('Tooltip');
+local MAX_PLAYER_LEVEL = MAX_PLAYER_LEVEL
+local _G = _G
+local sub = string.sub
+
+RP.Cache = {}
+RP.playerGUID = UnitGUID("player")
+RP.highestKill = 0
+
+local ClearAchievementComparisonUnit = ClearAchievementComparisonUnit
+
+
+RP.bosses = {
+	{ -- HFC
+		{ --Mythic
+			10204, 10208, 10212, 10216, 10220, 10224, 10228, 10232, 10236, 10240, 10244, 10248, 10252,
+		},
+		{ -- Herioc
+			10203, 10207, 10211, 10215, 10219, 10223, 10227, 10231, 10235, 10239, 10243, 10247, 10251,
+		},
+		{ -- Normal
+			10202, 10206, 10210, 10214, 10218, 10222, 10226, 10230, 10234, 10238, 10242, 10246, 10250,
+		},
+		{ -- LFR
+			10201, 10205, 10209, 10213, 10217, 10221, 10225, 10229, 10233, 10237, 10241, 10245, 10249,
+		},
+	},
+	{ -- Blackrock Foundry
+		{ --Mythic
+			9319, 9323, 9329, 9333, 9338, 9342, 9353, 9357, 9361, 9365,
+		},
+		{ -- Herioc
+			9318, 9322, 9328, 9332, 9337, 9341, 9351, 9356, 9360, 9364,
+		},
+		{ -- Normal
+			9317, 9321, 9327, 9331, 9336, 9340, 9349, 9355, 9359, 9363,
+		},
+		{ -- LFR
+			9316, 9320, 9324, 9330, 9334, 9339, 9343, 9354, 9358, 9362,
+		},
+	},
+	{ -- HighMaul
+		{ -- Mythic
+			9285, 9289, 9294, 9300, 9304, 9311, 9315,
+		},
+		{ -- Herioc
+			9284, 9288, 9293, 9298, 9303, 9310, 9314,
+		},
+		{ --Normal
+			9282, 9287, 9292, 9297, 9302, 9308, 9313,
+		},
+		{ --LFR
+			9280, 9286, 9290, 9295, 9301, 9306, 9312,
+		},
+	},
+}
+RP.Raids = {
+	["LONG"] = {
+		T.GetMapNameByID(1026),
+		T.GetMapNameByID(988),
+		T.GetMapNameByID(994)
+	},
+	["SHORT"] = {
+		L["RAID_HFC"],
+		L["RAID_BRF"],
+		L["RAID_HM"],
+	},
+}
+RP.modes = {
+	["LONG"] = {
+		PLAYER_DIFFICULTY6,
+		PLAYER_DIFFICULTY2,
+		PLAYER_DIFFICULTY1,
+		PLAYER_DIFFICULTY3,
+	},
+	["SHORT"] = {
+		sub(PLAYER_DIFFICULTY6, 1 , 1),
+		sub(PLAYER_DIFFICULTY2, 1 , 1),
+		sub(PLAYER_DIFFICULTY1, 1 , 1),
+		sub(PLAYER_DIFFICULTY3, 1 , 1),
+	},
+}
+
+function RP:GetProgression(guid)
+	local kills, complete, pos = 0, false, 0
+	local statFunc = guid == RP.playerGUID and T.GetStatistic or T.GetComparisonStatistic
+
+	for raid = 1, #RP.Raids["LONG"] do
+		RP.Cache[guid].header[raid] = {}
+		RP.Cache[guid].info[raid] = {}
+		for level = 1, 4 do
+			RP.highestKill = 0
+			for statInfo = 1, #RP.bosses[raid][level] do
+				kills = T.tonumber((statFunc(RP.bosses[raid][level][statInfo])))
+				if kills and kills > 0 then
+					RP.highestKill = RP.highestKill + 1
+				end
+			end
+			pos = RP.highestKill
+			if (RP.highestKill > 0) then
+				RP.Cache[guid].header[raid][level] = T.format("%s [%s]:", RP.Raids[E.db.sle.tooltip.RaidProg.NameStyle][raid], RP.modes[E.db.sle.tooltip.RaidProg.DifStyle][level])
+				RP.Cache[guid].info[raid][level] = T.format("%d/%d", RP.highestKill, #RP.bosses[raid][level])
+				if RP.highestKill == #RP.bosses[raid][level] then
+					break
+				end
+			end
+		end
+	end
+end
+
+function RP:UpdateProgression(guid)
+	RP.Cache[guid] = RP.Cache[guid] or {}
+	RP.Cache[guid].header = RP.Cache[guid].header or {}
+	RP.Cache[guid].info =  RP.Cache[guid].info or {}
+	RP.Cache[guid].timer = T.GetTime()
+
+	RP:GetProgression(guid)
+end
+
+function RP:SetProgressionInfo(guid, tt)
+	if RP.Cache[guid] then
+		local updated = 0
+		for i=1, tt:NumLines() do
+			local leftTipText = _G["GameTooltipTextLeft"..i]
+			for raid = 1, #RP.Raids["LONG"] do
+				for level = 1, 4 do
+					if (leftTipText:GetText() and leftTipText:GetText():find(RP.Raids[E.db.sle.tooltip.RaidProg.NameStyle][raid]) and leftTipText:GetText():find(RP.modes[E.db.sle.tooltip.RaidProg.DifStyle][level])) then
+						-- update found tooltip text line
+						local rightTipText = _G["GameTooltipTextRight"..i]
+						leftTipText:SetText(RP.Cache[guid].header[raid][level])
+						rightTipText:SetText(RP.Cache[guid].info[raid][level])
+						updated = 1
+					end
+				end
+			end
+		end
+		if updated == 1 then return end
+		-- add progression tooltip line
+		if RP.highestKill > 0 then tt:AddLine(" ") end
+		for raid = 1, #RP.Raids["LONG"] do
+			for level = 1, 4 do
+				tt:AddDoubleLine(RP.Cache[guid].header[raid][level], RP.Cache[guid].info[raid][level], nil, nil, nil, 1, 1, 1)
+			end
+		end
+	end
+end
+
+local function AchieveReady(event, GUID)
+	if (TT.compareGUID ~= GUID) then return end
+	local unit = "mouseover"
+	if T.UnitExists(unit) then
+		RP:UpdateProgression(GUID)
+		_G["GameTooltip"]:SetUnit(unit)
+	end
+	ClearAchievementComparisonUnit()
+	TT:UnregisterEvent("INSPECT_ACHIEVEMENT_READY")
+end
+
+local function OnInspectInfo(self, tt, unit, level, r, g, b, numTries)
+	if T.InCombatLockdown() then return end
+	if not E.db.sle.tooltip.RaidProg.enable then return end
+	if not level or level < MAX_PLAYER_LEVEL then return end
+	if not (unit and T.CanInspect(unit)) then return end
+
+	local guid = T.UnitGUID(unit)
+	if not RP.Cache[guid] or (T.GetTime() - RP.Cache[guid].timer) > 600 then
+		if guid == RP.playerGUID then
+			RP:UpdateProgression(guid)
+		else
+			ClearAchievementComparisonUnit()
+			if not self.loadedComparison and T.select(2, T.IsAddOnLoaded("Blizzard_AchievementUI")) then
+				AchievementFrame_DisplayComparison(unit)
+				HideUIPanel(AchievementFrame)
+				ClearAchievementComparisonUnit()
+				self.loadedComparison = true
+			end
+			self.compareGUID = guid
+			if SetAchievementComparisonUnit(unit) then
+				self:RegisterEvent("INSPECT_ACHIEVEMENT_READY", AchieveReady)
+			end
+			return
+		end
+	end
+
+	RP:SetProgressionInfo(guid, tt)
+end
+
+function RP:Initialize()
+	hooksecurefunc(TT, 'ShowInspectInfo', OnInspectInfo)
+end
+
+SLE:RegisterModule(RP:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/tooltips/tooltip.lua b/ElvUI_SLE/modules/tooltips/tooltip.lua
new file mode 100644
index 0000000..f43053e
--- /dev/null
+++ b/ElvUI_SLE/modules/tooltips/tooltip.lua
@@ -0,0 +1,55 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local TT = E:GetModule('Tooltip');
+local GameTooltip = GameTooltip
+local GetCursorPosition = GetCursorPosition
+local iconPath = [[Interface\AddOns\ElvUI_SLE\media\textures\]]
+local MAX_PLAYER_LEVEL = MAX_PLAYER_LEVEL
+local _G = _G
+
+--GLOBALS: UIParent, hooksecurefunc
+
+local function AnchorFrameToMouse()
+	if not SLE.initialized then return end
+	if not E.db.tooltip.cursorAnchor or (E.db.sle.tooltip.xOffset == 0 and E.db.sle.tooltip.yOffset == 0) then return end
+
+	local frame = GameTooltip
+	if frame:GetAnchorType() ~= "ANCHOR_CURSOR" then return end
+
+	local x, y = GetCursorPosition();
+	local scale = frame:GetEffectiveScale();
+	local tipWidth = frame:GetWidth();
+
+	frame:ClearAllPoints();
+	frame:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", (x/scale + (E.db.sle.tooltip.xOffset - tipWidth/2)), (y/scale + E.db.sle.tooltip.yOffset));
+end
+
+local function OnTooltipSetUnit(self, tt)
+	if not SLE.initialized then return end
+	if not E.db.sle.tooltip.showFaction then return end
+
+	local unit = T.select(2, tt:GetUnit())
+	if (T.UnitIsPlayer(unit)) then
+		local text = _G["GameTooltipTextLeft1"]:GetText()
+		local faction = T.UnitFactionGroup(unit)
+
+		if not faction then faction = "Neutral" end
+
+		_G["GameTooltipTextLeft1"]:SetText("|T"..iconPath..faction..".blp:15:15:0:0:64:64:2:56:2:56|t "..text)
+	end
+end
+
+function SLE:SetCompareItems()
+	if E.db.sle.tooltip.alwaysCompareItems then
+		E:LockCVar("alwaysCompareItems", 1)
+	else
+		E:LockCVar("alwaysCompareItems", 0)
+	end
+end
+
+local function Init()
+	if not E.private.tooltip.enable then return end
+	hooksecurefunc(TT, "GameTooltip_OnTooltipSetUnit", OnTooltipSetUnit)
+
+	hooksecurefunc(TT, "CheckBackdropColor", AnchorFrameToMouse)
+end
+hooksecurefunc(TT, "Initialize", Init)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/uibuttons.lua b/ElvUI_SLE/modules/uibuttons.lua
index 4849be9..642131f 100644
--- a/ElvUI_SLE/modules/uibuttons.lua
+++ b/ElvUI_SLE/modules/uibuttons.lua
@@ -1,12 +1,12 @@
-local E, L, V, P, G = unpack(ElvUI);
-local UB = E:GetModule('SLE_UIButtons');
-local ACD = LibStub("AceConfigDialog-3.0-ElvUI")
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local UB = SLE:NewModule('UIButtons', 'AceHook-3.0');
 local lib = LibStub("LibElv-UIButtons-1.0")
-local SLE = E:GetModule("SLE")
 local S = E:GetModule("Skins")
+local RandomRoll = RandomRoll
+local SendChatMessage = SendChatMessage

 local function CustomRollCall()
-	local min, max = tonumber(E.db.sle.uibuttons.customroll.min), tonumber(E.db.sle.uibuttons.customroll.max)
+	local min, max = T.tonumber(E.db.sle.uibuttons.customroll.min), T.tonumber(E.db.sle.uibuttons.customroll.max)
 	if min <= max then
 		RandomRoll(min, max)
 	else
@@ -16,11 +16,11 @@ end

 function UB:ConfigSetup(menu)
 	--UB:CreateSeparator("Config", "SLE_StartSeparator", 1, 2)
-	menu:CreateDropdownButton("Config", "Elv", "|cff1784d1ElvUI|r", L["ElvUI Config"], L["Click to toggle config window"],  function() if InCombatLockdown() then return end; E:ToggleConfig() end, nil, true)
-	menu:CreateDropdownButton("Config", "SLE", "|cff9482c9S&L|r", L["S&L Config"], L["Click to toggle Shadow & Light config group"],  function() if InCombatLockdown() then return end; E:ToggleConfig(); ACD:SelectGroup("ElvUI", "sle", "options") end, nil, true)
+	menu:CreateDropdownButton("Config", "Elv", "|cff1784d1ElvUI|r", L["ElvUI Config"], L["Click to toggle config window"],  function() if T.InCombatLockdown() then return end; E:ToggleConfig() end, nil, true)
+	menu:CreateDropdownButton("Config", "SLE", "|cff9482c9S&L|r", L["S&L Config"], L["Click to toggle Shadow & Light config group"],  function() if T.InCombatLockdown() then return end; E:ToggleConfig(); SLE.ACD:SelectGroup("ElvUI", "sle") end, nil, true)
 	menu:CreateSeparator("Config", "First", 4, 2)
 	menu:CreateDropdownButton( "Config", "Reload", "/reloadui", L["Reload UI"], L["Click to reload your interface"],  function() ReloadUI() end, nil, true)
-	menu:CreateDropdownButton("Config", "MoveUI", "/moveui", L["Move UI"], L["Click to unlock moving ElvUI elements"],  function() if InCombatLockdown() then return end; E:ToggleConfigMode() end, nil, true)
+	menu:CreateDropdownButton("Config", "MoveUI", "/moveui", L["Move UI"], L["Click to unlock moving ElvUI elements"],  function() if T.InCombatLockdown() then return end; E:ToggleConfigMode() end, nil, true)
 	--UB:CreateSeparator("Config", "SLE_EndSeparator", 1, 2)
 end

@@ -30,7 +30,7 @@ function UB:AddonSetup(menu)

 	menu:CreateDropdownButton("Addon", "DBM", L["Boss Mod"], L["Boss Mod"], L["Click to toggle the Configuration/Option Window from the Bossmod you have enabled."], function() DBM:LoadGUI() end, "DBM-Core")
 	menu:CreateDropdownButton("Addon", "VEM", L["Boss Mod"], L["Boss Mod"], L["Click to toggle the Configuration/Option Window from the Bossmod you have enabled."], function() VEM:LoadGUI() end, "VEM-Core")
-	menu:CreateDropdownButton("Addon", "BigWigs", L["Boss Mod"], L["Boss Mod"], L["Click to toggle the Configuration/Option Window from the Bossmod you have enabled."], function() LibDBIcon10_BigWigs:Click("RightButton") end, "BigWigs")
+	menu:CreateDropdownButton("Addon", "BigWigs", L["Boss Mod"], L["Boss Mod"], L["Click to toggle the Configuration/Option Window from the Bossmod you have enabled."], function() LibStub("LibDataBroker-1.1"):GetDataObjectByName("BigWigs"):OnClick("RightButton") end, "BigWigs")
 	menu:CreateSeparator("Addon", "First", 4, 2)
 	menu:CreateDropdownButton("Addon", "Altoholic", "Altoholic", nil, nil, function() Altoholic:ToggleUI() end, "Altoholic")
 	menu:CreateDropdownButton("Addon", "AtlasLoot", "AtlasLoot", nil, nil, function() AtlasLoot.GUI:Toggle() end, "AtlasLoot")
@@ -64,12 +64,12 @@ function UB:SetupBar(menu)
 		menu:CreateCoreButton("Reload", "R", function() ReloadUI() end)
 		menu:CreateCoreButton("MoveUI", "M", function(self) E:ToggleConfigMode() end)
 		menu:CreateCoreButton("Boss", "B", function(self)
-			if IsAddOnLoaded("DBM-Core") then
+			if T.IsAddOnLoaded("DBM-Core") then
 				DBM:LoadGUI()
-			elseif IsAddOnLoaded("VEM-Core") then
+			elseif T.IsAddOnLoaded("VEM-Core") then
 				VEM:LoadGUI()
-			elseif IsAddOnLoaded("BigWigs") then
-				LibDBIcon10_BigWigs:Click("RightButton")
+			elseif T.IsAddOnLoaded("BigWigs") then
+				LibStub("LibDataBroker-1.1"):GetDataObjectByName("BigWigs"):OnClick("RightButton")
 			end
 		end)
 		menu:CreateCoreButton("Addon", "A", function(self) GameMenuButtonAddons:Click() end)
@@ -116,11 +116,18 @@ function UB:RightClicks(menu)
 end

 function UB:Initialize()
+	if not SLE.initialized then return end
 	UB.Holder = lib:CreateFrame("SLE_UIButtons", E.db.sle.uibuttons, P.sle.uibuttons, E.private.sle.uiButtonStyle, "dropdown")
 	local menu = UB.Holder
 	menu:Point("LEFT", E.UIParent, "LEFT", -2, 0);
 	menu:SetupMover(L["S&L UI Buttons"], "ALL,S&L,S&L MISC")

+	function UB:ForUpdateAll()
+		UB.Holder.db = E.db.sle.uibuttons
+		UB.Holder:ToggleShow()
+		UB.Holder:FrameSize()
+	end
+
 	UB:SetupBar(menu)

 	menu:FrameSize()
@@ -129,12 +136,6 @@ function UB:Initialize()
 	UB.FrameSize = menu.FrameSize

 	UB:RightClicks(menu)
+end

-	hooksecurefunc(E, "UpdateAll", function()
-		UB.Holder.db = E.db.sle.uibuttons
-		UB.Holder:ToggleShow()
-		UB.Holder:FrameSize()
-		collectgarbage('collect');
-	end)
-	-- lib:CreateOptions(menu, true, "slebuttons", "SLE Buttons")
-end
\ No newline at end of file
+SLE:RegisterModule(UB:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/unitframes.lua b/ElvUI_SLE/modules/unitframes.lua
deleted file mode 100644
index d4055f0..0000000
--- a/ElvUI_SLE/modules/unitframes.lua
+++ /dev/null
@@ -1,389 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-if not E.private.unitframe.enable then return end
-local UF = E:GetModule('UnitFrames');
-local SLE = E:GetModule('SLE');
-local RC = LibStub("LibRangeCheck-2.0")
-local format = format
-
---Replacement of text formats on unitframes.
-local styles = {
-	['CURRENT'] = '%s',
-	['CURRENT_MAX'] = '%s - %s',
-	['CURRENT_PERCENT'] =  '%s | %s%%',
-	['CURRENT_MAX_PERCENT'] = '%s - %s | %s%%',
-	['DEFICIT'] = '-%s',
-	['DARTH_HEAL'] = '-%s / %s | %s%%',
-}
-
-local function GetFormattedTextSLE(style, min, max)
-	assert(styles[style], 'Invalid format style: '..style)
-	assert(min, 'You need to provide a current value. Usage: E:GetFormattedText(style, min, max)')
-	assert(max, 'You need to provide a maximum value. Usage: E:GetFormattedText(style, min, max)')
-
-	if max == 0 then max = 1 end
-
-	local useStyle = styles[style]
-
-	if style == 'DEFICIT' then
-		local deficit = max - min
-		if deficit <= 0 then
-			return ''
-		else
-			return format(useStyle, deficit)
-		end
-	elseif style == 'CURRENT' or ((style == 'CURRENT_MAX' or style == 'CURRENT_MAX_PERCENT' or style == 'CURRENT_PERCENT') and min == max) then
-		return format(styles['CURRENT'], min)
-	elseif style == 'CURRENT_MAX' then
-		return format(useStyle, min, max)
-	elseif style == 'CURRENT_PERCENT' then
-		return format(useStyle, min, format("%.1f", min / max * 100))
-	elseif style == 'CURRENT_MAX_PERCENT' then
-		return format(useStyle, min, max, format("%.1f", min / max * 100))
-	elseif style == "DARTH_HEAL" then
-		local deficit = max - min
-		if deficit <= 0 then
-			return format(styles["CURRENT_PERCENT"], min, format("%.1f", min / max * 100))
-		else
-			return format(useStyle, deficit, min, format("%.1f", min / max * 100))
-		end
-
-	end
-end
-
---New Tags
-local function AddTags()
-
-	ElvUF.Tags.Events['vengeance:current:sl'] = 'UNIT_AURA'
-	ElvUF.Tags.Methods['vengeance:current:sl'] = function(unit)
-		local SPELL_VENGEANCE_NAME = (GetSpellInfo(93098))
-		local veng = select(15, UnitAura(unit, SPELL_VENGEANCE_NAME, nil, 'HELPFUL')) or 0
-		if (veng > 999999) then
-			veng = math.floor(veng/1000000) .. "m"
-		elseif (veng > 999) then
-			veng = math.floor(veng/1000) .. "k"
-		end
-		if veng == 0 then
-			return ' '
-		else
-			return veng
-		end
-	end
-
-	ElvUF.Tags.Events['resolve:current-percent:sl'] = 'UNIT_AURA'
-	ElvUF.Tags.Methods['resolve:current-percent:sl'] = function(unit)
-	local SPELL_RESOLVE_NAME = GetSpellInfo(158300)
-	--/run print(GetSpellInfo(158300))
-	--/run print(UnitAura('player', 'Resolve', nil, 'HELPFUL'))
-	end
-
-	ElvUF.Tags.Methods['range:sl'] = function(unit)
-		local name, server = UnitName(unit)
-		local rangeText = ''
-		local min, max = RC:GetRange(unit)
-		curMin = min
-		curMax = max
-
-		if(server and server ~= "") then
-			name = format("%s-%s", name, server)
-		end
-
-		if min and max and (name ~= UnitName('player')) then
-			rangeText = curMin.."-"..curMax
-		end
-		return rangeText
-	end
-
-	ElvUF.Tags.Events['health:current:sl'] = 'UNIT_HEALTH_FREQUENT UNIT_MAXHEALTH UNIT_CONNECTION'
-	ElvUF.Tags.Methods['health:current:sl'] = function(unit)
-		local min, max = UnitHealth(unit), UnitHealthMax(unit)
-		local status = not UnitIsConnected(unit) and L['Offline'] or UnitIsGhost(unit) and L['Ghost'] or UnitIsDead(unit) and DEAD
-
-		if (status) then
-			return status
-		else
-			return GetFormattedTextSLE('CURRENT', min, max)
-		end
-	end
-
-	ElvUF.Tags.Events['health:deficit:sl'] = 'UNIT_HEALTH_FREQUENT UNIT_MAXHEALTH UNIT_CONNECTION'
-	ElvUF.Tags.Methods['health:deficit:sl'] = function(unit)
-		local min, max = UnitHealth(unit), UnitHealthMax(unit)
-		local status = not UnitIsConnected(unit) and L['Offline'] or UnitIsGhost(unit) and L['Ghost'] or UnitIsDead(unit) and DEAD
-
-		if (status) then
-			return status
-		else
-			return GetFormattedTextSLE('DEFICIT', min, max)
-		end
-	end
-
-	ElvUF.Tags.Events['health:current-percent:sl'] = 'UNIT_HEALTH_FREQUENT UNIT_MAXHEALTH UNIT_CONNECTION'
-	ElvUF.Tags.Methods['health:current-percent:sl'] = function(unit)
-		local min, max = UnitHealth(unit), UnitHealthMax(unit)
-		local status = not UnitIsConnected(unit) and L['Offline'] or UnitIsGhost(unit) and L['Ghost'] or UnitIsDead(unit) and DEAD
-
-		if (status) then
-			return status
-		else
-			return GetFormattedTextSLE('CURRENT_PERCENT', min, max)
-		end
-	end
-
-	ElvUF.Tags.Events['health:current-max:sl'] = 'UNIT_HEALTH_FREQUENT UNIT_MAXHEALTH UNIT_CONNECTION'
-	ElvUF.Tags.Methods['health:current-max:sl'] = function(unit)
-		local min, max = UnitHealth(unit), UnitHealthMax(unit)
-		local status = not UnitIsConnected(unit) and L['Offline'] or UnitIsGhost(unit) and L['Ghost'] or UnitIsDead(unit) and DEAD
-
-		if (status) then
-			return status
-		else
-			return GetFormattedTextSLE('CURRENT_MAX', min, max)
-		end
-	end
-
-	ElvUF.Tags.Events['health:current-max-percent:sl'] = 'UNIT_HEALTH_FREQUENT UNIT_MAXHEALTH UNIT_CONNECTION'
-	ElvUF.Tags.Methods['health:current-max-percent:sl'] = function(unit)
-		local min, max = UnitHealth(unit), UnitHealthMax(unit)
-		local status = not UnitIsConnected(unit) and L['Offline'] or UnitIsGhost(unit) and L['Ghost'] or UnitIsDead(unit) and DEAD
-
-		if (status) then
-			return status
-		else
-			return GetFormattedTextSLE('CURRENT_MAX_PERCENT', min, max)
-		end
-	end
-
-	ElvUF.Tags.Events['health:sl:darth-heal'] = 'UNIT_HEALTH_FREQUENT UNIT_MAXHEALTH UNIT_CONNECTION'
-	ElvUF.Tags.Methods['health:sl:darth-heal'] = function(unit)
-		local min, max = UnitHealth(unit), UnitHealthMax(unit)
-		local status = not UnitIsConnected(unit) and L['Offline'] or UnitIsGhost(unit) and L['Ghost'] or UnitIsDead(unit) and DEAD
-
-		if (status) then
-			return status
-		else
-			return GetFormattedTextSLE('DARTH_HEAL', min, max)
-		end
-	end
-
-	ElvUF.Tags.Events['power:current:sl'] = 'UNIT_POWER_FREQUENT UNIT_MAXPOWER'
-	ElvUF.Tags.Methods['power:current:sl'] = function(unit)
-		local pType = UnitPowerType(unit)
-		local min, max = UnitPower(unit, pType), UnitPowerMax(unit, pType)
-
-		if min == 0 then
-			return ' '
-		else
-			return GetFormattedTextSLE('CURRENT', min, max)
-		end
-	end
-
-	ElvUF.Tags.Events['power:current-max:sl'] = 'UNIT_POWER_FREQUENT UNIT_MAXPOWER'
-	ElvUF.Tags.Methods['power:current-max:sl'] = function(unit)
-		local pType = UnitPowerType(unit)
-		local min, max = UnitPower(unit, pType), UnitPowerMax(unit, pType)
-
-		if min == 0 then
-			return ' '
-		else
-			return GetFormattedTextSLE('CURRENT_MAX', min, max)
-		end
-	end
-
-	ElvUF.Tags.Events['power:current-percent:sl'] = 'UNIT_POWER_FREQUENT UNIT_MAXPOWER'
-	ElvUF.Tags.Methods['power:current-percent:sl'] = function(unit)
-		local pType = UnitPowerType(unit)
-		local min, max = UnitPower(unit, pType), UnitPowerMax(unit, pType)
-
-		if min == 0 then
-			return ' '
-		else
-			return GetFormattedTextSLE('CURRENT_PERCENT', min, max)
-		end
-	end
-
-	ElvUF.Tags.Events['power:current-max-percent:sl'] = 'UNIT_POWER_FREQUENT UNIT_MAXPOWER'
-	ElvUF.Tags.Methods['power:current-max-percent:sl'] = function(unit)
-		local pType = UnitPowerType(unit)
-		local min, max = UnitPower(unit, pType), UnitPowerMax(unit, pType)
-
-		if min == 0 then
-			return ' '
-		else
-			return GetFormattedTextSLE('CURRENT_MAX_PERCENT', min, max)
-		end
-	end
-
-	ElvUF.Tags.Events['power:deficit:sl'] = 'UNIT_POWER_FREQUENT UNIT_MAXPOWER'
-	ElvUF.Tags.Methods['power:deficit:sl'] = function(unit)
-		local pType = UnitPowerType(unit)
-		local min, max = UnitPower(unit, pType), UnitPowerMax(unit, pType)
-
-		return GetFormattedTextSLE('DEFICIT', min, max, r, g, b)
-	end
-end
-AddTags()
-
---Player Frame Enhancements
-function UF:Update_CombatIndicator()
-	local CombatText = ElvUF_Player.Combat
-	if E.db.sle.combatico.pos == "NONE" then E.db.sle.combatico.pos = "TOP" end
-	local x, y = UF:GetPositionOffset(E.db.sle.combatico.pos)
-	CombatText:ClearAllPoints()
-	CombatText:Point(E.db.sle.combatico.pos, ElvUF_Player.Health, E.db.sle.combatico.pos, x, x)
-	SLE:UnregisterEvent("PLAYER_REGEN_DISABLED")
-end
-
-local function EclipseTextSLE()
-	local eclipseBar = ElvUF_Player.EclipseBar
-	local spower = UnitPower( PlayerFrame.unit, SPELL_POWER_ECLIPSE );
-	if E.db.sle.powtext then
-		eclipseBar.powtext:SetText(spower)
-	else
-		eclipseBar.powtext:SetText('')
-	end
-end
-
-local function DFTextSLE()
-	local ShardBar = ElvUF_Player.ShardBar
-	local dfpower = UnitPower( PlayerFrame.unit, SPELL_POWER_DEMONIC_FURY );
-	local hasspec = GetSpecialization(false, false)
-	if hasspec == nil then return end
-	local index = select(1, GetSpecializationInfo(GetSpecialization(false, false, active)), false, false)
-	if index == 266 then --This crap is checking the spec.
-		if E.db.sle.powtext then
-			ShardBar.powtext:SetText(dfpower)
-			if E.db.unitframe.units.player.classbar.fill == "spaced" then
-				ShardBar.powtext:ClearAllPoints()
-				ShardBar.powtext:SetPoint("LEFT", ShardBar, "RIGHT")
-			else
-				ShardBar.powtext:ClearAllPoints()
-				ShardBar.powtext:SetPoint("CENTER", ShardBar, "CENTER")
-			end
-		else
-			ShardBar.powtext:SetText('')
-		end
-	else
-		ShardBar.powtext:SetText('')
-	end
-end
-
-local function PlayerFrameAnchors()
-	if E.myclass == "DRUID" then
-		EclipseTextSLE()
-	elseif E.myclass == "WARLOCK" then
-		DFTextSLE()
-	end
-end
-
-hooksecurefunc(UF, "Configure_ClassBar", PlayerFrameAnchors)
-
-function UF:ClassbarTextSLE()
-	if E.myclass == "DRUID" then
-		EclipseTextSLE()
-	elseif E.myclass == "WARLOCK" then
-		DFTextSLE()
-	end
-end
-
---Text for druid eclipse bar
-if E.myclass == "DRUID" then
-	local eclipseBar = ElvUF_Player.EclipseBar
-	local lunarBar = eclipseBar.LunarBar
-
-	eclipseBar.powtext = lunarBar:CreateFontString(nil, 'OVERLAY')
-	eclipseBar.powtext:SetPoint("CENTER", eclipseBar, "CENTER")
-	eclipseBar.powtext:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE")
-end
-
-if E.myclass == "WARLOCK" then
-	local ShardBar = ElvUF_Player.ShardBar
-	local dfbar = select(2, ShardBar:GetChildren())
-
-	ShardBar.powtext = dfbar:CreateFontString(nil, 'OVERLAY')
-	ShardBar.powtext:SetFont("Fonts\\FRIZQT__.TTF", 10, "OUTLINE")
-end
-
-local specNameToRole = {}
-for i = 1, GetNumClasses() do
-	local _, class, classID = GetClassInfo(i)
-	specNameToRole[class] = {}
-	for j = 1, GetNumSpecializationsForClassID(classID) do
-		local _, spec, _, _, _, role = GetSpecializationInfoForClassID(classID, j)
-		specNameToRole[class][spec] = role
-	end
-end
-
-local function GetBattleFieldIndexFromUnitName(name)
-	local nameFromIndex
-	for index = 1, GetNumBattlefieldScores() do
-		nameFromIndex = GetBattlefieldScore(index)
-		if nameFromIndex == name then
-			return index
-		end
-	end
-	return nil
-end
-
-
-function UF:UpdateRoleIcon()
-    local lfdrole = self.LFDRole
-    if not self.db then return; end
-    local db = self.db.roleIcon;
-    if (not db) or (db and not db.enable) then
-        lfdrole:Hide()
-        return
-    end
-
-    local isInstance, instanceType = IsInInstance()
-    local role
-    if isInstance and instanceType == "pvp" then
-        local name = GetUnitName(self.unit, true)
-        local index = GetBattleFieldIndexFromUnitName(name)
-        if index then
-            local _, _, _, _, _, _, _, _, classToken, _, _, _, _, _, _, talentSpec = GetBattlefieldScore(index)
-            if classToken and talentSpec then
-                role = specNameToRole[classToken][talentSpec]
-            else
-                role = UnitGroupRolesAssigned(self.unit) --Fallback
-            end
-        else
-            role = UnitGroupRolesAssigned(self.unit) --Fallback
-        end
-    else
-        role = UnitGroupRolesAssigned(self.unit)
-        if self.isForced and role == 'NONE' then
-            local rnd = random(1, 3)
-            role = rnd == 1 and "TANK" or (rnd == 2 and "HEALER" or (rnd == 3 and "DAMAGER"))
-        end
-    end
-    if (self.isForced or UnitIsConnected(self.unit)) and ((role == "DAMAGER" and db.damager) or (role == "HEALER" and db.healer) or (role == "TANK" and db.tank)) then
-        lfdrole:SetTexture(SLE.rolePaths[E.db.sle.roleicons][role])
-        lfdrole:Show()
-    else
-        lfdrole:Hide()
-    end
-end
-
-local function SetRoleIcons()
-    for _, header in pairs(UF.headers) do
-        local name = header.groupName
-        local db = UF.db['units'][name]
-        for i = 1, header:GetNumChildren() do
-            local group = select(i, header:GetChildren())
-            for j = 1, group:GetNumChildren() do
-                local unitbutton = select(j, group:GetChildren())
-                if unitbutton.LFDRole and unitbutton.LFDRole.Override then
-                    unitbutton.LFDRole.Override = UF.UpdateRoleIcon
-                end
-            end
-        end
-    end
-
-    UF:UpdateAllHeaders()
-end
-local f = CreateFrame("Frame")
-f:RegisterEvent("PLAYER_ENTERING_WORLD")
-f:SetScript("OnEvent", function(self, event)
-    self:UnregisterEvent(event)
-    SetRoleIcons()
-end)
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/unitframes/load_unitframes.xml b/ElvUI_SLE/modules/unitframes/load_unitframes.xml
new file mode 100644
index 0000000..d163687
--- /dev/null
+++ b/ElvUI_SLE/modules/unitframes/load_unitframes.xml
@@ -0,0 +1,7 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<Script file='unitframes.lua'/>
+	<Include file='units\load_units.xml'/>
+	<Script file='offline.lua'/>
+	<Script file='statusbars.lua'/>
+	<Script file='roleIcons.lua'/>
+</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/unitframes/offline.lua b/ElvUI_SLE/modules/unitframes/offline.lua
new file mode 100644
index 0000000..fe345d3
--- /dev/null
+++ b/ElvUI_SLE/modules/unitframes/offline.lua
@@ -0,0 +1,21 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local SUF = SLE:GetModule("UnitFrames")
+
+SUF.OfflineTextures = {
+	["ALERT"] = [[Interface\DialogFrame\UI-Dialog-Icon-AlertNew]],
+	["ARTHAS"] = [[Interface\LFGFRAME\UI-LFR-PORTRAIT]],
+	["SKULL"] = [[Interface\LootFrame\LootPanel-Icon]],
+	["PASS"] = [[Interface\PaperDollInfoFrame\UI-GearManager-LeaveItem-Transparent]],
+	["NOTREADY"] = [[Interface\RAIDFRAME\ReadyCheck-NotReady]],
+}
+
+function SUF:Construct_Offline(frame, group)
+	local db = E.db.sle.unitframes.unit[group].offline
+	local offline = frame:CreateTexture(frame:GetName().."Offline", "OVERLAY")
+	offline:SetSize(db.size, db.size)
+	offline:SetPoint("CENTER", frame, "CENTER", db.xOffset, db.yOffset)
+	offline.Group = "ElvUF_"..T.StringToUpper(group)
+	offline:Hide()
+
+	return offline
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/unitframes/roleIcons.lua b/ElvUI_SLE/modules/unitframes/roleIcons.lua
new file mode 100644
index 0000000..9c6c6c6
--- /dev/null
+++ b/ElvUI_SLE/modules/unitframes/roleIcons.lua
@@ -0,0 +1,71 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local SUF = SLE:GetModule("UnitFrames")
+local UF = E:GetModule('UnitFrames');
+local _G = _G
+
+local function GetBattleFieldIndexFromUnitName(name)
+	local nameFromIndex
+	for index = 1, T.GetNumBattlefieldScores() do
+		nameFromIndex = T.GetBattlefieldScore(index)
+		if nameFromIndex == name then
+			return index
+		end
+	end
+	return nil
+end
+
+function SUF:UpdateRoleIcon()
+	local lfdrole = self.LFDRole
+	if not self.db then return; end
+	local db = self.db.roleIcon;
+	if (not db) or (db and not db.enable) then
+		lfdrole:Hide()
+		return
+	end
+
+	local isInstance, instanceType = T.IsInInstance()
+	local role
+	if isInstance and instanceType == "pvp" then
+		local name = T.GetUnitName(self.unit, true)
+		local index = GetBattleFieldIndexFromUnitName(name)
+		if index then
+			local _, _, _, _, _, _, _, _, classToken, _, _, _, _, _, _, talentSpec = T.GetBattlefieldScore(index)
+			if classToken and talentSpec then
+				role = SUF.specNameToRole[classToken][talentSpec]
+			else
+				role = T.UnitGroupRolesAssigned(self.unit) --Fallback
+			end
+		else
+			role = T.UnitGroupRolesAssigned(self.unit) --Fallback
+		end
+	else
+		role = T.UnitGroupRolesAssigned(self.unit)
+		if self.isForced and role == 'NONE' then
+			local rnd = T.random(1, 3)
+			role = rnd == 1 and "TANK" or (rnd == 2 and "HEALER" or (rnd == 3 and "DAMAGER"))
+		end
+	end
+	if (self.isForced or T.UnitIsConnected(self.unit)) and ((role == "DAMAGER" and db.damager) or (role == "HEALER" and db.healer) or (role == "TANK" and db.tank)) then
+		lfdrole:SetTexture(SLE.rolePaths[E.db.sle.unitframes.roleicons][role])
+		lfdrole:Show()
+	else
+		lfdrole:Hide()
+	end
+end
+
+function SUF:SetRoleIcons()
+	for _, header in T.pairs(UF.headers) do
+		local name = header.groupName
+		local db = UF.db["units"][name]
+		for i = 1, header:GetNumChildren() do
+			local group = T.select(i, header:GetChildren())
+			for j = 1, group:GetNumChildren() do
+			local unitbutton = T.select(j, group:GetChildren())
+				if unitbutton.LFDRole and unitbutton.LFDRole.Override then
+					unitbutton.LFDRole.Override = SUF.UpdateRoleIcon
+				end
+			end
+		end
+	end
+	UF:UpdateAllHeaders()
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/unitframes/statusbars.lua b/ElvUI_SLE/modules/unitframes/statusbars.lua
new file mode 100644
index 0000000..de7f28d
--- /dev/null
+++ b/ElvUI_SLE/modules/unitframes/statusbars.lua
@@ -0,0 +1,127 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local SUF = SLE:GetModule("UnitFrames")
+local UF = E:GetModule('UnitFrames');
+local LSM = LibStub("LibSharedMedia-3.0");
+--GLOBALS: hooksecurefunc
+local _G = _G
+local MAX_BOSS_FRAMES = MAX_BOSS_FRAMES
+
+SUF.powerbars = {}
+
+--PowerBar Texture
+function SUF:BuildStatusTable()
+	T.twipe(SUF.powerbars)
+
+	for _, unitName in T.pairs(UF.units) do
+		local frameNameUnit = E:StringTitle(unitName)
+		frameNameUnit = T.gsub(frameNameUnit, "t(arget)", "T%1")
+
+		local unitframe = _G["ElvUF_"..frameNameUnit]
+		if unitframe and unitframe.Power then SUF.powerbars[unitframe.Power] = true end
+	end
+
+	for unit, unitgroup in T.pairs(UF.groupunits) do
+		local frameNameUnit = E:StringTitle(unit)
+		frameNameUnit = T.gsub(frameNameUnit, "t(arget)", "T%1")
+
+		local unitframe = _G["ElvUF_"..frameNameUnit]
+		if unitframe and unitframe.Power then SUF.powerbars[unitframe.Power] = true end
+	end
+end
+
+--Castbar
+function SUF:PostCast(unit)
+	local castTexture = LSM:Fetch("statusbar", E.db.sle.unitframes.statusTextures.castTexture)
+	self:SetStatusBarTexture(castTexture)
+end
+
+function SUF:CastBarHook()
+	local units = {"Player", "Target", "Focus"}
+	for _, unit in T.pairs(units) do
+		local unitframe = _G["ElvUF_"..unit];
+		local castbar = unitframe and unitframe.Castbar
+		if castbar then
+			hooksecurefunc(castbar, "PostCastStart", SUF.PostCast)
+			hooksecurefunc(castbar, "PostCastInterruptible", SUF.PostCast)
+			hooksecurefunc(castbar, "PostChannelStart", SUF.PostCast)
+		end
+	end
+
+	for i = 1, 5 do
+		local castbar = _G["ElvUF_Arena"..i].Castbar
+		if castbar then
+			hooksecurefunc(castbar, "PostCastStart", SUF.PostCast)
+			hooksecurefunc(castbar, "PostCastInterruptible", SUF.PostCast)
+			hooksecurefunc(castbar, "PostChannelStart", SUF.PostCast)
+		end
+	end
+
+	for i = 1, MAX_BOSS_FRAMES do
+		local castbar = _G["ElvUF_Boss"..i].Castbar
+		if castbar then
+			hooksecurefunc(castbar, "PostCastStart", SUF.PostCast)
+			hooksecurefunc(castbar, "PostCastInterruptible", SUF.PostCast)
+			hooksecurefunc(castbar, "PostChannelStart", SUF.PostCast)
+		end
+	end
+end
+
+--Aurabars
+function SUF:AuraHook()
+	local auraTexture = LSM:Fetch("statusbar", E.db.sle.unitframes.statusTextures.auraTexture)
+	local bars = self.bars
+	if not bars then return end
+	for index = 1, #bars do
+		local frame = bars[index]
+		frame.statusBar:SetStatusBarTexture(auraTexture)
+	end
+end
+
+--Classbars
+function SUF:UpdateClass(frame)
+	local bars = frame[frame.ClassBar]
+	local texture = LSM:Fetch("statusbar", E.db.sle.unitframes.statusTextures.classTexture)
+	if (frame.ClassBar == 'ClassIcons' or frame.ClassBar == 'Runes') then
+		for i = 1, (UF.classMaxResourceBar[E.myclass] or 0) do
+			if i <= frame.MAX_CLASS_BAR then
+				bars[i]:SetStatusBarTexture(texture)
+			end
+		end
+	end
+end
+
+function SUF:UpdateStatusBars()
+	if E.private.sle.unitframe.statusbarTextures.power then
+		local powerTexture = LSM:Fetch("statusbar", E.db.sle.unitframes.statusTextures.powerTexture)
+
+		for powerbar in T.pairs(SUF.powerbars) do
+			if powerbar and powerbar:GetObjectType() == "StatusBar" and not powerbar.isTransparent then
+				powerbar:SetStatusBarTexture(powerTexture)
+			elseif powerbar and powerbar:GetObjectType() == "Texture" then
+				powerbar:SetTexture(powerTexture)
+			end
+		end
+	end
+	if E.private.sle.unitframe.statusbarTextures.class then UF:CreateAndUpdateUF('player') end
+end
+
+function SUF:InitStatus()
+	if E.private.sle.unitframe.statusbarTextures.power or E.private.sle.unitframe.statusbarTextures.class then
+		hooksecurefunc(UF, "Update_StatusBars", SUF.UpdateStatusBars)
+	end
+	if E.private.sle.unitframe.statusbarTextures.power then
+		SUF:BuildStatusTable()
+		hooksecurefunc(UF, "CreateAndUpdateUF", SUF.UpdateStatusBars)
+		hooksecurefunc(UF, "CreateAndUpdateUFGroup", SUF.UpdateStatusBars)
+		hooksecurefunc(UF, "CreateAndUpdateHeaderGroup", SUF.UpdateStatusBars)
+		hooksecurefunc(UF, "ForceShow", SUF.UpdateStatusBars)
+	end
+	if E.private.sle.unitframe.statusbarTextures.aura then
+		hooksecurefunc(_G["ElvUF_Player"].AuraBars, "PostUpdate", SUF.AuraHook)
+		hooksecurefunc(_G["ElvUF_Target"].AuraBars, "PostUpdate", SUF.AuraHook)
+		hooksecurefunc(_G["ElvUF_Focus"].AuraBars, "PostUpdate", SUF.AuraHook)
+	end
+	if E.private.sle.unitframe.statusbarTextures.class then
+		hooksecurefunc(UF, "Configure_ClassBar", SUF.UpdateClass)
+	end
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/unitframes/unitframes.lua b/ElvUI_SLE/modules/unitframes/unitframes.lua
new file mode 100644
index 0000000..48e939e
--- /dev/null
+++ b/ElvUI_SLE/modules/unitframes/unitframes.lua
@@ -0,0 +1,166 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local UF = E:GetModule('UnitFrames');
+local SUF = SLE:NewModule("UnitFrames")
+local RC = LibStub("LibRangeCheck-2.0")
+--GLOBALS: hooksecurefunc, CreateFrame
+local _G = _G
+
+function SUF:NewTags()
+	_G["ElvUF"].Tags.Methods["range:sl"] = function(unit)
+		local name, server = T.UnitName(unit)
+		local rangeText = ''
+		local min, max = RC:GetRange(unit)
+		local curMin = min
+		local curMax = max
+
+		if(server and server ~= "") then
+			name = T.format("%s-%s", name, server)
+		end
+
+		if min and max and (name ~= T.UnitName('player')) then
+			rangeText = curMin.."-"..curMax
+		end
+		return rangeText
+	end
+
+	_G["ElvUF"].Tags.Events['absorbs:sl-short'] = 'UNIT_ABSORB_AMOUNT_CHANGED'
+	_G["ElvUF"].Tags.Methods['absorbs:sl-short'] = function(unit)
+		local absorb = UnitGetTotalAbsorbs(unit) or 0
+		if absorb == 0 then
+			return 0
+		else
+			return E:ShortValue(absorb)
+		end
+	end
+
+	_G["ElvUF"].Tags.Events['absorbs:sl-full'] = 'UNIT_ABSORB_AMOUNT_CHANGED'
+	_G["ElvUF"].Tags.Methods['absorbs:sl-full'] = function(unit)
+		local absorb = UnitGetTotalAbsorbs(unit) or 0
+		if absorb == 0 then
+			return 0
+		else
+			return absorb
+		end
+	end
+end
+
+function SUF:ConfiguePortrait(frame, dontHide)
+	local db = E.db.sle.unitframes.unit
+	local portrait = frame.Portrait
+	if not portrait.SLEHooked then
+		hooksecurefunc(portrait, "PostUpdate", SUF.PortraitUpdate)
+		portrait.SLEHooked = true
+	end
+	if (db[frame.unitframeType] and db[frame.unitframeType].higherPortrait) and frame.USE_PORTRAIT_OVERLAY then
+		if not frame.Health.HigherPortrait then
+			frame.Health.HigherPortrait = CreateFrame("Frame", frame:GetName().."HigherPortrait", frame)
+			frame.Health.HigherPortrait:SetFrameLevel(frame.Health:GetFrameLevel() + 4)
+			frame.Health.HigherPortrait:SetAllPoints(frame.Health)
+		end
+		portrait:ClearAllPoints()
+		if frame.db.portrait.style == '3D' then portrait:SetFrameLevel(frame.Health.HigherPortrait:GetFrameLevel()) end
+		portrait:SetAllPoints(frame.Health.HigherPortrait)
+		frame.Health.bg:SetParent(frame.Health)
+	end
+end
+
+function SUF:PortraitUpdate(unit)
+	local frame = self:GetParent()
+	local dbElv = frame.db
+	if not dbElv then return end
+	local db = E.db.sle.unitframes.unit
+	local portrait = dbElv.portrait
+	if db[frame.unitframeType] and portrait.enable and self:GetParent().USE_PORTRAIT_OVERLAY then
+		self:SetAlpha(0);
+		self:SetAlpha(db[frame.unitframeType].portraitAlpha);
+	end
+end
+
+local function UpdateFillBar(frame, previousTexture, bar, amount)
+	if ( amount == 0 ) then
+		bar:Hide();
+		return previousTexture;
+	end
+
+	local orientation = frame.Health:GetOrientation()
+	local first = false
+	bar:ClearAllPoints()
+	if previousTexture == frame.Health:GetStatusBarTexture() then first = true end
+	if orientation == 'HORIZONTAL' then
+		bar:Point("TOPLEFT", previousTexture, "TOPRIGHT");
+		bar:Point("BOTTOMLEFT", previousTexture, "BOTTOMRIGHT",0,first and -1 or 0);
+	else
+		bar:Point("BOTTOMRIGHT", previousTexture, "TOPRIGHT");
+		bar:Point("BOTTOMLEFT", previousTexture, "TOPLEFT");
+	end
+
+	local totalWidth, totalHeight = frame.Health:GetSize();
+	if orientation == 'HORIZONTAL' then
+		bar:Width(totalWidth);
+	else
+		bar:Height(totalHeight);
+	end
+
+	return bar:GetStatusBarTexture();
+end
+
+function SUF:UpdateHealComm(unit, myIncomingHeal, allIncomingHeal, totalAbsorb)
+	local frame = self.parent
+	local previousTexture = frame.Health:GetStatusBarTexture();
+
+	previousTexture = UpdateFillBar(frame, previousTexture, self.myBar, myIncomingHeal);
+	previousTexture = UpdateFillBar(frame, previousTexture, self.otherBar, allIncomingHeal);
+	previousTexture = UpdateFillBar(frame, previousTexture, self.absorbBar, totalAbsorb);
+end
+
+function SUF:HealthPredictUpdate(frame)
+	if frame.HealPrediction and (not frame.HealPrediction.SLEPredicHook and frame.HealPrediction.PostUpdate) then
+		frame.HealPrediction.PostUpdate = SUF.UpdateHealComm
+		frame.HealPrediction.SLEPredicHook = true
+	end
+end
+
+function SUF:Initialize()
+if not SLE.initialized then return end
+	SUF:NewTags()
+	SUF:InitPlayer()
+
+	--Raid stuff
+	SUF.specNameToRole = {}
+	for i = 1, T.GetNumClasses() do
+		local _, class, classID = T.GetClassInfo(i)
+		SUF.specNameToRole[class] = {}
+		for j = 1, T.GetNumSpecializationsForClassID(classID) do
+			local _, spec, _, _, _, role = T.GetSpecializationInfoForClassID(classID, j)
+			SUF.specNameToRole[class][spec] = role
+		end
+	end
+
+	local f = CreateFrame("Frame")
+	f:RegisterEvent("PLAYER_ENTERING_WORLD")
+	f:SetScript("OnEvent", function(self, event)
+		self:UnregisterEvent(event)
+		SUF:SetRoleIcons()
+		if E.private.sle.unitframe.statusbarTextures.cast then SUF:CastBarHook() end
+	end)
+
+	--Hooking to group frames
+	hooksecurefunc(UF, "Update_PartyFrames", SUF.Update_GroupFrames)
+	hooksecurefunc(UF, "Update_RaidFrames", SUF.Update_GroupFrames)
+	hooksecurefunc(UF, "Update_Raid40Frames", SUF.Update_GroupFrames)
+	--Portrait overlay
+	hooksecurefunc(UF, "Configure_Portrait", SUF.ConfiguePortrait)
+	-- hooksecurefunc(UF, "PortraitUpdate", SUF.PortraitUpdate)
+	if E.private.sle.unitframe.resizeHealthPrediction then
+		hooksecurefunc(UF, "Configure_HealthBar", SUF.HealthPredictUpdate)
+	end
+
+	SUF:InitStatus()
+
+	function SUF:ForUpdateAll()
+		UF:UpdateAllHeaders()
+		if E.private.sle.unitframe.statusbarTextures.power then SUF:BuildStatusTable() end
+	end
+end
+
+SLE:RegisterModule(SUF:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/unitframes/units/groupFrames.lua b/ElvUI_SLE/modules/unitframes/units/groupFrames.lua
new file mode 100644
index 0000000..71ac4ad
--- /dev/null
+++ b/ElvUI_SLE/modules/unitframes/units/groupFrames.lua
@@ -0,0 +1,37 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local SUF = SLE:GetModule("UnitFrames")
+
+local ignore = {
+	["partytarget"] = true,
+	["partypet"] = true,
+	["raidpet"] = true,
+}
+
+function SUF:Update_GroupFrames(frame)
+	local group = frame.unitframeType
+	if ignore[group] then return end
+	if not frame.Offline then frame.Offline = SUF:Construct_Offline(frame, group) end
+	local db = E.db.sle.unitframes.unit[group]
+	if db.offline.enable then
+		if not frame:IsElementEnabled('SLE_Offline') then
+			frame:EnableElement('SLE_Offline')
+		end
+		frame.Offline:SetPoint("CENTER", frame, "CENTER", db.offline.xOffset, db.offline.yOffset)
+		frame.Offline:SetSize(db.offline.size, db.offline.size)
+		if db.offline.texture == "CUSTOM" then
+			frame.Offline:SetTexture(db.offline.CustomTexture)
+		else
+			frame.Offline:SetTexture(SUF.OfflineTextures[db.offline.texture])
+		end
+	else
+		if frame:IsElementEnabled('SLE_Offline') then
+			frame:DisableElement('SLE_Offline')
+		end
+	end
+	-- if frame.db.roleIcon.enable and frame.LFDRole then
+		-- frame.LFDRole:ClearAllPoints()
+		-- local x, y = self:GetPositionOffset(frame.db.roleIcon.position, 1)
+		-- frame.LFDRole:ClearAllPoints()
+		-- frame.LFDRole:Point(frame.db.roleIcon.position, frame.Health, frame.db.roleIcon.position, x + db.role.xoffset, y + db.role.yoffset)
+	-- end
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/unitframes/units/load_units.xml b/ElvUI_SLE/modules/unitframes/units/load_units.xml
new file mode 100644
index 0000000..15ee200
--- /dev/null
+++ b/ElvUI_SLE/modules/unitframes/units/load_units.xml
@@ -0,0 +1,4 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<Script file='player.lua'/>
+	<Script file='groupFrames.lua'/>
+</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/unitframes/units/player.lua b/ElvUI_SLE/modules/unitframes/units/player.lua
new file mode 100644
index 0000000..2c98e22
--- /dev/null
+++ b/ElvUI_SLE/modules/unitframes/units/player.lua
@@ -0,0 +1,79 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local SUF = SLE:GetModule("UnitFrames")
+local UF = E:GetModule('UnitFrames');
+--GLOBALS: CreateFrame, UIParent
+local _G = _G
+local C_TimerNewTimer = C_Timer.NewTimer
+
+SUF.CombatTextures = {
+	["DEFAULT"] = [[Interface\CharacterFrame\UI-StateIcon]],
+	["PLATINUM"] = [[Interface\Challenges\ChallengeMode_Medal_Platinum]],
+	["ATTACK"] = [[Interface\CURSOR\Attack]],
+	["ALERT"] = [[Interface\DialogFrame\UI-Dialog-Icon-AlertNew]],
+	["ARTHAS"] = [[Interface\LFGFRAME\UI-LFR-PORTRAIT]],
+	["SKULL"] = [[Interface\LootFrame\LootPanel-Icon]],
+	["SVUI"] = [[Interface\AddOns\ElvUI_SLE\media\textures\SVUI-StateIcon]],
+}
+SUF.RestedTextures = {
+	["DEFAULT"] = [[Interface\CharacterFrame\UI-StateIcon]],
+	["SVUI"] = [[Interface\AddOns\ElvUI_SLE\media\textures\SVUI-StateIcon]],
+}
+
+function SUF:CombatIcon_PostUpdate(inCombat)
+	local frame = self:GetParent()
+	self:ClearAllPoints()
+	self:SetTexture(SUF.CombatTextures[E.db.sle.unitframes.unit.player.combatico.texture])
+	if E.db.sle.unitframes.unit.player.combatico.texture == "DEFAULT" or E.db.sle.unitframes.unit.player.combatico.texture == "SVUI" then self:SetTexCoord(.5, 1, 0, .49) else self:SetTexCoord(0,1,0,1) end
+	self:Size(E.db.sle.unitframes.unit.player.combatico.size)
+	self:Point("CENTER", frame.Health, "CENTER", E.db.sle.unitframes.unit.player.combatico.xoffset, E.db.sle.unitframes.unit.player.combatico.yoffset)
+	if not E.db.sle.unitframes.unit.player.combatico.red then self:SetVertexColor(1, 1, 1) end
+end
+
+function SUF:TestCombat()
+	if SUF.CombatTest.Timer then SUF.CombatTest.Timer:Cancel() end
+
+	SUF.CombatTest:Point("CENTER", _G["ElvUF_Player"].Combat)
+	SUF.CombatTest:Size(E.db.sle.unitframes.unit.player.combatico.size)
+
+	SUF.CombatTest.texture:SetTexture(SUF.CombatTextures[E.db.sle.unitframes.unit.player.combatico.texture])
+	if E.db.sle.unitframes.unit.player.combatico.texture == "DEFAULT" or E.db.sle.unitframes.unit.player.combatico.texture == "SVUI" then SUF.CombatTest.texture:SetTexCoord(.5, 1, 0, .49) else SUF.CombatTest.texture:SetTexCoord(0,1,0,1) end
+	if not E.db.sle.unitframes.unit.player.combatico.red then SUF.CombatTest.texture:SetVertexColor(1, 1, 1) else SUF.CombatTest.texture:SetVertexColor(0.69, 0.31, 0.31) end
+	SUF.CombatTest:Show()
+	SUF.CombatTest.Timer = C_TimerNewTimer(10, function() SUF.CombatTest:Hide() end)
+end
+
+function SUF:UpdateRested(frame)
+	local rIcon = frame.Resting
+	local db = frame.db
+	local Sdb = E.db.sle.unitframes.unit.player.rested
+	if db.restIcon then
+		rIcon:ClearAllPoints()
+		if frame.ORIENTATION == "RIGHT" then
+			rIcon:Point("CENTER", frame.Health, "TOPLEFT", -3 + Sdb.xoffset, 6 + Sdb.yoffset)
+		else
+			if frame.USE_PORTRAIT and not frame.USE_PORTRAIT_OVERLAY then
+				rIcon:Point("CENTER", frame.Portrait, "TOPLEFT", -3 + Sdb.xoffset, 6 + Sdb.yoffset)
+			else
+				rIcon:Point("CENTER", frame.Health, "TOPLEFT", -3 + Sdb.xoffset, 6 + Sdb.yoffset)
+			end
+		end
+		rIcon:Size(Sdb.size)
+		if Sdb.texture ~= "CUSTOM" then
+			rIcon:SetTexture(SUF.CombatTextures[Sdb.texture])
+			if Sdb.texture == "DEFAULT" or Sdb.texture == "SVUI" then rIcon:SetTexCoord(0, .5, 0, .421875) else rIcon:SetTexCoord(0,1,0,1) end
+		else
+			rIcon:SetTexture(Sdb.customTexture)
+		end
+	end
+end
+
+function SUF:InitPlayer()
+	SUF.CombatTest = CreateFrame("Frame", "SLE_CombatIconTest", UIParent)
+	SUF.CombatTest:Point("CENTER", _G["ElvUF_Player"].Combat)
+	SUF.CombatTest.texture = SUF.CombatTest:CreateTexture(nil, "OVERLAY")
+	SUF.CombatTest.texture:SetAllPoints()
+	SUF.CombatTest:Hide()
+	_G["ElvUF_Player"].Combat.PostUpdate = SUF.CombatIcon_PostUpdate
+
+	hooksecurefunc(UF, "Configure_RestingIndicator", SUF.UpdateRested)
+end
\ No newline at end of file
diff --git a/ElvUI_SLE/modules/vehicle.lua b/ElvUI_SLE/modules/vehicle.lua
index 0f3ea30..51dc1c6 100644
--- a/ElvUI_SLE/modules/vehicle.lua
+++ b/ElvUI_SLE/modules/vehicle.lua
@@ -1,5 +1,5 @@
-local E, L, V, P, G = unpack(ElvUI);
-local EVB = E:GetModule("SLE_EnhancedVehicleBar")
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local EVB = SLE:NewModule("EnhancedVehicleBar")
 local AB = E:GetModule("ActionBars");
 local LAB = LibStub("LibActionButton-1.0-ElvUI")

@@ -26,7 +26,7 @@ end

 function EVB:AnimSlideIn(bar)
 	if not bar.anim then
-		Animate(bar)
+		EVB:Animate(bar)
 	end

 	bar.anim.out1:Stop()
@@ -48,7 +48,7 @@ function EVB:CreateExtraButtonSet()
 	for i = 1, 7 do
 		i = i == 7 and 12 or i

-		bar.buttons[i] = LAB:CreateButton(i, format(bar:GetName().."Button%d", i), bar, nil);
+		bar.buttons[i] = LAB:CreateButton(i, T.format(bar:GetName().."Button%d", i), bar, nil);
 		bar.buttons[i]:SetState(0, "action", i);

 		for k = 1, 14 do
@@ -76,10 +76,11 @@ function EVB:CreateExtraButtonSet()
 end

 function EVB:Initialize()
+	if not SLE.initialized then return end
 	if (not E.private.sle.vehicle.enable) then return end;

 	local visibility = "[petbattle] hide; [vehicleui][overridebar][shapeshift][possessbar] hide;"
-	local page = format("[vehicleui] %d; [possessbar] %d; [overridebar] %d; [shapeshift] 13;", GetVehicleBarIndex(), GetVehicleBarIndex(), GetOverrideBarIndex());
+	local page = T.format("[vehicleui] %d; [possessbar] %d; [overridebar] %d; [shapeshift] 13;", GetVehicleBarIndex(), GetVehicleBarIndex(), GetOverrideBarIndex());
 	local bindButtons = "ACTIONBUTTON";

 	hooksecurefunc(AB, "PositionAndSizeBar", function(self, barName)
@@ -93,6 +94,7 @@ function EVB:Initialize()
 	local size = 40;
 	local spacing = E:Scale(AB.db["bar1"].buttonspacing);
 	local bar = CreateFrame("Frame", "ElvUISLEEnhancedVehicleBar", UIParent, "SecureHandlerStateTemplate");
+	bar.id = 1

 	self.size = size;
 	self.spacing = spacing;
@@ -135,4 +137,7 @@ function EVB:Initialize()
 	self:CreateExtraButtonSet();

 	AB:UpdateButtonConfig(bar, bindButtons);
-end
\ No newline at end of file
+	AB:PositionAndSizeBar("bar1")
+end
+
+SLE:RegisterModule(EVB:GetName())
\ No newline at end of file
diff --git a/ElvUI_SLE/options/actionbars_c.lua b/ElvUI_SLE/options/actionbars_c.lua
new file mode 100644
index 0000000..4e75f10
--- /dev/null
+++ b/ElvUI_SLE/options/actionbars_c.lua
@@ -0,0 +1,92 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local A = SLE:GetModule("Actionbars")
+local AB = E:GetModule('ActionBars');
+
+local function configTable()
+	if not SLE.initialized then return end
+
+	E.Options.args.sle.args.modules.args.actionbars = {
+		type = "group",
+		name = L["ActionBars"],
+		order = 1,
+		childGroups = 'tab',
+		disabled = function() return not E.private.actionbar.enable end,
+		args = {
+			oorBind = {
+				order = 1,
+				type = "toggle",
+				name = L["OOR as Bind Text"],
+				desc = L["Out Of Range indication will use keybind text instead of the whole icon."],
+				get = function(info) return E.private.sle.actionbars.oorBind end,
+				set = function(info, value) E.private.sle.actionbars.oorBind = value; E:StaticPopup_Show('PRIVATE_RL'); end,
+			},
+			checkedtexture = {
+				order = 2,
+				type = "toggle",
+				name = L["Checked Texture"],
+				desc = L["Highlight the button of the spell with areal effect untill the area is selected."],
+				disabled = function() return not E.private.actionbar.enable or (LibStub("Masque", true) and E.private.actionbar.masque.actionbars) end,
+				get = function(info) return E.private.sle.actionbars.checkedtexture end,
+				set = function(info, value) E.private.sle.actionbars.checkedtexture = value; E:StaticPopup_Show('PRIVATE_RL'); end,
+			},
+			checkedColor = {
+				type = 'color',
+				order = 3,
+				name = L["Checked Texture Color"],
+				hasAlpha = true,
+				disabled = function() return not E.private.actionbar.enable or not E.private.sle.actionbars.checkedtexture or LibStub("Masque", true) end,
+				get = function(info)
+					local t = E.private.sle.actionbars[ info[#info] ]
+					local d = V.sle.actionbars[info[#info]]
+					return t.r, t.g, t.b, t.a, d.r, d.g, d.b, d.a
+				end,
+				set = function(info, r, g, b, a)
+					E.private.sle.actionbars[ info[#info] ] = {}
+					local t = E.private.sle.actionbars[ info[#info] ]
+					t.r, t.g, t.b, t.a = r, g, b, a
+					for i=1, A.MaxBars do
+						AB:PositionAndSizeBar('bar'..i)
+					end
+				end,
+			},
+			transparentBackdrop = {
+				order = 4,
+				type = "toggle",
+				name = L["Transparent Backdrop"],
+				desc = L["Sets actiobars' backgrounds to transparent template."],
+				get = function(info) return E.private.sle.actionbars.transparentBackdrop end,
+				set = function(info, value) E.private.sle.actionbars.transparentBackdrop = value; E:StaticPopup_Show('PRIVATE_RL'); end,
+			},
+			transparentButtons = {
+				order = 5,
+				type = "toggle",
+				name = L["Transparent Buttons"],
+				desc = L["Sets actiobars buttons' backgrounds to transparent template."],
+				get = function(info) return E.private.sle.actionbars.transparentButtons end,
+				set = function(info, value) E.private.sle.actionbars.transparentButtons = value; E:StaticPopup_Show('PRIVATE_RL'); end,
+			},
+			vehicle = {
+				type = "group",
+				name = L["Enhanced Vehicle Bar"],
+				order = 10,
+				guiInline = true,
+				args = {
+					info = {
+						order = 2,
+						type = "description",
+						name = L["A different look/feel vehicle bar"],
+					},
+					enable = {
+						order = 3,
+						type = "toggle",
+						name = L["Enable"],
+						get = function(info) return E.private.sle.vehicle.enable end,
+						set = function(info, value) E.private.sle.vehicle.enable = value; E:StaticPopup_Show("PRIVATE_RL") end,
+					},
+				},
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/afk_c.lua b/ElvUI_SLE/options/afk_c.lua
new file mode 100644
index 0000000..63be998
--- /dev/null
+++ b/ElvUI_SLE/options/afk_c.lua
@@ -0,0 +1,255 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local S = SLE:GetModule("Screensaver")
+
+local function configTable()
+	if not SLE.initialized then return end
+
+	local function CreateFont(i, title, group)
+		local config = {
+			order = i,
+			type = "group",
+			name = title,
+			get = function(info) return E.db.sle.screensaver[group][ info[#info] ] end,
+			set = function(info, value) E.db.sle.screensaver[group][ info[#info] ] = value S:Media() end,
+			args = {
+				font = {
+					type = "select", dialogControl = 'LSM30_Font',
+					order = 1,
+					name = L["Font"],
+					values = AceGUIWidgetLSMlists.font,
+				},
+				size = {
+					order = 2,
+					name = L["Font Size"],
+					type = "range",
+					min = 8, max = 32, step = 1,
+				},
+				outline = {
+					order = 3,
+					name = L["Font Outline"],
+					type = "select",
+					values = {
+						["NONE"] = L["None"],
+						["OUTLINE"] = 'OUTLINE',
+						["MONOCHROMEOUTLINE"] = 'MONOCROMEOUTLINE',
+						["THICKOUTLINE"] = 'THICKOUTLINE',
+					},
+				},
+			},
+		}
+		return config
+	end
+	E.Options.args.sle.args.modules.args.screensaver = {
+		type = "group",
+		name = L["AFK Mode"],
+		order = 2,
+		childGroups = 'tab',
+		disabled = function() return not E.db.general.afk end,
+		args = {
+			enable = {
+				order = 1,
+				type = "toggle",
+				name = L["Enable"],
+				desc = L["Enable S&L's additional features for AFK screen."],
+				get = function(info) return E.private.sle.module.screensaver end,
+				set = function(info, value) E.private.sle.module.screensaver = value; E:StaticPopup_Show("PRIVATE_RL") end,
+			},
+			keydown = {
+				order = 2,
+				type = "toggle",
+				name = L["Button restrictions"],
+				desc = L["Use ElvUI's restrictions for button presses."],
+				hidden = function() return not E.global.sle.advanced.general end,
+				get = function(info) return E.db.sle.screensaver.keydown end,
+				set = function(info, value) E.db.sle.screensaver.keydown = value; S:KeyScript() end,
+			},
+			fonts = {
+				order = 3,
+				type = "group",
+				name = L["Fonts"],
+				disabled = function() return not E.private.sle.module.screensaver end,
+				args = {
+					title = CreateFont(1, L["Title font"], "title"),
+					subtitle = CreateFont(2, L["Subitle font"], "subtitle"),
+					date = CreateFont(3,L["Date font"], "date"),
+					player = CreateFont(4,L["Player info font"], "player"),
+					tips = CreateFont(5,L["Tips font"], "tips"),
+				},
+			},
+			graphics = {
+				type = "group",
+				name = L["Graphics"],
+				order = 4,
+				disabled = function() return not E.private.sle.module.screensaver end,
+				args = {
+					general = {
+						type = "group",
+						name = L["General"],
+						order = 1,
+						args = {
+							crest = {
+								order = 1,
+								name = L["Crest Size"],
+								type = "range",
+								min = 84, max = 256, step = 1,
+								get = function(info) return E.db.sle.screensaver.crest end,
+								set = function(info, value) E.db.sle.screensaver.crest = value; S:Media() end,
+							},
+							xpack = {
+								order = 2,
+								name = L["X-Pack Logo Size"],
+								type = "range",
+								min = 100, max = 256, step = 1,
+								get = function(info) return E.db.sle.screensaver.xpack end,
+								set = function(info, value) E.db.sle.screensaver.xpack = value; S:Media() end,
+							},
+							height = {
+								order = 3,
+								name = L["Panel Height"],
+								type = "range",
+								min = 120, max = 200, step = 1,
+								get = function(info) return E.db.sle.screensaver.height end,
+								set = function(info, value) E.db.sle.screensaver.height = value end,
+							},
+							animType = {
+								order = 4,
+								name = L["Template"],
+								type = "select",
+								disabled = function() return E.db.sle.screensaver.panelTemplate == 0 end,
+								get = function(info) return E.db.sle.screensaver.panelTemplate end,
+								set = function(info, value) E.db.sle.screensaver.panelTemplate = value; S:SetPanelTemplate() end,
+								values = {
+									["Default"] = DEFAULT,
+									["Transparent"] = L["Transparent"],
+								},
+							},
+						},
+					},
+					model = {
+						type = "group",
+						name = L["Player Model"],
+						order = 2,
+						args = {
+							modelanim = {
+								order = 1,
+								name = L["Model Animation"],
+								type = "select",
+								get = function(info) return E.db.sle.screensaver.playermodel.anim end,
+								set = function(info, value) E.db.sle.screensaver.playermodel.anim = value end,
+								values = {
+									[47] = "Standing",
+									[4] = "Walking",
+									[5] = "Running",
+									[13] = "Walking backwards",
+									[25] = 'Unarmed Ready',
+									[60] = "Talking",
+									[64] = 'Exclmation',
+									[66] = 'Bow',
+									[67] = 'Wave',
+									[68] = 'Ceers',
+									[69] = 'Dance',
+									[70] = 'Laugh',
+									[76] = 'Kiss',
+									[77] = 'Cry',
+									[80] = 'Applaud',
+									[82] = 'Flex',
+									[83] = 'Shy',
+									[113] = 'Salute',
+								},
+							},
+							holderXoffset = {
+								order = 6,
+								name = L["X-Offset"],
+								type = "range",
+								min = -E.screenwidth, max = E.screenwidth, step = 1,
+								get = function(info) return E.db.sle.screensaver.playermodel.holderXoffset end,
+								set = function(info, value) E.db.sle.screensaver.playermodel.holderXoffset = value; S:ModelHolderPos() end,
+							},
+							holderYoffset = {
+								order = 7,
+								name = L["Y-Offset"],
+								type = "range",
+								min = -E.screenheight, max = E.screenheight, step = 1,
+								get = function(info) return E.db.sle.screensaver.playermodel.holderYoffset end,
+								set = function(info, value) E.db.sle.screensaver.playermodel.holderYoffset = value; S:ModelHolderPos() end,
+							},
+							distance = {
+								order = 8,
+								name = L["Camera Distance Scale"],
+								type = "range",
+								min = 0, max = 10, step = 0.01,
+								get = function(info) return E.db.sle.screensaver.playermodel.distance end,
+								set = function(info, value) E.db.sle.screensaver.playermodel.distance = value end,
+							},
+							rotation = {
+								type = 'range',
+								name = L["Model Rotation"],
+								order = 4,
+								min = 0, max = 360, step = 1,
+								get = function(info) return E.db.sle.screensaver.playermodel.rotation end,
+								set = function(info, value) E.db.sle.screensaver.playermodel.rotation = value end,
+							},
+							testmodel = {
+								order = 10,
+								type = 'execute',
+								name = L["Test"],
+								desc = L["Shows a test model with selected animation for 10 seconds. Clicking again will reset timer."],
+								func = function() S:TestShow() end,
+							},
+						},
+					},
+				},
+			},
+			misc = {
+				type = "group",
+				name = L["Misc"],
+				order = 5,
+				disabled = function() return not E.private.sle.module.screensaver end,
+				args = {
+					animBounce = {
+						order = 1,
+						type = "toggle",
+						name = L["Bouncing"],
+						desc = L["Use bounce on fade in animations."],
+						disabled = function() return E.db.sle.screensaver.animTime == 0 end,
+						get = function(info) return E.db.sle.screensaver.animBounce end,
+						set = function(info, value) E.db.sle.screensaver.animBounce = value; S:SetupAnimations() end,
+					},
+					animTime = {
+						order = 2,
+						type = "range",
+						name = L["Animation time"],
+						desc = L["Time the fade in animation will take. To disable animation set to 0."],
+						min = 0, max = 10, step = 0.01,
+						get = function(info) return E.db.sle.screensaver.animTime end,
+						set = function(info, value) E.db.sle.screensaver.animTime = value; S:Hide() end,
+					},
+					animType = {
+						order = 3,
+						name = L["Animation Type"],
+						type = "select",
+						disabled = function() return E.db.sle.screensaver.animTime == 0 end,
+						get = function(info) return E.db.sle.screensaver.animType end,
+						set = function(info, value) E.db.sle.screensaver.animType = value; S:SetupType() end,
+						values = {
+							["SlideIn"] = L["Slide"],
+							["SlideSide"] = L["Slide Sideways"],
+							["FadeIn"] = L["Fade"],
+						},
+					},
+					tipThrottle = {
+						order = 4,
+						name = L["Tip time"],
+						desc = L["Number of seconds tip will be shown before changed to another."],
+						type = "range",
+						min = 5, max = 120, step = 1,
+						get = function(info) return E.db.sle.screensaver.tipThrottle end,
+						set = function(info, value) E.db.sle.screensaver.tipThrottle = value end,
+					},
+				},
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/auras_c.lua b/ElvUI_SLE/options/auras_c.lua
index a8b048f..c456656 100644
--- a/ElvUI_SLE/options/auras_c.lua
+++ b/ElvUI_SLE/options/auras_c.lua
@@ -1,13 +1,12 @@
-local E, L, V, P, G = unpack(ElvUI);
-local AT = E:GetModule('SLE_AuraTimers')
-local A = E:GetModule('Auras')
-
-
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local BUFFOPTIONS_LABEL = BUFFOPTIONS_LABEL
 local function configTable()
-	E.Options.args.sle.args.options.args.general.args.auras = {
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.auras = {
 		type = "group",
 		name = BUFFOPTIONS_LABEL,
-		order = 1,
+		order = 4,
+		disabled = function() return not E.private.auras.enable end,
 		args = {
 			header = {
 				order = 1,
@@ -17,14 +16,7 @@ local function configTable()
 			intro = {
 				order = 2,
 				type = "description",
-				name = L['AURAS_DESC'],
-			},
-			enabled = {
-				order = 3,
-				type = "toggle",
-				name = ENABLE,
-				get = function(info) return E.db.sle.auras.enable end,
-				set = function(info, value) E.db.sle.auras.enable = value end
+				name = L["AURAS_DESC"],
 			},
 			space1 = {
 				order = 4,
@@ -41,35 +33,19 @@ local function configTable()
 				type = "toggle",
 				name = L["Hide Buff Timer"],
 				desc = L["This hides the time remaining for your buffs."],
-				disabled = function() return not E.db.sle.auras.enable end,
-				get = function(info) return E.db.sle.auras.buffs.hideTimer end,
-				set = function(info, value) E.db.sle.auras.buffs.hideTimer = value end,
+				get = function(info) return E.db.sle.auras.hideBuffsTimer end,
+				set = function(info, value) E.db.sle.auras.hideBuffsTimer = value end,
 			},
 			debuffs = {
 				order = 7,
 				type = "toggle",
 				name = L["Hide Debuff Timer"],
 				desc = L["This hides the time remaining for your debuffs."],
-				disabled = function() return not E.db.sle.auras.enable end,
-				get = function(info) return E.db.sle.auras.debuffs.hideTimer end,
-				set = function(info, value) E.db.sle.auras.debuffs.hideTimer = value end,
-			},
-			space3 = {
-				order = 8,
-				type = 'description',
-				name = "",
-			},
-			consolidatedMark = {
-				order = 9,
-				type = "toggle",
-				name = L["Mark Your Consolidated Buffs"],
-				desc = L["Create a mark bar on a consolidated buffs bar's icons for buffs your class can provide."],
-				disabled = function() return (E.private.general.minimap.enable ~= true or E.private.auras.disableBlizzard ~= true) end,
-				get = function(info) return E.private.sle.auras.consolidatedMark end,
-				set = function(info, value) E.private.sle.auras.consolidatedMark = value; AT:BuildCasts(); A:Update_ConsolidatedBuffsSettings() end,
+				get = function(info) return E.db.sle.auras.hideDebuffsTimer end,
+				set = function(info, value) E.db.sle.auras.hideDebuffsTimer = value end,
 			},
 		},
 	}
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/autorelease_c.lua b/ElvUI_SLE/options/autorelease_c.lua
deleted file mode 100644
index 7f31e9a..0000000
--- a/ElvUI_SLE/options/autorelease_c.lua
+++ /dev/null
@@ -1,30 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-
-local function configTable()
-	E.Options.args.sle.args.options.args.general.args.pvpautorelease = {
-		type = "group",
-		name = L["PvP Auto Release"],
-		order = 9,
-		args = {
-			header = {
-				order = 1,
-				type = "header",
-				name = L["PvP Auto Release"],
-			},
-			intro = {
-				order = 2,
-				type = "description",
-				name = L["Automatically release body when killed inside a battleground."],
-			},
-			enable = {
-				order = 3,
-				type = "toggle",
-				name = ENABLE,
-				get = function(info) return E.db.sle.pvpautorelease end,
-				set = function(info, value) E.db.sle.pvpautorelease = value; end
-			},
-		},
-	}
-end
-
-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/backgrounds_c.lua b/ElvUI_SLE/options/backgrounds_c.lua
index cb3b4c2..fc0dd78 100644
--- a/ElvUI_SLE/options/backgrounds_c.lua
+++ b/ElvUI_SLE/options/backgrounds_c.lua
@@ -1,120 +1,43 @@
-local E, L, V, P, G = unpack(ElvUI);
-local BG = E:GetModule('SLE_BackGrounds')
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local BG = SLE:GetModule('Backgrounds')

 local function configTable()
-	--GroupName = { ShortName, Order }
-	local drop = {
-		["Bottom BG"] = {"bottom", 1},
-		["Left BG"] = {"left", 2},
-		["Right BG"] = {"right", 3},
-		["Actionbar BG"] = {"action", 4},
-	}
-
-	--Options for additional background frames. Main group
-	E.Options.args.sle.args.datatext.args.backgrounds = {
-		type = "group",
-		name = L["Backgrounds"],
-		order = 3,
-		args = {
-			header = {
-				order = 1,
-				type = "header",
-				name = L["Additional Background Panels"],
-			},
-			intro = {
-				order = 2,
-				type = "description",
-				name = L["BG_DESC"]
-			},
-			enabled = {
-				order = 3,
-				type = "toggle",
-				name = ENABLE,
-				desc = L["Show/Hide this frame."],
-				get = function(info) return E.private.sle.backgrounds end,
-				set = function(info, value) E.private.sle.backgrounds = value; E:StaticPopup_Show("PRIVATE_RL") end
-			},
-			Reset = {
-				order = 4,
-				type = 'execute',
-				name = L['Restore Defaults'],
-				desc = L["Reset these options to defaults"],
-				disabled = function() return not E.private.sle.backgrounds end,
-				func = function() E:GetModule('SLE'):Reset("backgrounds") end,
-			},
-			spacerreset = {
-				order = 5,
-				type = 'description',
-				name = "",
-			},
-			bottom_enabled = {
-				order = 6,
-				type = "toggle",
-				name = L["Bottom BG"],
-				desc = L["Show/Hide this frame."],
-				disabled = function() return not E.private.sle.backgrounds end,
-				get = function(info) return E.db.sle.backgrounds.bottom.enabled end,
-				set = function(info, value) E.db.sle.backgrounds.bottom.enabled = value; BG:FramesVisibility() end
-			},
-			left_enabled = {
-				order = 7,
-				type = "toggle",
-				name = L["Left BG"],
-				desc = L["Show/Hide this frame."],
-				disabled = function() return not E.private.sle.backgrounds end,
-				get = function(info) return E.db.sle.backgrounds.left.enabled end,
-				set = function(info, value) E.db.sle.backgrounds.left.enabled = value; BG:FramesVisibility() end
-			},
-			spacer = {
-				order = 8,
-				type = "description",
-				name = "",
-			},
-			right_enabled = {
-				order = 9,
-				type = "toggle",
-				name = L["Right BG"],
-				desc = L["Show/Hide this frame."],
-				disabled = function() return not E.private.sle.backgrounds end,
-				get = function(info) return E.db.sle.backgrounds.right.enabled end,
-				set = function(info, value) E.db.sle.backgrounds.right.enabled = value; BG:FramesVisibility() end
-			},
-			action_enabled = {
-				order = 10,
-				type = "toggle",
-				name = L["Actionbar BG"],
-				desc = L["Show/Hide this frame."],
-				disabled = function() return not E.private.sle.backgrounds end,
-				get = function(info) return E.db.sle.backgrounds.action.enabled end,
-				set = function(info, value) E.db.sle.backgrounds.action.enabled = value; BG:FramesVisibility() end
-			},
+	if not SLE.initialized then return end
+	local function CreateEnable(i)
+		local config = {
+			order = i+5,
+			type = "toggle",
+			name = L["SLE_BG_"..i],
+			desc = L["Show/Hide this frame."],
+			get = function(info) return E.db.sle.backgrounds["bg"..i].enabled end,
+			set = function(info, value) E.db.sle.backgrounds["bg"..i].enabled = value; BG:FramesVisibility(i) end
 		}
-	}
+		return config
+	end

-	--Subgroups
-	for k,v in pairs(drop) do
-		E.Options.args.sle.args.datatext.args.backgrounds.args[v[1]] = {
+	local function CreateGroup(i)
+		local config = {
 			type = "group",
-			name = L[k],
-			order = v[2],
-			get = function(info) return E.db.sle.backgrounds[v[1]][ info[#info] ] end,
-			disabled = function() return not E.db.sle.backgrounds[v[1]].enabled or not E.private.sle.backgrounds end,
+			name = L["SLE_BG_"..i],
+			order = i,
+			get = function(info) return E.db.sle.backgrounds["bg"..i][ info[#info] ] end,
+			disabled = function() return not E.db.sle.backgrounds["bg"..i].enabled end, --or not E.private.sle.backgrounds end,
 			args = {
 				width = {
 					order = 1,
 					type = "range",
-					name = L['Width'],
+					name = L["Width"],
 					desc = L["Sets width of the frame"],
 					min = 50, max = E.screenwidth, step = 1,
-					set = function(info, value) E.db.sle.backgrounds[v[1]].width = value; BG:FramesSize() end,
+					set = function(info, value) E.db.sle.backgrounds["bg"..i].width = value; BG:FramesSize(i) end,
 				},
 				height = {
 					order = 2,
 					type = "range",
-					name = L['Height'],
+					name = L["Height"],
 					desc = L["Sets height of the frame"],
 					min = 30, max = E.screenheight/2, step = 1,
-					set = function(info, value) E.db.sle.backgrounds[v[1]].height = value; BG:FramesSize() end,
+					set = function(info, value) E.db.sle.backgrounds["bg"..i].height = value; BG:FramesSize(i) end,
 				},
 				spacer = {
 					order = 3,
@@ -126,11 +49,11 @@ local function configTable()
 					type = 'input',
 					width = 'full',
 					name = L["Texture"],
-					desc = L["Set the texture to use in this frame.  Requirements are the same as the chat textures."],
+					desc = L["Set the texture to use in this frame. Requirements are the same as the chat textures."],
 					set = function(info, value)
-						E.db.sle.backgrounds[v[1]].texture = value
+						E.db.sle.backgrounds["bg"..i].texture = value
 						E:UpdateMedia()
-						BG:UpdateTex()
+						BG:UpdateTexture(i)
 					end,
 				},
 				template = {
@@ -138,11 +61,11 @@ local function configTable()
 					type = "select",
 					name = L["Backdrop Template"],
 					desc = L["Change the template used for this backdrop."],
-					get = function(info) return E.db.sle.backgrounds[v[1]].template end,
-					set = function(info, value) E.db.sle.backgrounds[v[1]].template = value; BG:UpdateFrames() end,
+					get = function(info) return E.db.sle.backgrounds["bg"..i].template end,
+					set = function(info, value) E.db.sle.backgrounds["bg"..i].template = value; BG:FrameTemplate(i) end,
 					values = {
-						['Default'] = L["Default"],
-						['Transparent'] = L["Transparent"],
+						["Default"] = DEFAULT,
+						["Transparent"] = L["Transparent"],
 					},
 				},
 				pethide = {
@@ -150,26 +73,72 @@ local function configTable()
 					type = "toggle",
 					name = L["Hide in Pet Batlle"],
 					desc = L["Show/Hide this frame during Pet Battles."],
-					set = function(info, value) E.db.sle.backgrounds[v[1]].pethide = value; BG:RegisterHide() end
+					set = function(info, value) E.db.sle.backgrounds["bg"..i].pethide = value; BG:RegisterHide(i) end
 				},
 				clickthrough = {
 					order = 9,
 					type = "toggle",
 					name = L["Click Through"],
-					set = function(info, value) E.db.sle.backgrounds[v[1]].clickthrough = value; BG:MouseCatching() end
+					set = function(info, value) E.db.sle.backgrounds["bg"..i].clickthrough = value; BG:MouseCatching(i) end
 				},
 				alpha = {
 					order = 12,
 					type = 'range',
-					name = L['Alpha'],
+					name = L["Alpha"],
 					isPercent = true,
 					min = 0, max = 1, step = 0.01,
-					get = function(info) return E.db.sle.backgrounds[v[1]].alpha end,
-					set = function(info, value) E.db.sle.backgrounds[v[1]].alpha = value; BG:UpdateFrames() end,
+					get = function(info) return E.db.sle.backgrounds["bg"..i].alpha end,
+					set = function(info, value) E.db.sle.backgrounds["bg"..i].alpha = value; BG:Alpha(i) end,
 				},
 			},
 		}
+		return config
 	end
+
+	E.Options.args.sle.args.modules.args.backgrounds = {
+		type = "group",
+		name = L["Backgrounds"],
+		order = 5,
+		childGroups = 'select',
+		args = {
+			header = {
+				order = 1,
+				type = "header",
+				name = L["Additional Background Panels"],
+			},
+			intro = {
+				order = 2,
+				type = "description",
+				name = L["BG_DESC"]
+			},
+			-- Reset = {
+				-- order = 4,
+				-- type = 'execute',
+				-- name = L["Restore Defaults"],
+				-- desc = L["Reset these options to defaults"],
+				-- func = function() E:GetModule('SLE'):Reset("backgrounds") end,
+			-- },
+			spacerreset = {
+				order = 5,
+				type = 'description',
+				name = "",
+			},
+			bg1 = CreateEnable(1),
+			bg2 = CreateEnable(2),
+			spacer = {
+				order = 8,
+				type = "description",
+				name = "",
+			},
+			bg3 = CreateEnable(3),
+			bg4 = CreateEnable(4),
+			bg1gr = CreateGroup(1),
+			bg2gr = CreateGroup(2),
+			bg3gr = CreateGroup(3),
+			bg4gr = CreateGroup(4),
+		},
+	}
+
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/bags_c.lua b/ElvUI_SLE/options/bags_c.lua
index 5261874..1a9b332 100644
--- a/ElvUI_SLE/options/bags_c.lua
+++ b/ElvUI_SLE/options/bags_c.lua
@@ -1,16 +1,26 @@
-local E, L, V, P, G = unpack(ElvUI);
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))

 local function configTable()
-	E.Options.args.sle.args.options.args.general.args.bags = {
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.bags = {
 		order = 6,
 		type = "group",
 		name = L["Bags"],
+		disabled = function() return not E.private.bags.enable end,
 		args = {
 			header = {
 				order = 1,
 				type = "header",
 				name = L["Bags"],
 			},
+			transparentSlots = {
+				order = 2,
+				type = "toggle",
+				name = L["Transparent Slots"],
+				desc = L["Apply transparent template on bag and bank slots."],
+				get = function(info) return E.private.sle.bags.transparentSlots end,
+				set = function(info, value)	E.private.sle.bags.transparentSlots = value; E:StaticPopup_Show('PRIVATE_RL') end,
+			},
 			lootflash = {
 				order = 5,
 				type = "toggle",
@@ -23,4 +33,4 @@ local function configTable()
 	}
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/blizzard_c.lua b/ElvUI_SLE/options/blizzard_c.lua
new file mode 100644
index 0000000..e164af5
--- /dev/null
+++ b/ElvUI_SLE/options/blizzard_c.lua
@@ -0,0 +1,71 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local B = SLE:GetModule("Blizzard")
+local M = SLE:GetModule("Misc")
+
+local function configTable()
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.blizz = {
+		order = 6,
+		type = "group",
+		name = "Blizzard",
+		args = {
+			header = {
+				order = 1,
+				type = "header",
+				name = "Blizzard",
+			},
+			blizzmove = {
+				order = 1,
+				type = "toggle",
+				name = L["Move Blizzard frames"],
+				desc = L["Allow some Blizzard frames to be moved around."],
+				get = function(info) return E.private.sle.module.blizzmove end,
+				set = function(info, value) E.private.sle.module.blizzmove = value; E:StaticPopup_Show("PRIVATE_RL") end,
+			},
+			rumouseover = {
+				order = 2,
+				type = "toggle",
+				name = L["Raid Utility Mouse Over"],
+				desc = L["Enabling mouse over will make ElvUI's raid utility show on mouse over instead of always showing."],
+				get = function(info) return E.db.sle.blizzard.rumouseover end,
+				set = function(info, value) E.db.sle.blizzard.rumouseover = value; M:RUReset() end,
+			},
+			vehicleSeatScale = {
+				order = 3,
+				type = 'range',
+				name = L["Vehicle Seat Scale"],
+				min = 0.1, max = 3, step = 0.01,
+				isPercent = true,
+				get = function(info) return E.db.sle.blizzard[ info[#info] ] end,
+				set = function(info, value) E.db.sle.blizzard[ info[#info] ] = value; B:VehicleScale() end,
+				-- disabled = function() return not E.private.sle.skins.objectiveTracker.enable or not E.private.skins.blizzard.enable or not E.private.skins.blizzard.objectiveTracker end,
+			},
+			errorframe = {
+				order = 11,
+				type = "group",
+				name = L["Error Frame"],
+				guiInline = true,
+				get = function(info) return E.db.sle.blizzard.errorframe[ info[#info] ] end,
+				set = function(info, value) E.db.sle.blizzard.errorframe[ info[#info] ] = value; B:ErrorFrameSize() end,
+				args = {
+					width = {
+						order = 1,
+						name = L["Width"],
+						desc = L["Set the width of Error Frame. Too narrow frame may cause messages to be split in several lines"],
+						type = "range",
+						min = 100, max = 1000, step = 1,
+					},
+					height = {
+						order = 2,
+						name = L["Height"],
+						desc = L["Set the height of Error Frame. Higher frame can show more lines at once."],
+						type = "range",
+						min = 30, max = 300, step = 15,
+					},
+				},
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/chat/chat_c.lua b/ElvUI_SLE/options/chat/chat_c.lua
new file mode 100644
index 0000000..a31b87a
--- /dev/null
+++ b/ElvUI_SLE/options/chat/chat_c.lua
@@ -0,0 +1,126 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local C = SLE:GetModule("Chat")
+local NONE = NONE
+local function configTable()
+	if not SLE.initialized then return end
+	local function CreateJustify(i)
+		local config = {
+			order = i + 1,
+			type = "select",
+			name = L["Frame "..i],
+			get = function(info) return E.db.sle.chat.justify["frame"..i] end,
+			set = function(info, value)	E.db.sle.chat.justify["frame"..i] = value; C:JustifyChat(i) end,
+			values = {
+				LEFT = L["Left"],
+				RIGHT = L["Right"],
+				CENTER = L["Center"],
+			},
+		}
+		return config
+	end
+
+	E.Options.args.sle.args.modules.args.chat = {
+		order = 7,
+		type = "group",
+		name = L["Chat"],
+		childGroups = 'select',
+		args = {
+			header = { order = 1, type = "header", name = L["Chat"] },
+			editreset = {
+				order = 3, type = 'execute',
+				name = L["Reset Editbox History"], desc = L["Clears the editbox history and will reload your UI."],
+				func = function() E:StaticPopup_Show("SLE_EDIT_HISTORY_CLEAR") end,
+			},
+			header2 = { order = 4, type = "description", name = "" },
+			guildmaster = {
+				order = 5, type = "toggle",
+				name = L["Guild Master Icon"],
+				desc = L["Displays an icon near your Guild Master in chat.\n\n|cffFF0000Note:|r Some messages in chat history may disappear on login."],
+				get = function(info) return E.db.sle.chat.guildmaster end,
+				set = function(info, value)	E.db.sle.chat.guildmaster = value; C:GMIconUpdate() end,
+			},
+			editboxhistory = {
+				order = 6, type = "range",
+				name = L["Chat Editbox History"],
+				desc = L["The amount of messages to save in the editbox history.\n\n|cffFF0000Note:|r To disable, set to 0."],
+				min = 5, max = 20, step = 1,
+				get = function(info) return E.db.sle.chat.editboxhistory end,
+				set = function(info, value) E.db.sle.chat.editboxhistory = value; end,
+			},
+			chatMax = {
+				order = 7, type = "range",
+				name = L["Chat Max Messages"],
+				desc = L["The amount of messages to save in chat window.\n\n|cffFF0000Warning:|r Can increase the amount of memory needed. Also changing this setting will clear the chat in all windows, leaving just lines saved in chat history."],
+				min = 10, max = 5000, step = 1,
+				disabled = function() return not E.private.chat.enable or SLE._Compatibility["ElvUI_CustomTweaks"] end,
+				get = function(info) return E.private.sle.chat.chatMax end,
+				set = function(info, value) E.private.sle.chat.chatMax = value; C:UpdateChatMax() end,
+			},
+			dpsSpam = {
+				order = 8, type = "toggle",
+				name = L["Filter DPS meters' Spam"],
+				desc = L["Replaces long reports from damage meters with a clickeble hyperlink to reduce chat spam.\nWorks correctly only with general reports such as DPS or HPS. May fail to filter te report of other things"],
+				get = function(info) return E.db.sle.chat.dpsSpam end,
+				set = function(info, value)	E.db.sle.chat.dpsSpam = value; C:SpamFilter() end,
+			},
+			combathide = {
+				order = 9, type = "select",
+				name = L["Hide In Combat"],
+				get = function(info) return E.db.sle.chat.combathide end,
+				set = function(info, value)	E.db.sle.chat.combathide = value; end,
+				values = {
+					["NONE"] = NONE,
+					["BOTH"] = L["Both"],
+					["LEFT"] = L["Left"],
+					["RIGHT"] = L["Right"],
+				}
+			},
+			textureAlpha = {
+				order = 20, type = "group",
+				name = L["Texture Alpha"],
+				args = {
+					enable = {
+						order = 1, type = "toggle",
+						name = L["Enable"],
+						desc = L["Allows separate alpha setting for textures in chat"],
+						get = function(info) return E.db.sle.chat.textureAlpha.enable end,
+						set = function(info, value)	E.db.sle.chat.textureAlpha.enable = value; E:UpdateMedia() end,
+					},
+					alpha = {
+						order = 2, type = "range",
+						name = L["Alpha"],
+						isPercent = true,
+						disabled = function() return not E.db.sle.chat.textureAlpha.enable end,
+						min = 0, max = 1, step = 0.01,
+						get = function(info) return E.db.sle.chat.textureAlpha.alpha end,
+						set = function(info, value)	E.db.sle.chat.textureAlpha.alpha = value; E:UpdateMedia() end,
+					},
+				},
+			},
+			justify = {
+				order = 30, type = "group",
+				name = L["Chat Frame Justify"],
+				args = {
+					frame1 = CreateJustify(1),
+					frame2 = CreateJustify(2),
+					frame3 = CreateJustify(3),
+					frame4 = CreateJustify(4),
+					frame5 = CreateJustify(5),
+					frame6 = CreateJustify(6),
+					frame7 = CreateJustify(7),
+					frame8 = CreateJustify(8),
+					frame9 = CreateJustify(9),
+					frame10 = CreateJustify(10),
+					identify = {
+						order = 12, type = "execute",
+						name = L["Identify"],
+						desc = L["Showes the message in each chat frame containing frame's number."],
+						func = function() C:IdentifyChatFrames() end,
+					},
+				},
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/chat/history_c.lua b/ElvUI_SLE/options/chat/history_c.lua
new file mode 100644
index 0000000..6740e91
--- /dev/null
+++ b/ElvUI_SLE/options/chat/history_c.lua
@@ -0,0 +1,80 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local C = SLE:GetModule("Chat")
+local _G = _G
+local function configTable()
+	if not SLE.initialized then return end
+	local function CreateHistoryChannel(Name, Order)
+		local config = {
+			order = Order,
+			type = "toggle",
+			name = _G[Name] or _G[T.gsub(Name, "CHAT_MSG_", "")],
+			hidden = function() return not E.global.sle.advanced.general end,
+			get = function(info) return E.private.sle.chat.chatHistory[Name] end,
+			set = function(info, value) E.private.sle.chat.chatHistory[Name] = value; C:ChatHistoryToggle(true) end,
+		}
+		return config
+	end
+
+	E.Options.args.sle.args.modules.args.chat.args.chatHistory = {
+		type = "group",
+		name = L["Chat History"],
+		order = 10,
+		args = {
+			historyreset = {
+				order = 1,
+				type = 'execute',
+				name = L["Reset Chat History"],
+				desc = L["Clears your chat history and will reload your UI."],
+				disabled = function() return not E.db.chat.chatHistory end,
+				func = function() E:StaticPopup_Show("SLE_CHAT_HISTORY_CLEAR") end,
+			},
+			size = {
+				order = 3,
+				name = L["Chat history size"],
+				desc = L["Sets how many messages will be stored in history."],
+				type = "range",
+				min = 50, max = 500, step = 1,
+				get = function(info) return E.private.sle.chat.chatHistory.size end,
+				set = function(info, value) E.private.sle.chat.chatHistory.size = value; end
+			},
+			infos = {
+				order = 4,
+				type = "description",
+				hidden = function() return not E.global.sle.advanced.general end,
+				name = "\n"..L["Following options determine which channels to save in chat history.\nNote: disabling a channel will immideately delete saved info for that channel."],
+			},
+			CHAT_MSG_INSTANCE_CHAT = CreateHistoryChannel("CHAT_MSG_INSTANCE_CHAT", 5),
+			CHAT_MSG_INSTANCE_CHAT_LEADER = CreateHistoryChannel("CHAT_MSG_INSTANCE_CHAT_LEADER", 6),
+			CHAT_MSG_CHANNEL = CreateHistoryChannel("CHAT_MSG_CHANNEL", 7),
+			CHAT_MSG_EMOTE = CreateHistoryChannel("CHAT_MSG_EMOTE", 8),
+			CHAT_MSG_GUILD = CreateHistoryChannel("CHAT_MSG_GUILD", 9),
+			CHAT_MSG_GUILD_ACHIEVEMENT = CreateHistoryChannel("CHAT_MSG_GUILD_ACHIEVEMENT", 10),
+			CHAT_MSG_OFFICER = CreateHistoryChannel("CHAT_MSG_OFFICER", 11),
+			CHAT_MSG_PARTY = CreateHistoryChannel("CHAT_MSG_PARTY", 12),
+			CHAT_MSG_PARTY_LEADER = CreateHistoryChannel("CHAT_MSG_PARTY_LEADER", 13),
+			CHAT_MSG_RAID = CreateHistoryChannel("CHAT_MSG_RAID", 14),
+			CHAT_MSG_RAID_LEADER = CreateHistoryChannel("CHAT_MSG_RAID_LEADER", 15),
+			CHAT_MSG_RAID_WARNING = CreateHistoryChannel("CHAT_MSG_RAID_WARNING", 16),
+			CHAT_MSG_SAY = CreateHistoryChannel("CHAT_MSG_SAY", 17),
+			CHAT_MSG_YELL = CreateHistoryChannel("CHAT_MSG_YELL", 18),
+			WHISPER = {
+				order = 19,
+				type = "toggle",
+				name = _G["CHAT_MSG_WHISPER"],
+				hidden = function() return not E.global.sle.advanced.general end,
+				get = function(info) return E.private.sle.chat.chatHistory["CHAT_MSG_WHISPER"] end,
+				set = function(info, value) E.private.sle.chat.chatHistory["CHAT_MSG_WHISPER"] = value; E.private.sle.chat.chatHistory["CHAT_MSG_WHISPER_INFORM"] = value; C:ChatHistoryToggle(true) end,
+			},
+			BN_WHISPER = {
+				order = 20,
+				type = "toggle",
+				name = _G["CHAT_MSG_BN_WHISPER"],
+				hidden = function() return not E.global.sle.advanced.general end,
+				get = function(info) return E.private.sle.chat.chatHistory["CHAT_MSG_BN_WHISPER"] end,
+				set = function(info, value) E.private.sle.chat.chatHistory["CHAT_MSG_BN_WHISPER"] = value; E.private.sle.chat.chatHistory["CHAT_MSG_BN_WHISPER_INFORM"] = value; C:ChatHistoryToggle(true) end,
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/chat/load_chat.xml b/ElvUI_SLE/options/chat/load_chat.xml
new file mode 100644
index 0000000..a8f3e0c
--- /dev/null
+++ b/ElvUI_SLE/options/chat/load_chat.xml
@@ -0,0 +1,6 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<!--Core-->
+	<Script file='chat_c.lua'/>
+	<Script file='tabs_c.lua'/>
+	<Script file='history_c.lua'/>
+</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/options/chat/tabs_c.lua b/ElvUI_SLE/options/chat/tabs_c.lua
new file mode 100644
index 0000000..f45d0a7
--- /dev/null
+++ b/ElvUI_SLE/options/chat/tabs_c.lua
@@ -0,0 +1,57 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local C = SLE:GetModule("Chat")
+local NAME = NAME
+local function configTable()
+	if not SLE.initialized then return end
+
+	E.Options.args.sle.args.modules.args.chat.args.tabs = {
+		order = 15,
+		type = "group",
+		name = L["Tabs"],
+		-- guiInline = true,
+		get = function(info) return E.db.sle.chat.tab[ info[#info] ] end,
+		set = function(info, value) E.db.sle.chat.tab[ info[#info] ] = value; C:SetSelectedTab(true) end,
+		args = {
+			select = {
+				order = 1,
+				type = "toggle",
+				name = L["Selected Indicator"],
+				desc = L["Shows you which of docked chat tabs is currently selected."],
+			},
+			style = {
+				order = 2,
+				type = "select",
+				name = L["Style"],
+				disabled = function() return not E.db.sle.chat.tab.select end,
+				values = {
+					["DEFAULT"] = "|cff0CD809>|r "..NAME.." |cff0CD809<|r",
+					["SQUARE"] = "|cff0CD809[|r "..NAME.." |cff0CD809]|r",
+					["HALFDEFAULT"] = "|cff0CD809>|r "..NAME,
+					["CHECKBOX"] = [[|TInterface\ACHIEVEMENTFRAME\UI-Achievement-Criteria-Check:26|t]]..NAME,
+					["ARROWRIGHT"] = [[|TInterface\BUTTONS\UI-SpellbookIcon-NextPage-Up:26|t]]..NAME,
+					["ARROWDOWN"] = [[|TInterface\BUTTONS\UI-MicroStream-Green:26|t]]..NAME,
+				}
+			},
+			color = {
+				type = 'color',
+				order = 3,
+				name = L["Color"],
+				hasAlpha = false,
+				disabled = function() return not E.db.sle.chat.tab.select or not (E.db.sle.chat.tab.style == "DEFAULT" or E.db.sle.chat.tab.style == "SQUARE" or E.db.sle.chat.tab.style == "HALFDEFAULT") end,
+				get = function(info)
+					local t = E.db.sle.chat.tab[ info[#info] ]
+					local d = P.sle.chat.tab[info[#info]]
+					return t.r, t.g, t.b, d.r, d.g, d.b
+				end,
+				set = function(info, r, g, b)
+					E.db.sle.chat.tab[ info[#info] ] = {}
+					local t = E.db.sle.chat.tab[ info[#info] ]
+					t.r, t.g, t.b = r, g, b
+					C:SetSelectedTab(true)
+				end,
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/chat_c.lua b/ElvUI_SLE/options/chat_c.lua
deleted file mode 100644
index 8b508ea..0000000
--- a/ElvUI_SLE/options/chat_c.lua
+++ /dev/null
@@ -1,104 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local CH = E:GetModule('Chat')
-
-local function configTable()
-	E.Options.args.sle.args.options.args.general.args.chat = {
-		order = 5,
-		type = "group",
-		name = L["Chat"],
-		args = {
-			header = {
-				order = 1,
-				type = "header",
-				name = L["Chat"],
-			},
-			historyreset = {
-				order = 2,
-				type = 'execute',
-				name = L["Reset Chat History"],
-				desc = L["Clears your chat history and will reload your UI."],
-				disabled = function() return not E.db.chat.chatHistory end,
-				func = function() E:StaticPopup_Show("SLE_CHAT_HISTORY") end,
-			},
-			editreset = {
-				order = 3,
-				type = 'execute',
-				name = L["Reset Editbox History"],
-				desc = L["Clears the editbox history and will reload your UI."],
-				disabled = function() return not E.db.chat.chatHistory end,
-				func = function() E:StaticPopup_Show("SLE_EDIT_HISTORY") end,
-			},
-			header2 = {
-				order = 4,
-				type = "description",
-				name = "",
-			},
-			guildmaster = {
-				order = 5,
-				type = "toggle",
-				name = L["Guild Master Icon"],
-				desc = L["Displays an icon near your Guild Master in chat.\n\n|cffFF0000Note:|r Some messages in chat history may disappear on login."],
-				get = function(info) return E.db.sle.chat.guildmaster end,
-				set = function(info, value)	E.db.sle.chat.guildmaster = value; CH:GMIconUpdate() end,
-			},
-			editboxhistory = {
-				order = 6,
-				type = "range",
-				name = L["Chat Editbox History"],
-				desc = L["The amount of messages to save in the editbox history.\n\n|cffFF0000Note:|r To disable, set to 0."],
-				min = 0, max = 20, step = 1,
-				get = function(info) return E.db.chat.editboxhistory end,
-				set = function(info, value)	E.db.chat.editboxhistory = value; end,
-			},
-			dpsSpam = {
-				order = 7,
-				type = "toggle",
-				name = L["Filter DPS meters' Spam"],
-				desc = L["Replaces long reports from damage meters with a clickeble hyperlink to reduce chat spam.\nWorks correctly only with general reports such as DPS or HPS. May fail to filter te report of other things"],
-				get = function(info) return E.db.sle.chat.dpsSpam end,
-				set = function(info, value)	E.db.sle.chat.dpsSpam = value; CH:SpamFilter() end,
-			},
-			combathide = {
-				order = 8,
-				type = "select",
-				name = L["Hide In Combat"],
-				get = function(info) return E.db.sle.chat.combathide end,
-				set = function(info, value)	E.db.sle.chat.combathide = value; end,
-				values = {
-					["NONE"] = NONE,
-					["BOTH"] = L["Both"],
-					["LEFT"] = L["Left"],
-					["RIGHT"] = L["Right"],
-				}
-			},
-			textureAlpha = {
-				order = 10,
-				type = "group",
-				name = L["Texture Alpha"],
-				guiInline = true,
-				args = {
-					enable = {
-						order = 1,
-						type = "toggle",
-						name = ENABLE,
-						desc = L["Allows separate alpha setting for textures in chat"],
-						get = function(info) return E.db.sle.chat.textureAlpha.enable end,
-						set = function(info, value)	E.db.sle.chat.textureAlpha.enable = value; E:UpdateMedia() end,
-					},
-					alpha = {
-						order = 2,
-						type = "range",
-						name = L["Alpha"],
-						isPercent = true,
-						disabled = function() return not E.db.sle.chat.textureAlpha.enable end,
-						min = 0, max = 1, step = 0.01,
-						get = function(info) return E.db.sle.chat.textureAlpha.alpha end,
-						set = function(info, value)	E.db.sle.chat.textureAlpha.alpha = value; E:UpdateMedia() end,
-					},
-				},
-			},
-		},
-	}
-end
-
-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/core_c.lua b/ElvUI_SLE/options/core_c.lua
index 485f077..8872bc4 100644
--- a/ElvUI_SLE/options/core_c.lua
+++ b/ElvUI_SLE/options/core_c.lua
@@ -1,13 +1,28 @@
-local E, L, V, P, G = unpack(ElvUI)
-local SLE = E:GetModule('SLE')
-local LT = E:GetModule('SLE_Loot')
-local ACD = LibStub("AceConfigDialog-3.0-ElvUI")
-
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local M = SLE:GetModule("Misc")
+local SETTINGS = SETTINGS
+local LFG_LIST_LEGACY = LFG_LIST_LEGACY
 local function configTable()
-	E.Options.args.ElvUI_Header.name = E.Options.args.ElvUI_Header.name.." + Shadow & Light"..format(": |cff99ff33%s|r",SLE.version)
-
-	--local size = E.db.general.fontSize
+	if not SLE.initialized then return end
+	local ACD = LibStub("AceConfigDialog-3.0-ElvUI")
+	SLE.ACD = ACD
+	E.Options.args.ElvUI_Header.name = E.Options.args.ElvUI_Header.name.." + |cff9482c9Shadow & Light|r"..T.format(": |cff99ff33%s|r",SLE.version)

+	local function CreateButton(number, text, ...)
+		local path = {}
+		local num = T.select("#", ...)
+		for i = 1, num do
+			local name = T.select(i, ...)
+			T.tinsert(path, #(path)+1, name)
+		end
+		local config = {
+			order = number,
+			type = 'execute',
+			name = text,
+			func = function() ACD:SelectGroup("ElvUI", "sle", T.unpack(path)) end,
+		}
+		return config
+	end
 	--Main options group
 	E.Options.args.sle = {
 		type = "group",
@@ -18,143 +33,165 @@ local function configTable()
 			header = {
 				order = 1,
 				type = "header",
-				name = "Shadow & Light"..format(": |cff99ff33%s|r", SLE.version),
+				name = "|cff9482c9Shadow & Light|r"..T.format(": |cff99ff33%s|r", SLE.version),
 			},
 			logo = {
 				type = 'description',
-				name = '',
+				name = L["SLE_DESC"],
 				order = 2,
-				image = function() return 'Interface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Title', 555, 350 end,
+				image = function() return 'Interface\\AddOns\\ElvUI_SLE\\media\\textures\\SLE_Banner', 200, 100 end,
 			},
-			--[[info = {
-				order = 3,
-				type = "description",
-				name = L["SLE_DESC"],
-			},]]
 			Install = {
 				order = 4,
 				type = 'execute',
-				name = L['Install'],
-				desc = L['Run the installation process.'],
-				func = function() SLE:Install(); E:ToggleConfig() end,
+				name = L["Install"],
+				desc = L["Run the installation process."],
+				func = function() E:GetModule("PluginInstaller"):Queue(SLE.installTable); E:ToggleConfig();  end,
 			},
-			SettingsButton = {
-				order = 5,
-				type = 'execute',
-				name = L["General"].." "..SETTINGS,
-				func = function() ACD:SelectGroup("ElvUI", "sle", "options", "general") end,
-			},
-			MinimapButton = {
+			infoButton = CreateButton(5, L["About/Help"], "help"),
+			Reset = {
 				order = 6,
 				type = 'execute',
-				name = L["Minimap"],
-				func = function() ACD:SelectGroup("ElvUI", "sle", "options", "minimap") end,
-			},
-			MarkersButton = {
-				order = 7,
-				type = 'execute',
-				name = L["Raid Markers"],
-				func = function() ACD:SelectGroup("ElvUI", "sle", "options", "raidmarkerbars") end,
-			},
-			EquipButton = {
-				order = 8,
-				type = 'execute',
-				name = L['Equipment Manager'],
-				func = function() ACD:SelectGroup("ElvUI", "sle", "options", "equipmanager") end,
-			},
-			FarmButton = {
-				order = 9,
-				type = 'execute',
-				name = L['Farm'],
-				func = function() ACD:SelectGroup("ElvUI", "sle", "options", "farm") end,
-			},
-			LootButton = {
-				order = 10,
-				type = 'execute',
-				name = L['Loot'],
-				func = function() ACD:SelectGroup("ElvUI", "sle", "options", "loot") end,
+				name = L["Reset All"],
+				desc = L["Resets all movers & options for S&L."],
+				func = function() SLE:Reset("all") end,
 			},
-			MediaButton = {
-				order = 11,
-				type = 'execute',
-				name = L["Media"],
-				func = function() ACD:SelectGroup("ElvUI", "sle", "media") end,
-			},
-			ScreensaverButton = {
+			modulesButton = CreateButton(7, L["Modules"], "modules"),
+			mediaButton = CreateButton(8, L["Media"], "media"),
+			skinsButton = CreateButton(9, L["Skins"], "skins"),
+			threat = {
+				type = "group",
+				name = L["Threat"],
 				order = 12,
-				type = 'execute',
-				name = L["Screensaver"],
-				func = function() ACD:SelectGroup("ElvUI", "sle", "screensaver") end,
-			},
-			ArmoryButton = {
-				order = 13,
-				type = 'execute',
-				name = L["Armory Mode"],
-				func = function() ACD:SelectGroup("ElvUI", "sle", "Armory") end,
-			},
-			DatatextButton = {
-				order = 14,
-				type = 'execute',
-				name = L["Panels & Dashboard"],
-				func = function() ACD:SelectGroup("ElvUI", "sle", "datatext") end,
-			},
-			HelpButton = {
-				order = 15,
-				type = 'execute',
-				name = L['About/Help'],
-				func = function() ACD:SelectGroup("ElvUI", "sle", "help") end,
+				guiInline = true,
+				args = {
+					enabled = {
+						order = 1,
+						type = "toggle",
+						name = L["Enable"],
+						get = function(info) return E.db.sle.misc.threat.enable end,
+						set = function(info, value) E.db.sle.misc.threat.enable = value; M:UpdateThreatConfig(); M:UpdateThreatPosition() end,
+					},
+					position = {
+						order = 2,
+						type = 'select',
+						name = L["Position"],
+						desc = L["Adjust the position of the threat bar to any of the datatext panels in ElvUI & S&L."],
+						disabled = function() return not E.db.sle.misc.threat.enable end,
+						values = {
+							["SLE_DataPanel_1"] = L["SLE_DataPanel_1"],
+							["SLE_DataPanel_2"] = L["SLE_DataPanel_2"],
+							["SLE_DataPanel_3"] = L["SLE_DataPanel_3"],
+							["SLE_DataPanel_4"] = L["SLE_DataPanel_4"],
+							["SLE_DataPanel_5"] = L["SLE_DataPanel_5"],
+							["SLE_DataPanel_6"] = L["SLE_DataPanel_6"],
+							["SLE_DataPanel_7"] = L["SLE_DataPanel_7"],
+							["SLE_DataPanel_8"] = L["SLE_DataPanel_8"],
+							["LeftChatDataPanel"] = L["Left Chat"],
+							["RightChatDataPanel"] = L["Right Chat"],
+						},
+						get = function(info) return E.db.sle.misc.threat.position end,
+						set = function(info, value) E.db.sle.misc.threat.position = value; M:UpdateThreatPosition() end,
+					},
+				},
 			},
-			options = {
-				order = 1,
+			advanced = {
 				type = "group",
-				childGroups = 'tab',
-				name = SETTINGS,
+				name = L["Advanced Options"],
+				order = 16,
+				guiInline = true,
+				get = function(info) return E.global.sle.advanced[ info[#info] ] end,
+				set = function(info, value) E.global.sle.advanced[ info[#info] ] = value; end,
 				args = {
-					--[[intro = {
+					info = {
 						order = 1,
 						type = "description",
-						name = L["Below you can see option groups presented by |cff1784d1Shadow & Light|r."],
-					},]]
+						name = L["SLE_Advanced_Desc"],
+					},
 					general = {
 						order = 2,
+						type = "toggle",
+						name = L["Allow Advanced Options"],
+						set = function(info, value)
+							if value == true and not E.global.sle.advanced.confirmed then E:StaticPopup_Show("SLE_ADVANCED_POPUP"); return end
+							E.global.sle.advanced[ info[#info] ] = value;
+						end,
+					},
+					optionsLimits = {
+						order = 3,
+						type = "toggle",
+						name = L["Change Elv's options limits"],
+						desc = L["Allow |cff9482c9Shadow & Light|r to change some of ElvUI's options limits."],
+						disabled = function() return not E.global.sle.advanced.general end,
+						set = function(info, value) E.global.sle.advanced[ info[#info] ] = value; E:StaticPopup_Show("GLOBAL_RL") end,
+					},
+					gameMenu = {
+						order = 4,
 						type = "group",
-						name = L["General"],
+						name = L["Game Menu Buttons"],
+						hidden = function() return not E.global.sle.advanced.general end,
+						disabled = function() return not E.global.sle.advanced.gameMenu.enable end,
+						get = function(info) return E.global.sle.advanced.gameMenu[ info[#info] ] end,
+						set = function(info, value) E.global.sle.advanced.gameMenu[ info[#info] ] = value; E:StaticPopup_Show("GLOBAL_RL") end,
 						args = {
-							--[[intro = {
+							enable = {
 								order = 1,
-								type = "description",
-								name = L["General options of |cff1784d1Shadow & Light|r."],
-							},]]
-							Reset = {
+								type = "toggle",
+								name = L["Enable"],
+								desc = L["Adds |cff9482c9Shadow & Light|r buttons to main game menu."],
+								disabled = false,
+							},
+							reload = {
 								order = 2,
-								type = 'execute',
-								name = L["Reset All"],
-								desc = L["Resets all movers & options for S&L."],
-								func = function() SLE:Reset("all") end,
+								type = "toggle",
+								name = L["Reload UI"],
 							},
-							Install = {
-								order = 3,
-								type = 'execute',
-								name = L['Install'],
-								desc = L['Run the installation process.'],
-								func = function() SLE:Install(); E:ToggleConfig() end,
+						},
+					},
+					cyrillics = {
+						order = 5,
+						type = "group",
+						name = L["Cyrillics Support"],
+						hidden = function() return not E.global.sle.advanced.general end,
+						get = function(info) return E.global.sle.advanced.cyrillics[ info[#info] ] end,
+						set = function(info, value) E.global.sle.advanced.cyrillics[ info[#info] ] = value; E:StaticPopup_Show("GLOBAL_RL") end,
+						args = {
+							info = {
+								order = 1,
+								type = "description",
+								name = L["SLE_CYR_DESC"],
 							},
-							space1 = {
-								order = 4,
-								type = 'description',
-								name = "",
+							commands = {
+								order = 2,
+								type = "toggle",
+								name = L["Commands"],
+								desc = L["SLE_CYR_COM_DESC"],
 							},
-							space2 = {
-								order = 4,
-								type = 'description',
-								name = "",
+							devCommands = {
+								order = 3,
+								type = "toggle",
+								name = L["Dev Commands"],
+								desc = L["SLE_CYR_DEVCOM_DESC"],
 							},
 						},
 					},
 				},
 			},
+			modules = {
+				order = 20,
+				type = "group",
+				childGroups = "select",
+				name = L["Modules"],
+				args = {
+					info = {
+						type = "description",
+						order = 1,
+						name = L["Options for different S&L modules."],
+					},
+				},
+			},
 		},
 	}
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/databars_c.lua b/ElvUI_SLE/options/databars_c.lua
new file mode 100644
index 0000000..1e44213
--- /dev/null
+++ b/ElvUI_SLE/options/databars_c.lua
@@ -0,0 +1,306 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local EDB = E:GetModule('DataBars')
+local DB = SLE:GetModule("DataBars")
+local FACTION, REPUTATION, SCENARIO_BONUS_LABEL = FACTION, REPUTATION, SCENARIO_BONUS_LABEL
+
+local function configTable()
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.databars = {
+		type = "group",
+		name = L["DataBars"],
+		childGroups = 'select',
+		order = 10,
+		args = {
+			exp = {
+				order = 1,
+				type = "group",
+				name = XP,
+				args = {
+					goElv = {
+						order = 1,
+						type = 'execute',
+						name = "ElvUI: "..XPBAR_LABEL,
+						func = function() SLE.ACD:SelectGroup("ElvUI", "databars", "experience") end,
+					},
+					longtext = {
+						order = 2,
+						type = "toggle",
+						name = L["Full value on Exp Bar"],
+						desc = L["Changes the way text is shown on exp bar."],
+						get = function(info) return E.db.sle.databars.exp.longtext end,
+						set = function(info, value) E.db.sle.databars.exp.longtext = value; EDB:UpdateExperience() end,
+					},
+					chatfilters = {
+						order = 3,
+						type = "group",
+						guiInline = true,
+						name = L["Chat Filters"],
+						get = function(info) return E.db.sle.databars.exp.chatfilter[ info[#info] ] end,
+						set = function(info, value) E.db.sle.databars.exp.chatfilter[ info[#info] ] = value; end,
+						args = {
+							enable = {
+								order = 1,
+								type = "toggle",
+								name = L["Enable"],
+								desc = L["Change the style of experience gain messages."],
+								set = function(info, value) E.db.sle.databars.exp.chatfilter[ info[#info] ] = value; DB:RegisterFilters() end,
+							},
+							iconsize = {
+								order = 2,
+								type = "range",
+								name = L["Icon Size"],
+								disabled = function() return not E.db.sle.databars.exp.chatfilter.enable end,
+								min = 8, max = 32, step = 1,
+							},
+							style = {
+								order = 3,
+								type = "select",
+								name = L["Experience Style"],
+								disabled = function() return not E.db.sle.databars.exp.chatfilter.enable end,
+								values = {
+									["STYLE1"] = T.format(DB.Exp.Styles["STYLE1"]["Bonus"], 14, E.myname, 300, 150, SCENARIO_BONUS_LABEL),
+									["STYLE2"] = T.format(DB.Exp.Styles["STYLE2"]["Bonus"], 14, E.myname, 300, 150, SCENARIO_BONUS_LABEL),
+								},
+							},
+						},
+					},
+				},
+			},
+			rep = {
+				order = 2,
+				type = "group",
+				name = REPUTATION,
+				args = {
+					goElv = {
+						order = 1,
+						type = 'execute',
+						name = "ElvUI: "..REPUTATION,
+						func = function() SLE.ACD:SelectGroup("ElvUI", "databars", "reputation") end,
+					},
+					longtext = {
+						order = 2,
+						type = "toggle",
+						name = L["Full value on Rep Bar"],
+						desc = L["Changes the way text is shown on rep bar."],
+						get = function(info) return E.db.sle.databars.rep.longtext end,
+						set = function(info, value) E.db.sle.databars.rep.longtext = value; EDB:UpdateReputation() end,
+					},
+					autotrackrep = {
+						order = 3,
+						type = "toggle",
+						name = L["Auto Track Reputation"],
+						desc = L["Automatically sets reputation tracking to the most recent reputation change."],
+						get = function(info) return E.db.sle.databars.rep.autotrack end,
+						set = function(info, value) E.db.sle.databars.rep.autotrack = value; end,
+					},
+					chatfilters = {
+						order = 4,
+						type = "group",
+						guiInline = true,
+						name = L["Chat Filters"],
+						get = function(info) return E.db.sle.databars.rep.chatfilter[ info[#info] ] end,
+						set = function(info, value) E.db.sle.databars.rep.chatfilter[ info[#info] ] = value; end,
+						args = {
+							enable = {
+								order = 1,
+								type = "toggle",
+								name = L["Enable"],
+								desc = L["Change the style of reputation messages."],
+								set = function(info, value) E.db.sle.databars.rep.chatfilter[ info[#info] ] = value; DB:RegisterFilters() end,
+							},
+							iconsize = {
+								order = 2,
+								type = "range",
+								name = L["Icon Size"],
+								disabled = function() return not E.db.sle.databars.rep.chatfilter.enable end,
+								min = 8, max = 32, step = 1,
+							},
+							style = {
+								order = 3,
+								type = "select",
+								name = L["Reputation increase Style"],
+								disabled = function() return not E.db.sle.databars.rep.chatfilter.enable end,
+								values = {
+									["STYLE1"] = T.format(DB.RepIncreaseStyles["STYLE1"], 14, FACTION, 300),
+									["STYLE2"] = T.format(DB.RepIncreaseStyles["STYLE2"], 14, FACTION, 300),
+								},
+							},
+							styleDec = {
+								order = 4,
+								type = "select",
+								name = L["Reputation decrease Style"],
+								disabled = function() return not E.db.sle.databars.rep.chatfilter.enable end,
+								values = {
+									["STYLE1"] = T.format(DB.RepDecreaseStyles["STYLE1"], 14, FACTION, 300),
+									["STYLE2"] = T.format(DB.RepDecreaseStyles["STYLE2"], 14, FACTION, 300),
+								},
+							},
+							showAll = {
+								order = 5,
+								type = "toggle",
+								name = L["Full List"],
+								desc = L["Show all factions affected by the latest reputation change. When disabled only first (in alphabetical order) affected faction will be shown."],
+								disabled = function() return not E.db.sle.databars.rep.chatfilter.enable end,
+							},
+							chatframe = {
+								order = 6,
+								type = "select",
+								name = L["Output"],
+								desc = L["Determines in which frame reputation messages will be shown. Auto is for whatever frame has reputation messages enabled via Blizzard options."],
+								disabled = function() return not E.db.sle.databars.rep.chatfilter.enable end,
+								values = {
+									["AUTO"] = L["Auto"],
+									["ChatFrame1"] = L["Frame 1"],
+									["ChatFrame2"] = L["Frame 2"],
+									["ChatFrame3"] = L["Frame 3"],
+									["ChatFrame4"] = L["Frame 4"],
+									["ChatFrame5"] = L["Frame 5"],
+									["ChatFrame6"] = L["Frame 6"],
+									["ChatFrame7"] = L["Frame 7"],
+									["ChatFrame8"] = L["Frame 8"],
+									["ChatFrame9"] = L["Frame 9"],
+									["ChatFrame10"] = L["Frame 10"],
+								},
+							},
+						},
+					},
+				},
+			},
+			artifact = {
+				order = 3,
+				type = "group",
+				name = L["Artifact Bar"],
+				args = {
+					goElv = {
+						order = 1,
+						type = 'execute',
+						name = "ElvUI: "..L["Artifact Bar"],
+						func = function() SLE.ACD:SelectGroup("ElvUI", "databars", "artifact") end,
+					},
+					longtext = {
+						order = 2,
+						type = "toggle",
+						name = L["Full value on Artifact Bar"],
+						desc = L["Changes the way text is shown on artifact bar."],
+						get = function(info) return E.db.sle.databars.artifact.longtext end,
+						set = function(info, value) E.db.sle.databars.artifact.longtext = value; EDB:UpdateArtifact() end,
+					},
+					chatfilters = {
+						order = 3,
+						type = "group",
+						guiInline = true,
+						name = L["Chat Filters"],
+						get = function(info) return E.db.sle.databars.artifact.chatfilter[ info[#info] ] end,
+						set = function(info, value) E.db.sle.databars.artifact.chatfilter[ info[#info] ] = value; end,
+						args = {
+							enable = {
+								order = 1,
+								type = "toggle",
+								name = L["Enable"],
+								desc = L["Change the style of experience gain messages."],
+								set = function(info, value) E.db.sle.databars.artifact.chatfilter[ info[#info] ] = value; DB:RegisterFilters() end,
+							},
+							iconsize = {
+								order = 2,
+								type = "range",
+								name = L["Icon Size"],
+								disabled = function() return not E.db.sle.databars.artifact.chatfilter.enable end,
+								min = 8, max = 32, step = 1,
+							},
+							style = {
+								order = 3,
+								type = "select",
+								name = L["Style"],
+								disabled = function() return not E.db.sle.databars.artifact.chatfilter.enable end,
+								values = {
+									["STYLE1"] = T.format(DB.Art.Styles["STYLE1"], [[Interface\AddOns\ElvUI_SLE\media\textures\Skull_Event]],14, NAME, 300),
+									["STYLE2"] = T.format(DB.Art.Styles["STYLE2"], [[Interface\AddOns\ElvUI_SLE\media\textures\Skull_Event]],14, NAME, 300),
+								},
+							},
+						},
+					},
+				},
+			},
+			honor = {
+				order = 4,
+				type = "group",
+				name = HONOR,
+				args = {
+					goElv = {
+						order = 1,
+						type = 'execute',
+						name = "ElvUI: "..HONOR,
+						func = function() SLE.ACD:SelectGroup("ElvUI", "databars", "honor") end,
+					},
+					longtext = {
+						order = 2,
+						type = "toggle",
+						name = L["Full value on Honor Bar"],
+						desc = L["Changes the way text is shown on honor bar."],
+						get = function(info) return E.db.sle.databars.honor.longtext end,
+						set = function(info, value) E.db.sle.databars.honor.longtext = value; EDB:UpdateUpdateHonor() end,
+					},
+					chatfilters = {
+						order = 3,
+						type = "group",
+						guiInline = true,
+						name = L["Chat Filters"],
+						get = function(info) return E.db.sle.databars.honor.chatfilter[ info[#info] ] end,
+						set = function(info, value) E.db.sle.databars.honor.chatfilter[ info[#info] ] = value; end,
+						args = {
+							enable = {
+								order = 1,
+								type = "toggle",
+								name = L["Enable"],
+								desc = L["Change the style of honor gain messages."],
+								set = function(info, value) E.db.sle.databars.honor.chatfilter[ info[#info] ] = value; DB:RegisterFilters() end,
+							},
+							iconsize = {
+								order = 2,
+								type = "range",
+								name = L["Icon Size"],
+								disabled = function() return not E.db.sle.databars.honor.chatfilter.enable end,
+								min = 8, max = 32, step = 1,
+							},
+							spacer = {order = 3, type = "description", name = ""},
+							style = {
+								order = 4,
+								type = "select",
+								name = L["Honor Style"],
+								disabled = function() return not E.db.sle.databars.honor.chatfilter.enable end,
+								values = {
+									["STYLE1"] = T.format(DB.Honor.Styles["STYLE1"], E.myname, RANK, "3.45", DB.Honor.Icon, 12),
+									["STYLE2"] = T.format(DB.Honor.Styles["STYLE2"], E.myname, RANK, "3.45", DB.Honor.Icon, 12),
+									["STYLE3"] = T.format(DB.Honor.Styles["STYLE3"], E.myname, RANK, "3.45", DB.Honor.Icon, 12),
+									["STYLE4"] = T.format(DB.Honor.Styles["STYLE4"], E.myname, RANK, "3.45", DB.Honor.Icon, 12),
+									["STYLE5"] = T.format(DB.Honor.Styles["STYLE5"], E.myname, RANK, "3.45", DB.Honor.Icon, 12),
+									["STYLE6"] = T.format(DB.Honor.Styles["STYLE6"], E.myname, RANK, "3.45", DB.Honor.Icon, 12),
+									["STYLE7"] = T.format(DB.Honor.Styles["STYLE7"], E.myname, RANK, "3.45", DB.Honor.Icon, 12),
+									["STYLE8"] = T.format(DB.Honor.Styles["STYLE8"], E.myname, RANK, "3.45", DB.Honor.Icon, 12),
+									["STYLE9"] = T.format(DB.Honor.Styles["STYLE9"], E.myname, RANK, "3.45", DB.Honor.Icon, 12),
+								},
+							},
+							awardStyle = {
+								order = 5,
+								type = "select",
+								name = L["Award Style"],
+								desc = L["Defines the style of changed string. Colored parts will be shown with your selected value color in chat."],
+								disabled = function() return not E.db.sle.databars.honor.chatfilter.enable end,
+								values = {
+									["STYLE1"] = T.format(DB.Honor.AwardStyles["STYLE1"], "3.45", DB.Honor.Icon, 12),
+									["STYLE2"] = T.format(DB.Honor.AwardStyles["STYLE2"], "3.45", DB.Honor.Icon, 12),
+									["STYLE3"] = T.format(DB.Honor.AwardStyles["STYLE3"], "3.45", DB.Honor.Icon, 12),
+									["STYLE4"] = T.format(DB.Honor.AwardStyles["STYLE4"], "3.45", DB.Honor.Icon, 12),
+									["STYLE5"] = T.format(DB.Honor.AwardStyles["STYLE5"], "3.45", DB.Honor.Icon, 12),
+									["STYLE6"] = T.format(DB.Honor.AwardStyles["STYLE6"], "3.45", DB.Honor.Icon, 12),
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/datatexts/currency_c.lua b/ElvUI_SLE/options/datatexts/currency_c.lua
new file mode 100644
index 0000000..e761753
--- /dev/null
+++ b/ElvUI_SLE/options/datatexts/currency_c.lua
@@ -0,0 +1,77 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+
+local function configTable()
+	if not SLE.initialized then return end
+
+	local function OrderedPairs(t, f)
+		local function orderednext(t, n)
+			local key = t[t.__next]
+			if not key then return end
+			t.__next = t.__next + 1
+			return key, t.__source[key]
+		end
+
+		local keys, kn = {__source = t, __next = 1}, 1
+		for k in pairs(t) do
+			keys[kn], kn = k, kn + 1
+		end
+		sort(keys, f)
+		return orderednext, keys
+	end
+
+
+	local function CreateCurrencyConfig(i, text, name)
+		local config = {
+			order = i, type = "toggle", name = text,
+			get = function(info) return E.db.sle.dt.currency[name] end,
+			set = function(info, value) E.db.sle.dt.currency[name] = value; end,
+		}
+		return config
+	end
+
+	E.Options.args.sle.args.modules.args.datatext.args.sldatatext.args.slcurrency = {
+		type = "group",
+		name = "S&L Currency",
+		order = 2,
+		args = {
+			header = {
+				order = 1, type = "description", name = L["ElvUI Improved Currency Options"],
+			},
+			arch = CreateCurrencyConfig(2, L["Show Archaeology Fragments"], 'Archaeology'),
+			jewel = CreateCurrencyConfig(3, L["Show Jewelcrafting Tokens"], 'Jewelcrafting'),
+			pvp = CreateCurrencyConfig(4, L["Show Player vs Player Currency"], 'PvP'),
+			dungeon = CreateCurrencyConfig(5, L["Show Dungeon and Raid Currency"], 'Raid'),
+			cook = CreateCurrencyConfig(6, L["Show Cooking Awards"], 'Cooking'),
+			misc = CreateCurrencyConfig(7, L["Show Miscellaneous Currency"], 'Miscellaneous'),
+			zero = CreateCurrencyConfig(8, L["Show Zero Currency"], 'Zero'),
+			icons = CreateCurrencyConfig(9, L["Show Icons"], 'Icons'),
+			faction = CreateCurrencyConfig(10, L["Show Faction Totals"], 'Faction'),
+			unused = CreateCurrencyConfig(11, L["Show Unsed Currency"], 'Unused'),
+			delete = {
+				order = 12,
+				type = "select",
+				name = L["Delete character info"],
+				desc = L["Remove selected character from the stored gold values"],
+				values = function()
+					local names = {};
+					for rk,_ in OrderedPairs(ElvDB['gold']) do
+						for k,_ in OrderedPairs(ElvDB['gold'][rk]) do
+							if ElvDB['gold'][rk][k] then
+								local name = T.format("%s-%s", k, rk);
+								names[name] = name;
+							end
+						end
+					end
+					return names;
+				end,
+				set = function(info, value)
+					local name, realm = strsplit("-", value);
+					E.PopupDialogs['SLE_CONFIRM_DELETE_CURRENCY_CHARACTER'].text = T.format(L["Are you sure you want to remove |cff1784d1%s|r from currency datatexts?"], name..(realm and "-"..realm or ""))
+					E:StaticPopup_Show('SLE_CONFIRM_DELETE_CURRENCY_CHARACTER', nil, nil, { ["name"] = name, ["realm"] = realm });
+				end,
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/datatexts/datatexts_c.lua b/ElvUI_SLE/options/datatexts/datatexts_c.lua
new file mode 100644
index 0000000..b925ebb
--- /dev/null
+++ b/ElvUI_SLE/options/datatexts/datatexts_c.lua
@@ -0,0 +1,157 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local DTP = SLE:GetModule('Datatexts')
+
+
+local function configTable()
+	if not SLE.initialized then return end
+
+	local function CreateDPConfig(i)
+		local config = {
+			order = 10 + i, type = "group", name = L["SLE_DataPanel_"..i],
+			get = function(info) return E.db.sle.datatexts["panel"..i][ info[#info] ] end,
+			args = {
+				enabled = {
+					order = 1, type = "toggle",
+					name = L["Enable"], desc = L["Show/Hide this panel."],
+					set = function(info, value)E.db.sle.datatexts["panel"..i].enabled = value; DTP:Toggle(i) end
+				},
+				width = {
+					order = 2, type = "range",
+					name = L["Width"], desc = L["Sets size of this panel"],
+					disabled = function() return not E.db.sle.datatexts["panel"..i].enabled end,
+					min = 50, max = (E.eyefinity or E.screenwidth)/2, step = 1,
+					set = function(info, value) E.db.sle.datatexts["panel"..i].width = value; DTP:Size(i) end,
+				},
+				hide = {
+					order = 3, type = "toggle",
+					name = L["Hide panel background"],
+					desc = L["Don't show this panel, only datatexts assinged to it"],
+					disabled = function() return not E.db.sle.datatexts["panel"..i].enabled end,
+					get = function(info) return E.db.sle.datatexts["panel"..i].noback end,
+					set = function(info, value) E.db.sle.datatexts["panel"..i].noback = value; E:StaticPopup_Show('CONFIG_RL') end,
+				},
+				transparent = {
+					order = 4, type = 'toggle', name = L["Panel Transparency"],
+					disabled = function() return not E.db.sle.datatexts["panel"..i].enabled or E.db.sle.datatexts["panel"..i].noback end,
+					set = function(info, value) E.db.sle.datatexts["panel"..i].transparent = value; DTP:Template(i) end,
+				},
+				pethide = {
+					order = 5, type = 'toggle',
+					name = L["Hide in Pet Batlle"],
+					desc = L["Show/Hide this frame during Pet Battles."],
+					set = function(info, value) E.db.sle.datatexts["panel"..i].pethide = value; DTP:PetHide(i) end,
+				},
+				mouseover = {
+					order = 6, type = 'toggle', name = L["Mouseover"],
+					disabled = function() return not E.db.sle.datatexts["panel"..i].enabled end,
+					set = function(info, value) E.db.sle.datatexts["panel"..i].mouseover = value; DTP:Mouseover(i) end,
+				},
+				alpha = {
+					order = 12, type = 'range',
+					name = L["Alpha"], isPercent = true,
+					min = 0, max = 1, step = 0.01,
+					set = function(info, value) E.db.sle.datatexts["panel"..i].alpha = value; DTP:Alpha(i) end,
+				},
+			},
+		}
+		return config
+	end
+
+	local function CreateChatConfig(i, chat)
+		local name = T.strlower(chat)
+		local db = chat == "LeftChat" and "leftChatPanel" or "rightChatPanel"
+		local config = {
+			order = 18 + i, type = "group", name = L[chat],
+			args = {
+				enabled = {
+					order = 1, type = "toggle",
+					name = L["Enable"], desc = L["Show/Hide this panel."],
+					get = function(info) return E.db.datatexts[db] end,
+					set = function(info, value)
+						E.db.datatexts[db] = value;
+						if E.db[chat.."PanelFaded"] then
+							E.db[chat.."PanelFaded"] = true;
+							Hide[chat]()
+						end
+						E:GetModule('Chat'):UpdateAnchors()
+						E:GetModule('Layout'):ToggleChatPanels()
+						E:GetModule('Bags'):PositionBagFrames()
+					end
+				},
+				width = {
+					order = 2, type = "range",
+					name = L["Width"], desc = L["Sets size of this panel"],
+					disabled = function() return not E.db.datatexts[db] end,
+					min = 150, max = (E.eyefinity or E.screenwidth)/2, step = 1,
+					get = function(info) return E.db.sle.datatexts[name].width end,
+					set = function(info, value) E.db.sle.datatexts[name].width = value; DTP:ChatResize() end,
+				},
+				alpha = {
+					order = 12, type = 'range',
+					name = L["Alpha"], isPercent = true,
+					min = 0, max = 1, step = 0.01,
+					get = function(info) return E.db.sle.datatexts[name].alpha end,
+					set = function(info, value) E.db.sle.datatexts[name].alpha = value; DTP:ChatResize() end,
+				},
+			},
+		}
+		return config
+	end
+
+	--Datatext panels
+	E.Options.args.sle.args.modules.args.datatext = {
+		order = 8, type = "group", name = L["DataTexts"],
+		childGroups = "tab",
+		args = {
+			panels = {
+				type = "group",
+				name = L["Datatexts"],
+				order = 1,
+				args = {
+					header = { order = 1, type = "header", name = L["Additional Datatext Panels"] },
+					intro = { order = 2, type = "description", name = L["DP_DESC"] },
+					Reset = {
+						order = 3,
+						type = 'execute',
+						name = L["Restore Defaults"],
+						desc = L["Reset these options to defaults"],
+						func = function() E:GetModule('SLE'):Reset(nil, nil, true) end,
+					},
+					spacer = { order = 4, type = 'description', name = "" },
+					chathandle = {
+						order = 7,
+						type = "toggle",
+						name = L["Override Chat DT Panels"],
+						desc = L["This will have S&L handle chat datatext panels and place them below the left & right chat panels.\n\n|cffFF0000Note:|r When you first enabled, you may need to move the chat panels up to see your datatext panels."],
+						get = function(info) return E.db.sle.datatexts.chathandle end,
+						set = function(info, value) E.db.sle.datatexts.chathandle = value; E:GetModule('Layout'):ToggleChatPanels(); E.Chat:PositionChat(true) end,
+						disabled = function() return T.IsAddOnLoaded("ElvUI_TukUIStyle") end,
+					},
+					panel1 = CreateDPConfig(1),
+					panel2 = CreateDPConfig(2),
+					panel3 = CreateDPConfig(3),
+					panel4 = CreateDPConfig(4),
+					panel5 = CreateDPConfig(5),
+					panel6 = CreateDPConfig(6),
+					panel7 = CreateDPConfig(7),
+					panel8 = CreateDPConfig(8),
+					leftchat = CreateChatConfig(1, "LeftChat"),
+					rightchat = CreateChatConfig(1, "RightChat"),
+				},
+			},
+		},
+	}
+
+	E.Options.args.sle.args.modules.args.datatext.args.sldatatext = {
+		order = 2, type = "group", name = L["S&L Datatexts"],
+		args = {
+			header = { order = 1, type = "header", name = L["Datatext Options"] },
+			intro = { order = 2, type = "description",
+				name = L["Some datatexts that Shadow & Light are supplied with, has settings that can be modified to alter the displayed information."]
+			},
+			spacer = { order = 3, type = 'description', name = "" },
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/datatexts/friends_c.lua b/ElvUI_SLE/options/datatexts/friends_c.lua
new file mode 100644
index 0000000..b17e03d
--- /dev/null
+++ b/ElvUI_SLE/options/datatexts/friends_c.lua
@@ -0,0 +1,71 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local DTP = SLE:GetModule('Datatexts')
+
+local function configTable()
+	if not SLE.initialized then return end
+
+	E.Options.args.sle.args.modules.args.datatext.args.sldatatext.args.slfriends = {
+		type = "group",
+		name = L["S&L Friends"],
+		order = 3,
+		args = {
+			header = {
+				order = 1,
+				type = "description",
+				name = L["These options are for modifing the Shadow & Light Friends datatext."],
+			},
+			combat = {
+				order = 2,
+				type = "toggle",
+				name = L["Hide In Combat"],
+				desc = L["Will not show the tooltip while in combat."],
+				get = function(info) return E.db.sle.dt.friends.combat end,
+				set = function(info, value) E.db.sle.dt.friends.combat = value; end,
+			},
+			totals = {
+				order = 3,
+				type = "toggle",
+				name = L["Show Totals"],
+				desc = L["Show total friends in the datatext."],
+				get = function(info) return E.db.sle.dt.friends.totals end,
+				set = function(info, value) E.db.sle.dt.friends.totals = value; DTP:update_Friends(); end,
+			},
+			hideFriends = {
+				order = 4,
+				type = "toggle",
+				name = L["Hide Friends"],
+				desc = L["Minimize the Friend Datatext."],
+				get = function(info) return E.db.sle.dt.friends.hideFriends end,
+				set = function(info, value) E.db.sle.dt.friends.hideFriends = value; end,
+			},
+			hide_hintline = {
+				order = 5,
+				type = "toggle",
+				name = L["Hide Hints"],
+				desc = L["Hide the hints in the tooltip."],
+				get = function(info) return E.db.sle.dt.friends.hide_hintline end,
+				set = function(info, value) E.db.sle.dt.friends.hide_hintline = value; end,
+			},
+			expandBNBroadcast = {
+				order = 6,
+				type = "toggle",
+				name = L["Expand RealID"],
+				desc = L["Display realid with two lines to view broadcasts."],
+				get = function(info) return E.db.sle.dt.friends.expandBNBroadcast end,
+				set = function(info, value) E.db.sle.dt.friends.expandBNBroadcast = value; end,
+			},
+			spacer = { order = 7, type = 'description', name = "" },
+			tooltipAutohide = {
+				order = 8,
+				type = "range",
+				name = L["Autohide Delay:"],
+				desc = L["Adjust the tooltip autohide delay when mouse is no longer hovering of the datatext."],
+				min = 0.1, max = 1, step = 0.1,
+				get = function(info) return E.db.sle.dt.friends.tooltipAutohide end,
+				set = function(info, value) E.db.sle.dt.friends.tooltipAutohide = value; end,
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/datatexts/guild_c.lua b/ElvUI_SLE/options/datatexts/guild_c.lua
new file mode 100644
index 0000000..4e063e6
--- /dev/null
+++ b/ElvUI_SLE/options/datatexts/guild_c.lua
@@ -0,0 +1,83 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local DTP = SLE:GetModule('Datatexts')
+
+local function configTable()
+	if not SLE.initialized then return end
+
+	E.Options.args.sle.args.modules.args.datatext.args.sldatatext.args.slguild = {
+		type = "group",
+		name = L["S&L Guild"],
+		order = 4,
+		args = {
+			header = {
+				order = 1,
+				type = "description",
+				name = L["These options are for modifing the Shadow & Light Guild datatext."],
+			},
+			combat = {
+				order = 2,
+				type = "toggle",
+				name = L["Hide In Combat"],
+				desc = L["Will not show the tooltip while in combat."],
+				get = function(info) return E.db.sle.dt.guild.combat end,
+				set = function(info, value) E.db.sle.dt.guild.combat = value; end,
+			},
+			totals = {
+				order = 3,
+				type = "toggle",
+				name = L["Show Totals"],
+				desc = L["Show total guild members in the datatext."],
+				get = function(info) return E.db.sle.dt.guild.totals end,
+				set = function(info, value) E.db.sle.dt.guild.totals = value; DTP:update_Guild(); end,
+			},
+			hide_hintline = {
+				order = 4,
+				type = "toggle",
+				name = L["Hide Hints"],
+				desc = L["Hide the hints in the tooltip."],
+				get = function(info) return E.db.sle.dt.guild.hide_hintline end,
+				set = function(info, value) E.db.sle.dt.guild.hide_hintline = value; end,
+			},
+			hide_gmotd = {
+				order = 5,
+				type = "toggle",
+				name = L["Hide MOTD"],
+				desc = L["Hide the guild's Message of the Day in the tooltip."],
+				get = function(info) return E.db.sle.dt.guild.hide_gmotd end,
+				set = function(info, value) E.db.sle.dt.guild.hide_gmotd = value; end,
+			},
+			hideGuild = {
+				order = 6,
+				type = "toggle",
+				name = L["Hide Guild"],
+				desc = L["Minimize the Guild Datatext."],
+				get = function(info) return E.db.sle.dt.guild.hideGuild end,
+				set = function(info, value) E.db.sle.dt.guild.hideGuild = value; end,
+			},
+			hide_guildname = {
+				order = 7,
+				type = "toggle",
+				name = L["Hide Guild Name"],
+				desc = L["Hide the guild's name in the tooltip."],
+				get = function(info) return E.db.sle.dt.guild.hide_guildname end,
+				set = function(info, value) E.db.sle.dt.guild.hide_guildname = value; end,
+			},
+			spacer = {
+				order = 8,
+				type = 'description',
+				name = "",
+			},
+			tooltipAutohide = {
+				order = 9,
+				type = "range",
+				name = L["Autohide Delay:"],
+				desc = L["Adjust the tooltip autohide delay when mouse is no longer hovering of the datatext."],
+				min = 0.1, max = 1, step = 0.1,
+				get = function(info) return E.db.sle.dt.guild.tooltipAutohide end,
+				set = function(info, value) E.db.sle.dt.guild.tooltipAutohide = value; end,
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/datatexts/load_datatexts.xml b/ElvUI_SLE/options/datatexts/load_datatexts.xml
new file mode 100644
index 0000000..072835f
--- /dev/null
+++ b/ElvUI_SLE/options/datatexts/load_datatexts.xml
@@ -0,0 +1,9 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<!--Core-->
+	<Script file='datatexts_c.lua'/>
+	<Script file='misc_c.lua'/>
+	<Script file='time_c.lua'/>
+	<Script file='currency_c.lua'/>
+	<Script file='friends_c.lua'/>
+	<Script file='guild_c.lua'/>
+</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/options/datatexts/misc_c.lua b/ElvUI_SLE/options/datatexts/misc_c.lua
new file mode 100644
index 0000000..8cb999b
--- /dev/null
+++ b/ElvUI_SLE/options/datatexts/misc_c.lua
@@ -0,0 +1,79 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local DTP = SLE:GetModule('Datatexts')
+local DT = E:GetModule('DataTexts')
+local datatexts = {}
+local RAID_FINDER = RAID_FINDER
+local RAIDS = RAIDS
+local EXPANSION_NAME3, EXPANSION_NAME4, EXPANSION_NAME5, EXPANSION_NAME6 = EXPANSION_NAME3, EXPANSION_NAME4, EXPANSION_NAME5, EXPANSION_NAME6
+local DURABILITY = DURABILITY
+local MANA_REGEN = MANA_REGEN
+
+local function configTable()
+	if not SLE.initialized then return end
+
+	E.Options.args.sle.args.modules.args.datatext.args.sldatatext.args.slmail = {
+		type = "group",
+		name = L["S&L Mail"],
+		order = 5,
+		args = {
+			header = {
+				order = 1,
+				type = "description",
+				name = L["These options are for modifing the Shadow & Light Mail datatext."],
+			},
+			icon = {
+				order = 2,
+				type = "toggle",
+				name = L["Minimap icon"],
+				desc = L["If enabled will show new mail icon on minimap."],
+				get = function(info) return E.db.sle.dt.mail.icon end,
+				set = function(info, value) E.db.sle.dt.mail.icon = value; DTP:MailUp() end,
+			}
+		},
+	}
+	E.Options.args.sle.args.modules.args.datatext.args.sldatatext.args.sldurability = {
+		type = "group",
+		name = DURABILITY,
+		order = 6,
+		get = function(info) return E.db.sle.dt.durability[ info[#info] ] end,
+		set = function(info, value) E.db.sle.dt.durability[ info[#info] ] = value; DT:LoadDataTexts(); end,
+		args = {
+			header = {
+				order = 1,
+				type = "description",
+				name = L["Options below are for standard ElvUI's durability datatext."],
+			},
+			gradient = {
+				order = 2,
+				type = "toggle",
+				name = L["Gradient"],
+				desc = L["If enabled will color durability text based on it's value."],
+
+			},
+			threshold = {
+				order = 3,
+				type = "range",
+				min = -1, max = 99, step = 1,
+				name = L["Durability Threshold"],
+				desc = L["Datatext will flash if durability shown will be equal or lower that this value. Set to -1 to disable"],
+			}
+		},
+	}
+	E.Options.args.sle.args.modules.args.datatext.args.sldatatext.args.slregen = {
+		type = "group",
+		name = MANA_REGEN,
+		order = 7,
+		args = {
+			short = {
+				order = 1,
+				type = "toggle",
+				name = L["Short text"],
+				desc = L["Changes the text string to a shorter variant."],
+				get = function(info) return E.db.sle.dt.regen.short end,
+				set = function(info, value) E.db.sle.dt.regen.short = value; DT:LoadDataTexts(); end,
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/datatexts/time_c.lua b/ElvUI_SLE/options/datatexts/time_c.lua
new file mode 100644
index 0000000..4add8f1
--- /dev/null
+++ b/ElvUI_SLE/options/datatexts/time_c.lua
@@ -0,0 +1,82 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local RAID_FINDER = RAID_FINDER
+local RAIDS = RAIDS
+local EXPANSION_NAME3, EXPANSION_NAME4, EXPANSION_NAME5, EXPANSION_NAME6 = EXPANSION_NAME3, EXPANSION_NAME4, EXPANSION_NAME5, EXPANSION_NAME6
+
+
+local function configTable()
+	if not SLE.initialized then return end
+
+	E.Options.args.sle.args.modules.args.datatext.args.sldatatext.args.timedt = {
+		type = "group",
+		name = RAID_FINDER,
+		order = 1,
+		args = {
+			lfrshow = {
+				order = 1, type = "toggle",
+				name = L["LFR Lockout"],
+				desc = L["Show/Hide LFR lockout info in time datatext's tooltip."],
+				get = function(info) return E.db.sle.lfr.enabled end,
+				set = function(info, value) E.db.sle.lfr.enabled = value; end
+			},
+			raids = {
+				order = 2, type = "group",
+				name = RAIDS,
+				guiInline = true,
+				get = function(info) return E.db.sle.lfr[ info[#info] ] end,
+				set = function(info, value) E.db.sle.lfr[ info[#info] ] = value; end,
+				args = {
+					Cata = {
+						order = 1, type = "group",
+						name = EXPANSION_NAME3,
+						guiInline = true,
+						get = function(info) return E.db.sle.lfr.cata[ info[#info] ] end,
+						set = function(info, value) E.db.sle.lfr.cata[ info[#info] ] = value; end,
+						args = {
+							ds = { order = 1, type = "toggle", name = T.GetMapNameByID(824) },
+						},
+					},
+					MoP = {
+						order = 2, type = "group",
+						name = EXPANSION_NAME4,
+						guiInline = true,
+						get = function(info) return E.db.sle.lfr.mop[ info[#info] ] end,
+						set = function(info, value) E.db.sle.lfr.mop[ info[#info] ] = value; end,
+						args = {
+							mv = { order = 1, type = "toggle", name = T.GetMapNameByID(896) },
+							hof = { order = 2, type = "toggle", name = T.GetMapNameByID(897) },
+							toes = { order = 3, type = "toggle", name = T.GetMapNameByID(886) },
+							tot = { order = 4, type = "toggle", name = T.GetMapNameByID(930) },
+							soo = { order = 5, type = "toggle", name = T.GetMapNameByID(953) },
+						},
+					},
+					WoD = {
+						order = 3, type = "group",
+						name = EXPANSION_NAME5,
+						guiInline = true,
+						get = function(info) return E.db.sle.lfr.wod[ info[#info] ] end,
+						set = function(info, value) E.db.sle.lfr.wod[ info[#info] ] = value; end,
+						args = {
+							hm = { order = 1, type = "toggle", name = T.GetMapNameByID(994) },
+							brf = { order = 2, type = "toggle", name = T.GetMapNameByID(988) },
+							hfc = { order = 3, type = "toggle", name = T.GetMapNameByID(1026) },
+						},
+					},
+					Legion = {
+						order = 4, type = "group",
+						name = EXPANSION_NAME6,
+						guiInline = true,
+						get = function(info) return E.db.sle.lfr.legion[ info[#info] ] end,
+						set = function(info, value) E.db.sle.lfr.legion[ info[#info] ] = value; end,
+						args = {
+							nightmare = { order = 1, type = "toggle", name = T.GetMapNameByID(1094) },
+							palace = { order = 2, type = "toggle", name = T.GetMapNameByID(1088) },
+						},
+					},
+				},
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/datatexts_c.lua b/ElvUI_SLE/options/datatexts_c.lua
deleted file mode 100644
index 815629b..0000000
--- a/ElvUI_SLE/options/datatexts_c.lua
+++ /dev/null
@@ -1,615 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local DTP = E:GetModule('SLE_DTPanels')
-local DT = E:GetModule('DataTexts')
-local datatexts = {}
-
-local function OrderedPairs(t, f)
-	local function orderednext(t, n)
-		local key = t[t.__next]
-		if not key then return end
-		t.__next = t.__next + 1
-		return key, t.__source[key]
-	end
-
-	local keys, kn = {__source = t, __next = 1}, 1
-	for k in pairs(t) do
-		keys[kn], kn = k, kn + 1
-	end
-	sort(keys, f)
-	return orderednext, keys
-end
-
-E.PopupDialogs['CONFIRM_DELETE_CURRENCY_CHARACTER'] = {
-	text = "Are you sure you want to delete this character",
-	button1 = YES,
-	button2 = NO,
-	OnAccept = function(self, data)
-		if ElvDB['class'][data.realm][data.name] then
-			ElvDB['class'][data.realm][data.name] = nil;
-		end
-		if ElvDB['gold'][data.realm][data.name] then
-			ElvDB['gold'][data.realm][data.name] = nil;
-		end
-		if ElvDB['faction'][data.realm][FACTION_ALLIANCE][data.name] then
-			ElvDB['faction'][data.realm][FACTION_ALLIANCE][data.name] = nil;
-		end
-		if ElvDB['faction'][data.realm][FACTION_HORDE][data.name] then
-			ElvDB['faction'][data.realm][FACTION_HORDE][data.name] = nil;
-		end
-		ReloadUI();
-	end,
-	OnCancel = E.noop;
-}
-
-local function configTable()
-	local drop = {
-		--Group name = {short name, order, slot}
-		["DP_1"] = {"dp1", 1, 3},
-		["DP_2"] = {"dp2", 2, 3},
-		["DP_3"] = {"dp3", 3, 3},
-		["DP_4"] = {"dp4", 4, 3},
-		["DP_5"] = {"dp5", 5, 3},
-		["DP_6"] = {"dp6", 6, 3},
-		["Top_Center"] = {"top", 7, 1},
-		["Bottom_Panel"] = {"bottom", 8, 1},
-	}
-	local chatT = {
-		--Group name = {short name, order, elv's varible, chat panel(used to call functions)}
-		["Left Chat"] = {"chatleft", 9, "leftChatPanel", "LeftChat"},
-		["Right Chat"] = {"chatright", 10, "rightChatPanel", "RightChat"},
-	}
-
-	--Datatext panels
-	E.Options.args.sle.args.datatext = {
-		type = "group",
-		name = L["Panels & Dashboard"],
-		order = 10,
-		childGroups = "tab",
-		args = {
-			panels = {
-				type = "group",
-				name = L["Panels & Dashboard"],
-				order = 1,
-				args = {
-					header = {
-						order = 1,
-						type = "header",
-						name = L["Additional Datatext Panels"],
-					},
-					intro = {
-						order = 2,
-						type = "description",
-						name = L["DP_DESC"]
-					},
-					Reset = {
-						order = 3,
-						type = 'execute',
-						name = L['Restore Defaults'],
-						desc = L["Reset these options to defaults"],
-						func = function() E:GetModule('SLE'):Reset(nil, nil, true) end,
-					},
-					spacer = {
-						order = 4,
-						type = 'description',
-						name = "",
-					},
-					dashboard = {
-						order = 5,
-						type = "toggle",
-						name = L["Dashboard"],
-						desc = L["Show/Hide dashboard."],
-						get = function(info) return E.db.sle.datatext.dashboard.enable end,
-						set = function(info, value) E.db.sle.datatext.dashboard.enable = value; DTP:DashboardShow() end
-					},
-					width = {
-						order = 6,
-						type = "range",
-						name = L["Dashboard Panels Width"],
-						desc = L["Sets size of dashboard panels."],
-						disabled = function() return not E.db.sle.datatext.dashboard.enable end,
-						min = 75, max = 200, step = 1,
-						get = function(info) return E.db.sle.datatext.dashboard.width end,
-						set = function(info, value) E.db.sle.datatext.dashboard.width = value; DTP:DashWidth() end,
-					},
-					chathandle = {
-						order = 7,
-						type = "toggle",
-						name = L["Override Chat DT Panels"],
-						desc = L["This will have S&L handle chat datatext panels and place them below the left & right chat panels.\n\n|cffFF0000Note:|r When you first enabled, you may need to move the chat panels up to see your datatext panels."],
-						get = function(info) return E.db.sle.datatext.chathandle end,
-						set = function(info, value) E.db.sle.datatext.chathandle = value; E:GetModule('Layout'):ToggleChatPanels(); E.Chat:PositionChat(true) end,
-						disabled = function() return IsAddOnLoaded("ElvUI_TukUIStyle") end,
-					},
-				},
-			},
-		},
-	}
-
-	for k,v in pairs(drop) do
-	E.Options.args.sle.args.datatext.args.panels.args[v[1]] = {
-		order = v[2],
-		type = "group",
-		name = L[k],
-		get = function(info) return E.db.sle.datatext[v[1]][ info[#info] ] end,
-		args = {
-			enabled = {
-				order = 1,
-				type = "toggle",
-				name = ENABLE,
-				desc = L["Show/Hide this panel."],
-				set = function(info, value) E.db.sle.datatext[v[1]].enabled = value; DTP:ExtraDataBarSetup() end
-			},
-			width = {
-				order = 2,
-				type = "range",
-				name = L['Width'],
-				desc = L["Sets size of this panel"],
-				disabled = function() return not E.db.sle.datatext[v[1]].enabled end,
-				min = 100 * v[3], max = (E.eyefinity or E.screenwidth)/2, step = 1,
-				set = function(info, value) E.db.sle.datatext[v[1]].width = value; DTP:Update() end,
-			},
-			hide = {
-				order = 3,
-				type = "toggle",
-				name = L['Hide panel background'],
-				desc = L["Don't show this panel, only datatexts assinged to it"],
-				disabled = function() return not E.db.sle.datatext[v[1]].enabled end,
-				get = function(info) return E.private.sle.datatext[v[1].."hide"] end,
-				set = function(info, value) E.private.sle.datatext[v[1].."hide"] = value; E:StaticPopup_Show("PRIVATE_RL") end,
-			},
-			transparent = {
-				order = 4,
-				name = L['Panel Transparency'],
-				type = 'toggle',
-				disabled = function() return not E.db.sle.datatext[v[1]].enabled or E.private.sle.datatext[v[1].."hide"] end,
-				set = function(info, value) E.db.sle.datatext[v[1]].transparent = value; DTP:ExtraDataBarSetup() end,
-			},
-			pethide = {
-				order = 5,
-				name = L["Hide in Pet Batlle"],
-				type = 'toggle',
-				desc = L['Show/Hide this frame during Pet Battles.'],
-				set = function(info, value) E.db.sle.datatext[v[1]].pethide = value; DTP:RegisterHide() end,
-			},
-			alpha = {
-				order = 12,
-				type = 'range',
-				name = L['Alpha'],
-				isPercent = true,
-				min = 0, max = 1, step = 0.01,
-				--get = function(info) return E.db.sle.backgrounds[v[1]].alpha end,
-				set = function(info, value) E.db.sle.datatext[v[1]].alpha = value; DTP:Update() end,
-			},
-		},
-	}
-	end
-
-	for k,v in pairs(chatT) do
-	E.Options.args.sle.args.datatext.args.panels.args[v[1]] = {
-		order = v[2],
-		type = "group",
-		name = L[k],
-		args = {
-			enabled = {
-				order = 1,
-				type = "toggle",
-				name = ENABLE,
-				desc = L["Show/Hide this panel."],
-				get = function(info) return E.db.datatexts[v[3]] end,
-				set = function(info, value)
-					E.db.datatexts[v[3]] = value;
-					if E.db[v[4].."PanelFaded"] then
-						E.db[v[4].."PanelFaded"] = true;
-						Hide[v[4]]()
-					end
-					E:GetModule('Chat'):UpdateAnchors()
-					E:GetModule('Layout'):ToggleChatPanels()
-					E:GetModule('Bags'):PositionBagFrames()
-				end
-			},
-			width = {
-				order = 2,
-				type = "range",
-				name = L['Width'],
-				desc = L["Sets size of this panel"],
-				disabled = function() return not E.db.datatexts[v[3]] end,
-				min = 150, max = (E.eyefinity or E.screenwidth)/2, step = 1,
-				get = function(info) return E.db.sle.datatext[v[1]].width end,
-				set = function(info, value) E.db.sle.datatext[v[1]].width = value; DTP:ChatResize() end,
-			},
-			alpha = {
-				order = 12,
-				type = 'range',
-				name = L['Alpha'],
-				isPercent = true,
-				min = 0, max = 1, step = 0.01,
-				get = function(info) return E.db.sle.datatext[v[1]].alpha end,
-				set = function(info, value) E.db.sle.datatext[v[1]].alpha = value; DTP:ChatResize() end,
-			},
-		},
-
-	}
-	end
-
-	E.Options.args.sle.args.datatext.args.sldatatext = {
-		type = "group",
-		name = L["S&L Datatexts"],
-		order = 2,
-		args = {
-			header = {
-				order = 1,
-				type = "header",
-				name = L["Datatext Options"],
-			},
-			intro = {
-				order = 2,
-				type = "description",
-				name = L["Some datatexts that Shadow & Light are supplied with, has settings that can be modified to alter the displayed information."]
-			},
-			spacer = {
-				order = 3,
-				type = 'description',
-				name = "",
-			},
-			timedt = {
-				type = "group",
-				name = RAID_FINDER,
-				order = 1,
-				args = {
-					lfrshow = {
-						order = 1,
-						type = "toggle",
-						name = L["LFR Lockout"],
-						desc = L["Show/Hide LFR lockout info in time datatext's tooltip."],
-						get = function(info) return E.db.sle.lfrshow.enabled end,
-						set = function(info, value) E.db.sle.lfrshow.enabled = value; end
-					},
-					instances = {
-						order = 2,
-						type = "group",
-						name = L["Loot History"],
-						guiInline = true,
-						get = function(info) return E.db.sle.lfrshow[ info[#info] ] end,
-						set = function(info, value) E.db.sle.lfrshow[ info[#info] ] = value; end,
-						args = {
-							ds = {
-								order = 1,
-								type = "toggle",
-								name = GetMapNameByID(824),
-							},
-							mv = {
-								order = 2,
-								type = "toggle",
-								name = GetMapNameByID(896),
-							},
-							hof = {
-								order = 3,
-								type = "toggle",
-								name = GetMapNameByID(897),
-							},
-							toes = {
-								order = 4,
-								type = "toggle",
-								name = GetMapNameByID(886),
-							},
-							tot = {
-								order = 5,
-								type = "toggle",
-								name = GetMapNameByID(930),
-							},
-							soo = {
-								order = 6,
-								type = "toggle",
-								name = GetMapNameByID(953),
-							},
-							hm = {
-								order = 7,
-								type = "toggle",
-								name = GetMapNameByID(994),
-							},
-							brf = {
-								order = 8,
-								type = "toggle",
-								name = GetMapNameByID(988),
-							},
-							hfc = {
-								order = 9,
-								type = "toggle",
-								name = GetMapNameByID(1026),
-							},
-							--[[hmNormal = {
-								order = 8,
-								type = "toggle",
-								name = GetMapNameByID(994).." ("..PLAYER_DIFFICULTY1..")",
-							},
-							hmHeroic = {
-								order = 9,
-								type = "toggle",
-								name = GetMapNameByID(994).." ("..PLAYER_DIFFICULTY2..")",
-							},]]
-						},
-					},
-				},
-			},
-			slcurrency = {
-				type = "group",
-				name = "S&L Currency",
-				order = 2,
-				args = {
-					header = {
-						order = 1,
-						type = "description",
-						name = L['ElvUI Improved Currency Options'],
-					},
-					arch = {
-						order = 2,
-						type = "toggle",
-						name = L['Show Archaeology Fragments'],
-						get = function(info) return E.private['ElvUI_Currency']['Archaeology'] end,
-						set = function(info, value) E.private['ElvUI_Currency']['Archaeology'] = value; end,
-					},
-					jewel = {
-						order = 3,
-						type = "toggle",
-						name = L['Show Jewelcrafting Tokens'],
-						get = function(info) return E.private['ElvUI_Currency']['Jewelcrafting'] end,
-						set = function(info, value) E.private['ElvUI_Currency']['Jewelcrafting'] = value; end,
-					},
-					pvp = {
-						order = 4,
-						type = "toggle",
-						name = L['Show Player vs Player Currency'],
-						get = function(info) return E.private['ElvUI_Currency']['PvP'] end,
-						set = function(info, value) E.private['ElvUI_Currency']['PvP'] = value; end,
-					},
-					dungeon = {
-						order = 5,
-						type = "toggle",
-						name = L['Show Dungeon and Raid Currency'],
-						get = function(info) return E.private['ElvUI_Currency']['Raid'] end,
-						set = function(info, value) E.private['ElvUI_Currency']['Raid'] = value; end,
-					},
-					cook = {
-						order = 6,
-						type = "toggle",
-						name = L['Show Cooking Awards'],
-						get = function(info) return E.private['ElvUI_Currency']['Cooking'] end,
-						set = function(info, value) E.private['ElvUI_Currency']['Cooking'] = value; end,
-					},
-					misc = {
-						order = 7,
-						type = "toggle",
-						name = L['Show Miscellaneous Currency'],
-						get = function(info) return E.private['ElvUI_Currency']['Miscellaneous'] end,
-						set = function(info, value) E.private['ElvUI_Currency']['Miscellaneous'] = value; end,
-					},
-					zero = {
-						order = 8,
-						type = "toggle",
-						name = L['Show Zero Currency'],
-						get = function(info) return E.private['ElvUI_Currency']['Zero'] end,
-						set = function(info, value) E.private['ElvUI_Currency']['Zero'] = value; end,
-					},
-					icons = {
-						order = 9,
-						type = "toggle",
-						name = L['Show Icons'],
-						get = function(info) return E.private['ElvUI_Currency']['Icons'] end,
-						set = function(info, value) E.private['ElvUI_Currency']['Icons'] = value; end,
-					},
-					faction = {
-						order = 10,
-						type = "toggle",
-						name = L['Show Faction Totals'],
-						get = function(info) return E.private['ElvUI_Currency']['Faction'] end,
-						set = function(info, value) E.private['ElvUI_Currency']['Faction'] = value; end,
-					},
-					unused = {
-						order = 11,
-						type = "toggle",
-						name = L['Show Unsed Currency'],
-						get = function(info) return E.private['ElvUI_Currency']['Unused'] end,
-						set = function(info, value) E.private['ElvUI_Currency']['Unused'] = value; end,
-					},
-					delete = {
-						order = 12,
-						type = "select",
-						name = "Delete a character",
-						desc = "Remove a character from the stored gold values",
-						values = function()
-							local names = {};
-							for rk,_ in OrderedPairs(ElvDB['gold']) do
-								for k,_ in OrderedPairs(ElvDB['gold'][rk]) do
-									if ElvDB['gold'][rk][k] then
-										local name = ("%s-%s"):format(k, rk);
-										names[name] = name;
-									end
-								end
-							end
-							return names;
-						end,
-						set = function(info, value)
-							local name, realm = strsplit("-", value);
-							E:StaticPopup_Show('CONFIRM_DELETE_CURRENCY_CHARACTER', nil, nil, { ["name"] = name, ["realm"] = realm });
-						end,
-					}
-				},
-			},
-			slfriends = {
-				type = "group",
-				name = L["S&L Friends"],
-				order = 3,
-				args = {
-					header = {
-						order = 1,
-						type = "description",
-						name = L["These options are for modifing the Shadow & Light Friends datatext."],
-					},
-					combat = {
-						order = 2,
-						type = "toggle",
-						name = L["Hide In Combat"],
-						desc = L["Will not show the tooltip while in combat."],
-						get = function(info) return E.db.sle.dt.friends.combat end,
-						set = function(info, value) E.db.sle.dt.friends.combat = value; end,
-					},
-					hidetotals = {
-						order = 3,
-						type = "toggle",
-						name = L["Show Totals"],
-						desc = L["Show total friends in the datatext."],
-						get = function(info) return E.db.sle.dt.friends.totals end,
-						set = function(info, value) E.db.sle.dt.friends.totals = value; DT:update_Friends() end,
-					},
-					hidehintline = {
-						order = 4,
-						type = "toggle",
-						name = L["Hide Hints"],
-						desc = L["Hide the hints in the tooltip."],
-						get = function(info) return E.db.sle.dt.friends.hide_hintline end,
-						set = function(info, value) E.db.sle.dt.friends.hide_hintline = value; end,
-					},
-					bnbroadcast = {
-						order = 5,
-						type = "toggle",
-						name = L["Expand RealID"],
-						desc = L["Display realid with two lines to view broadcasts."],
-						get = function(info) return E.db.sle.dt.friends.expandBNBroadcast end,
-						set = function(info, value) E.db.sle.dt.friends.expandBNBroadcast = value; end,
-					},
-					spacer = {
-						order = 6,
-						type = 'description',
-						name = "",
-					},
-					tooltipautohide = {
-						order = 7,
-						type = "range",
-						name = L["Autohide Delay:"],
-						desc = L["Adjust the tooltip autohide delay when mouse is no longer hovering of the datatext."],
-						min = 0.1, max = 1, step = 0.1,
-						get = function(info) return E.db.sle.dt.friends.tooltipAutohide end,
-						set = function(info, value) E.db.sle.dt.friends.tooltipAutohide = value; end,
-					},
-				},
-			},
-			slguild = {
-				type = "group",
-				name = L["S&L Guild"],
-				order = 4,
-				args = {
-					header = {
-						order = 1,
-						type = "description",
-						name = L["These options are for modifing the Shadow & Light Guild datatext."],
-					},
-					combat = {
-						order = 2,
-						type = "toggle",
-						name = L["Hide In Combat"],
-						desc = L["Will not show the tooltip while in combat."],
-						get = function(info) return E.db.sle.dt.guild.combat end,
-						set = function(info, value) E.db.sle.dt.guild.combat = value; end,
-					},
-					hidetotals = {
-						order = 3,
-						type = "toggle",
-						name = L["Show Totals"],
-						desc = L["Show total guild members in the datatext."],
-						get = function(info) return E.db.sle.dt.guild.totals end,
-						set = function(info, value) E.db.sle.dt.guild.totals = value; DT:update_Guild() end,
-					},
-					hidehintline = {
-						order = 4,
-						type = "toggle",
-						name = L["Hide Hints"],
-						desc = L["Hide the hints in the tooltip."],
-						get = function(info) return E.db.sle.dt.guild.hide_hintline end,
-						set = function(info, value) E.db.sle.dt.guild.hide_hintline = value; end,
-					},
-					hidemotd = {
-						order = 5,
-						type = "toggle",
-						name = L["Hide MOTD"],
-						desc = L["Hide the guild's Message of the Day in the tooltip."],
-						get = function(info) return E.db.sle.dt.guild.hide_gmotd end,
-						set = function(info, value) E.db.sle.dt.guild.hide_gmotd = value; end,
-					},
-					hideguildname = {
-						order = 6,
-						type = "toggle",
-						name = L["Hide Guild Name"],
-						desc = L["Hide the guild's name in the tooltip."],
-						get = function(info) return E.db.sle.dt.guild.hide_guildname end,
-						set = function(info, value) E.db.sle.dt.guild.hide_guildname = value; end,
-					},
-					spacer = {
-						order = 7,
-						type = 'description',
-						name = "",
-					},
-					tooltipautohide = {
-						order = 8,
-						type = "range",
-						name = L["Autohide Delay:"],
-						desc = L["Adjust the tooltip autohide delay when mouse is no longer hovering of the datatext."],
-						min = 0.1, max = 1, step = 0.1,
-						get = function(info) return E.db.sle.dt.guild.tooltipAutohide end,
-						set = function(info, value) E.db.sle.dt.guild.tooltipAutohide = value; end,
-					},
-				},
-			},
-			slmail = {
-				type = "group",
-				name = L["S&L Mail"],
-				order = 5,
-				args = {
-					header = {
-						order = 1,
-						type = "description",
-						name = L["These options are for modifing the Shadow & Light Mail datatext."],
-					},
-					icon = {
-						order = 2,
-						type = "toggle",
-						name = L["Minimap icon"],
-						desc = L["If enabled will show new mail icon on minimap."],
-						get = function(info) return E.db.sle.dt.mail.icon end,
-						set = function(info, value) E.db.sle.dt.mail.icon = value; DT:SLEmailUp() end,
-					}
-				},
-			},
-			sldurability = {
-				type = "group",
-				name = DURABILITY,
-				order = 6,
-				args = {
-					header = {
-						order = 1,
-						type = "description",
-						name = L["Any changes made will take effect only after:\n - Opening vendor\n - Item durability changes\n - Experiencing loading screen."],
-					},
-					gradient = {
-						order = 2,
-						type = "toggle",
-						name = L["Gradient"],
-						desc = L["If enabled will color durability text based on it's value."],
-						get = function(info) return E.db.sle.dt.durability.gradient end,
-						set = function(info, value) E.db.sle.dt.durability.gradient = value end,
-					},
-					threshold = {
-						order = 3,
-						type = "range",
-						min = -1, max = 99, step = 1,
-						name = L["Durability Threshold"],
-						desc = L["Datatext will flash if durability shown will be equal or lower that this value. Set to -1 to disable"],
-						get = function(info) return E.db.sle.dt.durability.threshold end,
-						set = function(info, value) E.db.sle.dt.durability.threshold = value end,
-					}
-				},
-			},
-		},
-	}
-end
-
-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/equipmanager_c.lua b/ElvUI_SLE/options/equipmanager_c.lua
index 26ad8e3..b49ee3b 100644
--- a/ElvUI_SLE/options/equipmanager_c.lua
+++ b/ElvUI_SLE/options/equipmanager_c.lua
@@ -1,14 +1,19 @@
-local E, L, V, P, G = unpack(ElvUI);
-local EM = E:GetModule('SLE_EquipManager')
-local BI = E:GetModule('SLE_BagInfo')
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local EM = SLE:GetModule('EquipManager')
+local NONE = NONE
+local PAPERDOLL_EQUIPMENTMANAGER = PAPERDOLL_EQUIPMENTMANAGER
+local SPECIALIZATION_PRIMARY = SPECIALIZATION_PRIMARY
+local SPECIALIZATION_SECONDARY = SPECIALIZATION_SECONDARY
+local PVP = PVP
+local DUNGEONS = DUNGEONS

 local sets = {}

 local function FillTable()
 	sets = {}
 	sets["NONE"] = NONE
-	for i = 1, GetNumEquipmentSets() do
-		local name, icon, lessIndex = GetEquipmentSetInfo(i)
+	for i = 1, T.GetNumEquipmentSets() do
+		local name, icon, lessIndex = T.GetEquipmentSetInfo(i)
 		if name then
 			sets[name] = name
 		end
@@ -17,10 +22,65 @@ local function FillTable()
 end

 local function configTable()
-	E.Options.args.sle.args.options.args.equipmanager = {
+	if not SLE.initialized then return end
+
+	local function ConstructSpecOption(ORDER, ID, OPTION)
+		local SpecID, SpecName = GetSpecializationInfo(ID)
+		if not SpecID then return nil end
+		local config = {
+			order = ORDER,
+			type = "group",
+			guiInline = true,
+			name = SpecName,
+			get = function(info) return EM.db[OPTION][ info[#info] ] end,
+			set = function(info, value) EM.db[OPTION][ info[#info] ] = value; end,
+			args = {
+				infoz = {
+					order = 1,
+					type = "description",
+					name =  T.format(L["Equip this set when switching to specialization %s."], SpecName),
+				},
+				general = {
+					order = 2,
+					type = "select",
+					name = GENERAL,
+					desc = L["Equip this set for open world/general use."],
+					values = function()
+						FillTable()
+						return sets
+					end,
+				},
+				instance = {
+					order = 3,
+					type = "select",
+					name = DUNGEONS,
+					disabled = function() return not EM.db.instanceSet end,
+					desc = L["Equip this set after entering dungeons or raids."],
+					values = function()
+						FillTable()
+						return sets
+					end,
+				},
+				pvp = {
+					order = 4,
+					type = "select",
+					name = PVP,
+					disabled = function() return not EM.db.pvpSet end,
+					desc = L["Equip this set after entering battlegrounds or arens."],
+					values = function()
+						FillTable()
+						return sets
+					end,
+				},
+			},
+		}
+		return config
+	end
+
+	E.Options.args.sle.args.modules.args.equipmanager = {
 		type = 'group',
-		order = 7,
-		name = L['Equipment Manager'],
+		order = 9,
+		name = L["Equipment Manager"],
 		args = {
 			header = {
 				order = 1,
@@ -35,31 +95,47 @@ local function configTable()
 			enable = {
 				type = "toggle",
 				order = 3,
-				name = L['Enable'],
-				get = function(info) return E.private.sle.equip.enable end,
-				set = function(info, value) E.private.sle.equip.enable = value; E:StaticPopup_Show("PRIVATE_RL") end
-			},
-			spam = {
-				type = "toggle",
-				order = 4,
-				name = L['Spam Throttling'],
-				desc = L["Removes the spam from chat stating what talents were learned or unlearned during spec change."],
-				get = function(info) return E.private.sle.equip.spam end,
-				set = function(info, value) E.private.sle.equip.spam = value; EM:SpamThrottle() end
+				name = L["Enable"],
+				get = function(info) return EM.db.enable end,
+				set = function(info, value) EM.db.enable = value; E:StaticPopup_Show("PRIVATE_RL") end
 			},
 			setoverlay = {
 				type = "toggle",
 				order = 5,
-				name = L['Equipment Set Overlay'],
-				desc = L['Show the associated equipment sets for the items in your bags (or bank).'],
-				get = function(info) return E.private.sle.equip.setoverlay end,
-				set = function(info, value) E.private.sle.equip.setoverlay = value; BI:ToggleSettings(); end,
+				name = L["Equipment Set Overlay"],
+				desc = L["Show the associated equipment sets for the items in your bags (or bank)."],
+				disabled = function() return not E.private.bags.enable end,
+				get = function(info) return EM.db.setoverlay end,
+				set = function(info, value) EM.db.setoverlay = value; SLE:GetModule('BagInfo'):ToggleSettings(); end,
+			},
+			spacer = {
+				order = 6,
+				type = "description",
+				name = "",
+			},
+			instanceSet = {
+				type = "toggle",
+				order = 7,
+				name = L["Use Instanse Set"],
+				desc = L["Use a dedicated set for instances and raids."],
+				disabled = function() return not EM.db.enable end,
+				get = function(info) return EM.db.instanceSet end,
+				set = function(info, value) EM.db.instanceSet = value; end
+			},
+			pvpSet = {
+				type = "toggle",
+				order = 8,
+				name = L["Use PvP Set"],
+				desc = L["Use a dedicated set for PvP situations."],
+				disabled = function() return not EM.db.enable end,
+				get = function(info) return EM.db.pvpSet end,
+				set = function(info, value) EM.db.pvpSet = value; end
 			},
 			equipsets = {
 				type = "group",
 				name = PAPERDOLL_EQUIPMENTMANAGER,
-				order = 6,
-				disabled = function() return not E.private.sle.equip.enable end,
+				order = 9,
+				disabled = function() return not EM.db.enable end,
 				guiInline = true,
 				args = {
 					intro = {
@@ -67,63 +143,14 @@ local function configTable()
 						type = 'description',
 						name = L["Here you can choose what equipment sets to use in different situations."],
 					},
-					primary = {
-						order = 2,
-						type = "select",
-						name = SPECIALIZATION_PRIMARY,
-						desc = L["Equip this set when switching to primary talents."],
-						get = function(info) return E.private.sle.equip.primary end,
-						set = function(info, value) E.private.sle.equip.primary = value; end,
-						values = function()
-							FillTable()
-							return sets
-						end,
-					},
-					secondary = {
-						order = 3,
-						type = "select",
-						name = SPECIALIZATION_SECONDARY,
-						desc = L["Equip this set when switching to secondary talents."],
-						get = function(info) return E.private.sle.equip.secondary end,
-						set = function(info, value) E.private.sle.equip.secondary = value end,
-						values = function()
-							FillTable()
-							return sets
-						end,
-					},
-					spacer = {
-						type = "description",
-						order = 4,
-						name = "",
-					},
-					instance = {
-						order = 5,
-						type = "select",
-						name = DUNGEONS,
-						desc = L["Equip this set after entering dungeons or raids."],
-						get = function(info) return E.private.sle.equip.instance end,
-						set = function(info, value) E.private.sle.equip.instance = value end,
-						values = function()
-							FillTable()
-							return sets
-						end,
-					},
-					pvp = {
-						order = 6,
-						type = "select",
-						name = PVP,
-						desc = L["Equip this set after entering battlegrounds or arens."],
-						get = function(info) return E.private.sle.equip.pvp end,
-						set = function(info, value) E.private.sle.equip.pvp = value end,
-						values = function()
-							FillTable()
-							return sets
-						end,
-					},
+					firstSpec = ConstructSpecOption(1, 1, "firstSpec"),
+					secondSpec = ConstructSpecOption(2, 2, "secondSpec"),
+					thirdSpec = ConstructSpecOption(3, 3, "thirdSpec"),
+					forthSpec = ConstructSpecOption(4, 4, "forthSpec"),
 				},
 			},
 		},
 	}
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/errorframe_c.lua b/ElvUI_SLE/options/errorframe_c.lua
deleted file mode 100644
index 5f5642e..0000000
--- a/ElvUI_SLE/options/errorframe_c.lua
+++ /dev/null
@@ -1,59 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local F = E:GetModule('SLE_ErrorFrame');
-local ACD = LibStub("AceConfigDialog-3.0-ElvUI")
-
-local function configTable()
-	E.Options.args.sle.args.options.args.general.args.errorframe = {
-		type = "group",
-		name = L["Error Frame"],
-		order = 75,
-		args = {
-			header = {
-				order = 1,
-				type = "header",
-				name = L["Error Frame"],
-			},
-			hideErrorFrame = {
-				order = 2,
-				name = L["Hide Error Text"],
-				desc = L["Hides the red error text at the top of the screen while in combat."],
-				type = "toggle",
-				get = function(info) return E.db.general[ info[#info] ] end,
-				set = function(info, value) E.db.general[ info[#info] ] = value end,
-			},
-			space = {
-				type = "description",
-				order = 3,
-				name = '',
-			},
-			width = {
-				order = 4,
-				name = L["Width"],
-				desc = L["Set the width of Error Frame. Too narrow frame may cause messages to be split in several lines"],
-				type = "range",
-				min = 100, max = 1000, step = 1,
-				get = function(info) return E.db.sle.errorframe.width end,
-				set = function(info, value) E.db.sle.errorframe.width = value; F:SetSize() end
-			},
-			height = {
-				order = 5,
-				name = L["Height"],
-				desc = L["Set the height of Error Frame. Higher frame can show more lines at once."],
-				type = "range",
-				min = 30, max = 300, step = 15,
-				get = function(info) return E.db.sle.errorframe.height end,
-				set = function(info, value) E.db.sle.errorframe.height = value; F:SetSize() end
-			},
-		},
-	}
-
-	E.Options.args.general.args.general.args.hideErrorFrame = {
-		order = 13,
-		name = L["Hide Error Text"],
-		desc = L["This option have been moved by Shadow & Light. Click to access it's new place."],
-		type = "execute",
-		func = function() ACD:SelectGroup("ElvUI", "sle", "options", "general", "errorframe") end,
-	}
-end
-
-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/exprepbar_c.lua b/ElvUI_SLE/options/exprepbar_c.lua
deleted file mode 100644
index 0138040..0000000
--- a/ElvUI_SLE/options/exprepbar_c.lua
+++ /dev/null
@@ -1,44 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local M = E:GetModule('Misc')
-
-local function configTable()
-	--Options for Exp/Rep text
-	E.Options.args.sle.args.options.args.general.args.exprep = {
-		type = "group",
-		name = L["Xp-Rep Text"],
-		order = 99,
-		args = {
-			header = {
-				order = 1,
-				type = "header",
-				name = L["Xp-Rep Text"],
-			},
-			explong = {
-				order = 2,
-				type = "toggle",
-				name = L["Full value on Exp Bar"],
-				desc = L["Changes the way text is shown on exp bar."],
-				get = function(info) return E.db.sle.exprep.explong end,
-				set = function(info, value) E.db.sle.exprep.explong = value; M:UpdateExperience() end
-			},
-			replong = {
-				order = 3,
-				type = "toggle",
-				name = L["Full value on Rep Bar"],
-				desc = L["Changes the way text is shown on rep bar."],
-				get = function(info) return E.db.sle.exprep.replong end,
-				set = function(info, value) E.db.sle.exprep.replong = value; M:UpdateReputation() end
-			},
-			autotrackrep = {
-				order = 4,
-				type = "toggle",
-				name = L["Auto Track Reputation"],
-				desc = L["Automatically sets reputation tracking to the most recent reputation change."],
-				get = function(info) return E.private.sle.exprep.autotrack end,
-				set = function(info, value) E.private.sle.exprep.autotrack = value; end
-			},
-		},
-	}
-end
-
-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/farm_c.lua b/ElvUI_SLE/options/farm_c.lua
index d51711b..6ed7a6d 100644
--- a/ElvUI_SLE/options/farm_c.lua
+++ b/ElvUI_SLE/options/farm_c.lua
@@ -1,97 +1,70 @@
-local E, L, V, P, G = unpack(ElvUI);
-local F = E:GetModule('SLE_Farm')
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local Tools = SLE:GetModule("Toolbars")
+local EXPANSION_NAME4 = EXPANSION_NAME4

 local function configTable()
-	E.Options.args.sle.args.options.args.farm = {
+	if not SLE.initialized then return end
+	local db = E.db.sle.legacy.farm
+	E.Options.args.sle.args.modules.args.legacy.args.farm = {
 		type = 'group',
-		order = 8,
-		name = L['Farm'],
+		order = 1,
+		name = L["Farm"].." ("..EXPANSION_NAME4..")",
+		get = function(info) return db[ info[#info] ] end,
+		set = function(info, value) db[ info[#info] ] = value; Tools:UpdateLayout() end,
 		args = {
 			header = {
 				order = 1,
 				type = "header",
-				name = L["Farm Options"],
-			},
-			intro = {
-				order = 2,
-				type = 'description',
-				name = L["FARM_DESC"],
+				name = L["Farm"],
 			},
 			enable = {
 				type = "toggle",
-				order = 3,
-				name = L['Enable'],
-				get = function(info) return E.private.sle.farm.enable end,
-				set = function(info, value) E.private.sle.farm.enable = value; E:StaticPopup_Show("PRIVATE_RL") end
+				order = 2,
+				name = L["Enable"],
 			},
 			active = {
-				order = 4,
+				order = 3,
 				type = 'toggle',
-				name = L['Only active buttons'],
-				desc = L['Only show the buttons for the seeds, portals, tools you have in your bags.'],
-				disabled = function() return not E.private.sle.farm.enable end,
-				get = function(info) return E.db.sle.farm.active end,
-				set = function(info, value) E.db.sle.farm.active = value; if SeedAnchor then F:UpdateLayout() end end,
+				name = L["Only active buttons"],
+				desc = L["Only show the buttons for the seeds, portals, tools you have in your bags."],
+				disabled = function() return not db.enable end,
 			},
-			size = {
-				order = 5,
+			buttonsize = {
+				order = 4,
 				type = "range",
 				name = L["Button Size"],
-				disabled = function() return not E.private.sle.farm.enable end,
+				disabled = function() return not db.enable end,
 				min = 15, max = 60, step = 1,
-				get = function(info) return E.db.sle.farm.size end,
-				set = function(info, value) E.db.sle.farm.size = value; F:UpdateLayout() end,
 			},
-			seedbar = {
-				type = "group",
+			autotarget = {
+				type = "toggle",
+				order = 5,
+				name = L["Auto Planting"],
+				desc = L["Automatically plant seeds to the nearest tilled soil if one is not already selected."],
+				disabled = function() return not db.enable end,
+			},
+			quest = {
+				type = "toggle",
 				order = 6,
-				name = L["Seed Bars"],
-				disabled = function() return not E.private.sle.farm.enable end,
-				guiInline = true,
-				args = {
-					autotarget = {
-						type = "toggle",
-						order = 1,
-						name = L["Auto Planting"],
-						desc = L["Automatically plant seeds to the nearest tilled soil if one is not already selected."],
-						get = function(info) return E.db.sle.farm.autotarget end,
-						set = function(info, value) E.db.sle.farm.autotarget = value; end
-					},
-					trash = {
-						type = "toggle",
-						order = 2,
-						name = L["Drop Seeds"],
-						desc = L["Allow seeds to be destroyed from seed bars."],
-						get = function(info) return E.private.sle.farm.seedtrash end,
-						set = function(info, value) E.private.sle.farm.seedtrash = value; E:StaticPopup_Show("PRIVATE_RL") end
-					},
-					quest = {
-						type = "toggle",
-						order = 3,
-						name = L["Quest Glow"],
-						desc = L["Show glowing border on seeds needed for any quest in your log."],
-						get = function(info) return E.db.sle.farm.quest end,
-						set = function(info, value) E.db.sle.farm.quest = value; if SeedAnchor then F:UpdateLayout() end end
-					},
-					growth = {
-						order = 8,
-						type = "select",
-						name = L["Dock Buttons To"],
-						desc = L["Change the position from where seed bars will grow."],
-						disabled = function() return not E.private.sle.farm end,
-						get = function(info) return E.db.sle.farm.seedor end,
-						set = function(info, value) E.db.sle.farm.seedor = value; if SeedAnchor then F:UpdateLayout() end end,
-						values = {
-							['RIGHT'] = L["Right"],
-							['LEFT'] = L["Left"],
-							['BOTTOM'] = L["Bottom"],
-							['TOP'] = L["Top"],
-						},
-					},
+				name = L["Quest Glow"],
+				desc = L["Show glowing border on seeds needed for any quest in your log."],
+				disabled = function() return not db.enable end,
+			},
+			seedor = {
+				order = 7,
+				type = "select",
+				name = L["Dock Buttons To"],
+				desc = L["Change the position from where seed bars will grow."],
+				disabled = function() return not db.enable end,
+				values = {
+					["RIGHT"] = L["Right"],
+					["LEFT"] = L["Left"],
+					["BOTTOM"] = L["Bottom"],
+					["TOP"] = L["Top"],
 				},
 			},
 		},
 	}
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/garrison_c.lua b/ElvUI_SLE/options/garrison_c.lua
index 9486606..32c0a2d 100644
--- a/ElvUI_SLE/options/garrison_c.lua
+++ b/ElvUI_SLE/options/garrison_c.lua
@@ -1,53 +1,85 @@
-local E, L, V, P, G = unpack(ElvUI);
-
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local GARRISON_LOCATION_TOOLTIP = GARRISON_LOCATION_TOOLTIP
+local EXPANSION_NAME5 = EXPANSION_NAME5
 local function configTable()
-	E.Options.args.sle.args.options.args.general.args.garrison = {
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.legacy.args.garrison = {
 		type = "group",
-		name = GARRISON_LOCATION_TOOLTIP,
-		order = 53,
+		name = GARRISON_LOCATION_TOOLTIP.." ("..EXPANSION_NAME5..")",
+		order = 1,
 		args = {
 			header = {
 				order = 1,
 				type = "header",
 				name = GARRISON_LOCATION_TOOLTIP,
 			},
+			toolbar = {
+				order = 1,
+				type = "group",
+				name = L["Toolbar"],
+				guiInline = true,
+				get = function(info) return E.db.sle.legacy.garrison.toolbar[ info[#info] ] end,
+				set = function(info, value) E.db.sle.legacy.garrison.toolbar[ info[#info] ] = value; SLE:GetModule("Toolbars"):UpdateLayout() end,
+				args = {
+					enable = {
+						order = 1,
+						type = "toggle",
+						name = L["Enable"],
+					},
+					active = {
+						order = 2,
+						type = 'toggle',
+						name = L["Only active buttons"],
+						disabled = function() return not E.db.sle.legacy.garrison.toolbar.enable end,
+					},
+					buttonsize = {
+						order = 3,
+						type = "range",
+						name = L["Button Size"],
+						disabled = function() return not E.db.sle.legacy.garrison.toolbar.enable end,
+						min = 15, max = 60, step = 1,
+					},
+				},
+			},
 			autoOrder = {
-				order = 3,
-				type = "toggle",
+				order = 2,
+				type = "group",
 				name = L["Auto Work Orders"],
-				desc = L["Automatically queue maximum number of work orders available when visitin respected NPC."],
-				get = function(info) return E.db.sle.garrison.autoOrder end,
-				set = function(info, value) E.db.sle.garrison.autoOrder = value end
-			},
-			autoWar = {
-				order = 4,
-				type = "toggle",
-				name = L["Auto Work Orders for Warmill"],
-				desc = L["Automatically queue maximum number of work orders available for Warmill/Dwarven Bunker."],
-				disabled = function() return not E.db.sle.garrison.autoOrder end,
-				get = function(info) return E.db.sle.garrison.autoWar end,
-				set = function(info, value) E.db.sle.garrison.autoWar = value end
-			},
-			autoTrade = {
-				order = 5,
-				type = "toggle",
-				name = L["Auto Work Orders for Trading Post"],
-				desc = L["Automatically queue maximum number of work orders available for Trading Post."],
-				disabled = function() return not E.db.sle.garrison.autoOrder end,
-				get = function(info) return E.db.sle.garrison.autoTrade end,
-				set = function(info, value) E.db.sle.garrison.autoTrade = value end
-			},
-			autoShip = {
-				order = 6,
-				type = "toggle",
-				name = L["Auto Work Orders for Shipyard"],
-				desc = L["Automatically queue maximum number of work orders available for Shipyard."],
-				disabled = function() return not E.db.sle.garrison.autoOrder end,
-				get = function(info) return E.db.sle.garrison.autoShip end,
-				set = function(info, value) E.db.sle.garrison.autoShip = value end
+				guiInline = true,
+				get = function(info) return E.db.sle.legacy.garrison.autoOrder[ info[#info] ] end,
+				set = function(info, value) E.db.sle.legacy.garrison.autoOrder[ info[#info] ] = value end,
+				args = {
+					enable = {
+						order = 1,
+						type = "toggle",
+						name = L["Enable"],
+						desc = L["Automatically queue maximum number of work orders available when visiting respected NPC."],
+					},
+					autoWar = {
+						order = 2,
+						type = "toggle",
+						name = L["Auto Work Orders for Warmill"],
+						desc = L["Automatically queue maximum number of work orders available for Warmill/Dwarven Bunker."],
+						disabled = function() return not E.db.sle.legacy.garrison.autoOrder.enable end,
+					},
+					autoTrade = {
+						order = 3,
+						type = "toggle",
+						name = L["Auto Work Orders for Trading Post"],
+						desc = L["Automatically queue maximum number of work orders available for Trading Post."],
+						disabled = function() return not E.db.sle.legacy.garrison.autoOrder.enable end,
+					},
+					autoShip = {
+						order = 4,
+						type = "toggle",
+						name = L["Auto Work Orders for Shipyard"],
+						desc = L["Automatically queue maximum number of work orders available for Shipyard."],
+						disabled = function() return not E.db.sle.legacy.garrison.autoOrder.enable end,
+					},
+				},
 			},
 		},
 	}
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/help_c.lua b/ElvUI_SLE/options/help_c.lua
index 54c5463..c746624 100644
--- a/ElvUI_SLE/options/help_c.lua
+++ b/ElvUI_SLE/options/help_c.lua
@@ -1,25 +1,28 @@
-local E, L, V, P, G = unpack(ElvUI);
-local SLE = E:GetModule('SLE')
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))

 local function configTable()
+	if not SLE.initialized then return end
+
+	local function CreateQuestion(i, text)
+		local question = {
+			type = 'group', name = '', order = i, guiInline = true,
+			args = {
+				q = { order = 1, type = 'description', fontSize = 'medium', name = text },
+			},
+		}
+		return question
+	end
 	--Main options group
 	E.Options.args.sle.args.help = {
 		type = 'group',
-		name = L['About/Help'],
-		order = -5,
+		name = L["About/Help"],
+		order = 100,
 		childGroups = 'tab',
 		args = {
 			about = {
-				type = 'group',
-				name = L['About'],
-				order = 1,
+				type = 'group', name = L["About"], order = 1,
 				args = {
-					content = {
-						order = 1,
-						type = 'description',
-						fontSize = 'medium',
-						name = L["SLE_DESC"],
-					},
+					content = { order = 1, type = 'description', fontSize = 'medium', name = L["SLE_DESC"] },
 				},
 			},
 			faq = {
@@ -35,185 +38,50 @@ local function configTable()
 						name = L["FAQ_DESC"],
 					},
 					elvui = {
-						type = 'group',
-						order = 1,
-						name = "ElvUI",
+						type = 'group', order = 1, name = "ElvUI",
 						args = {
-							q1 = {
-								type = 'group',
-								name = '',
-								order = 1,
-								guiInline = true,
-								args = {
-									q = {
-										order = 1,
-										type = 'description',
-										fontSize = 'medium',
-										name = L["FAQ_Elv_1"],
-									},
-								},
-							},
-							q2 = {
-								type = 'group',
-								name = '',
-								order = 2,
-								guiInline = true,
-								args = {
-									q = {
-										order = 1,
-										type = 'description',
-										fontSize = 'medium',
-										name = L["FAQ_Elv_2"],
-									},
-								},
-							},
-							q3 = {
-								type = 'group',
-								name = '',
-								order = 3,
-								guiInline = true,
-								args = {
-									q = {
-										order = 1,
-										type = 'description',
-										fontSize = 'medium',
-										name = L["FAQ_Elv_3"],
-									},
-								},
-							},
-							q4 = {
-								type = 'group',
-								name = '',
-								order = 4,
-								guiInline = true,
-								args = {
-									q = {
-										order = 1,
-										type = 'description',
-										fontSize = 'medium',
-										name = L["FAQ_Elv_4"],
-									},
-								},
-							},
+							q1 = CreateQuestion(1, L["FAQ_Elv_1"]),
+							q2 = CreateQuestion(2, L["FAQ_Elv_2"]),
+							q3 = CreateQuestion(3, L["FAQ_Elv_3"]),
+							q4 = CreateQuestion(4, L["FAQ_Elv_4"]),
+							q5 = CreateQuestion(5, L["FAQ_Elv_5"]),
 						},
 					},
 					sle = {
-						type = 'group',
-						order = 1,
-						name = "Shadow & Light",
+						type = 'group', order = 2, name = "Shadow & Light",
 						args = {
-							q1 = {
-								type = 'group',
-								name = '',
-								order = 1,
-								guiInline = true,
-								args = {
-									q = {
-										order = 1,
-										type = 'description',
-										fontSize = 'medium',
-										name = L["FAQ_sle_1"],
-									},
-								},
-							},
-							q2 = {
-								type = 'group',
-								name = '',
-								order = 2,
-								guiInline = true,
-								args = {
-									q = {
-										order = 1,
-										type = 'description',
-										fontSize = 'medium',
-										name = L["FAQ_sle_2"],
-									},
-								},
-							},
-							q3 = {
-								type = 'group',
-								name = '',
-								order = 3,
-								guiInline = true,
-								args = {
-									q = {
-										order = 1,
-										type = 'description',
-										fontSize = 'medium',
-										name = L["FAQ_sle_3"],
-									},
-								},
-							},
-							q4 = {
-								type = 'group',
-								name = '',
-								order = 4,
-								guiInline = true,
-								args = {
-									q = {
-										order = 1,
-										type = 'description',
-										fontSize = 'medium',
-										name = L["FAQ_sle_4"],
-									},
-								},
-							},
-							q5 = {
-								type = 'group',
-								name = '',
-								order = 5,
-								guiInline = true,
-								args = {
-									q = {
-										order = 1,
-										type = 'description',
-										fontSize = 'medium',
-										name = L["FAQ_sle_5"],
-									},
-								},
-							},
+							q1 = CreateQuestion(1, L["FAQ_sle_1"]),
+							q2 = CreateQuestion(2, L["FAQ_sle_2"]),
+							q3 = CreateQuestion(3, L["FAQ_sle_3"]),
+							q4 = CreateQuestion(4, L["FAQ_sle_4"]),
+							q5 = CreateQuestion(5, L["FAQ_sle_5"]),
 						},
 					},
 				},
 			},
 			links = {
 				type = 'group',
-				name = L['Links'],
+				name = L["Links"],
 				order = 10,
 				args = {
 					desc = {
-						order = 1,
-						type = 'description',
-						fontSize = 'medium',
-						name = L["LINK_DESC"],
+						order = 1, type = 'description', fontSize = 'medium', name = L["LINK_DESC"]
 					},
 					tukuilink = {
-						type = 'input',
-						width = 'full',
-						name = 'TukUI.org',
+						order = 2, type = 'input', width = 'full', name = 'TukUI.org',
 						get = function(info) return 'http://www.tukui.org/addons/index.php?act=view&id=42' end,
-						order = 2,
 					},
 					wowilink = {
-						type = 'input',
-						width = 'full',
-						name = 'WoWInterface',
+						order = 3, type = 'input', width = 'full', name = 'WoWInterface',
 						get = function(info) return 'http://www.wowinterface.com/downloads/info20927-ElvUIShadowLight.html' end,
-						order = 3,
 					},
 					curselink= {
-						type = 'input',
-						width = 'full',
-						name = 'Curse.com',
+						order = 4, type = 'input', width = 'full', name = 'Curse.com',
 						get = function(info) return 'http://www.curse.com/addons/wow/shadow-and-light-edit' end,
-						order = 4,
 					},
 					gitlablink = {
-						type = 'input',
-						width = 'full',
-						name = L['GitLab Link / Report Errors'],
+						order = 5, type = 'input', width = 'full', name = L["GitLab Link / Report Errors"],
 						get = function(info) return 'http://git.tukui.org/repooc/elvui-shadowandlight' end,
-						order = 5,
 					},
 				},
 			},
@@ -223,11 +91,7 @@ local function configTable()
 				type = 'group',
 				name = L["Credits"],
 				args = {
-					creditheader = {
-						order = 1,
-						type = "header",
-						name = L["Credits"],
-					},
+					creditheader = { order = 1, type = "header", name = L["Credits"] },
 					credits = {
 						order = 2,
 						type = "description",
@@ -239,4 +103,4 @@ local function configTable()
 	}
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/imports_c.lua b/ElvUI_SLE/options/imports_c.lua
deleted file mode 100644
index 6d94cc1..0000000
--- a/ElvUI_SLE/options/imports_c.lua
+++ /dev/null
@@ -1,687 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local AI = E:GetModule('SLE_AddonInstaller');
-local SLE = E:GetModule('SLE');
-
-local selectedAuthor
-local selectedClass
-local selectedOption
-local authors
-local options = {
-	Filters = "Filters",
-	Addons = "Addons",
-}
-local classes = {
-	AllClasses = "All Classes",
-	Priest = "Priest",
-	Druid = "Druid",
-	Paladin = "Paladin",
-	Shaman = "Shaman",
-	Monk = "Monk",
-	Rogue = "Rogue",
-	Mage = "Mage",
-	Warrior = "Warrior",
-	Deathknight = "Deathknight",
-	Warlock = "Warlock",
-}
-local function buffWatch(filter)
-	if filter == "AllClasses" and selectedAuthor == "Affinitii" then
-		E['global']['unitframe']['buffwatch'] = {
-			["PRIEST"] = {
-				{["point"] = "LEFT",["displayText"] = true,["yOffset"] = 2,["style"] = "NONE",["textColor"] = {["g"] = 0,["b"] = 0,},}, -- [1]
-				{["point"] = "TOPRIGHT",["style"] = "texturedIcon",}, -- [2]
-				{["enabled"] = false,}, -- [3]
-				{["color"] = {["b"] = 1,["g"] = 1,["r"] = 1,},["displayText"] = true,["style"] = "NONE",}, -- [4]
-				nil, -- [5]
-				{["enabled"] = false,}, -- [6]
-				{["enabled"] = false,}, -- [7]
-				{["enabled"] = false,}, -- [8]
-				{["enabled"] = true,["anyUnit"] = false,["point"] = "BOTTOMLEFT",["color"] = {["r"] = 1,["g"] = 1,["b"] = 1,},["displayText"] = true,["textThreshold"] = -1,["yOffset"] = 8,["style"] = "NONE",["id"] = 47753,}, -- [9]
-				{["enabled"] = true,["anyUnit"] = false,["point"] = "BOTTOMRIGHT",["color"] = {["r"] = 1,["g"] = 1,["b"] = 1,},["displayText"] = true,["textThreshold"] = -1,["yOffset"] = 8,["style"] = "NONE",["id"] = 114908,}, -- [10]
-			},
-			["DRUID"] = {
-				{["point"] = "TOPLEFT",["displayText"] = true,["style"] = "NONE",}, -- [1]
-				{["displayText"] = true,["style"] = "NONE",}, -- [2]
-				{["point"] = "BOTTOMRIGHT",["displayText"] = true,["textThreshold"] = 5,["yOffset"] = 12,["style"] = "texturedIcon",}, -- [3]
-				{["point"] = "TOPRIGHT",["displayText"] = true,["textThreshold"] = 3,["style"] = "texturedIcon",}, -- [4]
-				{["enabled"] = true,["anyUnit"] = false,["point"] = "LEFT",["id"] = 155777,["displayText"] = true,["style"] = "texturedIcon",["color"] = {["b"] = 0,["g"] = 0,["r"] = 1,},}, -- [5]
-				{["enabled"] = true,["anyUnit"] = false,["point"] = "BOTTOMRIGHT",["id"] = 162359,["displayText"] = true,["color"] = {["b"] = 0,["g"] = 0,["r"] = 1,},}, -- [6]
-			},
-			["MONK"] = {
-				{["color"] = {["b"] = 1,["g"] = 1,["r"] = 1,},["displayText"] = true,["style"] = "NONE",}, -- [1]
-				{["enabled"] = false,}, -- [2]
-				{["color"] = {["b"] = 1,["g"] = 1,["r"] = 1,},["displayText"] = true,["style"] = "NONE",}, -- [3]
-				{["color"] = {["b"] = 1,["g"] = 1,["r"] = 1,},["displayText"] = true,["style"] = "NONE",}, -- [4]
-				{["enabled"] = true,["anyUnit"] = false,["point"] = "TOPRIGHT",["id"] = 115175,["color"] = {["r"] = 1,["g"] = 1,["b"] = 1,},["displayText"] = false,["style"] = "texturedIcon",["yOffset"] = 0,}, -- [5]
-			},
-			["SHAMAN"] = {
-				{["color"] = {["r"] = 1,["g"] = 1,["b"] = 1,},["displayText"] = true,["style"] = "NONE",}, -- [1]
-				{["point"] = "BOTTOMRIGHT",["yOffset"] = 10,["style"] = "texturedIcon",}, -- [2]
-				{["point"] = "TOPLEFT",["color"] = {["b"] = 1,["g"] = 1,["r"] = 1,},["displayText"] = true,["style"] = "NONE",	}, -- [3]
-			},
-			["PALADIN"] = {
-				nil, -- [1]
-				{["enabled"] = false,}, -- [2]
-				{["enabled"] = false,}, -- [3]
-				{["enabled"] = false,}, -- [4]
-				{["enabled"] = false,}, -- [5]
-				nil, -- [6]
-				nil, -- [7]
-				{["anyUnit"] = false,["point"] = "TOPRIGHT",["color"] = {["b"] = 0,["g"] = 0,["r"] = 1,},["displayText"] = true,["style"] = "NONE",}, -- [8]
-			},
-		}
-		ReloadUI();
-	elseif selectedAuthor == "Affintii" then
-		if filter == "Priest" then
-			E.global.unitframe.buffwatch["PRIEST"] = {
-				{["point"] = "LEFT",["displayText"] = true,["yOffset"] = 2,["style"] = "NONE",["textColor"] = {["g"] = 0,["b"] = 0,},}, -- [1]
-				{["point"] = "TOPRIGHT",["style"] = "texturedIcon",}, -- [2]
-				{["enabled"] = false,}, -- [3]
-				{["color"] = {["b"] = 1,["g"] = 1,["r"] = 1,},["displayText"] = true,["style"] = "NONE",}, -- [4]
-				nil, -- [5]
-				{["enabled"] = false,}, -- [6]
-				{["enabled"] = false,}, -- [7]
-				{["enabled"] = false,}, -- [8]
-				{["enabled"] = true,["anyUnit"] = false,["point"] = "BOTTOMLEFT",["color"] = {["r"] = 1,["g"] = 1,["b"] = 1,},["displayText"] = true,["textThreshold"] = -1,["yOffset"] = 8,["style"] = "NONE",["id"] = 47753,}, -- [9]
-				{["enabled"] = true,["anyUnit"] = false,["point"] = "BOTTOMRIGHT",["color"] = {["r"] = 1,["g"] = 1,["b"] = 1,},["displayText"] = true,["textThreshold"] = -1,["yOffset"] = 8,["style"] = "NONE",["id"] = 114908,}, -- [10]
-			}
-			ReloadUI();
-		elseif filter == "Druid" then
-			E.global.unitframe.buffwatch["DRUID"] = {
-				{["point"] = "TOPLEFT",["displayText"] = true,["style"] = "NONE",}, -- [1]
-				{["displayText"] = true,["style"] = "NONE",}, -- [2]
-				{["point"] = "BOTTOMRIGHT",["displayText"] = true,["textThreshold"] = 5,["yOffset"] = 12,["style"] = "texturedIcon",}, -- [3]
-				{["point"] = "TOPRIGHT",["displayText"] = true,["textThreshold"] = 3,["style"] = "texturedIcon",}, -- [4]
-				{["enabled"] = true,["anyUnit"] = false,["point"] = "LEFT",["id"] = 155777,["displayText"] = true,["style"] = "texturedIcon",["color"] = {["b"] = 0,["g"] = 0,["r"] = 1,},}, -- [5]
-				{["enabled"] = true,["anyUnit"] = false,["point"] = "BOTTOMRIGHT",["id"] = 162359,["displayText"] = true,["color"] = {["b"] = 0,["g"] = 0,["r"] = 1,},}, -- [6]
-			}
-			ReloadUI();
-		elseif filter == "Monk" then
-			E.global.unitframe.buffwatch["MONK"] = {
-				{["color"] = {["b"] = 1,["g"] = 1,["r"] = 1,},["displayText"] = true,["style"] = "NONE",}, -- [1]
-				{["enabled"] = false,}, -- [2]
-				{["color"] = {["b"] = 1,["g"] = 1,["r"] = 1,},["displayText"] = true,["style"] = "NONE",}, -- [3]
-				{["color"] = {["b"] = 1,["g"] = 1,["r"] = 1,},["displayText"] = true,["style"] = "NONE",}, -- [4]
-				{["enabled"] = true,["anyUnit"] = false,["point"] = "TOPRIGHT",["id"] = 115175,["color"] = {["r"] = 1,["g"] = 1,["b"] = 1,},["displayText"] = false,["style"] = "texturedIcon",["yOffset"] = 0,}, -- [5]
-			}
-			ReloadUI();
-		elseif filter == "Shaman" then
-			E.global.unitframe.buffwatch["SHAMAN"] = {
-				{["color"] = {["r"] = 1,["g"] = 1,["b"] = 1,},["displayText"] = true,["style"] = "NONE",}, -- [1]
-				{["point"] = "BOTTOMRIGHT",["yOffset"] = 10,["style"] = "texturedIcon",}, -- [2]
-				{["point"] = "TOPLEFT",["color"] = {["b"] = 1,["g"] = 1,["r"] = 1,},["displayText"] = true,["style"] = "NONE",	}, -- [3]
-			}
-			ReloadUI();
-		elseif filter == "Paladin" then
-			E.global.unitframe.buffwatch["PALADIN"] = {
-				nil, -- [1]
-				{["enabled"] = false,}, -- [2]
-				{["enabled"] = false,}, -- [3]
-				{["enabled"] = false,}, -- [4]
-				{["enabled"] = false,}, -- [5]
-				nil, -- [6]
-				nil, -- [7]
-				{["anyUnit"] = false,["point"] = "TOPRIGHT",["color"] = {["b"] = 0,["g"] = 0,["r"] = 1,},["displayText"] = true,["style"] = "NONE",}, -- [8]
-			}
-			ReloadUI();
-		else
-			print("There is no filter for the class specified.")
-		end
-	elseif filter == "1Filter" then
-		E['global']['unitframe']["aurafilters"]["TurtleBuffs"] = {
-			["spells"] = {
-				["Alter Time"] = {
-					["enable"] = true,
-					["priority"] = 0,
-				},
-				["Elusive Brew"] = {
-					["enable"] = false,
-					["priority"] = 99,
-				},
-			},
-		}
-		E['global']['unitframe']["aurafilters"]["Blacklist"] = {
-			["spells"] = {
-				["Bright Light"] = {
-					["enable"] = true,
-					["priority"] = 0,
-				},
-				["Keen Eyesight"] = {
-					["enable"] = true,
-					["priority"] = 0,
-				},
-				["Clear Mind"] = {
-					["enable"] = true,
-					["priority"] = 0,
-				},
-				["Blue Rays"] = {
-					["enable"] = true,
-					["priority"] = 0,
-				},
-				["Inferno Breath"] = {
-					["enable"] = true,
-					["priority"] = 0,
-				},
-				["Infrared Light"] = {
-					["enable"] = true,
-					["priority"] = 0,
-				},
-				["Unleashed Anima"] = {
-					["enable"] = true,
-					["priority"] = 0,
-				},
-				["Dark Winds"] = {
-					["enable"] = true,
-					["priority"] = 0,
-				},
-				["Fully Mutated"] = {
-					["enable"] = true,
-					["priority"] = 0,
-				},
-				["Improved Synapses"] = {
-					["enable"] = true,
-					["priority"] = 0,
-				},
-				["Thick Bones"] = {
-					["enable"] = true,
-					["priority"] = 0,
-				},
-				["Recently Bandaged"] = {
-					["enable"] = true,
-					["priority"] = 0,
-				},
-				["Blue Timer"] = {
-					["enable"] = true,
-					["priority"] = 0,
-				},
-			},
-		},
-		ReloadUI();
-	else
-		print("This author doesn't have a filter import for that option.")
-	end
-end
-
-local function UpdateAuthor()
-	if selectedAuthor == 'Affinitii' then
-		if not selectedAuthor then
-			E.Options.args.sle.args.importing.args.authors.args.authorGroup = nil
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup = nil
-			return
-		end
-
-		E.Options.args.sle.args.importing.args.authors.args.authorGroup = {
-			type = 'group',
-			name = selectedAuthor,
-			guiInline = true,
-			order = 10,
-			args = {
-				importOptions = {
-					name = L["Import Options"],
-					type = 'select',
-					order = 1,
-					guiInline = true,
-					get = function(info) return selectedOption end,
-					set = function(info, value) selectedOption = value; UpdateAuthor(); end,
-					values = function()
-						local option = {}
-						option[''] = NONE
-						for k in pairs(options) do
-							option[k] = k
-						end
-
-						return option
-					end,
-				},
-			},
-		}
-		if not selectedOption or selectedOption == '' then
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup = nil
-			selectedClass = nil
-			return
-		end
-
-		if selectedOption == 'Filters' then
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup = {
-				type = "group",
-				name = selectedOption,
-				order = 15,
-				guiInline = true,
-				args = {
-					description = {
-						order = 2,
-						type = "description",
-						name = L["Please be aware that importing any of the filters will require a reload of the UI for the settings to take effect.\nOnce you click a filter button, your screen will reload automatically."],
-					},
-					selectClass = {
-						name = L["Select Filter"],
-						type = 'select',
-						order = 4,
-						guiInline = true,
-						get = function(info) return selectedClass end,
-						set = function(info, value) selectedClass = value; UpdateAuthor(); end,
-						values = function()
-							local class = {}
-							class[''] = NONE
-							class['1Filter'] = "General Filters"
-							for k, v in pairs(classes) do
-								class[k] = v
-							end
-
-							return class
-						end,
-					},
-					spacer = {
-						order = 6,
-						type = 'description',
-						name = '',
-					},
-				},
-			}
-			if not selectedClass or selectedClass == '' then
-				E.Options.args.sle.args.importing.args.authors.args.optionGroup.args.class = nil
-				return
-			end
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup.args.class = {
-				type = 'execute',
-				order = 5,
-				name = L["Import"],
-				func = function(info, value) buffWatch(selectedClass) end,
-			}
-			if selectedClass == '1Filter' then
-				E.Options.args.sle.args.importing.args.authors.args.optionGroup.args.filterInfo = {
-					type = "description",
-					order = 7,
-					name = L["This will import non class specific filters from this author."],
-				}
-			elseif selectedClass == 'AllClasses' then
-				E.Options.args.sle.args.importing.args.authors.args.optionGroup.args.filterInfo = {
-					type = "description",
-					order = 7,
-					name = L["This will import All Class specific filters from this author."],
-				}
-			end
-		elseif selectedOption == 'Addons' then
-			selectedClass = nil
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup = {
-				type = "group",
-				name = selectedOption,
-				order = 15,
-				guiInline = true,
-				args = {
-					AllAddons = {
-						type = 'execute',
-						order = 2,
-						name = L['Import All'],
-						func = function(info, value) AI:LoadAddons("Affinitii, All"); ReloadUI(); end,
-					},
-					--BigWigs = {
-					--	type = 'execute',
-					--	order = 3,
-					--	name = "Big Wigs",
-					--	func = function(info, value) AI:LoadAddons("Affinitii, BigWigs"); ReloadUI(); end,
-					--},
-					--Hermes = {
-					--	type = 'execute',
-					--	order = 4,
-					--	name = "Hermes",
-					--	func = function(info, value) AI:LoadAddons("Affinitii, Hermes"); ReloadUI(); end,
-					--},
-					--xCT = {
-					--	type = 'execute',
-					--	order = 5,
-					--	name = "xCT+",
-					--	func = function(info, value) AI:LoadAddons("Affinitii, xCT+,"); ReloadUI(); end,
-					--},
-				},
-			}
-		end
-	elseif selectedAuthor == 'Repooc' then
-		if not selectedAuthor then
-			E.Options.args.sle.args.importing.args.authors.args.authorGroup = nil
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup = nil
-			return
-		end
-
-		E.Options.args.sle.args.importing.args.authors.args.authorGroup = {
-			type = 'group',
-			name = selectedAuthor,
-			guiInline = true,
-			order = 10,
-			args = {
-				importOptions = {
-					name = L["Import Options"],
-					type = 'select',
-					order = 1,
-					guiInline = true,
-					get = function(info) return selectedOption end,
-					set = function(info, value) selectedOption = value; UpdateAuthor(); end,
-					values = function()
-						local option = {}
-						option[''] = NONE
-						for k in pairs(options) do
-							option[k] = k
-						end
-
-						return option
-					end,
-				},
-			},
-		}
-		if not selectedOption or selectedOption == '' then
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup = nil
-			return
-		end
-
-		if selectedOption == 'Filters' then
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup = {
-				type = "group",
-				name = selectedOption,
-				order = 15,
-				guiInline = true,
-				args = {
-					description = {
-						order = 2,
-						type = "description",
-						name = L["Please be aware that importing any of the filters will require a reload of the UI for the settings to take effect.\nOnce you click a filter button, your screen will reload automatically."],
-					},
-					selectClass = {
-						name = L["Select Filter"],
-						type = 'select',
-						order = 4,
-						guiInline = true,
-						get = function(info) return selectedClass end,
-						set = function(info, value) selectedClass = value; UpdateAuthor(); end,
-						values = function()
-							local class = {}
-							class[''] = NONE
-							class['1Filter'] = "General Filters"
-							for k, v in pairs(classes) do
-								class[k] = v
-							end
-
-							return class
-						end,
-					},
-					spacer = {
-						order = 6,
-						type = 'description',
-						name = '',
-					},
-				},
-			}
-			if not selectedClass or selectedClass == '' then
-				E.Options.args.sle.args.importing.args.authors.args.optionGroup.args.class = nil
-				return
-			end
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup.args.class = {
-				type = 'execute',
-				order = 5,
-				name = L["Import"],
-				func = function(info, value) buffWatch(selectedClass) end,
-			}
-			if selectedClass == '1Filter' then
-				E.Options.args.sle.args.importing.args.authors.args.optionGroup.args.filterInfo = {
-					type = "description",
-					order = 7,
-					name = L["This will import non class specific filters from this author."],
-				}
-			elseif selectedClass == 'AllClasses' then
-				E.Options.args.sle.args.importing.args.authors.args.optionGroup.args.filterInfo = {
-					type = "description",
-					order = 7,
-					name = L["This will import All Class specific filters from this author."],
-				}
-			end
-		elseif selectedOption == 'Addons' then
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup = {
-				type = "group",
-				name = selectedOption,
-				order = 15,
-				guiInline = true,
-				args = {
-					repoocinfo = {
-						type = "description",
-						order = 2,
-						name = selectedAuthor..' '..L["has no data for this selected option."],
-					},
-				--[[
-					BigWigs = {
-						type = 'execute',
-						order = 2,
-						name = "Big Wigs",
-						func = function(info, value) AI:LoadAddons("Affinitii, BigWigs"); end,
-					},
-					Hermes = {
-						type = 'execute',
-						order = 2,
-						name = "Hermes",
-						func = function(info, value) AI:LoadAddons("Affinitii, Hermes"); end,
-					},
-					xCT = {
-						type = 'execute',
-						order = 2,
-						name = "xCT+",
-						func = function(info, value) AI:LoadAddons("Affinitii, xCT+"); end,
-					},]]
-				},
-			}
-		end
-	elseif selectedAuthor == 'Darth' then
-		if not selectedAuthor then
-			E.Options.args.sle.args.importing.args.authors.args.authorGroup = nil
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup = nil
-			return
-		end
-
-		E.Options.args.sle.args.importing.args.authors.args.authorGroup = {
-			type = 'group',
-			name = selectedAuthor,
-			guiInline = true,
-			order = 10,
-			args = {
-				importOptions = {
-					name = L["Import Options"],
-					type = 'select',
-					order = 1,
-					guiInline = true,
-					get = function(info) return selectedOption end,
-					set = function(info, value) selectedOption = value; UpdateAuthor(); end,
-					values = function()
-						local option = {}
-						option[''] = NONE
-						for k in pairs(options) do
-							option[k] = k
-						end
-
-						return option
-					end,
-				},
-			},
-		}
-		if not selectedOption or selectedOption == '' then
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup = nil
-			return
-		end
-
-		if selectedOption == 'Filters' then
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup = {
-				type = "group",
-				name = selectedOption,
-				order = 15,
-				guiInline = true,
-				args = {
-					description = {
-						order = 2,
-						type = "description",
-						name = L["Please be aware that importing any of the filters will require a reload of the UI for the settings to take effect.\nOnce you click a filter button, your screen will reload automatically."],
-					},
-					selectClass = {
-						name = L["Select Filter"],
-						type = 'select',
-						order = 4,
-						guiInline = true,
-						get = function(info) return selectedClass end,
-						set = function(info, value) selectedClass = value; UpdateAuthor(); end,
-						values = function()
-							local class = {}
-							class[''] = NONE
-							class['1Filter'] = "General Filters"
-							for k, v in pairs(classes) do
-								class[k] = v
-							end
-
-							return class
-						end,
-					},
-					spacer = {
-						order = 6,
-						type = 'description',
-						name = '',
-					},
-				},
-			}
-			if not selectedClass or selectedClass == '' then
-				E.Options.args.sle.args.importing.args.authors.args.optionGroup.args.class = nil
-				return
-			end
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup.args.class = {
-				type = 'execute',
-				order = 5,
-				name = L["Import"],
-				func = function(info, value) buffWatch(selectedClass) end,
-			}
-			if selectedClass == '1Filter' then
-				E.Options.args.sle.args.importing.args.authors.args.optionGroup.args.filterInfo = {
-					type = "description",
-					order = 7,
-					name = L["This will import non class specific filters from this author."],
-				}
-			elseif selectedClass == 'AllClasses' then
-				E.Options.args.sle.args.importing.args.authors.args.optionGroup.args.filterInfo = {
-					type = "description",
-					order = 7,
-					name = L["This will import All Class specific filters from this author."],
-				}
-			end
-		elseif selectedOption == 'Addons' then
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup = {
-				type = "group",
-				name = selectedOption,
-				order = 15,
-				guiInline = true,
-				args = {
-					xCT = {
-						type = 'execute',
-						order = 2,
-						name = "xCT+",
-						func = function(info, value) AI:LoadAddons("Darth, All"); end,
-					},
-				},
-			}
-		end
-	else
-		if not selectedAuthor or selectedAuthor == "" then
-			E.Options.args.sle.args.importing.args.authors.args.authorGroup = nil
-			E.Options.args.sle.args.importing.args.authors.args.optionGroup = nil
-			return
-		end
-	end
-end
-
-local function configTable()
-	E.Options.args.sle.args.importing = {
-		type = 'group',
-		name = L['Import Options'],
-		order = 300,
-		args = {
-			header = {
-				order = 1,
-				type = "header",
-				name = L['Import Options'],
-			},
-			--[[export = {
-				order = 2,
-				type = 'group',
-				name = L["Export / Import"],
-				guiInline = true,
-				args = {
-					description = {
-						order = 1,
-						type = "description",
-						name = L["SLE_EXPORTS"],
-					},
-					profile = {
-						order = 2,
-						type = "toggle",
-						name = L["Profile"],
-						get = function(info) return E.global.sle.export.profile end,
-						set = function(info, value)	E.global.sle.export.profile = value end,
-					},
-					private = {
-						order = 3,
-						type = "toggle",
-						name = L["Private"],
-						get = function(info) return E.global.sle.export.private end,
-						set = function(info, value)	E.global.sle.export.private = value end,
-					},
-					global = {
-						order = 4,
-						type = "toggle",
-						name = L["Global"],
-						get = function(info) return E.global.sle.export.global end,
-						set = function(info, value)	E.global.sle.export.global = value end,
-					},
-					full = {
-						order = 5,
-						type = "toggle",
-						name = L["Full tables"],
-						get = function(info) return E.global.sle.export.full end,
-						set = function(info, value)	E.global.sle.export.full = value end,
-					},
-					space = {
-						order = 6,
-						type = 'description',
-						name = "",
-					},
-					export = {
-						type = 'execute',
-						order = 7,
-						name = L["Export"],
-						func = function(info, value) SLE:OpenExport() end,
-					},
-				},
-			},]]
-			authors = {
-				order = 3,
-				type = 'group',
-				name = L["Author Specific Imports"],
-				guiInline = true,
-				args = {
-					description = {
-						order = 2,
-						type = "description",
-						name = L["SLE_IMPORTS"],
-					},
-					selectAuthor = {
-						order = 3,
-						type = 'select',
-						name = L['Select Author'],
-						get = function(info) if selectedAuthor == nil then return 'None' else return selectedAuthor end end,
-						set = function(info, value) if value == '' then selectedAuthor = nil; selectedClass = nil; selectedOption = nil; else selectedAuthor = value; selectedOption = nil; selectedClass = nil; end; UpdateAuthor() end,
-						values = function()
-							local authors = {}
-							authors[''] = NONE
-
-							authors['Affinitii'] = 'Affinitii'
-							authors['Repooc'] = 'Repooc'
-							authors['Darth'] = 'Darth'
-							return authors
-						end,
-					},
-				},
-			},
-		},
-	}
-end
-
-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/legacy_c.lua b/ElvUI_SLE/options/legacy_c.lua
new file mode 100644
index 0000000..bcf84a8
--- /dev/null
+++ b/ElvUI_SLE/options/legacy_c.lua
@@ -0,0 +1,17 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local LFG_LIST_LEGACY = LFG_LIST_LEGACY
+local function configTable()
+	if not SLE.initialized then return end
+
+	E.Options.args.sle.args.modules.args.legacy = {
+		type = "group",
+		name = SLE.Russian and ITEM_QUALITY7_DESC or LFG_LIST_LEGACY,
+		desc = L["Modules designed for older expantions"],
+		order = 11,
+		childGroups = 'tab',
+		args = {
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/load_options.xml b/ElvUI_SLE/options/load_options.xml
index 23e291a..8a2d31d 100644
--- a/ElvUI_SLE/options/load_options.xml
+++ b/ElvUI_SLE/options/load_options.xml
@@ -1,30 +1,39 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<!--Core-->
 	<Script file='core_c.lua'/>
+	<Script file='skins_c.lua'/>
+	<Script file='misc_c.lua'/>
+	<Script file='legacy_c.lua'/>
+	<Script file='afk_c.lua'/>
+	<Script file='unitframes_c.lua'/>
+	<Script file='professions_c.lua'/>
+	<Include file='chat\load_chat.xml'/>
+	<Include file='minimap\load_minimap.xml'/>
+	<Include file='datatexts\load_datatexts.xml'/>
+
+	<Script file='actionbars_c.lua'/>
+	<Script file='blizzard_c.lua'/>
 	<Script file='help_c.lua'/>
 	<Script file='media_c.lua'/>
 	<Script file='auras_c.lua'/>
 	<Script file='bags_c.lua'/>
-	<Script file='autorelease_c.lua'/>
-	<Script file='datatexts_c.lua'/>
+	<Script file='pvp_c.lua'/>
 	<Script file='backgrounds_c.lua'/>
-	<Script file='chat_c.lua'/>
 	<Script file='bags_c.lua'/>
 	<Script file='equipmanager_c.lua'/>
-	<Script file='exprepbar_c.lua'/>
 	<Script file='farm_c.lua'/>
 	<Script file='garrison_c.lua'/>
 	<Script file='imports_c.lua'/>
 	<Script file='loot_c.lua'/>
-	<Script file='minimap_c.lua'/>
 	<Script file='nameplates_c.lua'/>
 	<Script file='raidmarkers_c.lua'/>
 	<Script file='raidutility_c.lua'/>
 	<Script file='threat_c.lua'/>
 	<Script file='tooltip_c.lua'/>
 	<Script file='uibuttons_c.lua'/>
-	<Script file='unitframes_c.lua'/>
 	<Script file='vehicle_c.lua'/>
-	<Script file='errorframe_c.lua'/>
+	<Script file='databars_c.lua'/>
 	<Script file='quests_c.lua'/>
 	<Script file='raidroleicons_c.lua'/>
+	<Script file='viewport_c.lua'/>
 </Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/options/loot_c.lua b/ElvUI_SLE/options/loot_c.lua
index bccd695..f2bad53 100644
--- a/ElvUI_SLE/options/loot_c.lua
+++ b/ElvUI_SLE/options/loot_c.lua
@@ -1,18 +1,34 @@
-local E, L, V, P, G = unpack(ElvUI);
-local LT = E:GetModule('SLE_Loot')
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local LT = SLE:GetModule('Loot')
+local _G = _G
+local ITEM_QUALITY2_DESC, ITEM_QUALITY3_DESC, ITEM_QUALITY4_DESC = ITEM_QUALITY2_DESC, ITEM_QUALITY3_DESC, ITEM_QUALITY4_DESC
+local SAY, PARTY, RAID = SAY, PARTY, RAID

 local function configTable()
-	E.Options.args.sle.args.options.args.loot = {
-		order = 9,
+	if not SLE.initialized then return end
+	local function CreateChannel(Name, Order)
+		local config = {
+			order = Order,
+			type = "toggle",
+			name = _G[Name] or _G[T.gsub(Name, "CHAT_MSG_", "")],
+			disabled = function() return not E.db.sle.loot.looticons.enable end,
+			get = function(info) return E.db.sle.loot.looticons.channels[Name] end,
+			set = function(info, value) E.db.sle.loot.looticons.channels[Name] = value end,
+		}
+		return config
+	end
+
+	E.Options.args.sle.args.modules.args.loot = {
+		order = 12,
 		type = "group",
-		name = L['Loot'],
+		name = L["Loot"],
 		args = {
 			enable = {
 				order = 1,
 				type = "toggle",
-				name = ENABLE,
+				name = L["Enable"],
 				get = function(info) return E.db.sle.loot.enable end,
-				set = function(info, value) E.db.sle.loot.enable = value; E:StaticPopup_Show("CONFIG_RL") end
+				set = function(info, value) E.db.sle.loot.enable = value; LT:Toggle() end
 			},
 			space1 = {
 				order = 2,
@@ -42,7 +58,7 @@ local function configTable()
 					enable = {
 						order = 4,
 						type = "toggle",
-						name = ENABLE,
+						name = L["Enable"],
 						disabled = function() return not E.db.sle.loot.enable end,
 						get = function(info) return E.db.sle.loot.autoroll.enable end,
 						set = function(info, value) E.db.sle.loot.autoroll.enable = value; LT:Update() end,
@@ -112,7 +128,7 @@ local function configTable()
 						type = "range",
 						name = L["Level to start auto-rolling from"],
 						disabled = function() return not E.db.sle.loot.enable or not E.db.sle.loot.autoroll.enable end,
-						min = 1, max = GetMaxPlayerLevel(), step = 1,
+						min = 1, max = T.GetMaxPlayerLevel(), step = 1,
 						get = function(info) return E.db.sle.loot.autoroll.level end,
 						set = function(info, value) E.db.sle.loot.autoroll.level = value; end,
 					},
@@ -126,7 +142,7 @@ local function configTable()
 					header = {
 						order = 1,
 						type = "header",
-						name = L['Loot Announcer'],
+						name = L["Loot Announcer"],
 					},
 					info = {
 						order = 2,
@@ -141,10 +157,10 @@ local function configTable()
 					enable = {
 						order = 4,
 						type = "toggle",
-						name = ENABLE,
+						name = L["Enable"],
 						disabled = function() return not E.db.sle.loot.enable end,
 						get = function(info) return E.db.sle.loot.announcer.enable end,
-						set = function(info, value) E.db.sle.loot.announcer.enable = value; E:StaticPopup_Show("CONFIG_RL") end,
+						set = function(info, value) E.db.sle.loot.announcer.enable = value; end,
 					},
 					space2 = {
 						order = 5,
@@ -169,11 +185,11 @@ local function configTable()
 						get = function(info) return E.db.sle.loot.announcer.override end,
 						set = function(info, value) E.db.sle.loot.announcer.override = value; end,
 						values = {
-							['1'] = "No Override",
-							['2'] = "Automatic Override",
-							['3'] = "SHIFT",
-							['4'] = "ALT",
-							['5'] = "CTRL",
+							["1"] = L["No Override"],
+							["2"] = L["Automatic Override"],
+							["3"] = "SHIFT",
+							["4"] = "ALT",
+							["5"] = "CTRL",
 						},
 					},
 					space3 = {
@@ -190,9 +206,9 @@ local function configTable()
 						get = function(info) return E.db.sle.loot.announcer.quality end,
 						set = function(info, value) E.db.sle.loot.announcer.quality = value; end,
 						values = {
-							['EPIC'] = "|cffA335EE"..ITEM_QUALITY4_DESC.."|r",
-							['RARE'] = "|cff0070DD"..ITEM_QUALITY3_DESC.."|r",
-							['UNCOMMON'] = "|cff1EFF00"..ITEM_QUALITY2_DESC.."|r",
+							["EPIC"] = "|cffA335EE"..ITEM_QUALITY4_DESC.."|r",
+							["RARE"] = "|cff0070DD"..ITEM_QUALITY3_DESC.."|r",
+							["UNCOMMON"] = "|cff1EFF00"..ITEM_QUALITY2_DESC.."|r",
 						},
 					},
 					channel = {
@@ -204,9 +220,9 @@ local function configTable()
 						get = function(info) return E.db.sle.loot.announcer.channel end,
 						set = function(info, value) E.db.sle.loot.announcer.channel = value; end,
 						values = {
-							['RAID'] = "|cffFF7F00"..RAID.."|r",
-							['PARTY'] = "|cffAAAAFF"..PARTY.."|r",
-							['SAY'] = "|cffFFFFFF"..SAY.."|r",
+							["RAID"] = "|cffFF7F00"..RAID.."|r",
+							["PARTY"] = "|cffAAAAFF"..PARTY.."|r",
+							["SAY"] = "|cffFFFFFF"..SAY.."|r",
 						},
 					},
 				},
@@ -238,12 +254,129 @@ local function configTable()
 					alpha = {
 						order = 4,
 						type = "range",
-						name = L['Alpha'],
+						name = L["Alpha"],
 						desc = L["Sets the alpha of Loot Roll Histroy frame."],
 						min = 0.2, max = 1, step = 0.1,
 						disabled = function() return not E.db.sle.loot.enable end,
 						get = function(info) return E.db.sle.loot.history.alpha end,
-						set = function(info, value) E.db.sle.loot.history.alpha = value; LT:Update() end,
+						set = function(info, value) E.db.sle.loot.history.alpha = value; LT:LootAlpha() end,
+					},
+				},
+			},
+			looticon = {
+				type = "group",
+				name = L["Loot Icons"],
+				order = 11,
+				-- guiInline = true,
+				args = {
+					enable = {
+						order = 1,
+						type = "toggle",
+						name = L["Enable"],
+						desc = L["Showes icons of items looted/created near respective messages in chat. Does not affect usual messages."],
+						get = function(info) return E.db.sle.loot.looticons.enable end,
+						set = function(info, value) E.db.sle.loot.looticons.enable = value; LT:LootIconToggle() end,
+					},
+					position = {
+						order = 2,
+						type = "select",
+						name = L["Position"],
+						disabled = function() return not E.db.sle.loot.looticons.enable end,
+						get = function(info) return E.db.sle.loot.looticons.position end,
+						set = function(info, value) E.db.sle.loot.looticons.position = value end,
+						values = {
+							LEFT = L["Left"],
+							RIGHT = L["Right"],
+						},
+					},
+					size = {
+						order = 3,
+						type = "range",
+						name = L["Size"],
+						disabled = function() return not E.db.sle.loot.looticons.enable end,
+						min = 8, max = 32, step = 1,
+						get = function(info) return E.db.sle.loot.looticons.size end,
+						set = function(info, value)	E.db.sle.loot.looticons.size = value; end,
+					},
+					channels = {
+						type = "group",
+						name = L["Channels"],
+						order = 4,
+						guiInline = true,
+						args = {
+							CHANNEL = CreateChannel("CHAT_MSG_CHANNEL", 4),
+							EMOTE = CreateChannel("CHAT_MSG_EMOTE", 5),
+							GUILD = CreateChannel("CHAT_MSG_GUILD", 6),
+							INSTANCE_CHAT = CreateChannel("CHAT_MSG_INSTANCE_CHAT", 7),
+							INSTANCE_CHAT_LEADER = CreateChannel("CHAT_MSG_INSTANCE_CHAT_LEADER", 8),
+							LOOT = CreateChannel("CHAT_MSG_LOOT", 9),
+							OFFICER = CreateChannel("CHAT_MSG_OFFICER", 10),
+							PARTY = CreateChannel("CHAT_MSG_PARTY", 11),
+							PARTY_LEADER = CreateChannel("CHAT_MSG_PARTY_LEADER", 12),
+							RAID = CreateChannel("CHAT_MSG_RAID", 13),
+							RAID_LEADER = CreateChannel("CHAT_MSG_RAID_LEADER", 14),
+							RAID_WARNING = CreateChannel("CHAT_MSG_RAID_WARNING", 15),
+							SAY = CreateChannel("CHAT_MSG_SAY", 16),
+							SYSTEM = CreateChannel("CHAT_MSG_SYSTEM", 17),
+							YELL = CreateChannel("CHAT_MSG_YELL", 20),
+						},
+					},
+					privateChannels = {
+						type = "group",
+						name = L["Private channels"],
+						order = 5,
+						guiInline = true,
+						args = {
+							CHAT_MSG_BN_CONVERSATION = CreateChannel("CHAT_MSG_BN_CONVERSATION", 1),
+							BN_WHISPER = {
+								type = "group",
+								name = CHAT_MSG_BN_WHISPER,
+								order = 2,
+								guiInline = true,
+								args = {
+									inc = {
+										order = 1,
+										type = "toggle",
+										name = L["Incoming"],
+										disabled = function() return not E.db.sle.loot.looticons.enable end,
+										get = function(info) return E.db.sle.loot.looticons.channels.CHAT_MSG_BN_WHISPER end,
+										set = function(info, value) E.db.sle.loot.looticons.channels.CHAT_MSG_BN_WHISPER = value end,
+									},
+									out = {
+										order = 2,
+										type = "toggle",
+										name = L["Outgoing"],
+										disabled = function() return not E.db.sle.loot.looticons.enable end,
+										get = function(info) return E.db.sle.loot.looticons.channels.CHAT_MSG_BN_WHISPER_INFORM end,
+										set = function(info, value) E.db.sle.loot.looticons.channels.CHAT_MSG_BN_WHISPER_INFORM = value end,
+									},
+								},
+							},
+							WHISPER = {
+								type = "group",
+								name = CHAT_MSG_WHISPER_INFORM,
+								order = 3,
+								guiInline = true,
+								args = {
+									inc = {
+										order = 1,
+										type = "toggle",
+										name = L["Incoming"],
+										disabled = function() return not E.db.sle.loot.looticons.enable end,
+										get = function(info) return E.db.sle.loot.looticons.channels.CHAT_MSG_WHISPER end,
+										set = function(info, value) E.db.sle.loot.looticons.channels.CHAT_MSG_WHISPER = value end,
+									},
+									out = {
+										order = 2,
+										type = "toggle",
+										name = L["Outgoing"],
+										disabled = function() return not E.db.sle.loot.looticons.enable end,
+										get = function(info) return E.db.sle.loot.looticons.channels.CHAT_MSG_WHISPER_INFORM end,
+										set = function(info, value) E.db.sle.loot.looticons.channels.CHAT_MSG_WHISPER_INFORM = value end,
+									},
+								},
+							},
+						},
 					},
 				},
 			},
@@ -251,4 +384,4 @@ local function configTable()
 	}
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/media_c.lua b/ElvUI_SLE/options/media_c.lua
index 0efe4c4..afd5665 100644
--- a/ElvUI_SLE/options/media_c.lua
+++ b/ElvUI_SLE/options/media_c.lua
@@ -1,12 +1,12 @@
-local E, L, V, P, G = unpack(ElvUI);
-local M = E:GetModule('SLE_Media')
-local S = E:GetModule("SLE_ScreenSaver")
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local M = SLE:GetModule('Media')

 local function configTable()
+	if not SLE.initialized then return end
 	E.Options.args.sle.args.media = {
 		type = "group",
-	    name = L["Media"],
-	    order = 3,
+		name = L["Media"],
+		order = 20,
 		childGroups = 'tab',
 		args = {
 			header = {
@@ -63,11 +63,11 @@ local function configTable()
 								desc = L["Set the font outline."],
 								type = "select",
 								values = {
-									['NONE'] = L['None'],
-									['OUTLINE'] = 'OUTLINE',
+									["NONE"] = L["None"],
+									["OUTLINE"] = 'OUTLINE',

-									['MONOCHROMEOUTLINE'] = 'MONOCROMEOUTLINE',
-									['THICKOUTLINE'] = 'THICKOUTLINE',
+									["MONOCHROMEOUTLINE"] = 'MONOCROMEOUTLINE',
+									["THICKOUTLINE"] = 'THICKOUTLINE',
 								},
 							},
 							width = {
@@ -106,11 +106,11 @@ local function configTable()
 								desc = L["Set the font outline."],
 								type = "select",
 								values = {
-									['NONE'] = L['None'],
-									['OUTLINE'] = 'OUTLINE',
+									["NONE"] = L["None"],
+									["OUTLINE"] = 'OUTLINE',

-									['MONOCHROMEOUTLINE'] = 'MONOCROMEOUTLINE',
-									['THICKOUTLINE'] = 'THICKOUTLINE',
+									["MONOCHROMEOUTLINE"] = 'MONOCROMEOUTLINE',
+									["THICKOUTLINE"] = 'THICKOUTLINE',
 								},
 							},
 							width = {
@@ -155,11 +155,11 @@ local function configTable()
 								desc = L["Set the font outline."],
 								type = "select",
 								values = {
-									['NONE'] = L['None'],
-									['OUTLINE'] = 'OUTLINE',
+									["NONE"] = L["None"],
+									["OUTLINE"] = 'OUTLINE',

-									['MONOCHROMEOUTLINE'] = 'MONOCROMEOUTLINE',
-									['THICKOUTLINE'] = 'THICKOUTLINE',
+									["MONOCHROMEOUTLINE"] = 'MONOCROMEOUTLINE',
+									["THICKOUTLINE"] = 'THICKOUTLINE',
 								},
 							},
 							width = {
@@ -206,11 +206,11 @@ local function configTable()
 								desc = L["Set the font outline."],
 								type = "select",
 								values = {
-									['NONE'] = L['None'],
-									['OUTLINE'] = 'OUTLINE',
+									["NONE"] = L["None"],
+									["OUTLINE"] = 'OUTLINE',

-									['MONOCHROMEOUTLINE'] = 'MONOCROMEOUTLINE',
-									['THICKOUTLINE'] = 'THICKOUTLINE',
+									["MONOCHROMEOUTLINE"] = 'MONOCROMEOUTLINE',
+									["THICKOUTLINE"] = 'THICKOUTLINE',
 								},
 							},
 						},
@@ -243,11 +243,11 @@ local function configTable()
 								desc = L["Set the font outline."],
 								type = "select",
 								values = {
-									['NONE'] = L['None'],
-									['OUTLINE'] = 'OUTLINE',
+									["NONE"] = L["None"],
+									["OUTLINE"] = 'OUTLINE',

-									['MONOCHROMEOUTLINE'] = 'MONOCROMEOUTLINE',
-									['THICKOUTLINE'] = 'THICKOUTLINE',
+									["MONOCHROMEOUTLINE"] = 'MONOCROMEOUTLINE',
+									["THICKOUTLINE"] = 'THICKOUTLINE',
 								},
 							},
 						},
@@ -280,164 +280,36 @@ local function configTable()
 								desc = L["Set the font outline."],
 								type = "select",
 								values = {
-									['NONE'] = L['None'],
-									['OUTLINE'] = 'OUTLINE',
+									["NONE"] = L["None"],
+									["OUTLINE"] = 'OUTLINE',

-									['MONOCHROMEOUTLINE'] = 'MONOCROMEOUTLINE',
-									['THICKOUTLINE'] = 'THICKOUTLINE',
+									["MONOCHROMEOUTLINE"] = 'MONOCROMEOUTLINE',
+									["THICKOUTLINE"] = 'THICKOUTLINE',
 								},
 							},
 						},
 					},
-				},
-			},
-		},
-	}
-
-	E.Options.args.sle.args.screensaver = {
-		type = "group",
-		name = L["Screensaver"],
-		order = 4,
-		childGroups = 'tab',
-		args = {
-			enable = {
-				order = 1,
-				type = "toggle",
-				name = ENABLE,
-				get = function(info) return E.db.sle.media.screensaver.enable end,
-				set = function(info, value) E.db.sle.media.screensaver.enable = value; S:Reg(true); S:UpdateConfig() end,
-			},
-			fonts = {
-				type = "group",
-				name = L["Fonts"],
-				order = 1,
-				disabled = function() return not E.db.sle.media.screensaver.enable end,
-				args = {
-					title = {
-						type = "group",
-						name = L["Title font"],
-						order = 1,
-						guiInline = true,
-						get = function(info) return E.db.sle.media.screensaver.title[ info[#info] ] end,
-						set = function(info, value) E.db.sle.media.screensaver.title[ info[#info] ] = value S:Media() end,
-						args = {
-							font = {
-								type = "select", dialogControl = 'LSM30_Font',
-								order = 1,
-								name = L["Font"],
-								desc = "The font used for ScreenSaver's Title",
-								values = AceGUIWidgetLSMlists.font,
-							},
-							size = {
-								order = 2,
-								name = L["Font Size"],
-								type = "range",
-								min = 12, max = 32, step = 1,
-							},
-							outline = {
-								order = 3,
-								name = L["Font Outline"],
-								desc = L["Set the font outline."],
-								type = "select",
-								values = {
-									['NONE'] = L['None'],
-									['OUTLINE'] = 'OUTLINE',
-									['MONOCHROMEOUTLINE'] = 'MONOCROMEOUTLINE',
-									['THICKOUTLINE'] = 'THICKOUTLINE',
-								},
-							},
-						},
-					},
-					subtitle = {
-						type = "group",
-						name = L["Subitle font"],
-						order = 2,
-						guiInline = true,
-						get = function(info) return E.db.sle.media.screensaver.subtitle[ info[#info] ] end,
-						set = function(info, value) E.db.sle.media.screensaver.subtitle[ info[#info] ] = value S:Media() end,
-						args = {
-							font = {
-								type = "select", dialogControl = 'LSM30_Font',
-								order = 1,
-								name = L["Font"],
-								desc = "The font used for ScreenSaver's Subtitle",
-								values = AceGUIWidgetLSMlists.font,
-							},
-							size = {
-								order = 2,
-								name = L["Font Size"],
-								type = "range",
-								min = 12, max = 26, step = 1,
-							},
-							outline = {
-								order = 3,
-								name = L["Font Outline"],
-								desc = L["Set the font outline."],
-								type = "select",
-								values = {
-									['NONE'] = L['None'],
-									['OUTLINE'] = 'OUTLINE',
-									['MONOCHROMEOUTLINE'] = 'MONOCROMEOUTLINE',
-									['THICKOUTLINE'] = 'THICKOUTLINE',
-								},
-							},
-						},
-					},
-					date = {
+					questHeader = {
 						type = "group",
-						name = L["Date font"],
+						name = L["Objective Tracker Header Text"],
 						order = 3,
 						guiInline = true,
-						get = function(info) return E.db.sle.media.screensaver.date[ info[#info] ] end,
-						set = function(info, value) E.db.sle.media.screensaver.date[ info[#info] ] = value S:Media() end,
-						args = {
-							font = {
-								type = "select", dialogControl = 'LSM30_Font',
-								order = 1,
-								name = L["Font"],
-								desc = "The font used for Screensaver's Date and Time",
-								values = AceGUIWidgetLSMlists.font,
-							},
-							size = {
-								order = 2,
-								name = L["Font Size"],
-								type = "range",
-								min = 12, max = 26, step = 1,
-							},
-							outline = {
-								order = 3,
-								name = L["Font Outline"],
-								desc = L["Set the font outline."],
-								type = "select",
-								values = {
-									['NONE'] = L['None'],
-									['OUTLINE'] = 'OUTLINE',
-									['MONOCHROMEOUTLINE'] = 'MONOCROMEOUTLINE',
-									['THICKOUTLINE'] = 'THICKOUTLINE',
-								},
-							},
-						},
-					},
-					player = {
-						type = "group",
-						name = L["Player info font"],
-						order = 4,
-						guiInline = true,
-						get = function(info) return E.db.sle.media.screensaver.player[ info[#info] ] end,
-						set = function(info, value) E.db.sle.media.screensaver.player[ info[#info] ] = value S:Media() end,
+						disabled = function() return not E.private.general.replaceBlizzFonts end,
+						get = function(info) return E.db.sle.media.fonts.objectiveHeader[ info[#info] ] end,
+						set = function(info, value) E.db.sle.media.fonts.objectiveHeader[ info[#info] ] = value; E:UpdateMedia() end,
 						args = {
 							font = {
 								type = "select", dialogControl = 'LSM30_Font',
 								order = 1,
 								name = L["Font"],
-								desc = "The font used for Screensaver's Player info",
+								desc = "The font used for chat editbox",
 								values = AceGUIWidgetLSMlists.font,
 							},
 							size = {
 								order = 2,
 								name = L["Font Size"],
 								type = "range",
-								min = 12, max = 26, step = 1,
+								min = 6, max = 20, step = 1,
 							},
 							outline = {
 								order = 3,
@@ -445,34 +317,36 @@ local function configTable()
 								desc = L["Set the font outline."],
 								type = "select",
 								values = {
-									['NONE'] = L['None'],
-									['OUTLINE'] = 'OUTLINE',
-									['MONOCHROMEOUTLINE'] = 'MONOCROMEOUTLINE',
-									['THICKOUTLINE'] = 'THICKOUTLINE',
+									["NONE"] = L["None"],
+									["OUTLINE"] = 'OUTLINE',
+
+									["MONOCHROMEOUTLINE"] = 'MONOCROMEOUTLINE',
+									["THICKOUTLINE"] = 'THICKOUTLINE',
 								},
 							},
 						},
 					},
-					tips = {
+					questTracker = {
 						type = "group",
-						name = L["Tips font"],
+						name = L["Objective Tracker Text"],
 						order = 4,
 						guiInline = true,
-						get = function(info) return E.db.sle.media.screensaver.tips[ info[#info] ] end,
-						set = function(info, value) E.db.sle.media.screensaver.tips[ info[#info] ] = value S:Media() end,
+						disabled = function() return not E.private.general.replaceBlizzFonts end,
+						get = function(info) return E.db.sle.media.fonts.objective[ info[#info] ] end,
+						set = function(info, value) E.db.sle.media.fonts.objective[ info[#info] ] = value; E:UpdateMedia() end,
 						args = {
 							font = {
 								type = "select", dialogControl = 'LSM30_Font',
 								order = 1,
 								name = L["Font"],
-								desc = "The font used for Screensaver's Tips",
+								desc = "The font used for chat editbox",
 								values = AceGUIWidgetLSMlists.font,
 							},
 							size = {
 								order = 2,
 								name = L["Font Size"],
 								type = "range",
-								min = 12, max = 32, step = 1,
+								min = 6, max = 20, step = 1,
 							},
 							outline = {
 								order = 3,
@@ -480,139 +354,19 @@ local function configTable()
 								desc = L["Set the font outline."],
 								type = "select",
 								values = {
-									['NONE'] = L['None'],
-									['OUTLINE'] = 'OUTLINE',
-									['MONOCHROMEOUTLINE'] = 'MONOCROMEOUTLINE',
-									['THICKOUTLINE'] = 'THICKOUTLINE',
+									["NONE"] = L["None"],
+									["OUTLINE"] = 'OUTLINE',
+
+									["MONOCHROMEOUTLINE"] = 'MONOCROMEOUTLINE',
+									["THICKOUTLINE"] = 'THICKOUTLINE',
 								},
 							},
 						},
 					},
 				},
 			},
-			model = {
-				type = "group",
-				name = L["Graphics"],
-				order = 2,
-				disabled = function() return not E.db.sle.media.screensaver.enable end,
-				-- get = function(info) return E.db.sle.media.screensaver[ info[#info] ] end,
-				-- set = function(info, value) E.db.sle.media.screensaver[ info[#info] ] = value S:Media() end,
-				args = {
-					crest = {
-						order = 1,
-						name = L["Crest Size"],
-						type = "range",
-						min = 84, max = 256, step = 1,
-						get = function(info) return E.db.sle.media.screensaver.crest end,
-						set = function(info, value) E.db.sle.media.screensaver.crest = value; S:Media() end,
-					},
-					xpack = {
-						order = 1,
-						name = L["X-Pack Logo Size"],
-						type = "range",
-						min = 100, max = 256, step = 1,
-						get = function(info) return E.db.sle.media.screensaver.xpack end,
-						set = function(info, value) E.db.sle.media.screensaver.xpack = value; S:Media() end,
-					},
-					modelanim = {
-						order = 2,
-						name = L["Model Animation"],
-						type = "select",
-						get = function(info) return E.db.sle.media.screensaver.playermodel.anim end,
-						set = function(info, value) E.db.sle.media.screensaver.playermodel.anim = value end,
-						values = {
-							[47] = "Standing",
-							[4] = "Walking",
-							[5] = "Running",
-							[13] = "Walking backwards",
-							[25] = 'Unarmed Ready',
-							[60] = "Talking",
-							[64] = 'Exclmation',
-							[66] = 'Bow',
-							[67] = 'Wave',
-							[68] = 'Ceers',
-							[69] = 'Dance',
-							[70] = 'Laugh',
-							[76] = 'Kiss',
-							[77] = 'Cry',
-							[80] = 'Applaud',
-							[82] = 'Flex',
-							[83] = 'Shy',
-							[113] = 'Salute',
-						},
-					},
-					modelpos = {
-						order = 3,
-						name = L["Model Position"],
-						type = "select",
-						get = function(info) return E.db.sle.media.screensaver.playermodel.position end,
-						set = function(info, value) E.db.sle.media.screensaver.playermodel.position = value end,
-						values = {
-							["RIGHT"] = L['Right'],
-							["LEFT"] = L['Left'],
-							["CENTER"] = L['Center']
-						},
-					},
-					height = {
-						order = 4,
-						name = L["Panel Height"],
-						type = "range",
-						min = 120, max = 200, step = 1,
-						get = function(info) return E.db.sle.media.screensaver.height end,
-						set = function(info, value) E.db.sle.media.screensaver.height = value end,
-					},
-					width = {
-						order = 5,
-						name = L["Width"],
-						type = "range",
-						min = 200, max = (E.eyefinity or E.screenwidth)/2, step = 0.01,
-						get = function(info) return E.db.sle.media.screensaver.playermodel.width end,
-						set = function(info, value) E.db.sle.media.screensaver.playermodel.width = value end,
-					},
-					yaxis = {
-						order = 6,
-						name = L["Y-Offset"],
-						type = "range",
-						min = -1.5, max = 1.5, step = 0.01,
-						get = function(info) return E.db.sle.media.screensaver.playermodel.yaxis end,
-						set = function(info, value) E.db.sle.media.screensaver.playermodel.yaxis = value end,
-					},
-					xaxis = {
-						order = 7,
-						name = L["X-Offset"],
-						type = "range",
-						min = -1.5, max = 1.5, step = 0.01,
-						get = function(info) return E.db.sle.media.screensaver.playermodel.xaxis end,
-						set = function(info, value) E.db.sle.media.screensaver.playermodel.xaxis = value end,
-					},
-					distance = {
-						order = 8,
-						name = L["Camera Distance Scale"],
-						type = "range",
-						min = -1.5, max = 4, step = 0.01,
-						get = function(info) return E.db.sle.media.screensaver.playermodel.distance end,
-						set = function(info, value) E.db.sle.media.screensaver.playermodel.distance = value end,
-					},
-					rotation = {
-						type = 'range',
-						name = L['Model Rotation'],
-						order = 4,
-						min = 0, max = 360, step = 1,
-						get = function(info) return E.db.sle.media.screensaver.playermodel.rotation end,
-						set = function(info, value) E.db.sle.media.screensaver.playermodel.rotation = value end,
-					},
-					testmodel = {
-						order = 10,
-						type = 'execute',
-						name = L["Test"],
-						desc = "Shows a test model with selected animation for 10 seconds. Ckicking again will reset timer.",
-						-- disabled = function() return not E.db.chat.chatHistory end,
-						func = function() S:TestShow() end,
-					},
-				},
-			},
 		},
 	}
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/minimap/coords_c.lua b/ElvUI_SLE/options/minimap/coords_c.lua
new file mode 100644
index 0000000..4736083
--- /dev/null
+++ b/ElvUI_SLE/options/minimap/coords_c.lua
@@ -0,0 +1,105 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local MM = SLE:GetModule("Minimap")
+local function configTable()
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.minimap.args.coords = {
+		type = "group",
+		name = L["Minimap Coordinates"],
+		order = 5,
+		get = function(info) return E.db.sle.minimap.coords[ info[#info] ] end,
+		set = function(info, value) E.db.sle.minimap.coords[ info[#info] ] = value; MM:UpdateSettings() end,
+		args = {
+			enable = {
+				type = "toggle",
+				name = L["Enable"],
+				order = 1,
+				desc = L["Enable/Disable Square Minimap Coords."],
+				disabled = function() return not E.private.general.minimap.enable end,
+			},
+			display = {
+				order = 2,
+				type = 'select',
+				name = L["Coords Display"],
+				desc = L["Change settings for the display of the coordinates that are on the minimap."],
+				disabled = function() return not E.private.general.minimap.enable or not E.db.sle.minimap.coords.enable end,
+				values = {
+					["MOUSEOVER"] = L["Minimap Mouseover"],
+					["SHOW"] = L["Always Display"],
+				},
+			},
+			position = {
+				order = 3,
+				type = "select",
+				name = L["Coords Location"],
+				desc = L["This will determine where the coords are shown on the minimap."],
+				disabled = function() return not E.private.general.minimap.enable or not E.db.sle.minimap.coords.enable end,
+				values = {
+					["TOPLEFT"] = "TOPLEFT",
+					["LEFT"] = "LEFT",
+					["BOTTOMLEFT"] = "BOTTOMLEFT",
+					["RIGHT"] = "RIGHT",
+					["TOPRIGHT"] = "TOPRIGHT",
+					["BOTTOMRIGHT"] = "BOTTOMRIGHT",
+					["TOP"] = "TOP",
+					["BOTTOM"] = "BOTTOM",
+				}
+			},
+			format = {
+				order = 4,
+				name = L["Format"],
+				type = "select",
+				disabled = function() return not E.private.general.minimap.enable or not E.db.sle.minimap.coords.enable end,
+				values = {
+					["%.0f"] = DEFAULT,
+					["%.1f"] = "45.3",
+					["%.2f"] = "45.34",
+				},
+			},
+			throttle = {
+				order = 5,
+				type = 'range',
+				name = L["Update Throttle"],
+				min = 0.1, max = 2, step = 0.1,
+				disabled = function() return not E.db.sle.minimap.locPanel.enable end,
+				set = function(info, value) E.db.sle.minimap.coords[ info[#info] ] = value; end,
+			},
+			fontGroup = {
+				order = 10,
+				type = "group",
+				name = L["Fonts"],
+				guiInline = true,
+				disabled = function() return not E.db.sle.minimap.locPanel.enable end,
+				get = function(info) return E.db.sle.minimap.coords[ info[#info] ] end,
+				set = function(info, value) E.db.sle.minimap.coords[ info[#info] ] = value; MM:CoordFont() end,
+				args = {
+					font = {
+						type = "select", dialogControl = 'LSM30_Font',
+						order = 1,
+						name = L["Font"],
+						values = AceGUIWidgetLSMlists.font,
+					},
+					fontSize = {
+						order = 2,
+						name = L["Font Size"],
+						type = "range",
+						min = 6, max = 22, step = 1,
+						set = function(info, value) E.db.sle.minimap.coords[ info[#info] ] = value; MM:CoordFont(); MM:CoordsSize() end,
+					},
+					fontOutline = {
+						order = 3,
+						name = L["Font Outline"],
+						type = "select",
+						values = {
+							["NONE"] = L["None"],
+							["OUTLINE"] = 'OUTLINE',
+							["MONOCHROMEOUTLINE"] = 'MONOCROMEOUTLINE',
+							["THICKOUTLINE"] = 'THICKOUTLINE',
+						},
+					},
+				},
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/minimap/instance_c.lua b/ElvUI_SLE/options/minimap/instance_c.lua
new file mode 100644
index 0000000..f24d0bd
--- /dev/null
+++ b/ElvUI_SLE/options/minimap/instance_c.lua
@@ -0,0 +1,107 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local I= SLE:GetModule("InstDif")
+local PLAYER_DIFFICULTY1, PLAYER_DIFFICULTY2, PLAYER_DIFFICULTY3, PLAYER_DIFFICULTY4, PLAYER_DIFFICULTY5, PLAYER_DIFFICULTY6 = PLAYER_DIFFICULTY1, PLAYER_DIFFICULTY2, PLAYER_DIFFICULTY3, PLAYER_DIFFICULTY4, PLAYER_DIFFICULTY5, PLAYER_DIFFICULTY6
+local PLAYER_DIFFICULTY_TIMEWALKER = PLAYER_DIFFICULTY_TIMEWALKER
+local function configTable()
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.minimap.args.instance = {
+		type = "group",
+		name = L["Instance indication"],
+		order = 7,
+		get = function(info) return E.db.sle.minimap.instance[ info[#info] ] end,
+		set = function(info, value) E.db.sle.minimap.instance[ info[#info] ] = value; I:UpdateFrame() end,
+		args = {
+			enable = {
+				order = 1,
+				type = 'toggle',
+				name = L["Enable"],
+				desc = L["Show instance difficulty info as text."],
+				disabled = function() return not E.private.general.minimap.enable end,
+			},
+			flag = {
+				order = 2,
+				type = 'toggle',
+				name = L["Show texture"],
+				desc = L["Show instance difficulty info as default texture."],
+				hidden = function() return not E.global.sle.advanced.general end,
+				disabled = function() return not E.private.general.minimap.enable end,
+			},
+			xoffset = {
+				order = 3, type = 'range', name = L["X-Offset"], min = -300, max = 300, step = 1,
+				disabled = function() return not E.private.general.minimap.enable or not E.db.sle.minimap.instance.enable end,
+			},
+			yoffset = {
+				order = 4, type = 'range', name = L["Y-Offset"], min = -300, max = 300, step = 1,
+				disabled = function() return not E.private.general.minimap.enable or not E.db.sle.minimap.instance.enable end,
+			},
+			fontGroup = {
+				order = 5,
+				type = "group",
+				name = L["Fonts"],
+				guiInline = true,
+				get = function(info) return E.db.sle.minimap.instance[ info[#info] ] end,
+				set = function(info, value) E.db.sle.minimap.instance[ info[#info] ] = value; I:UpdateFrame() end,
+				args = {
+					font = {
+						order = 1, type = "select", name = L["Font"], dialogControl = 'LSM30_Font', values = AceGUIWidgetLSMlists.font,
+					},
+					fontSize = {
+						order = 2, type = "range", name = L["Font Size"], min = 6, max = 22, step = 1,
+					},
+					fontOutline = {
+						order = 3, type = "select", name = L["Font Outline"], desc = L["Set the font outline."],
+						values = {
+							["NONE"] = L["None"],
+							["OUTLINE"] = 'OUTLINE',
+							["MONOCHROMEOUTLINE"] = 'MONOCROMEOUTLINE',
+							["THICKOUTLINE"] = 'THICKOUTLINE',
+						},
+					},
+				},
+			},
+			colors = {
+				order = 8,
+				type = 'group',
+				name = L["Colors"],
+				guiInline = true,
+				get = function(info)
+					local t = E.db.sle.minimap.instance.colors[ info[#info] ]
+					local d = P.sle.minimap.instance.colors[info[#info]]
+					return t.r, t.g, t.b, t.a, d.r, d.g, d.b, d.a
+				end,
+				set = function(info, r, g, b, a)
+					E.db.sle.minimap.instance.colors[ info[#info] ] = {}
+					local t = E.db.sle.minimap.instance.colors[ info[#info] ]
+					t.r, t.g, t.b, t.a = r, g, b, a
+					I:GenerateText(nil, nil, true)
+				end,
+				disabled = function() return not E.private.general.minimap.enable or not E.db.sle.minimap.instance.enable end,
+				args = {
+					info = {
+						order = 1, type = "description", name = L["Sets the colors for difficulty abbreviation"],
+					},
+					lfr = {
+						type = "color", order = 2, name = PLAYER_DIFFICULTY3, hasAlpha = false,
+					},
+					normal = {
+						type = "color", order = 3, name = PLAYER_DIFFICULTY1, hasAlpha = false,
+					},
+					heroic = {
+						type = "color", order = 4, name = PLAYER_DIFFICULTY2, hasAlpha = false,
+					},
+					challenge = {
+						type = "color", order = 5, name = PLAYER_DIFFICULTY5, hasAlpha = false,
+					},
+					mythic = {
+						type = "color", order = 6, name = PLAYER_DIFFICULTY6, hasAlpha = false,
+					},
+					time = {
+						type = "color", order = 6, name = PLAYER_DIFFICULTY_TIMEWALKER, hasAlpha = false,
+					},
+				},
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/minimap/load_minimap.xml b/ElvUI_SLE/options/minimap/load_minimap.xml
new file mode 100644
index 0000000..9cdd15d
--- /dev/null
+++ b/ElvUI_SLE/options/minimap/load_minimap.xml
@@ -0,0 +1,8 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<!--Core-->
+	<Script file='minimap_c.lua'/>
+	<Script file='coords_c.lua'/>
+	<Script file='minimapicons_c.lua'/>
+	<Script file='instance_c.lua'/>
+	<Script file='locpanel_c.lua'/>
+</Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/options/minimap/locpanel_c.lua b/ElvUI_SLE/options/minimap/locpanel_c.lua
new file mode 100644
index 0000000..e087a7a
--- /dev/null
+++ b/ElvUI_SLE/options/minimap/locpanel_c.lua
@@ -0,0 +1,196 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local LP = SLE:GetModule("LocationPanel")
+local DEFAULT = DEFAULT
+local function configTable()
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.minimap.args.locPanel = {
+		type = "group",
+		name = L["Location Panel"],
+		order = 8,
+		get = function(info) return E.db.sle.minimap.locPanel[ info[#info] ] end,
+		args = {
+			enable = {
+				type = "toggle",
+				name = L["Enable"],
+				order = 1,
+				set = function(info, value) E.db.sle.minimap.locPanel[ info[#info] ] = value; LP:Toggle() end,
+			},
+			width = {
+				order = 2,
+				type = 'range',
+				name = L["Width"],
+				min = 100, max = E.screenwidth/2, step = 1,
+				disabled = function() return not E.db.sle.minimap.locPanel.enable end,
+				set = function(info, value) E.db.sle.minimap.locPanel[ info[#info] ] = value; LP:Resize() end,
+			},
+			height = {
+				order = 3,
+				type = 'range',
+				name = L["Height"],
+				min = 10, max = 50, step = 1,
+				disabled = function() return not E.db.sle.minimap.locPanel.enable end,
+				set = function(info, value) E.db.sle.minimap.locPanel[ info[#info] ] = value; LP:Resize() end,
+			},
+			template = {
+				order = 4,
+				name = L["Template"],
+				type = "select",
+				disabled = function() return not E.db.sle.minimap.locPanel.enable end,
+				set = function(info, value) E.db.sle.minimap.locPanel[ info[#info] ] = value; LP:Template() end,
+				values = {
+					["Default"] = DEFAULT,
+					["Transparent"] = L["Transparent"],
+				},
+			},
+			throttle = {
+				order = 5,
+				type = 'range',
+				name = L["Update Throttle"],
+				desc = L["The frequency of coordinates and zonetext updates. Check will be done more often with lower values."],
+				min = 0.1, max = 2, step = 0.1,
+				disabled = function() return not E.db.sle.minimap.locPanel.enable end,
+				set = function(info, value) E.db.sle.minimap.locPanel[ info[#info] ] = value; end,
+			},
+			format = {
+				order = 6,
+				name = L["Format"],
+				type = "select",
+				disabled = function() return not E.db.sle.minimap.locPanel.enable end,
+				set = function(info, value) E.db.sle.minimap.locPanel[ info[#info] ] = value; end,
+				values = {
+					["%.0f"] = DEFAULT,
+					["%.1f"] = "45.3",
+					["%.2f"] = "45.34",
+				},
+			},
+			zoneText = {
+				type = "toggle",
+				name = L["Full Location"],
+				order = 7,
+				disabled = function() return not E.db.sle.minimap.locPanel.enable end,
+				set = function(info, value) E.db.sle.minimap.locPanel[ info[#info] ] = value; end,
+			},
+			colorType = {
+				order = 8,
+				name = L["Color Type"],
+				type = "select",
+				disabled = function() return not E.db.sle.minimap.locPanel.enable end,
+				set = function(info, value) E.db.sle.minimap.locPanel[ info[#info] ] = value; end,
+				values = {
+					["REACTION"] = L["Reaction"],
+					["DEFAULT"] = DEFAULT,
+					["CUSTOM"] = L["Custom"],
+				},
+			},
+			customColor = {
+				type = 'color',
+				order = 9,
+				name = L["Custom Color"],
+				disabled = function() return not E.db.sle.minimap.locPanel.enable or not E.db.sle.minimap.locPanel.colorType == "CUSTOM" end,
+				get = function(info)
+					local t = E.db.sle.minimap.locPanel[ info[#info] ]
+					local d = P.sle.minimap.locPanel[info[#info]]
+					return t.r, t.g, t.b, d.r, d.g, d.b
+				end,
+				set = function(info, r, g, b)
+					E.db.sle.minimap.locPanel[ info[#info] ] = {}
+					local t = E.db.sle.minimap.locPanel[ info[#info] ]
+					t.r, t.g, t.b = r, g, b
+				end,
+			},
+			linkcoords = {
+				type = "toggle",
+				name = L["Link Position"],
+				desc = L["Allow pasting of your coordinates in chat editbox via holding shift and clicking on the location name."],
+				order = 10,
+				set = function(info, value) E.db.sle.minimap.locPanel[ info[#info] ] = value; end,
+			},
+			portals = {
+				order = 11,
+				type = "group",
+				name = L["Relocation Menu"],
+				guiInline = true,
+				disabled = function() return not E.db.sle.minimap.locPanel.enable end,
+				get = function(info) return E.db.sle.minimap.locPanel.portals[ info[#info] ] end,
+				set = function(info, value) E.db.sle.minimap.locPanel.portals[ info[#info] ] = value; end,
+				args = {
+					enable = {
+						type = "toggle",
+						name = L["Enable"],
+						desc = L["Right click on the location panel will bring up a menu with available options for relocating your character (e.g. Hearthstones, Portals, etc)."],
+						order = 1,
+					},
+					customWidth = {
+						type = "toggle",
+						name = L["Custom Width"],
+						desc = L["By default menu's width will be equal to the location panel width. Checking this option will allow you to set own width."],
+						order = 2,
+					},
+					customWidthValue = {
+						order = 3,
+						name = L["Width"],
+						type = "range",
+						min = 100, max = E.screenwidth, step = 1,
+						disabled = function() return not E.db.sle.minimap.locPanel.portals.customWidth or not E.db.sle.minimap.locPanel.enable end,
+					},
+					justify = {
+						order = 4,
+						name = L["Justify Text"],
+						type = "select",
+						values = {
+							["LEFT"] = L["Left"],
+							["CENTER"] = L["Middle"],
+							["RIGHT"] = L["Right"],
+						},
+					},
+					cdFormat = {
+						order = 5,
+						name = L["CD format"],
+						type = "select",
+						values = {
+							["DEFAULT"] = [[(10m |TInterface\FriendsFrame\StatusIcon-Away:16|t)]],
+							["DEFAULT_ICONFIRST"] = [[( |TInterface\FriendsFrame\StatusIcon-Away:16|t10m)]],
+						},
+					},
+				},
+			},
+			fontGroup = {
+				order = 12,
+				type = "group",
+				name = L["Fonts"],
+				guiInline = true,
+				disabled = function() return not E.db.sle.minimap.locPanel.enable end,
+				get = function(info) return E.db.sle.minimap.locPanel[ info[#info] ] end,
+				set = function(info, value) E.db.sle.minimap.locPanel[ info[#info] ] = value; LP:Fonts() end,
+				args = {
+					font = {
+						type = "select", dialogControl = 'LSM30_Font',
+						order = 1,
+						name = L["Font"],
+						values = AceGUIWidgetLSMlists.font,
+					},
+					fontSize = {
+						order = 2,
+						name = L["Font Size"],
+						type = "range",
+						min = 6, max = 22, step = 1,
+						set = function(info, value) E.db.sle.minimap.locPanel[ info[#info] ] = value; LP:Fonts(); LP:Resize() end,
+					},
+					fontOutline = {
+						order = 3,
+						name = L["Font Outline"],
+						type = "select",
+						values = {
+							["NONE"] = L["None"],
+							["OUTLINE"] = 'OUTLINE',
+							["MONOCHROMEOUTLINE"] = 'MONOCROMEOUTLINE',
+							["THICKOUTLINE"] = 'THICKOUTLINE',
+						},
+					},
+				},
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/minimap/minimap_c.lua b/ElvUI_SLE/options/minimap/minimap_c.lua
new file mode 100644
index 0000000..20cbb81
--- /dev/null
+++ b/ElvUI_SLE/options/minimap/minimap_c.lua
@@ -0,0 +1,44 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local MM = SLE:GetModule("Minimap")
+local MINIMAP_LABEL = MINIMAP_LABEL
+local function configTable()
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.minimap = {
+		type = "group",
+		name = MINIMAP_LABEL,
+		order = 13,
+		childGroups = 'tab',
+		args = {
+			header = {
+				order = 1,
+				type = "header",
+				name = L["Minimap Options"],
+			},
+			intro = {
+				order = 2,
+				type = 'description',
+				name = L["MINIMAP_DESC"],
+			},
+			combat = {
+				type = "toggle",
+				name = L["Hide In Combat"],
+				order = 3,
+				desc = L["Hide minimap in combat."],
+				disabled = false,
+				get = function(info) return E.db.sle.minimap.combat end,
+				set = function(info, value) E.db.sle.minimap.combat = value; MM:HideMinimapRegister() end,
+			},
+			alpha = {
+				order = 4,
+				type = 'range',
+				name = L["Minimap Alpha"],
+				isPercent = true,
+				min = 0.3, max = 1, step = 0.01,
+				get = function(info) return E.db.sle.minimap.alpha end,
+				set = function(info, value) E.db.sle.minimap.alpha = value; MM:MinimapTransparency() end,
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/minimap/minimapicons_c.lua b/ElvUI_SLE/options/minimap/minimapicons_c.lua
new file mode 100644
index 0000000..7605e26
--- /dev/null
+++ b/ElvUI_SLE/options/minimap/minimapicons_c.lua
@@ -0,0 +1,78 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local SMB = SLE:GetModule("SquareMinimapButtons")
+local function configTable()
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.minimap.args.mapicons = {
+		type = "group",
+		name = L["Minimap Buttons"],
+		order = 6,
+		args = {
+			mapiconsenable = {
+				type = "toggle",
+				name = L["Enable"],
+				order = 1,
+				desc = L["Enable/Disable Square Minimap Buttons."],
+				get = function(info) return E.private.sle.minimap.mapicons.enable end,
+				set = function(info, value) E.private.sle.minimap.mapicons.enable = value; E:StaticPopup_Show("PRIVATE_RL") end,
+			},
+			barenable = {
+				order = 2,
+				type = "toggle",
+				name = L["Bar Enable"],
+				desc = L["Enable/Disable Square Minimap Bar."],
+				disabled = function() return not E.private.sle.minimap.mapicons.enable end,
+				get = function(info) return E.private.sle.minimap.mapicons.barenable end,
+				set = function(info, value) E.private.sle.minimap.mapicons.barenable = value; E:StaticPopup_Show("PRIVATE_RL") end,
+			},
+			skindungeon = {
+				order = 3,
+				type = 'toggle',
+				name = L["Skin Dungeon"],
+				desc = L["Skin dungeon icon."],
+				disabled = function() return not E.private.sle.minimap.mapicons.enable end,
+				get = function(info) return E.db.sle.minimap.mapicons.skindungeon end,
+				set = function(info, value) E.db.sle.minimap.mapicons.skindungeon = value; E:StaticPopup_Show("PRIVATE_RL") end,
+			},
+			skinmail = {
+				order = 4,
+				type = 'toggle',
+				name = L["Skin Mail"],
+				desc = L["Skin mail icon."],
+				disabled = function() return not E.private.sle.minimap.mapicons.enable end,
+				get = function(info) return E.db.sle.minimap.mapicons.skinmail end,
+				set = function(info, value) E.db.sle.minimap.mapicons.skinmail = value; E:StaticPopup_Show("PRIVATE_RL") end,
+			},
+			iconsize = {
+				order = 5,
+				type = 'range',
+				name = L["Button Size"],
+				desc = L["The size of the minimap buttons when not anchored to the minimap."],
+				min = 16, max = 40, step = 1,
+				disabled = function() return not E.private.sle.minimap.mapicons.enable end,
+				get = function(info) return E.db.sle.minimap.mapicons.iconsize end,
+				set = function(info, value) E.db.sle.minimap.mapicons.iconsize = value; SMB:Update(SLE_SquareMinimapButtonBar) end,
+			},
+			iconperrow = {
+				order = 6,
+				type = 'range',
+				name = L["Icons Per Row"],
+				desc = L["Anchor mode for displaying the minimap buttons are skinned."],
+				min = 1, max = 12, step = 1,
+				disabled = function() return not E.private.sle.minimap.mapicons.enable end,
+				get = function(info) return E.db.sle.minimap.mapicons.iconperrow end,
+				set = function(info, value) E.db.sle.minimap.mapicons.iconperrow = value; SMB:Update(SLE_SquareMinimapButtonBar) end,
+			},
+			iconmouseover = {
+				order = 7,
+				name = L["Mouse Over"],
+				desc = L["Show minimap buttons on mouseover."],
+				type = "toggle",
+				disabled = function() return not E.private.sle.minimap.mapicons.enable end,
+				get = function(info) return E.db.sle.minimap.mapicons.iconmouseover end,
+				set = function(info, value) E.db.sle.minimap.mapicons.iconmouseover = value; SMB:ChangeMouseOverSetting() end,
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/minimap_c.lua b/ElvUI_SLE/options/minimap_c.lua
deleted file mode 100644
index aefd839..0000000
--- a/ElvUI_SLE/options/minimap_c.lua
+++ /dev/null
@@ -1,292 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-
-local function configTable()
-	E.Options.args.sle.args.options.args.minimap = {
-		type = "group",
-		name = MINIMAP_LABEL,
-		order = 3,
-		args = {
-			header = {
-				order = 1,
-				type = "header",
-				name = L["Minimap Options"],
-			},
-			intro = {
-				order = 2,
-				type = 'description',
-				name = L['MINIMAP_DESC'],
-			},
-			combat = {
-				type = "toggle",
-				name = L["Hide In Combat"],
-				order = 3,
-				desc = L['Hide minimap in combat.'],
-				disabled = false,
-				get = function(info) return E.db.sle.minimap.combat end,
-				set = function(info, value) E.db.sle.minimap.combat = value; E:GetModule('Minimap'):SLEHideMinimap() end,
-			},
-			alpha = {
-				order = 4,
-				type = 'range',
-				name = L['Minimap Alpha'],
-				isPercent = true,
-				min = 0.3, max = 1, step = 0.01,
-				get = function(info) return E.db.sle.minimap.alpha end,
-				set = function(info, value) E.db.sle.minimap.alpha = value; E:GetModule('Minimap'):Transparency() end,
-			},
-			coords = {
-				type = "group",
-				name = L["Minimap Coordinates"],
-				order = 5,
-				guiInline = true,
-				disabled = function() return not E.private.general.minimap.enable or not E.db.sle.minimap.enable end,
-				args = {
-					coordsenable = {
-						type = "toggle",
-						name = L['Enable'],
-						order = 1,
-						desc = L['Enable/Disable Square Minimap Coords.'],
-						get = function(info) return E.db.sle.minimap.enable end,
-						set = function(info, value) E.db.sle.minimap.enable = value; E:GetModule('Minimap'):UpdateSettings() end,
-						disabled = function() return not E.private.general.minimap.enable end,
-					},
-					display = {
-						order = 2,
-						type = 'select',
-						name = L['Coords Display'],
-						desc = L['Change settings for the display of the coordinates that are on the minimap.'],
-						get = function(info) return E.db.sle.minimap.coords.display end,
-						set = function(info, value) E.db.sle.minimap.coords.display = value; E:GetModule('Minimap'):UpdateSettings() end,
-						values = {
-							['MOUSEOVER'] = L['Minimap Mouseover'],
-							['SHOW'] = L['Always Display'],
-						},
-					},
-					middle = {
-						order = 3,
-						type = "select",
-						name = L["Coords Location"],
-						desc = L['This will determine where the coords are shown on the minimap.'],
-						get = function(info) return E.db.sle.minimap.coords.middle end,
-						set = function(info, value) E.db.sle.minimap.coords.middle = value; E:GetModule('Minimap'):UpdateSettings() end,
-						values = {
-							['CORNERS'] = L['Bottom Corners'],
-							['CENTER'] = L['Bottom Center'],
-						},
-					},
-					decimals = {
-						type = "toggle",
-						name = L['Decimals'],
-						order = 4,
-						--desc = L['Enable/Disable Square Minimap Coords.'],
-						get = function(info) return E.db.sle.minimap.coords.decimals end,
-						set = function(info, value) E.db.sle.minimap.coords.decimals = value; E:GetModule('Minimap'):UpdateSettings() end,
-						disabled = function() return not E.private.general.minimap.enable end,
-					},
-				},
-			},
-			mapicons = {
-				type = "group",
-				name = L["Minimap Buttons"],
-				order = 6,
-				guiInline = true,
-				disabled = function() return not E.private.sle.minimap.mapicons.enable end,
-				args = {
-					mapiconsenable = {
-						type = "toggle",
-						name = L['Enable'],
-						order = 1,
-						desc = L['Enable/Disable Square Minimap Buttons.'],
-						disabled = false,
-						get = function(info) return E.private.sle.minimap.mapicons.enable end,
-						set = function(info, value) E.private.sle.minimap.mapicons.enable = value; E:StaticPopup_Show("PRIVATE_RL") end,
-					},
-					barenable = {
-						order = 2,
-						type = "toggle",
-						name = L["Bar Enable"],
-						desc = L['Enable/Disable Square Minimap Bar.'],
-						get = function(info) return E.private.sle.minimap.mapicons.barenable end,
-						set = function(info, value) E.private.sle.minimap.mapicons.barenable = value; E:StaticPopup_Show("PRIVATE_RL") end,
-					},
-					skindungeon = {
-						order = 3,
-						type = 'toggle',
-						name = L['Skin Dungeon'],
-						desc = L['Skin dungeon icon.'],
-						get = function(info) return E.db.sle.minimap.mapicons.skindungeon end,
-						set = function(info, value) E.db.sle.minimap.mapicons.skindungeon = value; E:StaticPopup_Show("PRIVATE_RL") end,
-						disabled = function() return not E.private.sle.minimap.mapicons.enable end,
-					},
-					skinmail = {
-						order = 4,
-						type = 'toggle',
-						name = L['Skin Mail'],
-						desc = L['Skin mail icon.'],
-						get = function(info) return E.db.sle.minimap.mapicons.skinmail end,
-						set = function(info, value) E.db.sle.minimap.mapicons.skinmail = value; E:StaticPopup_Show("PRIVATE_RL") end,
-						disabled = function() return not E.private.sle.minimap.mapicons.enable end,
-					},
-					iconsize = {
-						order = 5,
-						type = 'range',
-						name = L['Button Size'],
-						desc = L['The size of the minimap buttons when not anchored to the minimap.'],
-						min = 16, max = 40, step = 1,
-						get = function(info) return E.db.sle.minimap.mapicons.iconsize end,
-						set = function(info, value) E.db.sle.minimap.mapicons.iconsize = value; E:GetModule('SLE_SquareMinimapButtons'):Update(SquareMinimapButtonBar) end,
-						disabled = function() return not E.private.sle.minimap.mapicons.enable end,
-					},
-					iconperrow = {
-						order = 6,
-						type = 'range',
-						name = L['Icons Per Row'],
-						desc = L['Anchor mode for displaying the minimap buttons are skinned.'],
-						min = 1, max = 12, step = 1,
-						get = function(info) return E.db.sle.minimap.mapicons.iconperrow end,
-						set = function(info, value) E.db.sle.minimap.mapicons.iconperrow = value; E:GetModule('SLE_SquareMinimapButtons'):Update(SquareMinimapButtonBar) end,
-						disabled = function() return not E.private.sle.minimap.mapicons.enable end,
-					},
-					iconmouseover = {
-						order = 7,
-						name = L['Mouse Over'],
-						desc = L['Show minimap buttons on mouseover.'],
-						type = "toggle",
-						get = function(info) return E.db.sle.minimap.mapicons.iconmouseover end,
-						set = function(info, value) E.db.sle.minimap.mapicons.iconmouseover = value; E:GetModule('SLE_SquareMinimapButtons'):ChangeMouseOverSetting() end,
-						disabled = function() return not E.private.sle.minimap.mapicons.enable end,
-					},
-				},
-			},
-			instance = {
-				type = "group",
-				name = L["Instance indication"],
-				order = 7,
-				guiInline = true,
-				get = function(info) return E.db.sle.minimap.instance[ info[#info] ] end,
-				set = function(info, value) E.db.sle.minimap.instance[ info[#info] ] = value; E:GetModule('SLE_InstDif'):UpdateFrame() end,
-				args = {
-					enable = {
-						order = 1,
-						type = 'toggle',
-						name = L['Enable'],
-						desc = L['Show instance difficulty info as text.'],
-						disabled = function() return not E.private.general.minimap.enable end,
-					},
-					flag = {
-						order = 2,
-						type = 'toggle',
-						name = L['Show texture'],
-						desc = L['Show instance difficulty info as default texture.'],
-						disabled = function() return not E.private.general.minimap.enable end,
-					},
-					xoffset = {
-						order = 3,
-						type = 'range',
-						name = L['X-Offset'],
-						min = -300, max = 300, step = 1,
-						disabled = function() return not E.private.general.minimap.enable or not E.db.sle.minimap.instance.enable end,
-					},
-					yoffset = {
-						order = 4,
-						type = 'range',
-						name = L['Y-Offset'],
-						min = -300, max = 300, step = 1,
-						disabled = function() return not E.private.general.minimap.enable or not E.db.sle.minimap.instance.enable end,
-					},
-					fontGroup = {
-						order = 5,
-						type = "group",
-						name = L["Fonts"],
-						guiInline = true,
-						get = function(info) return E.db.sle.minimap.instance[ info[#info] ] end,
-						set = function(info, value) E.db.sle.minimap.instance[ info[#info] ] = value; E:GetModule('SLE_InstDif'):UpdateFrame() end,
-						args = {
-							font = {
-								type = "select", dialogControl = 'LSM30_Font',
-								order = 1,
-								name = L["Font"],
-								values = AceGUIWidgetLSMlists.font,
-							},
-							fontSize = {
-								order = 2,
-								name = L["Font Size"],
-								type = "range",
-								min = 6, max = 22, step = 1,
-							},
-							fontOutline = {
-								order = 3,
-								name = L["Font Outline"],
-								desc = L["Set the font outline."],
-								type = "select",
-								values = {
-									['NONE'] = L["None"],
-									['OUTLINE'] = 'OUTLINE',
-									['MONOCHROMEOUTLINE'] = 'MONOCROMEOUTLINE',
-									['THICKOUTLINE'] = 'THICKOUTLINE',
-								},
-							},
-						},
-					},
-					colors = {
-						order = 8,
-						type = 'group',
-						name = L["Colors"],
-						guiInline = true,
-						get = function(info)
-							local t = E.db.sle.minimap.instance.colors[ info[#info] ]
-							local d = P.sle.minimap.instance.colors[info[#info]]
-							return t.r, t.g, t.b, t.a, d.r, d.g, d.b
-						end,
-						set = function(info, r, g, b)
-							E.db.sle.minimap.instance.colors[ info[#info] ] = {}
-							local t = E.db.sle.minimap.instance.colors[ info[#info] ]
-							t.r, t.g, t.b = r, g, b
-							E:GetModule('SLE_InstDif'):GenerateText(nil, nil, true)
-						end,
-						disabled = function() return not E.private.general.minimap.enable or not E.db.sle.minimap.instance.enable end,
-						args = {
-							info = {
-								order = 1,
-								type = "description",
-								name = L['Sets the colors for difficulty abbreviation'],
-							},
-							lfr = {
-								type = "color",
-								order = 2,
-								name = PLAYER_DIFFICULTY3,
-								hasAlpha = false,
-							},
-							normal = {
-								type = "color",
-								order = 3,
-								name = PLAYER_DIFFICULTY1,
-								hasAlpha = false,
-							},
-							heroic = {
-								type = "color",
-								order = 4,
-								name = PLAYER_DIFFICULTY2,
-								hasAlpha = false,
-							},
-							challenge = {
-								type = "color",
-								order = 5,
-								name = PLAYER_DIFFICULTY5,
-								hasAlpha = false,
-							},
-							mythic = {
-								type = "color",
-								order = 6,
-								name = PLAYER_DIFFICULTY6,
-								hasAlpha = false,
-							},
-						},
-					},
-				},
-			},
-		},
-	}
-end
-
-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/misc_c.lua b/ElvUI_SLE/options/misc_c.lua
new file mode 100644
index 0000000..a429df1
--- /dev/null
+++ b/ElvUI_SLE/options/misc_c.lua
@@ -0,0 +1,78 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local M = SLE:GetModule('Misc');
+
+local function configTable()
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.options.args.general.args.misc = {
+		type = "group",
+		name = L["Misc"],
+		order = 75,
+		args = {
+			header = {
+				order = 1,
+				type = "header",
+				name = L["Misc"],
+			},
+			vehicle = {
+				type = "group",
+				name = L["Enhanced Vehicle Bar"],
+				order = 5,
+				guiInline = true,
+				args = {
+					info = {
+						order = 2,
+						type = "description",
+						name = L["A different look/feel vehicle bar"],
+					},
+					enable = {
+						order = 3,
+						type = "toggle",
+						name = L["Enable"],
+						get = function(info) return E.private.sle.vehicle.enable end,
+						set = function(info, value) E.private.sle.vehicle.enable = value; E:StaticPopup_Show("PRIVATE_RL") end,
+					},
+				},
+			},
+			viewport = {
+				type = "group",
+				name = L["Viewport"],
+				order = 6,
+				guiInline = true,
+				get = function(info) return E.db.sle.misc.viewport[ info[#info] ] end,
+				set = function(info, value) E.db.sle.misc.viewport[ info[#info] ] = value; M:SetViewport() end,
+				args = {
+					left = {
+						order = 1,
+						name = L["Left Offset"],
+						desc = L["Set the offset from the left border of the screen."],
+						type = "range",
+						min = 0, max = E.screenwidth/2, step = 1,
+					},
+					right = {
+						order = 2,
+						name = L["Right Offset"],
+						desc = L["Set the offset from the right border of the screen."],
+						type = "range",
+						min = 0, max = E.screenwidth/2, step = 1,
+					},
+					top = {
+						order = 3,
+						name = L["Top Offset"],
+						desc = L["Set the offset from the top border of the screen."],
+						type = "range",
+						min = 0, max = E.screenheight /2 , step = 1,
+					},
+					bottom = {
+						order = 4,
+						name = L["Bottom Offset"],
+						desc = L["Set the offset from the bottom border of the screen."],
+						type = "range",
+						min = 0, max = E.screenheight /2 , step = 1,
+					},
+				},
+			},
+		},
+	}
+end
+
+-- T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/nameplates_c.lua b/ElvUI_SLE/options/nameplates_c.lua
index 8011797..914ef24 100644
--- a/ElvUI_SLE/options/nameplates_c.lua
+++ b/ElvUI_SLE/options/nameplates_c.lua
@@ -1,13 +1,13 @@
-local E, L, V, P, G = unpack(ElvUI);
-local NP = E:GetModule('NamePlates')
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))

 local function configTable()
-	E.Options.args.sle.args.options.args.general.args.nameplate = {
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.nameplate = {
 		type = "group",
 		name = L["NamePlates"],
-		order = 8,
+		order = 14,
 		get = function(info) return E.db.sle.nameplate[ info[#info] ] end,
-		set = function(info, value) E.db.sle.nameplate[ info[#info] ] = value; NP:UpdateAllPlates() end,
+		set = function(info, value) E.db.sle.nameplate[ info[#info] ] = value; E:GetModule('NamePlates'):ConfigureAll() end,
 		args = {
 			header = {
 				order = 1,
@@ -30,4 +30,4 @@ local function configTable()
 	}
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/professions_c.lua b/ElvUI_SLE/options/professions_c.lua
new file mode 100644
index 0000000..14d66f9
--- /dev/null
+++ b/ElvUI_SLE/options/professions_c.lua
@@ -0,0 +1,223 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local Pr = SLE:GetModule("Professions")
+local TRADE_SKILLS, NONE = TRADE_SKILLS, NONE
+
+local function configTable()
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.professions = {
+		type = "group",
+		name = TRADE_SKILLS,
+		order = 15,
+		args = {
+			header = {
+				order = 1,
+				type = "header",
+				name = TRADE_SKILLS,
+			},
+			deconstructButton = {
+				order = 2,
+				type = "group",
+				name = L["Deconstruct Mode"],
+				guiInline = true,
+				args = {
+					enable = {
+						order = 1,
+						name = L["Enable"],
+						desc = L["Create a button in your bag frame to switch to deconstrution mode allowing you to easily disenchant/mill/prospect and pick locks."],
+						type = "toggle",
+						get = function(info) return E.private.sle.professions.deconButton.enable end,
+						set = function(info, value) E.private.sle.professions.deconButton.enable = value; E:StaticPopup_Show("PRIVATE_RL") end,
+					},
+					style = {
+						order = 2,
+						type = "select",
+						name = L["Style"],
+						desc = L["Sets style of glow around item available for deconstruction while in deconstruct mode. Autocast is less intence but also less noticeable."],
+						disabled = function() return not E.private.sle.professions.deconButton.enable end,
+						get = function(info) return E.private.sle.professions.deconButton.style end,
+						set = function(info, value) E.private.sle.professions.deconButton.style = value; end,
+						values = {
+							["BIG"] = L["Actionbar Proc"],
+							["SMALL"] = L["Actionbar Autocast"],
+							["NO"] = NONE,
+						},
+					},
+					buttonGlow = {
+						order = 3,
+						name = L["Show glow on bag button"],
+						desc = L["Show glow on the deconstruction button in bag when deconstruction mode is enabled.\nApplies on next mode toggle."],
+						type = "toggle",
+						disabled = function() return not E.private.sle.professions.deconButton.enable end,
+						get = function(info) return E.private.sle.professions.deconButton.buttonGlow end,
+						set = function(info, value) E.private.sle.professions.deconButton.buttonGlow = value; end,
+					},
+				},
+			},
+			ench = {
+				order = 3,
+				type = "group",
+				name = T.GetSpell(158716),
+				guiInline = true,
+				args = {
+					enchScroll = {
+						order = 1,
+						name = L["Enchant Scroll Button"],
+						desc = L["Create a button for applying selected enchant on the scroll."],
+						type = "toggle",
+						get = function(info) return E.private.sle.professions.enchant.enchScroll end,
+						set = function(info, value) E.private.sle.professions.enchant.enchScroll = value; E:StaticPopup_Show("PRIVATE_RL") end,
+					},
+					infos = {
+						order = 2,
+						type = "description",
+						name = L["Following options are global and will be applied to all characters on account."]
+					},
+					ignoreItems = {
+						order = 3,
+						name = L["Deconstruction ignore"],
+						desc = L["Items listed here will be ignored in deconstruction mode. Add names or item links, entries must be separated by comma."],
+						type = 'input',
+						width = 'full',
+						multiline = true,
+						disabled = function() return not E.private.sle.professions.deconButton.enable end,
+						get = function(info) return E.global.sle.DE.Blacklist end,
+						set = function(info, value) E.global.sle.DE.Blacklist = value; Pr:Blacklisting("DE") end,
+					},
+					IgnoreTabards = {
+						order = 4,
+						name = L["Ignore tabards"],
+						desc = L["Deconstruction mode will ignore tabards."],
+						type = "toggle",
+						disabled = function() return not E.private.sle.professions.deconButton.enable end,
+						hidden = function() return not E.global.sle.advanced.general end,
+						get = function(info) return E.global.sle.DE.IgnoreTabards end,
+						set = function(info, value) E.global.sle.DE.IgnoreTabards = value; end,
+					},
+					IgnorePanda = {
+						order = 5,
+						name = L["Ignore Pandaria BoA"],
+						desc = L["Deconstruction mode will ignore BoA weapons from Pandaria."],
+						type = "toggle",
+						disabled = function() return not E.private.sle.professions.deconButton.enable end,
+						hidden = function() return not E.global.sle.advanced.general end,
+						get = function(info) return E.global.sle.DE.IgnorePanda end,
+						set = function(info, value) E.global.sle.DE.IgnorePanda = value; end,
+					},
+					IgnoreCooking = {
+						order = 6,
+						name = L["Ignore Cooking"],
+						desc = L["Deconstruction mode will ignore cooking specific items."],
+						type = "toggle",
+						disabled = function() return not E.private.sle.professions.deconButton.enable end,
+						hidden = function() return not E.global.sle.advanced.general end,
+						get = function(info) return E.global.sle.DE.IgnoreCooking end,
+						set = function(info, value) E.global.sle.DE.IgnoreCooking = value; end,
+					},
+					IgnoreFishing = {
+						order = 7,
+						name = L["Ignore Fishing"],
+						desc = L["Deconstruction mode will ignore fishing specific items."],
+						type = "toggle",
+						disabled = function() return not E.private.sle.professions.deconButton.enable end,
+						hidden = function() return not E.global.sle.advanced.general end,
+						get = function(info) return E.global.sle.DE.IgnoreFishing end,
+						set = function(info, value) E.global.sle.DE.IgnoreFishing = value; end,
+					},
+				},
+			},
+			lockpick = {
+				order = 4,
+				type = "group",
+				name = T.GetSpell(1804),
+				guiInline = true,
+				args = {
+					infos = {
+						order = 1,
+						type = "description",
+						name = L["Following options are global and will be applied to all characters on account."]
+					},
+					ignoreItems = {
+						order = 2,
+						name = L["Deconstruction ignore"],
+						desc = L["Items listed here will be ingored in deconstruction mode. Add names or item links, entries must be separated by comma."],
+						type = 'input',
+						width = 'full',
+						multiline = true,
+						disabled = function() return not E.private.sle.professions.deconButton.enable end,
+						get = function(info) return E.global.sle.LOCK.Blacklist end,
+						set = function(info, value) E.global.sle.LOCK.Blacklist = value; Pr:Blacklisting("LOCK") end,
+					},
+					TradeOpen = {
+						order = 3,
+						name = L["Unlock in trade"],
+						desc = L["Apply unlocking skills in trade window the same way as in deconstruction mode for bags."],
+						type = "toggle",
+						disabled = function() return not E.private.sle.professions.deconButton.enable end,
+						get = function(info) return E.global.sle.LOCK.TradeOpen end,
+						set = function(info, value) E.global.sle.LOCK.TradeOpen = value; end,
+					},
+				},
+			},
+			fish = {
+				order = 5,
+				type = "group",
+				name = T.GetSpell(7620),
+				guiInline = true,
+				args = {
+					easycast = {
+						order = 1,
+						name = L["Easy Cast"],
+						desc = L["Allow to fish with double right-click."],
+						type = "toggle",
+						get = function(info) return E.private.sle.professions.fishing.EasyCast end,
+						set = function(info, value) E.private.sle.professions.fishing.EasyCast = value; E:StaticPopup_Show("PRIVATE_RL") end,
+					},
+					fromMount = {
+						order = 2,
+						name = L["From Mount"],
+						desc = L["Start fishing even if you are mounted."],
+						type = "toggle",
+						disabled = function() return not E.private.sle.professions.fishing.EasyCast end,
+						get = function(info) return E.private.sle.professions.fishing.FromMount end,
+						set = function(info, value) E.private.sle.professions.fishing.FromMount = value; end,
+					},
+					useLures = {
+						order = 3,
+						name = L["Apply Lures"],
+						desc = L["Automatically apply lures."],
+						type = "toggle",
+						disabled = function() return not E.private.sle.professions.fishing.EasyCast end,
+						get = function(info) return E.private.sle.professions.fishing.UseLures end,
+						set = function(info, value) E.private.sle.professions.fishing.UseLures = value; end,
+					},
+					IgnorePole = {
+						order = 4,
+						name = L["Ingore Poles"],
+						desc = L["If enabled will start fishing even if you don't have fishing pole equipped. Will not work if you have fish key set to \"None\"."],
+						type = "toggle",
+						disabled = function() return not E.private.sle.professions.fishing.EasyCast or E.private.sle.professions.fishing.CastButton == "None" end,
+						get = function(info) return E.private.sle.professions.fishing.IgnorePole end,
+						set = function(info, value) E.private.sle.professions.fishing.IgnorePole = value; end,
+					},
+					CastButton = {
+						order = 5,
+						name = L["Fish Key"],
+						desc = L["Hold this button while clicking to allow fishing action."],
+						type = "select",
+						disabled = function() return not E.private.sle.professions.fishing.EasyCast end,
+						get = function(info) return E.private.sle.professions.fishing.CastButton end,
+						set = function(info, value) E.private.sle.professions.fishing.CastButton = value; E:StaticPopup_Show("PRIVATE_RL") end,
+						values = {
+							["None"] = NONE,
+							["Shift"] = SHIFT_KEY,
+							["Alt"] = ALT_KEY,
+							["Control"] = CTRL_KEY,
+						},
+					},
+				},
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/pvp_c.lua b/ElvUI_SLE/options/pvp_c.lua
new file mode 100644
index 0000000..0c42fa0
--- /dev/null
+++ b/ElvUI_SLE/options/pvp_c.lua
@@ -0,0 +1,105 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local PVP = PVP
+local HONORABLE_KILLS = HONORABLE_KILLS
+local RANK = RANK
+local DUEL, PET_BATTLE_PVP_DUEL = DUEL, PET_BATTLE_PVP_DUEL
+local PvP = SLE:GetModule("PVP")
+local function configTable()
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.pvp = {
+		type = "group",
+		name = PVP,
+		order = 16,
+		args = {
+			header = {
+				order = 1,
+				type = "header",
+				name = PVP,
+			},
+			intro = {
+				order = 2,
+				type = "description",
+				name = L["Functions dedicated to player versus player modes."],
+			},
+			autorelease = {
+				type = "group",
+				name = L["PvP Auto Release"],
+				order = 9,
+				guiInline = true,
+				args = {
+					enable = {
+						order = 1,
+						type = "toggle",
+						name = L["Enable"],
+						desc = L["Automatically release body when killed inside a battleground."],
+						get = function(info) return E.db.sle.pvp.autorelease end,
+						set = function(info, value) E.db.sle.pvp.autorelease = value; end
+					},
+					rebirth = {
+						order = 2,
+						type = "toggle",
+						name = L["Check for rebirth mechanics"],
+						desc = L["Do not release if reincarnation or soulstone is up."],
+						disabled = function() return not E.db.sle.pvp.autorelease end,
+						get = function(info) return E.db.sle.pvp.rebirth end,
+						set = function(info, value) E.db.sle.pvp.rebirth = value; end
+					},
+				},
+			},
+			duels = {
+				order = 4,
+				type = "group",
+				name = DUEL,
+				guiInline = true,
+				get = function(info) return E.db.sle.pvp.duels[ info[#info] ] end,
+				set = function(info, value) E.db.sle.pvp.duels[ info[#info] ] = value end,
+				args = {
+					regular = {
+						order = 1,
+						type = "toggle",
+						name = PVP,
+						desc = L["Automatically cancel PvP duel requests."],
+					},
+					pet = {
+						order = 2,
+						type = "toggle",
+						name = PET_BATTLE_PVP_DUEL,
+						desc = L["Automatically cancel pet battles duel requests."],
+					},
+					announce = {
+						order = 3,
+						type = "toggle",
+						name = L["Announce"],
+						desc = L["Announce in chat if duel was rejected."],
+					},
+				},
+			},
+			BossBanner = {
+				order = 5,
+				type = "group",
+				name = KILLING_BLOWS,
+				guiInline = true,
+				get = function(info) return E.private.sle.pvp.KBbanner[ info[#info] ] end,
+				set = function(info, value) E.private.sle.pvp.KBbanner[ info[#info] ] = value end,
+				args = {
+					enable = {
+						order = 1,
+						type = "toggle",
+						name = L["Enable"],
+						desc = L["Show your PvP killing blows as a popup."],
+						set = function(info, value) E.private.sle.pvp.KBbanner[ info[#info] ] = value; E:StaticPopup_Show("PRIVATE_RL") end,
+					},
+					sound = {
+						order = 2,
+						type = "toggle",
+						name = L["KB Sound"],
+						desc = L["Play sound when Kkilling blows popup is shown."],
+						disabled = function() return not E.private.sle.pvp.KBbanner.enable end,
+					},
+				},
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/quests_c.lua b/ElvUI_SLE/options/quests_c.lua
index 7fe0490..c0207cc 100644
--- a/ElvUI_SLE/options/quests_c.lua
+++ b/ElvUI_SLE/options/quests_c.lua
@@ -1,102 +1,92 @@
-local E, L, V, P, G = unpack(ElvUI);
-
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local Q = SLE:GetModule("Quests")
+local DEFAULT, MINIMIZE, HIDE = DEFAULT, MINIMIZE, HIDE
+local QUESTS_LABEL = QUESTS_LABEL
+local GARRISON_LOCATION_TOOLTIP = GARRISON_LOCATION_TOOLTIP
+local BATTLEGROUNDS = BATTLEGROUNDS
+local ARENA = ARENA
+local DUNGEONS = DUNGEONS
+local SCENARIOS = SCENARIOS
+local RAIDS = RAIDS
 local function configTable()
-	E.Options.args.sle.args.options.args.general.args.quests = {
+	if not SLE.initialized then return end
+	local settings = {
+		["FULL"] = DEFAULT,
+		["COLLAPSED"] = MINIMIZE,
+		["HIDE"] = HIDE,
+	}
+	E.Options.args.sle.args.modules.args.quests = {
 		type = "group",
-		name = OBJECTIVES_TRACKER_LABEL,
-		order = 9,
+		name = QUESTS_LABEL,
+		order = 17,
 		args = {
 			header = {
 				order = 1,
 				type = "header",
-				name = OBJECTIVES_TRACKER_LABEL,
+				name = QUESTS_LABEL,
 			},
-			rested = {
+			autoReward = {
+				type = "toggle",
 				order = 2,
-				type = "select",
-				name = L["Rested"],
-				get = function(info) return E.db.sle.quests.visibility[ info[#info] ] end,
-				set = function(info, value) E.db.sle.quests.visibility[ info[#info] ] = value; E:GetModule('SLE_Quests'):ChangeState() end,
-				values = {
-					["FULL"] = DEFAULT,
-					["COLLAPSED"] = MINIMIZE,
-					["HIDE"] = HIDE,
-				},
-			},
-			garrison = {
-				order = 3,
-				type = "select",
-				name = GARRISON_LOCATION_TOOLTIP,
-				get = function(info) return E.db.sle.quests.visibility[ info[#info] ] end,
-				set = function(info, value) E.db.sle.quests.visibility[ info[#info] ] = value; E:GetModule('SLE_Quests'):ChangeState() end,
-				values = {
-					["FULL"] = DEFAULT,
-					["COLLAPSED"] = MINIMIZE,
-					["HIDE"] = HIDE,
-				},
-			},
-			bg = {
-				order = 4,
-				type = "select",
-				name = BATTLEGROUNDS,
-				get = function(info) return E.db.sle.quests.visibility[ info[#info] ] end,
-				set = function(info, value) E.db.sle.quests.visibility[ info[#info] ] = value; E:GetModule('SLE_Quests'):ChangeState() end,
-				values = {
-					["FULL"] = DEFAULT,
-					["COLLAPSED"] = MINIMIZE,
-					["HIDE"] = HIDE,
-				},
-			},
-			arena = {
-				order = 5,
-				type = "select",
-				name = ARENA,
-				get = function(info) return E.db.sle.quests.visibility[ info[#info] ] end,
-				set = function(info, value) E.db.sle.quests.visibility[ info[#info] ] = value; E:GetModule('SLE_Quests'):ChangeState() end,
-				values = {
-					["FULL"] = DEFAULT,
-					["COLLAPSED"] = MINIMIZE,
-					["HIDE"] = HIDE,
-				},
-			},
-			dungeon = {
-				order = 6,
-				type = "select",
-				name = DUNGEONS,
-				get = function(info) return E.db.sle.quests.visibility[ info[#info] ] end,
-				set = function(info, value) E.db.sle.quests.visibility[ info[#info] ] = value; E:GetModule('SLE_Quests'):ChangeState() end,
-				values = {
-					["FULL"] = DEFAULT,
-					["COLLAPSED"] = MINIMIZE,
-					["HIDE"] = HIDE,
-				},
-			},
-			scenario = {
-				order = 7,
-				type = "select",
-				name = SCENARIOS,
-				get = function(info) return E.db.sle.quests.visibility[ info[#info] ] end,
-				set = function(info, value) E.db.sle.quests.visibility[ info[#info] ] = value; E:GetModule('SLE_Quests'):ChangeState() end,
-				values = {
-					["FULL"] = DEFAULT,
-					["COLLAPSED"] = MINIMIZE,
-					["HIDE"] = HIDE,
-				},
+				name = L["Auto Reward"],
+				desc = L["Automatically selects areward with higherst selling price when quest is completed. Does not really finish the quest."],
+				get = function(info) return E.db.sle.quests.autoReward end,
+				set = function(info, value) E.db.sle.quests.autoReward = value; end,
 			},
-			raid = {
-				order = 8,
-				type = "select",
-				name = RAIDS,
+			logState = {
+				type = "group",
+				order = 10,
+				guiInline = true,
+				name = L["Quest Log Toggle"],
 				get = function(info) return E.db.sle.quests.visibility[ info[#info] ] end,
-				set = function(info, value) E.db.sle.quests.visibility[ info[#info] ] = value; E:GetModule('SLE_Quests'):ChangeState() end,
-				values = {
-					["FULL"] = DEFAULT,
-					["COLLAPSED"] = MINIMIZE,
-					["HIDE"] = HIDE,
+				set = function(info, value) E.db.sle.quests.visibility[ info[#info] ] = value; Q:ChangeState() end,
+				args = {
+					rested = {
+						order = 2,
+						type = "select",
+						name = L["Rested"],
+						values = settings,
+					},
+					garrison = {
+						order = 3,
+						type = "select",
+						name = GARRISON_LOCATION_TOOLTIP,
+						values = settings,
+					},
+					bg = {
+						order = 4,
+						type = "select",
+						name = BATTLEGROUNDS,
+						values = settings,
+					},
+					arena = {
+						order = 5,
+						type = "select",
+						name = ARENA,
+						values = settings,
+					},
+					dungeon = {
+						order = 6,
+						type = "select",
+						name = DUNGEONS,
+						values = settings,
+					},
+					scenario = {
+						order = 7,
+						type = "select",
+						name = SCENARIOS,
+						values = settings,
+					},
+					raid = {
+						order = 8,
+						type = "select",
+						name = RAIDS,
+						values = settings,
+					},
 				},
 			},
 		},
 	}
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/raidmarkers_c.lua b/ElvUI_SLE/options/raidmarkers_c.lua
index 640951e..ee84701 100644
--- a/ElvUI_SLE/options/raidmarkers_c.lua
+++ b/ElvUI_SLE/options/raidmarkers_c.lua
@@ -1,13 +1,14 @@
-local E, L, V, P, G = unpack(ElvUI);
-local RM = E:GetModule('SLE_RaidMarkers')
-
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local RM = SLE:GetModule('RaidMarkers')
+local SHIFT_KEY, CTRL_KEY, ALT_KEY = SHIFT_KEY, CTRL_KEY, ALT_KEY
+local AGGRO_WARNING_IN_PARTY = AGGRO_WARNING_IN_PARTY
 local function configTable()
-	E.Options.args.sle.args.options.args.raidmarkerbars = {
-		order = 4,
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.raidmarkerbars = {
+		order = 18,
 		type = "group",
 		name = L["Raid Markers"],
-		get = function(info) return E.db.sle.raidmarkers[ info[#info] ] end,
-		set = function(info, value) E.db.sle.raidmarkers[ info[#info] ] = value; RM:ToggleSettings() end,
+		get = function(info) return E.db.sle.raidmarkers[ info[#info] ] end,
 		args = {
 			marksheader = {
 				order = 1,
@@ -17,21 +18,22 @@ local function configTable()
 			info = {
 				order = 2,
 				type = "description",
-				name = L['Options for panels providing fast access to raid markers and flares.'],
+				name = L["Options for panels providing fast access to raid markers and flares."],
 			},
 			enable = {
 				order = 3,
 				type = "toggle",
-				name = ENABLE,
+				name = L["Enable"],
 				desc = L["Show/Hide raid marks."],
+				set = function(info, value) E.db.sle.raidmarkers.enable = value; RM:Visibility() end,
 			},
 			reset = {
 				order = 4,
 				type = 'execute',
-				name = L['Restore Defaults'],
+				name = L["Restore Defaults"],
 				desc = L["Reset these options to defaults"],
 				disabled = function() return not E.db.sle.raidmarkers.enable end,
-				func = function() E:GetModule('SLE'):Reset("marks") end,
+				func = function() SLE:Reset("marks") end,
 			},
 			space1 = {
 				order = 5,
@@ -42,30 +44,34 @@ local function configTable()
 				type = 'toggle',
 				order = 6,
 				name = L["Backdrop"],
-				disabled = function() return not E.db.sle.raidmarkers.enable end,
+				disabled = function() return not E.db.sle.raidmarkers.enable end,
+				set = function(info, value) E.db.sle.raidmarkers.backdrop = value; RM:Backdrop() end,
 			},
 			buttonSize = {
 				order = 7,
 				type = 'range',
-				name = L['Button Size'],
+				name = L["Button Size"],
 				min = 16, max = 40, step = 1,
 				disabled = function() return not E.db.sle.raidmarkers.enable end,
+				set = function(info, value) E.db.sle.raidmarkers.buttonSize = value; RM:UpdateBar() end,
 			},
 			spacing = {
 				order = 8,
 				type = 'range',
 				name = L["Button Spacing"],
-				min = 0, max = 10, step = 1,
+				min = -4, max = 10, step = 1,
 				disabled = function() return not E.db.sle.raidmarkers.enable end,
+				set = function(info, value) E.db.sle.raidmarkers.spacing = value; RM:UpdateBar() end,
 			},
 			orientation = {
 				order = 9,
 				type = 'select',
-				name = L['Orientation'],
+				name = L["Orientation"],
 				disabled = function() return not E.db.sle.raidmarkers.enable end,
+				set = function(info, value) E.db.sle.raidmarkers.orientation = value; RM:UpdateBar() end,
 				values = {
-					['HORIZONTAL'] = L['Horizontal'],
-					['VERTICAL'] = L['Vertical'],
+					["HORIZONTAL"] = L["Horizontal"],
+					["VERTICAL"] = L["Vertical"],
 				},
 			},
 			reverse = {
@@ -73,17 +79,19 @@ local function configTable()
 				order = 10,
 				name = L["Reverse"],
 				disabled = function() return not E.db.sle.raidmarkers.enable end,
+				set = function(info, value) E.db.sle.raidmarkers.reverse = value; RM:UpdateBar() end,
 			},
 			modifier = {
 				order = 11,
 				type = 'select',
-				name = L['Modifier Key'],
-				desc = L['Set the modifier key for placing world markers.'],
+				name = L["Modifier Key"],
+				desc = L["Set the modifier key for placing world markers."],
 				disabled = function() return not E.db.sle.raidmarkers.enable end,
+				set = function(info, value) E.db.sle.raidmarkers.modifier = value; RM:UpdateWorldMarkersAndTooltips() end,
 				values = {
-					['shift-'] = SHIFT_KEY,
-					['ctrl-'] = CTRL_KEY,
-					['alt-'] = ALT_KEY,
+					["shift-"] = SHIFT_KEY,
+					["ctrl-"] = CTRL_KEY,
+					["alt-"] = ALT_KEY,
 				},
 			},
 			visibility = {
@@ -91,11 +99,12 @@ local function configTable()
 				order = 12,
 				name = L["Visibility"],
 				disabled = function() return not E.db.sle.raidmarkers.enable end,
+				set = function(info, value) E.db.sle.raidmarkers.visibility = value; RM:Visibility() end,
 				values = {
-					DEFAULT = L['Default'],
-					INPARTY = AGGRO_WARNING_IN_PARTY,
-					ALWAYS = L['Always Display'],
-					CUSTOM = L["Custom"],
+					["DEFAULT"] = DEFAULT,
+					["INPARTY"] = AGGRO_WARNING_IN_PARTY,
+					["ALWAYS"] = L["Always Display"],
+					["CUSTOM"] = L["Custom"],
 				},
 			},
 			customVisibility = {
@@ -104,9 +113,10 @@ local function configTable()
 				width = 'full',
 				name = L["Visibility State"],
 				disabled = function() return E.db.sle.raidmarkers.visibility ~= "CUSTOM" or not E.db.sle.raidmarkers.enable end,
+				set = function(info, value) E.db.sle.raidmarkers.customVisibility = value; RM:Visibility() end,
 			},
 		},
 	}
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/raidroleicons_c.lua b/ElvUI_SLE/options/raidroleicons_c.lua
index 97e11f2..5ee7713 100644
--- a/ElvUI_SLE/options/raidroleicons_c.lua
+++ b/ElvUI_SLE/options/raidroleicons_c.lua
@@ -1,18 +1,20 @@
-local E, L, V, P, G = unpack(ElvUI);
-local SLE = E:GetModule('SLE')
-local B = E:GetModule("SLE_BlizzRaid")
-
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local B = SLE:GetModule("BlizzRaid")
+local RAID_CONTROL = RAID_CONTROL
 local function configTable()
-	E.Options.args.sle.args.options.args.general.args.raidmanager = {
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.raidmanager = {
 		type = "group",
-		name = RAID,
-		order = 80,
-		disabled = function() return SLE.oraenabled end,
+		name = RAID_CONTROL,
+		order = 19,
+		disabled = function() return SLE._Compatibility["oRA3"] end,
+		get = function(info) return E.db.sle.raidmanager[ info[#info] ] end,
+		set = function(info, value) E.db.sle.raidmanager[ info[#info] ] = value; B:CreateAndUpdateIcons() end,
 		args = {
 			header = {
 				order = 1,
 				type = "header",
-				name = RAID,
+				name = RAID_CONTROL,
 			},
 			info = {
 				order = 2,
@@ -23,17 +25,13 @@ local function configTable()
 				order = 3,
 				type = "toggle",
 				name = L["Show role icons"],
-				get = function(info) return E.db.sle.raidmanager.roles end,
-				set = function(info, value) E.db.sle.raidmanager.roles = value; E:GetModule("SLE_BlizzRaid"):CreateAndUpdateIcons() end,
 			},
 			level = {
 				order = 4,
 				type = "toggle",
 				name = L["Show level"],
-				get = function(info) return E.db.sle.raidmanager.level end,
-				set = function(info, value) E.db.sle.raidmanager.level = value; E:GetModule("SLE_BlizzRaid"):CreateAndUpdateIcons() end,
 			},
 		},
 	}
 end
-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/raidutility_c.lua b/ElvUI_SLE/options/raidutility_c.lua
deleted file mode 100644
index a4e2a71..0000000
--- a/ElvUI_SLE/options/raidutility_c.lua
+++ /dev/null
@@ -1,32 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local M = E:GetModule('Misc')
-
-local function configTable()
-	E.Options.args.sle.args.options.args.general.args.ru = {
-		type = "group",
-		name = L['Raid Utility'],
-		order = 10,
-		args = {
-			header = {
-				order = 1,
-				type = "header",
-				name = L['Raid Utility'],
-			},
-			info = {
-				order = 2,
-				type = "description",
-				name = "",
-			},
-			mouseover = {
-				order = 3,
-				type = "toggle",
-				name = L["Mouse Over"],
-				desc = L["Enabling mouse over will make ElvUI's raid utility show on mouse over instead of always showing."],
-				get = function(info) return E.db.sle.rumouseover end,
-				set = function(info, value) E.db.sle.rumouseover = value; M:RUReset() end,
-			},
-		},
-	}
-end
-
-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/skins_c.lua b/ElvUI_SLE/options/skins_c.lua
new file mode 100644
index 0000000..ab6fd1f
--- /dev/null
+++ b/ElvUI_SLE/options/skins_c.lua
@@ -0,0 +1,369 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local Sk, QK = SLE:GetModules("Skins", "QuestKingSkinner")
+
+local function configTable()
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.skins = {
+		order = 30,
+		type = "group",
+		name = L["Skins"],
+		childGroups = 'select',
+		args = {
+			info = {
+				order = 1,
+				type = "description",
+				name = L["SLE_SKINS_DESC"],
+			},
+			GoToSkins = {
+				order = 2,
+				type = "execute",
+				name = L["ElvUI Skins"],
+				func = function() SLE.ACD:SelectGroup("ElvUI", "skins") end,
+			},
+			objectiveTracker = {
+				order = 10,
+				type = "group",
+				name = OBJECTIVES_TRACKER_LABEL,
+				get = function(info) return E.private.sle.skins.objectiveTracker[ info[#info] ] end,
+				set = function(info, value) E.private.sle.skins.objectiveTracker[ info[#info] ] = value; E:StaticPopup_Show("PRIVATE_RL") end,
+				args = {
+					enable = {
+						order = 1,
+						type = "toggle",
+						name = L["Enable"],
+						disabled = function() return not E.private.skins.blizzard.enable or not E.private.skins.blizzard.objectiveTracker end,
+					},
+					space1 = {
+						order = 3,
+						type = "description",
+						name = "",
+					},
+					space2 = {
+						order = 3,
+						type = "description",
+						name = "",
+					},
+					texture = {
+						order = 3,
+						type = "select", dialogControl = "LSM30_Statusbar",
+						name = L["Texture"],
+						desc = L["Sets the texture for statusbars in quest tracker, e.g. bonus objectives/timers."],
+						disabled = function() return not E.private.sle.skins.objectiveTracker.enable or not E.private.skins.blizzard.enable or not E.private.skins.blizzard.objectiveTracker end,
+						values = AceGUIWidgetLSMlists.statusbar,
+					},
+					color = {
+						type = 'color',
+						order = 4,
+						name = L["Statusbar Color"],
+						disabled = function() return not E.private.sle.skins.objectiveTracker.enable or E.private.sle.skins.objectiveTracker.class or not E.private.skins.blizzard.enable or not E.private.skins.blizzard.objectiveTracker end,
+						get = function(info)
+							local t = E.private.sle.skins.objectiveTracker[ info[#info] ]
+							local d = V.sle.skins.objectiveTracker[info[#info]]
+							return t.r, t.g, t.b, t.a, d.r, d.g, d.b, d.a
+						end,
+						set = function(info, r, g, b, a)
+							E.private.sle.skins.objectiveTracker[ info[#info] ] = {}
+							local t = E.private.sle.skins.objectiveTracker[ info[#info] ]
+							t.r, t.g, t.b, t.a = r, g, b, a
+							E:StaticPopup_Show("PRIVATE_RL")
+						end,
+					},
+					class = {
+						order = 5,
+						type = "toggle",
+						name = L["Class Colored Statusbars"],
+						disabled = function() return not E.private.sle.skins.objectiveTracker.enable or not E.private.skins.blizzard.enable or not E.private.skins.blizzard.objectiveTracker end,
+					},
+					space3 = {
+						order = 6,
+						type = "description",
+						name = "",
+					},
+					underline = {
+						order = 7,
+						type = "toggle",
+						name = L["Underline"],
+						desc = L["Creates a cosmetic line under objective headers."],
+						disabled = function() return not E.private.sle.skins.objectiveTracker.enable or SLE._Compatibility["QuestKing"] end,
+						get = function(info) return E.db.sle.skins.objectiveTracker[ info[#info] ] end,
+						set = function(info, value) E.db.sle.skins.objectiveTracker[ info[#info] ] = value; Sk:Update_ObjectiveTrackerUnderlinesVisibility() end,
+					},
+					underlineColor = {
+						type = 'color',
+						order = 8,
+						name = L["Underline Color"],
+						disabled = function() return not E.private.sle.skins.objectiveTracker.enable or not E.db.sle.skins.objectiveTracker.underline or E.db.sle.skins.objectiveTracker.underlineClass or SLE._Compatibility["QuestKing"] end,
+						get = function(info)
+							local t = E.db.sle.skins.objectiveTracker[ info[#info] ]
+							local d = P.sle.skins.objectiveTracker[info[#info]]
+							return t.r, t.g, t.b, d.r, d.g, d.b
+						end,
+						set = function(info, r, g, b)
+							E.db.sle.skins.objectiveTracker[ info[#info] ] = {}
+							local t = E.db.sle.skins.objectiveTracker[ info[#info] ]
+							t.r, t.g, t.b = r, g, b
+							Sk:Update_ObjectiveTrackerUnderlinesColor()
+						end,
+					},
+					underlineClass = {
+						order = 9,
+						type = "toggle",
+						name = L["Class Colored Underline"],
+						disabled = function() return not E.private.sle.skins.objectiveTracker.enable or not E.db.sle.skins.objectiveTracker.underline or SLE._Compatibility["QuestKing"] end,
+						get = function(info) return E.db.sle.skins.objectiveTracker[ info[#info] ] end,
+						set = function(info, value) E.db.sle.skins.objectiveTracker[ info[#info] ] = value; Sk:Update_ObjectiveTrackerUnderlinesColor() end,
+					},
+					underlineHeight = {
+						order = 10,
+						type = 'range',
+						name = L["Underline Height"],
+						min = 1, max = 10, step = 1,
+						disabled = function() return not E.private.sle.skins.objectiveTracker.enable or not E.private.skins.blizzard.enable or not E.private.skins.blizzard.objectiveTracker or SLE._Compatibility["QuestKing"] end,
+					},
+					space4 = {
+						order = 11,
+						type = "description",
+						name = "",
+					},
+					space5 = {
+						order = 12,
+						type = "description",
+						name = "",
+					},
+					colorHeader = {
+						type = 'color',
+						order = 13,
+						name = L["Header Text Color"],
+						disabled = function() return not E.private.sle.skins.objectiveTracker.enable or E.db.sle.skins.objectiveTracker.classHeader end,
+						get = function(info)
+							local t = E.db.sle.skins.objectiveTracker[ info[#info] ]
+							local d = P.sle.skins.objectiveTracker[info[#info]]
+							return t.r, t.g, t.b, d.r, d.g, d.b
+						end,
+						set = function(info, r, g, b)
+							E.db.sle.skins.objectiveTracker[ info[#info] ] = {}
+							local t = E.db.sle.skins.objectiveTracker[ info[#info] ]
+							t.r, t.g, t.b = r, g, b
+							E:UpdateBlizzardFonts()
+						end,
+					},
+					classHeader = {
+						order = 14,
+						type = "toggle",
+						name = L["Class Colored Header Text"],
+						get = function(info) return E.db.sle.skins.objectiveTracker[ info[#info] ] end,
+						set = function(info, value) E.db.sle.skins.objectiveTracker[ info[#info] ] = value; E:UpdateBlizzardFonts() end,
+					},
+					-- QuestKing = {
+						-- order = 50,
+						-- type = "group",
+						-- name = "QuestKing",
+						-- guiInline = true,
+						-- hidden = function() return not SLE._Compatibility["QuestKing"] end,
+						-- disabled = function() return not E.private.sle.skins.QuestKing.enable end,
+						-- get = function(info) return E.private.sle.skins.QuestKing[ info[#info] ] end,
+						-- set = function(info, value) E.private.sle.skins.QuestKing[ info[#info] ] = value; _G["QuestKing"]:UpdateTrackerQuests() end,
+						-- args = {
+							-- info = {
+								-- order = 1,
+								-- type = "description",
+								-- name = L["SLE_SKINS_QUESTKING_DESC"],
+							-- },
+							-- GoToOF = {
+								-- order = 2,
+								-- type = "execute",
+								-- name = L["ElvUI Objective Tracker"],
+								-- disabled = false,
+								-- func = function() SLE.ACD:SelectGroup("ElvUI", "general", "objectiveFrame") end,
+							-- },
+							-- enable = {
+								-- order = 2,
+								-- type = "toggle",
+								-- name = L["Enable"],
+								-- disabled = false,
+								-- set = function(info, value) E.private.sle.skins.QuestKing[ info[#info] ] = value; E:StaticPopup_Show("PRIVATE_RL") end,
+							-- },
+							-- tooltipAnchor = {
+								-- order = 3,
+								-- type = "select",
+								-- name = L["Tooltip Anchor"],
+								-- set = function(info, value) E.private.sle.skins.QuestKing[ info[#info] ] = value; end,
+								-- values = {
+									-- ["ANCHOR_BOTTOMLEFT"] = "ANCHOR_BOTTOMLEFT",
+									-- ["ANCHOR_BOTTOMRIGHT"] = "ANCHOR_BOTTOMRIGHT",
+									-- ["ANCHOR_CURSOR"] = "ANCHOR_CURSOR",
+									-- ["ANCHOR_LEFT"] = "ANCHOR_LEFT",
+									-- ["ANCHOR_NONE"] = "ANCHOR_NONE",
+									-- ["ANCHOR_PRESERVE"] = "ANCHOR_PRESERVE",
+									-- ["ANCHOR_RIGHT"] = "ANCHOR_RIGHT",
+									-- ["ANCHOR_TOPLEFT"] = "ANCHOR_TOPLEFT",
+									-- ["ANCHOR_TOPRIGHT"] = "ANCHOR_TOPRIGHT",
+								-- },
+							-- },
+							-- tooltipScale = {
+								-- order = 4,
+								-- type = 'range',
+								-- name = L["Tooltip Scale"],
+								-- min = 0.3, max = 5, step = 0.01,
+								-- set = function(info, value) E.private.sle.skins.QuestKing[ info[#info] ] = value; end,
+							-- },
+							-- trackerSize = {
+								-- order = 5,
+								-- type = 'range',
+								-- name = L["Tracking Icon Size"],
+								-- min = 8, max = 40, step = 1,
+								-- set = function(info, value) E.private.sle.skins.QuestKing[ info[#info] ] = value;  end,
+							-- },
+							-- trackerIcon = {
+								-- order = 6, type = "select",
+								-- name = L["Tracking Icon"],
+								-- set = function(info, value) E.private.sle.skins.QuestKing[ info[#info] ] = value; end,
+								-- values = {
+									-- ["DEFAULT"] = DEFAULT..[[ |TInterface\Scenarios\ScenarioIcon-Combat:14:14:-1:0|t]],
+									-- ["Skull"] = RAID_TARGET_8..[[ |TInterface\AddOns\ElvUI_SLE\media\textures\Skull:14:14:-1:0|t]],
+									-- ["LFG"] = LFG_TITLE..[[ |TInterface\LFGFRAME\BattlenetWorking0:14:14:-1:0|t]],
+									-- ["CUSTOM"] = L["Custom"],
+								-- },
+							-- },
+							-- trackerIconCustom = {
+								-- order = 7,
+								-- type = 'input',
+								-- width = 'full',
+								-- name = L["Custom Texture"],
+								-- set = function(info, value) E.private.sle.skins.QuestKing[ info[#info] ] = value; end,
+							-- },
+							-- QuestTypes = {
+								-- order = 30,
+								-- type = "group",
+								-- name = L["Quest Type Indications"],
+								-- guiInline = true,
+								-- get = function(info, value) return E.private.sle.skins.QuestKing.questTypes[ info[#info] ] end,
+								-- set = function(info, value) E.private.sle.skins.QuestKing.questTypes[ info[#info] ] = value; _G["QuestKing"]:UpdateTrackerQuests() end,
+								-- args = {
+									-- daily = {
+										-- order = 1, type = "select",
+										-- name = DAILY,
+										-- values = {
+											-- ["DEFAULT"] = DEFAULT,
+											-- ["FULL"] = L["Full"],
+											-- ["ICON"] = L["Icon"].." |T"..QK.Icons["Daily"]..":14|t",
+										-- },
+									-- },
+									-- weekly = {
+										-- order = 2, type = "select",
+										-- name = WEEKLY,
+										-- values = {
+											-- ["DEFAULT"] = DEFAULT,
+											-- ["FULL"] = L["Full"],
+											-- ["ICON"] = L["Icon"].." |T"..QK.Icons["Weekly"]..":14|t",
+										-- },
+									-- },
+									-- group = {
+										-- order = 3, type = "select",
+										-- name = GROUP,
+										-- values = {
+											-- ["DEFAULT"] = DEFAULT,
+											-- ["FULL"] = L["Full"],
+										-- },
+									-- },
+									-- raid = {
+										-- order = 4, type = "select",
+										-- name = RAID,
+										-- values = {
+											-- ["DEFAULT"] = DEFAULT,
+											-- ["FULL"] = L["Full"],
+										-- },
+									-- },
+									-- dungeon = {
+										-- order = 5, type = "select",
+										-- name = TRACKER_HEADER_DUNGEON,
+										-- values = {
+											-- ["DEFAULT"] = DEFAULT,
+											-- ["FULL"] = L["Full"],
+										-- },
+									-- },
+									-- heroic = {
+										-- order = 6, type = "select",
+										-- name = PLAYER_DIFFICULTY2,
+										-- values = {
+											-- ["DEFAULT"] = DEFAULT,
+											-- ["FULL"] = L["Full"],
+										-- },
+									-- },
+									-- legend = {
+										-- order = 7, type = "select",
+										-- name = ITEM_QUALITY5_DESC,
+										-- values = {
+											-- ["DEFAULT"] = DEFAULT,
+											-- ["FULL"] = L["Full"],
+										-- },
+									-- },
+									-- scenario = {
+										-- order = 8, type = "select",
+										-- name = TRACKER_HEADER_SCENARIO,
+										-- values = {
+											-- ["DEFAULT"] = DEFAULT,
+											-- ["FULL"] = L["Full"],
+										-- },
+									-- },
+								-- },
+							-- },
+							-- clickTemplate = {
+								-- order = 50,
+								-- type = "select",
+								-- name = L["Clicks Registration"],
+								-- desc = L["SLE_SKINS_QUESTKING_TEMPLATE_DESC"],
+								-- set = function(info, value)
+									-- E.private.sle.skins.QuestKing[ info[#info] ] = value;
+								-- end,
+								-- values = {
+									-- ["QuestKing"] = "Quest King",
+									-- ["Blizzlike"] = "Blizzlike",
+								-- },
+							-- },
+						-- },
+					-- },
+				},
+			},
+			merchant = {
+				order = 20,
+				type = "group",
+				name = L["Merchant Frame"],
+				get = function(info) return E.private.sle.skins.merchant[ info[#info] ] end,
+				set = function(info, value) E.private.sle.skins.merchant[ info[#info] ] = value; E:StaticPopup_Show("PRIVATE_RL") end,
+				args = {
+					enable = {
+						order = 1,
+						type = "toggle",
+						name = L["Enable"],
+					},
+					subpages = {
+						order = 2,
+						type = 'range',
+						name = L["Subpages"],
+						desc = L["Subpages are blocks of 10 items. This option set how many of subpages will be shown on a single page."],
+						min = 2, max = 5, step = 1,
+						disabled = function() return not E.private.sle.skins.merchant.enable end,
+					},
+				},
+			},
+			petbattles = {
+				order = 30,
+				type = "group",
+				name = L["Pet Battles skinning"],
+				args = {
+					enable = {
+						order = 1,
+						type = "toggle",
+						name = L["Enable"],
+						desc = L["Make some elements of pet battles movable via toggle anchors."],
+						get = function(info) return E.private.sle.skins.petbattles.enable end,
+						set = function(info, value) E.private.sle.skins.petbattles.enable = value; E:StaticPopup_Show("PRIVATE_RL") end,
+					},
+				},
+			},
+		},
+	}
+end
+
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/threat_c.lua b/ElvUI_SLE/options/threat_c.lua
deleted file mode 100644
index 7ac6f42..0000000
--- a/ElvUI_SLE/options/threat_c.lua
+++ /dev/null
@@ -1,62 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-local SLT = E:GetModule('SLE_Threat');
-
-local function configTable()
-	E.Options.args.sle.args.options.args.general.args.threat = {
-		type = "group",
-		name = L['Threat'],
-		order = 55,
-		args = {
-			header = {
-				order = 1,
-				type = "header",
-				name = L['Threat'],
-			},
-			--[[intro = {
-				order = 2,
-				type = "description",
-				name = "Some threat changes",
-			},]]
-			enabled = {
-				order = 3,
-				type = "toggle",
-				name = ENABLE,
-				--desc = L["Show/Hide UI buttons."],
-				get = function(info) return E.db.sle.threat.enable end,
-				set = function(info, value) E.db.sle.threat.enable = value; SLT:Update(); SLT:UpdatePosition() end,
-			},
-			space1 = {
-				order = 4,
-				type = 'description',
-				name = "",
-			},
-			space2 = {
-				order = 5,
-				type = 'description',
-				name = "",
-			},
-			position = {
-				order = 6,
-				type = 'select',
-				name = L['Position'],
-				desc = L['Adjust the position of the threat bar to any of the datatext panels in ElvUI & S&L.'],
-				values = {
-					['Top_Center'] = "Top Panel",
-					['Bottom_Panel'] = "Bottom Panel",
-					['DP_1'] = "Data Panel 1",
-					['DP_2'] = "Data Panel 2",
-					['DP_3'] = "Data Panel 3",
-					['DP_4'] = "Data Panel 4",
-					['DP_5'] = "Data Panel 5",
-					['DP_6'] = "Data Panel 6",
-					['LeftChatDataPanel'] = L['Left Chat'],
-					['RightChatDataPanel'] = L['Right Chat'],
-				},
-				get = function(info) return E.db.sle.threat.position end,
-				set = function(info, value) E.db.sle.threat.position = value; SLT:UpdatePosition() end,
-			},
-		},
-	}
-end
-
-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/tooltip_c.lua b/ElvUI_SLE/options/tooltip_c.lua
index d5af8bb..d9f4ecd 100644
--- a/ElvUI_SLE/options/tooltip_c.lua
+++ b/ElvUI_SLE/options/tooltip_c.lua
@@ -1,8 +1,10 @@
-local E, L, V, P, G = unpack(ElvUI);
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local RP = SLE:GetModule("RaidProgress")

 local function configTable()
-	E.Options.args.sle.args.options.args.general.args.tooltip = {
-		order = 66,
+	if not SLE.initialized then return end
+	E.Options.args.sle.args.modules.args.tooltip = {
+		order = 20,
 		type = "group",
 		get = function(info) return E.db.sle.tooltip[ info[#info] ] end,
 		name = L["Tooltip"],
@@ -12,11 +14,6 @@ local function configTable()
 				type = "header",
 				name = L["Tooltip"],
 			},
-			--[[intro = {
-				order = 2,
-				type = 'description',
-				name = L["Tooltip enhancements"],
-			},]]
 			space1 = {
 				order = 4,
 				type = 'description',
@@ -28,19 +25,22 @@ local function configTable()
 				name = L["Faction Icon"],
 				desc = L["Show faction icon to the left of player's name on tooltip."],
 				disabled = function() return not E.private.tooltip.enable end,
-				--get = function(info) return E.db.sle.tooltip.showFaction end,
 				set = function(info, value) E.db.sle.tooltip.showFaction = value end,
 			},
-			space2 = {
+			alwaysCompareItems = {
 				order = 6,
-				type = 'description',
-				name = "",
+				type = 'toggle',
+				name = L["Always Compare Items"],
+				-- desc = L["Show faction icon to the left of player's name on tooltip."],
+				disabled = function() return not E.private.tooltip.enable end,
+				set = function(info, value) E.db.sle.tooltip.alwaysCompareItems = value; SLE:SetCompareItems() end,
 			},
 			offset = {
 				type = "group",
 				name = L["Tooltip Cursor Offset"],
 				order = 7,
 				guiInline = true,
+				set = function(info, value) E.db.sle.tooltip[ info[#info] ] = value end,
 				disabled = function() return not E.private.tooltip.enable or not E.db.tooltip.cursorAnchor end,
 				args = {
 					intro = {
@@ -59,8 +59,6 @@ local function configTable()
 						name = L["Tooltip X-offset"],
 						desc = L["Offset the tooltip on the X-axis."],
 						min = -200, max = 200, step = 1,
-						--get = function(info) return E.db.sle.tooltip.xOffset end,
-						set = function(info, value) E.db.sle.tooltip[ info[#info] ] = value end,
 					},
 					yOffset = {
 						order = 32,
@@ -68,8 +66,43 @@ local function configTable()
 						name = L["Tooltip Y-offset"],
 						desc = L["Offset the tooltip on the Y-axis."],
 						min = -200, max = 200, step = 1,
-						--get = function(info) return E.db.sle.tooltip.yOffset
-						set = function(info, value) E.db.sle.tooltip[ info[#info] ] = value end,
+					},
+				},
+			},
+			RaidProg = {
+				type = "group",
+				name = L["Raid Progression"],
+				order = 12,
+				guiInline = true,
+				get = function(info) return E.db.sle.tooltip.RaidProg[ info[#info] ] end,
+				set = function(info, value) E.db.sle.tooltip.RaidProg[ info[#info] ] = value end,
+				disabled = function() return not E.private.tooltip.enable end,
+				args = {
+					enable = {
+						order = 1,
+						type = 'toggle',
+						name = L["Enable"],
+						desc = L["Show raid experience of character in tooltip (requires holding shift)."],
+					},
+					NameStyle = {
+						order = 2,
+						name = L["Name Style"],
+						type = "select",
+						set = function(info, value) E.db.sle.tooltip.RaidProg[ info[#info] ] = value; T.twipe(RP.Cache) end,
+						values = {
+							["LONG"] = L["Full"],
+							["SHORT"] = L["Short"],
+						},
+					},
+					DifStyle = {
+						order = 3,
+						name = L["Difficulty Style"],
+						type = "select",
+						set = function(info, value) E.db.sle.tooltip.RaidProg[ info[#info] ] = value; T.twipe(RP.Cache) end,
+						values = {
+							["LONG"] = L["Full"],
+							["SHORT"] = L["Short"],
+						},
 					},
 				},
 			},
@@ -77,4 +110,4 @@ local function configTable()
 	}
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/uibuttons_c.lua b/ElvUI_SLE/options/uibuttons_c.lua
index bd4888a..a2de675 100644
--- a/ElvUI_SLE/options/uibuttons_c.lua
+++ b/ElvUI_SLE/options/uibuttons_c.lua
@@ -1,5 +1,5 @@
-local E, L, V, P, G = unpack(ElvUI);
-local UB = E:GetModule('SLE_UIButtons')
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local UB = SLE:GetModule('UIButtons')

 local positionValues = {
 	TOPLEFT = 'TOPLEFT',
@@ -14,11 +14,12 @@ local positionValues = {
 };

 local function configTable()
+	if not SLE.initialized then return end
 	local Bar = UB.Holder
-	E.Options.args.sle.args.options.args.general.args.uibuttons = {
+	E.Options.args.sle.args.modules.args.uibuttons = {
 		type = "group",
 		name = L["UI Buttons"],
-		order = 77,
+		order = 21,
 		args = {
 			header = {
 				order = 1,
@@ -33,7 +34,7 @@ local function configTable()
 			enabled = {
 				order = 3,
 				type = "toggle",
-				name = ENABLE,
+				name = L["Enable"],
 				desc = L["Show/Hide UI buttons."],
 				get = function(info) return E.db.sle.uibuttons.enable end,
 				set = function(info, value) E.db.sle.uibuttons.enable = value; Bar:ToggleShow() end
@@ -43,8 +44,8 @@ local function configTable()
 				name = L["UI Buttons Style"],
 				type = "select",
 				values = {
-					["classic"] = L['Classic'],
-					["dropdown"] = L['Dropdown'],
+					["classic"] = L["Classic"],
+					["dropdown"] = L["Dropdown"],
 				},
 				disabled = function() return not E.db.sle.uibuttons.enable end,
 				get = function(info) return E.private.sle.uiButtonStyle end,
@@ -58,7 +59,7 @@ local function configTable()
 			size = {
 				order = 6,
 				type = "range",
-				name = L['Size'],
+				name = L["Size"],
 				desc = L["Sets size of buttons"],
 				min = 12, max = 25, step = 1,
 				disabled = function() return not E.db.sle.uibuttons.enable end,
@@ -68,9 +69,9 @@ local function configTable()
 			spacing = {
 				order = 7,
 				type = "range",
-				name = L['Button Spacing'],
-				desc = L['The spacing between buttons.'],
-				min = 1, max = 10, step = 1,
+				name = L["Button Spacing"],
+				desc = L["The spacing between buttons."],
+				min = -4, max = 10, step = 1,
 				disabled = function() return not E.db.sle.uibuttons.enable end,
 				get = function(info) return E.db.sle.uibuttons.spacing end,
 				set = function(info, value) E.db.sle.uibuttons.spacing = value; Bar:FrameSize() end,
@@ -106,8 +107,8 @@ local function configTable()
 				desc = L["Layout for UI buttons."],
 				type = "select",
 				values = {
-					["horizontal"] = L['Horizontal'],
-					["vertical"] = L['Vertical'],
+					["horizontal"] = L["Horizontal"],
+					["vertical"] = L["Vertical"],
 				},
 				disabled = function() return not E.db.sle.uibuttons.enable end,
 				get = function(info) return E.db.sle.uibuttons.orientation end,
@@ -116,27 +117,27 @@ local function configTable()
 			point = {
 				type = 'select',
 				order = 13,
-				name = L['Anchor Point'],
-				desc = L['What point of dropdown will be attached to the toggle button.'],
+				name = L["Anchor Point"],
+				desc = L["What point of dropdown will be attached to the toggle button."],
 				disabled = function() return not E.db.sle.uibuttons.enable or E.private.sle.uiButtonStyle == "classic" end,
 				get = function(info) return E.db.sle.uibuttons.point end,
 				set = function(info, value) E.db.sle.uibuttons.point = value; Bar:FrameSize() end,
-				values = positionValues,
+				values = positionValues,
 			},
 			anchor = {
 				type = 'select',
 				order = 14,
-				name = L['Attach To'],
-				desc = L['What point to anchor dropdown on the toggle button.'],
+				name = L["Attach To"],
+				desc = L["What point to anchor dropdown on the toggle button."],
 				disabled = function() return not E.db.sle.uibuttons.enable or E.private.sle.uiButtonStyle == "classic" end,
 				get = function(info) return E.db.sle.uibuttons.anchor end,
 				set = function(info, value) E.db.sle.uibuttons.anchor = value; Bar:FrameSize() end,
-				values = positionValues,
+				values = positionValues,
 			},
 			xoffset = {
 				order = 15,
 				type = "range",
-				name = L['X-Offset'],
+				name = L["X-Offset"],
 				desc = L["Horizontal offset of dropdown from the toggle button."],
 				min = -10, max = 10, step = 1,
 				disabled = function() return not E.db.sle.uibuttons.enable or E.private.sle.uiButtonStyle == "classic" end,
@@ -146,7 +147,7 @@ local function configTable()
 			yoffset = {
 				order = 16,
 				type = "range",
-				name = L['Y-Offset'],
+				name = L["Y-Offset"],
 				desc = L["Vertical offset of dropdown from the toggle button."],
 				min = -10, max = 10, step = 1,
 				disabled = function() return not E.db.sle.uibuttons.enable or E.private.sle.uiButtonStyle == "classic" end,
@@ -181,7 +182,7 @@ local function configTable()
 					enabled = {
 						order = 1,
 						type = "toggle",
-						name = ENABLE,
+						name = L["Enable"],
 						desc = L["Use quick access (on right click) for this button."],
 						get = function(info) return E.db.sle.uibuttons.Config.enable end,
 						set = function(info, value) E.db.sle.uibuttons.Config.enable = value end
@@ -212,7 +213,7 @@ local function configTable()
 					enabled = {
 						order = 1,
 						type = "toggle",
-						name = ENABLE,
+						name = L["Enable"],
 						desc = L["Use quick access (on right click) for this button."],
 						get = function(info) return E.db.sle.uibuttons.Addon.enable end,
 						set = function(info, value) E.db.sle.uibuttons.Addon.enable = value end
@@ -241,7 +242,7 @@ local function configTable()
 					enabled = {
 						order = 1,
 						type = "toggle",
-						name = ENABLE,
+						name = L["Enable"],
 						desc = L["Use quick access (on right click) for this button."],
 						get = function(info) return E.db.sle.uibuttons.Status.enable end,
 						set = function(info, value) E.db.sle.uibuttons.Status.enable = value end
@@ -270,7 +271,7 @@ local function configTable()
 					enabled = {
 						order = 1,
 						type = "toggle",
-						name = ENABLE,
+						name = L["Enable"],
 						desc = L["Use quick access (on right click) for this button."],
 						get = function(info) return E.db.sle.uibuttons.Roll.enable end,
 						set = function(info, value) E.db.sle.uibuttons.Roll.enable = value end
@@ -298,4 +299,4 @@ local function configTable()
 	}
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/unitframes_c.lua b/ElvUI_SLE/options/unitframes_c.lua
index d2e7fe6..dfe9e05 100644
--- a/ElvUI_SLE/options/unitframes_c.lua
+++ b/ElvUI_SLE/options/unitframes_c.lua
@@ -1,11 +1,11 @@
-local E, L, V, P, G = unpack(ElvUI);
-local UF = E:GetModule('UnitFrames')
-local CAN_HAVE_CLASSBAR = (E.myclass == "PALADIN" or E.myclass == "DRUID" or E.myclass == "DEATHKNIGHT" or E.myclass == "WARLOCK" or E.myclass == "PRIEST" or E.myclass == "MONK" or E.myclass == 'MAGE')
-
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local UF = E:GetModule('UnitFrames');
+local SUF = SLE:GetModule("UnitFrames")
 local texPath = [[Interface\AddOns\ElvUI_SLE\media\textures\role\]]
 local texPathE = [[Interface\AddOns\ElvUI\media\textures\]]

 local function configTable()
+	if not SLE.initialized then return end
 	local positionValues = {
 		TOPLEFT = 'TOPLEFT',
 		LEFT = 'LEFT',
@@ -17,81 +17,420 @@ local function configTable()
 		TOP = 'TOP',
 		BOTTOM = 'BOTTOM',
 	};
+
+	local function CreateOfflineConfig(group)
+		local config = {
+			order = 5,
+			type = "group",
+			guiInline = true,
+			name = L["Offline Indicator"],
+			get = function(info) return E.db.sle.unitframes.unit[group].offline[ info[#info] ] end,
+			set = function(info, value) E.db.sle.unitframes.unit[group].offline[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup(group) end,
+			args = {
+				enable = { order = 1, type = "toggle", name = L["Enable"] },
+				size = { order = 2, type = 'range', name = L["Size"], min = 10, max = 120, step = 1 },
+				xOffset = { order = 3, type = 'range', name = L["X-Offset"], min = -600, max = 600, step = 1 },
+				yOffset = { order = 4, type = 'range', name = L["Y-Offset"], min = -600, max = 600, step = 1 },
+				texture = {
+					order = 5,
+					type = "select",
+					name = L["Texture"],
+					values = {
+						["ALERT"] = [[|TInterface\DialogFrame\UI-Dialog-Icon-AlertNew:14|t]],
+						["ARTHAS"] =[[|TInterface\LFGFRAME\UI-LFR-PORTRAIT:14|t]],
+						["SKULL"] = [[|TInterface\LootFrame\LootPanel-Icon:14|t]],
+						["PASS"] = [[|TInterface\PaperDollInfoFrame\UI-GearManager-LeaveItem-Transparent:14|t]],
+						["NOTREADY"] = [[|TInterface\RAIDFRAME\ReadyCheck-NotReady:14|t]],
+						["CUSTOM"] = L["Custom"],
+					},
+				},
+				CustomTexture = {
+					order = 6,
+					type = 'input',
+					width = 'full',
+					name = L["Custom Texture"],
+					disabled = function() return E.db.sle.unitframes.unit[group].offline.texture ~= "CUSTOM" end,
+				},
+			},
+		}
+		return config
+	end

-	E.Options.args.sle.args.options.args.general.args.unitframes = {
+	E.Options.args.sle.args.modules.args.unitframes = {
 		type = "group",
 		name = L["UnitFrames"],
-		order = 88,
+		order = 22,
+		childGroups = "select",
+		disabled = function() return not E.private.unitframe.enable end,
 		args = {
-			header = {
-				order = 1,
-				type = "header",
-				name = L["UnitFrames"],
-			},
 			info = {
-				order = 2,
+				order = 1,
 				type = "description",
 				name = L["Options for customizing unit frames. Please don't change these setting when ElvUI's testing frames for bosses and arena teams are shown. That will make them invisible until retoggling."],
 			},
 			Reset = {
-				order = 3,
+				order = 2,
 				type = 'execute',
-				name = L['Restore Defaults'],
+				name = L["Restore Defaults"],
 				desc = L["Reset these options to defaults"],
-				func = function() E:GetModule('SLE'):Reset("unitframes") end,
+				func = function() SLE:Reset("unitframes") end,
+			},
+			roleicons = {
+				order = 3,
+				type = "select",
+				name = L["LFG Icons"],
+				desc = L["Choose what icon set will unitframes and chat use."],
+				get = function(info) return E.db.sle.unitframes.roleicons end,
+				set = function(info, value) E.db.sle.unitframes.roleicons = value; E:GetModule('Chat'):CheckLFGRoles(); UF:UpdateAllHeaders() end,
+				values = {
+					["ElvUI"] = "ElvUI ".."|T"..texPathE.."tank:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPathE.."healer:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPathE.."dps:15:15:0:0:64:64:2:56:2:56|t ",
+					["SupervillainUI"] = "Supervillain UI ".."|T"..texPath.."svui-tank:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."svui-healer:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."svui-dps:15:15:0:0:64:64:2:56:2:56|t ",
+					["Blizzard"] = "Blizzard ".."|T"..texPath.."blizz-tank:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."blizz-healer:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."blizz-dps:15:15:0:0:64:64:2:56:2:56|t ",
+					["MiirGui"] = "MiirGui ".."|T"..texPath.."mg-tank:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."mg-healer:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."mg-dps:15:15:0:0:64:64:2:56:2:56|t ",
+				},
+			},
+			player = {
+				order = 10,
+				type = "group",
+				name = L["Player Frame"],
+				args = {
+					higherPortrait = {
+						order = 1, type = "toggle",
+						name = L["Higher Overlay Portrait"],
+						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
+						get = function(info) return E.db.sle.unitframes.unit.player[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.player[ info[#info] ] = value; UF:CreateAndUpdateUF('player'); end,
+					},
+					portraitAlpha = {
+						order = 2, type = 'range',
+						name = L["Overlay Portrait Alpha"],
+						isPercent = true,
+						 min = 0, max = 1, step = 0.01,
+						get = function(info) return E.db.sle.unitframes.unit.player[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.player[ info[#info] ] = value; UF:CreateAndUpdateUF('player'); end,
+					},
+					combaticon = {
+						order = 3,
+						type = "group",
+						name = L["Combat Icon"],
+						guiInline = true,
+						get = function(info) return E.db.sle.unitframes.unit.player.combatico[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.player.combatico[ info[#info] ] = value; ElvUF_Player.Combat:PostUpdate(); SUF:TestCombat() end,
+						args = {
+							xoffset = { order = 1, type = 'range', name = L["X-Offset"], min = -300, max = 300, step = 1 },
+							yoffset = { order = 2, type = 'range', name = L["Y-Offset"], min = -150, max = 150, step = 1 },
+							size = { order = 3, type = 'range', name = L["Size"], min = 10, max = 60, step = 1 },
+							red = { order = 4, type = "toggle", name = L["Red Icon"] },
+							texture = {
+								order = 5,
+								type = "select",
+								name = L["Texture"],
+								values = {
+									["DEFAULT"] = DEFAULT,
+									["PLATINUM"] = [[|TInterface\Challenges\ChallengeMode_Medal_Platinum:14|t]],
+									["ATTACK"] = [[|TInterface\CURSOR\Attack:14|t]],
+									["ALERT"] = [[|TInterface\DialogFrame\UI-Dialog-Icon-AlertNew:14|t]],
+									["SKULL"] = [[|TInterface\LootFrame\LootPanel-Icon:14|t]],
+									["ARTHAS"] =[[|TInterface\LFGFRAME\UI-LFR-PORTRAIT:14|t]],
+									["SVUI"] = "Supervillian UI",
+								},
+							},
+						},
+					},
+					rested = {
+						order = 4,
+						type = "group",
+						name = L["Rest Icon"],
+						guiInline = true,
+						get = function(info) return E.db.sle.unitframes.unit.player.rested[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.player.rested[ info[#info] ] = value; UF:Configure_RestingIndicator(_G["ElvUF_Player"]) end,
+						args = {
+							xoffset = { order = 1, type = 'range', name = L["X-Offset"], min = -300, max = 300, step = 1 },
+							yoffset = { order = 2, type = 'range', name = L["Y-Offset"], min = -150, max = 150, step = 1 },
+							size = { order = 3, type = 'range', name = L["Size"], min = 10, max = 60, step = 1 },
+							texture = {
+								order = 5,
+								type = "select",
+								name = L["Texture"],
+								values = {
+									["DEFAULT"] = DEFAULT,
+									["SVUI"] = "Supervillian UI",
+									["CUSTOM"] = L["Custom"],
+								},
+							},
+							customTexture = {
+								order = 6,
+								type = 'input',
+								width = 'full',
+								name = L["Custom Texture"],
+								disabled = function() return E.db.sle.unitframes.unit.player.rested.texture ~= "CUSTOM" end,
+							},
+						},
+					},
+				},
+			},
+			target = {
+				order = 11,
+				type = "group",
+				name = L["Target Frame"],
+				args = {
+					higherPortrait = {
+						order = 1, type = "toggle",
+						name = L["Higher Overlay Portrait"],
+						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
+						get = function(info) return E.db.sle.unitframes.unit.target[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.target[ info[#info] ] = value; UF:CreateAndUpdateUF('target'); end,
+					},
+					portraitAlpha = {
+						order = 2, type = 'range',
+						name = L["Overlay Portrait Alpha"],
+						isPercent = true,
+						 min = 0, max = 1, step = 0.01,
+						get = function(info) return E.db.sle.unitframes.unit.target[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.target[ info[#info] ] = value; UF:CreateAndUpdateUF('target'); end,
+					},
+				},
+			},
+			focus = {
+				order = 12,
+				type = "group",
+				name = L["Focus Frame"],
+				args = {
+					higherPortrait = {
+						order = 1, type = "toggle",
+						name = L["Higher Overlay Portrait"],
+						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
+						get = function(info) return E.db.sle.unitframes.unit.focus[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.focus[ info[#info] ] = value; UF:CreateAndUpdateUF('focus'); end,
+					},
+					portraitAlpha = {
+						order = 2, type = 'range',
+						name = L["Overlay Portrait Alpha"],
+						isPercent = true,
+						 min = 0, max = 1, step = 0.01,
+						get = function(info) return E.db.sle.unitframes.unit.focus[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.focus[ info[#info] ] = value; UF:CreateAndUpdateUF('focus'); end,
+					},
+				},
+			},
+			party = {
+				order = 20,
+				type = "group",
+				name = L["Party Frames"],
+				args = {
+					configureToggle = {
+						order = 1,
+						type = 'execute',
+						name = L["Display Frames"],
+						func = function()
+							UF:HeaderConfig(ElvUF_Party, ElvUF_Party.forceShow ~= true or nil)
+						end,
+					},
+					higherPortrait = {
+						order = 2, type = "toggle",
+						name = L["Higher Overlay Portrait"],
+						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
+						get = function(info) return E.db.sle.unitframes.unit.party[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.party[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('party') end,
+					},
+					portraitAlpha = {
+						order = 3, type = 'range',
+						name = L["Overlay Portrait Alpha"],
+						isPercent = true,
+						 min = 0, max = 1, step = 0.01,
+						get = function(info) return E.db.sle.unitframes.unit.party[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.party[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('party') end,
+					},
+					offline = CreateOfflineConfig("party")
+				},
+			},
+			raid = {
+				order = 21,
+				type = "group",
+				name = L["Raid Frames"],
+				args = {
+					configureToggle = {
+						order = 1,
+						type = 'execute',
+						name = L["Display Frames"],
+						func = function()
+							UF:HeaderConfig(_G['ElvUF_Raid'], _G['ElvUF_Raid'].forceShow ~= true or nil)
+						end,
+					},
+					higherPortrait = {
+						order = 2, type = "toggle",
+						name = L["Higher Overlay Portrait"],
+						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
+						get = function(info) return E.db.sle.unitframes.unit.raid[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.raid[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('raid') end,
+					},
+					portraitAlpha = {
+						order = 3, type = 'range',
+						name = L["Overlay Portrait Alpha"],
+						isPercent = true,
+						 min = 0, max = 1, step = 0.01,
+						get = function(info) return E.db.sle.unitframes.unit.raid[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.raid[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('raid') end,
+					},
+					offline = CreateOfflineConfig("raid")
+				},
+			},
+			raid40 = {
+				order = 22,
+				type = "group",
+				name = L["Raid-40 Frames"],
+				args = {
+					configureToggle = {
+						order = 1,
+						type = 'execute',
+						name = L["Display Frames"],
+						func = function()
+							UF:HeaderConfig(_G['ElvUF_Raid40'], _G['ElvUF_Raid40'].forceShow ~= true or nil)
+						end,
+					},
+					higherPortrait = {
+						order = 2, type = "toggle",
+						name = L["Higher Overlay Portrait"],
+						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
+						get = function(info) return E.db.sle.unitframes.unit.raid40[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.raid40[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('raid40') end,
+					},
+					portraitAlpha = {
+						order = 3, type = 'range',
+						name = L["Overlay Portrait Alpha"],
+						isPercent = true,
+						 min = 0, max = 1, step = 0.01,
+						get = function(info) return E.db.sle.unitframes.unit.raid40[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.raid40[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('raid40') end,
+					},
+					offline = CreateOfflineConfig("raid40")
+				},
+			},
+			boss = {
+				order = 23,
+				type = "group",
+				name = L["Boss Frames"],
+				args = {
+					higherPortrait = {
+						order = 1, type = "toggle",
+						name = L["Higher Overlay Portrait"],
+						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
+						get = function(info) return E.db.sle.unitframes.unit.boss[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.boss[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('boss') end,
+					},
+					portraitAlpha = {
+						order = 2, type = 'range',
+						name = L["Overlay Portrait Alpha"],
+						isPercent = true,
+						 min = 0, max = 1, step = 0.01,
+						get = function(info) return E.db.sle.unitframes.unit.boss[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.boss[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('boss') end,
+					},
+				},
+			},
+			arena = {
+				order = 24,
+				type = "group",
+				name = L["Arena Frames"],
+				args = {
+					higherPortrait = {
+						order = 1, type = "toggle",
+						name = L["Higher Overlay Portrait"],
+						desc = L["Makes frame portrait visible regardles of health level when overlay portrait is set."],
+						get = function(info) return E.db.sle.unitframes.unit.arena[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.arena[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('arena') end,
+					},
+					portraitAlpha = {
+						order = 2, type = 'range',
+						name = L["Overlay Portrait Alpha"],
+						isPercent = true,
+						 min = 0, max = 1, step = 0.01,
+						get = function(info) return E.db.sle.unitframes.unit.arena[ info[#info] ] end,
+						set = function(info, value) E.db.sle.unitframes.unit.arena[ info[#info] ] = value; UF:CreateAndUpdateHeaderGroup('arena') end,
+					},
+				},
 			},
-			indicators = {
-				order = 4,
+			statusbars = {
+				order = 50,
 				type = "group",
-				name = L["Player Frame Indicators"],
-				guiInline = true,
+				name = L["Statusbars"],
+				get = function(info) return E.db.sle.unitframes.statusTextures[info[#info]] end,
+				set = function(info, value) E.db.sle.unitframes.statusTextures[info[#info]] = value; SUF:BuildStatusTable(); SUF:UpdateStatusBars() end,
 				args = {
-					combaticopos = {
+					power = {
 						order = 1,
-						type = "select",
-						name = L["Combat Position"],
-						desc = L["Set the point to show combat icon"],
-						get = function(info) return E.db.sle.combatico.pos end,
-						set = function(info, value) E.db.sle.combatico.pos = value; UF:Update_CombatIndicator() end,
-						values = positionValues
-					},
-					roleicons = {
+						type = "toggle",
+						name = L["Power"],
+						disabled = function() return SLE._Compatibility["ElvUI_CustomTweaks"] end,
+						get = function(info) return E.private.sle.unitframe.statusbarTextures.power end,
+						set = function(info, value) E.private.sle.unitframe.statusbarTextures.power = value; E:StaticPopup_Show("PRIVATE_RL") end,
+					},
+					powerTexture = {
 						order = 2,
-						type = "select",
-						name = L["LFG Icons"],
-						desc = L["Choose what icon set will unitframes and chat use."],
-						get = function(info) return E.db.sle.roleicons end,
-						set = function(info, value) E.db.sle.roleicons = value; E:GetModule('Chat'):CheckLFGRoles(); UF:UpdateAllHeaders() end,
-						values = {
-							["ElvUI"] = "ElvUI ".."|T"..texPathE.."tank:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPathE.."healer:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPathE.."dps:15:15:0:0:64:64:2:56:2:56|t ",
-							["SupervillainUI"] = "Supervillain UI ".."|T"..texPath.."svui-tank:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."svui-healer:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."svui-dps:15:15:0:0:64:64:2:56:2:56|t ",
-							["Blizzard"] = "Blizzard ".."|T"..texPath.."blizz-tank:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."blizz-healer:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."blizz-dps:15:15:0:0:64:64:2:56:2:56|t ",
-							["MiirGui"] = "MiirGui ".."|T"..texPath.."mg-tank:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."mg-healer:15:15:0:0:64:64:2:56:2:56|t ".."|T"..texPath.."mg-dps:15:15:0:0:64:64:2:56:2:56|t ",
-						},
+						type = "select", dialogControl = "LSM30_Statusbar",
+						name = L["Power Texture"],
+						disabled = function() return not E.private.unitframe.enable or not E.private.sle.unitframe.statusbarTextures.power or SLE._Compatibility["ElvUI_CustomTweaks"] end,
+						values = AceGUIWidgetLSMlists.statusbar,
+					},
+					space = { order = 3, type = "description", name = "" },
+					cast = {
+						order = 4,
+						type = "toggle",
+						name = L["Castbar"],
+						get = function(info) return E.private.sle.unitframe.statusbarTextures.cast end,
+						set = function(info, value) E.private.sle.unitframe.statusbarTextures.cast = value; E:StaticPopup_Show("PRIVATE_RL") end,
+					},
+					castTexture = {
+						order = 5,
+						type = "select", dialogControl = "LSM30_Statusbar",
+						name = L["Castbar Texture"],
+						disabled = function() return not E.private.unitframe.enable or not E.private.sle.unitframe.statusbarTextures.cast end,
+						values = AceGUIWidgetLSMlists.statusbar,
+					},
+					space2 = { order = 6, type = "description", name = "" },
+					aura = {
+						order = 7,
+						type = "toggle",
+						name = L["Aura Bars"],
+						get = function(info) return E.private.sle.unitframe.statusbarTextures.aura end,
+						set = function(info, value) E.private.sle.unitframe.statusbarTextures.aura = value; E:StaticPopup_Show("PRIVATE_RL") end,
+					},
+					auraTexture = {
+						order = 8,
+						type = "select", dialogControl = "LSM30_Statusbar",
+						name = L["Aura Bars Texture"],
+						disabled = function() return not E.private.unitframe.enable or not E.private.sle.unitframe.statusbarTextures.aura end,
+						values = AceGUIWidgetLSMlists.statusbar,
+					},
+					space3 = { order = 9, type = "description", name = "" },
+					class = {
+						order = 10,
+						type = "toggle",
+						name = L["Classbar"],
+						get = function(info) return E.private.sle.unitframe.statusbarTextures.class end,
+						set = function(info, value) E.private.sle.unitframe.statusbarTextures.class = value; E:StaticPopup_Show("PRIVATE_RL") end,
+					},
+					classTexture = {
+						order = 11,
+						type = "select", dialogControl = "LSM30_Statusbar",
+						name = L["Classbar Texture"],
+						disabled = function() return not E.private.unitframe.enable or not E.private.sle.unitframe.statusbarTextures.class end,
+						set = function(info, value) E.db.sle.unitframes.statusTextures[info[#info]] = value; UF:CreateAndUpdateUF('player') end,
+						values = AceGUIWidgetLSMlists.statusbar,
+					},
+					space4 = { order = 12, type = "description", name = "" },
+					resizePrediction = {
+						order = 13,
+						type = "toggle",
+						name = L["Resize Health Prediction"],
+						desc = L["Slightly chages size of health prediction bars."],
+						get = function(info) return E.private.sle.unitframe.resizeHealthPrediction end,
+						set = function(info, value) E.private.sle.unitframe.resizeHealthPrediction = value; E:StaticPopup_Show("PRIVATE_RL") end,
 					},
 				},
 			},
 		},
 	}
-
-	if E.myclass == "DRUID" or E.myclass == "WARLOCK" then
-		E.Options.args.sle.args.options.args.general.args.unitframes.args.druid = {
-			order = 7,
-			type = 'group',
-			name = L["Classbar Energy"],
-			guiInline = true,
-			args = {
-				powtext = {
-					order = 1,
-					type = "toggle",
-					name = ENABLE,
-					desc = L["Show/hide the text with exact number of energy (Solar/Lunar or Demonic Fury) on your Classbar."],
-					get = function(info) return E.db.sle.powtext end,
-					set = function(info, value) E.db.sle.powtext = value; UF:ClassbarTextSLE() end,
-				},
-			},
-		}
-	end
 end

-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/vehicle_c.lua b/ElvUI_SLE/options/vehicle_c.lua
deleted file mode 100644
index 946cadc..0000000
--- a/ElvUI_SLE/options/vehicle_c.lua
+++ /dev/null
@@ -1,30 +0,0 @@
-local E, L, V, P, G = unpack(ElvUI);
-
-local function configTable()
-	E.Options.args.sle.args.options.args.general.args.vehicle = {
-		type = "group",
-		name = L["Enhanced Vehicle Bar"],
-		order = 6,
-		args = {
-			header = {
-				order = 1,
-				type = "header",
-				name = L["Enhanced Vehicle Bar"],
-			},
-			info = {
-				order = 2,
-				type = "description",
-				name = L["A different look/feel vehicle bar based on work by Azilroka"],
-			},
-			enable = {
-				order = 3,
-				type = "toggle",
-				name = ENABLE,
-				get = function(info) return E.private.sle.vehicle.enable end,
-				set = function(info, value) E.private.sle.vehicle.enable = value; E:StaticPopup_Show("PRIVATE_RL") end,
-			},
-		},
-	}
-end
-
-table.insert(E.SLEConfigs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/options/viewport_c.lua b/ElvUI_SLE/options/viewport_c.lua
new file mode 100644
index 0000000..1b015af
--- /dev/null
+++ b/ElvUI_SLE/options/viewport_c.lua
@@ -0,0 +1,40 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local M = SLE:GetModule("Misc")
+
+local function configTable()
+	E.Options.args.sle.args.modules.args.viewport = {
+		type = "group",
+		name = L["Viewport"],
+		order = 22,
+		hidden = function() return not E.global.sle.advanced.general end,
+		get = function(info) return E.db.sle.misc.viewport[ info[#info] ] end,
+		set = function(info, value) E.db.sle.misc.viewport[ info[#info] ] = value; M:SetViewport() end,
+		args = {
+			left = {
+				order = 1,
+				name = L["Left Offset"],
+				desc = L["Set the offset from the left border of the screen."],
+				type = "range", min = 0, max = E.screenwidth/2, step = 1,
+			},
+			right = {
+				order = 2,
+				name = L["Right Offset"],
+				desc = L["Set the offset from the right border of the screen."],
+				type = "range", min = 0, max = E.screenwidth/2, step = 1,
+			},
+			top = {
+				order = 3,
+				name = L["Top Offset"],
+				desc = L["Set the offset from the top border of the screen."],
+				type = "range", min = 0, max = E.screenheight /2 , step = 1,
+			},
+			bottom = {
+				order = 4,
+				name = L["Bottom Offset"],
+				desc = L["Set the offset from the bottom border of the screen."],
+				type = "range", min = 0, max = E.screenheight /2 , step = 1,
+			},
+		},
+	}
+end
+T.tinsert(SLE.Configs, configTable)
\ No newline at end of file
diff --git a/ElvUI_SLE/skins/blizzard/character.lua b/ElvUI_SLE/skins/blizzard/character.lua
index 98383eb..1563a6e 100644
--- a/ElvUI_SLE/skins/blizzard/character.lua
+++ b/ElvUI_SLE/skins/blizzard/character.lua
@@ -1,9 +1,10 @@
-local E, L, V, P, G = unpack(ElvUI);
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local S = E:GetModule('Skins')
+local _G = _G

 local function LoadSkin()
 	if E.private.skins.blizzard.enable == true and E.private.skins.blizzard.character == true then return end
-	if not E.db.sle.Armory.Character.Enable then return end
+	if E.db.sle.Armory and not E.db.sle.Armory.Character.Enable then return end

 	local slots = {
 		"HeadSlot", "NeckSlot", "ShoulderSlot", "BackSlot", "ChestSlot", "ShirtSlot",
@@ -11,7 +12,7 @@ local function LoadSkin()
 		"Finger0Slot", "Finger1Slot", "Trinket0Slot", "Trinket1Slot", "MainHandSlot", "SecondaryHandSlot",
 	}

-	for _, slot in pairs(slots) do
+	for _, slot in T.pairs(slots) do
 		local icon = _G["Character"..slot.."IconTexture"]
 		local cooldown = _G["Character"..slot.."Cooldown"]
 		slot = _G["Character"..slot]
@@ -19,7 +20,7 @@ local function LoadSkin()
 		slot:StyleButton(false)
 		slot.ignoreTexture:SetTexture([[Interface\PaperDollInfoFrame\UI-GearManager-LeaveItem-Transparent]])
 		slot:SetTemplate("Default", true)
-		icon:SetTexCoord(unpack(E.TexCoords))
+		icon:SetTexCoord(T.unpack(E.TexCoords))
 		icon:SetInside()

 		if(cooldown) then
@@ -28,20 +29,20 @@ local function LoadSkin()
 	end

 	local function ColorItemBorder()
-		for _, slot in pairs(slots) do
+		for _, slot in T.pairs(slots) do
 			local target = _G["Character"..slot]
-			local slotId, _, _ = GetInventorySlotInfo(slot)
-			local itemId = GetInventoryItemID("player", slotId)
+			local slotId, _, _ = T.GetInventorySlotInfo(slot)
+			local itemId = T.GetInventoryItemID("player", slotId)

 			if itemId then
-				local rarity = GetInventoryItemQuality("player", slotId);
+				local rarity = T.GetInventoryItemQuality("player", slotId);
 				if rarity and rarity > 1 then
-					target:SetBackdropBorderColor(GetItemQualityColor(rarity))
+					target:SetBackdropBorderColor(T.GetItemQualityColor(rarity))
 				else
-					target:SetBackdropBorderColor(unpack(E.media.bordercolor))
+					target:SetBackdropBorderColor(T.unpack(E.media.bordercolor))
 				end
 			else
-				target:SetBackdropBorderColor(unpack(E.media.bordercolor))
+				target:SetBackdropBorderColor(T.unpack(E.media.bordercolor))
 			end
 		end
 	end
@@ -49,7 +50,7 @@ local function LoadSkin()
 	local CheckItemBorderColor = CreateFrame("Frame")
 	CheckItemBorderColor:RegisterEvent("PLAYER_EQUIPMENT_CHANGED")
 	CheckItemBorderColor:SetScript("OnEvent", ColorItemBorder)
-	CharacterFrame:HookScript("OnShow", ColorItemBorder)
+	_G["CharacterFrame"]:HookScript("OnShow", ColorItemBorder)
 	ColorItemBorder()

 	local charframe = {
@@ -57,7 +58,7 @@ local function LoadSkin()
 		"CharacterFrameInset",
 	}

-	for _, object in pairs(charframe) do
+	for _, object in T.pairs(charframe) do
 		_G[object]:StripTextures()
 	end
 end
diff --git a/ElvUI_SLE/skins/blizzard/load_blizzard.xml b/ElvUI_SLE/skins/blizzard/load_blizzard.xml
index a2c142e..58d7824 100644
--- a/ElvUI_SLE/skins/blizzard/load_blizzard.xml
+++ b/ElvUI_SLE/skins/blizzard/load_blizzard.xml
@@ -1,4 +1,6 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/">
 	<Script file='character.lua'/>
 	<Script file='petbattle.lua'/>
+	<Script file='objectiveTracker.lua'/>
+	<Script file='merchant.lua'/>
 </Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/skins/blizzard/merchant.lua b/ElvUI_SLE/skins/blizzard/merchant.lua
new file mode 100644
index 0000000..1d20910
--- /dev/null
+++ b/ElvUI_SLE/skins/blizzard/merchant.lua
@@ -0,0 +1,257 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local Sk = SLE:GetModule("Skins")
+local S = E:GetModule('Skins')
+--GLOBALS: CreateFrame, MERCHANT_ITEMS_PER_PAGE, BUYBACK_ITEMS_PER_PAGE, hooksecurefunc, MERCHANT_PAGE_NUMBER
+local _G = _G
+local ItemsPerSubpage, SubpagesPerPage
+local math_max, math_ceil = math.max, math.ceil
+local MerchantFrame_UpdateAltCurrency, MoneyFrame_Update = MerchantFrame_UpdateAltCurrency, MoneyFrame_Update
+local GetMerchantNumItems = GetMerchantNumItems
+local GetMerchantItemInfo, GetMerchantItemLink = GetMerchantItemInfo, GetMerchantItemLink
+local SetItemButtonCount, SetItemButtonStock, SetItemButtonTexture = SetItemButtonCount, SetItemButtonStock, SetItemButtonTexture
+local SetItemButtonNameFrameVertexColor, SetItemButtonSlotVertexColor, SetItemButtonTextureVertexColor, SetItemButtonNormalTextureVertexColor = SetItemButtonNameFrameVertexColor, SetItemButtonSlotVertexColor, SetItemButtonTextureVertexColor, SetItemButtonNormalTextureVertexColor
+
+local IgnoreCurrency = {
+	[T.GetCurrencyInfo(994)] = true,
+}
+
+local function SkinVendorItems(i)
+	local b = _G["MerchantItem"..i.."ItemButton"]
+	local t = _G["MerchantItem"..i.."ItemButtonIconTexture"]
+	local item_bar = _G["MerchantItem"..i]
+	item_bar:StripTextures(true)
+	item_bar:CreateBackdrop("Default")
+
+	b:StripTextures()
+	b:StyleButton(false)
+	b:SetTemplate("Default", true)
+	b:Point("TOPLEFT", item_bar, "TOPLEFT", 4, -4)
+	t:SetTexCoord(T.unpack(E.TexCoords))
+	t:SetInside()
+
+	_G["MerchantItem"..i.."MoneyFrame"]:ClearAllPoints()
+	_G["MerchantItem"..i.."MoneyFrame"]:Point("BOTTOMLEFT", b, "BOTTOMRIGHT", 3, 0)
+end
+
+local function UpdateButtonsPositions(isBuyBack)
+	local btn;
+	local vertSpacing, horizSpacing
+
+	if (isBuyBack) then
+		vertSpacing = -30
+		horizSpacing = 50
+	else
+		vertSpacing = -16
+		horizSpacing = 12
+	end
+	for i = 1, MERCHANT_ITEMS_PER_PAGE do
+		btn = _G["MerchantItem" .. i]
+		if (isBuyBack) then
+			if (i > BUYBACK_ITEMS_PER_PAGE) then
+				btn:Hide()
+			else
+				if (i == 1) then
+					btn:SetPoint("TOPLEFT", _G["MerchantFrame"], "TOPLEFT", 64, -105)
+				else
+					if ((i % 3) == 1) then
+						btn:SetPoint("TOPLEFT", _G["MerchantItem" .. (i-3)], "BOTTOMLEFT", 0, vertSpacing)
+					else
+						btn:SetPoint("TOPLEFT", _G["MerchantItem" .. (i-1)], "TOPRIGHT", horizSpacing, 0)
+					end
+				end
+			end
+		else
+			btn:Show()
+			if ((i % ItemsPerSubpage) == 1) then
+				if (i == 1) then
+					btn:SetPoint("TOPLEFT", _G["MerchantFrame"], "TOPLEFT", 24, -70)
+				else
+					btn:SetPoint("TOPLEFT", _G["MerchantItem" .. (i-(ItemsPerSubpage - 1))], "TOPRIGHT", 12, 0)
+				end
+			else
+				if ((i % 2) == 1) then
+					btn:SetPoint("TOPLEFT", _G["MerchantItem" .. (i-2)], "BOTTOMLEFT", 0, vertSpacing)
+				else
+					btn:SetPoint("TOPLEFT", _G["MerchantItem" .. (i-1)], "TOPRIGHT", horizSpacing, 0)
+				end
+			end
+		end
+	end
+end
+
+local function UpdateBuybackInfo()
+	UpdateButtonsPositions(true)
+	-- apply coloring
+	local btn, link, quality, r, g, b, _;
+	for i = 1, BUYBACK_ITEMS_PER_PAGE, 1 do
+		btn = _G["MerchantItem" .. i];
+		if (btn) then
+			link = GetBuybackItemLink(i);
+			if (link) then
+				_, _, quality = GetItemInfo(link);
+				r, g, b = GetItemQualityColor(quality);
+				_G["MerchantItem" .. i .. "Name"]:SetTextColor(r, g, b);
+			end
+		end
+	end
+end
+
+local function UpdateMerchantInfo()
+	UpdateButtonsPositions()
+
+	local totalMerchantItems = GetMerchantNumItems();
+	local visibleMerchantItems = 0
+	local indexes = {}
+	local _, name, texture, price, quantity, numAvailable, isUsable, extendedCost, r, g, b, notOptimal;
+	local link, quality, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, itemSellPrice, itemId;
+
+	for i = 1, totalMerchantItems do
+		T.tinsert(indexes, i);
+		visibleMerchantItems = visibleMerchantItems + 1;
+	end
+
+	 -- validate current page shown
+	if (_G["MerchantFrame"].page > math_max(1, math_ceil(visibleMerchantItems / MERCHANT_ITEMS_PER_PAGE))) then
+		_G["MerchantFrame"].page = math_max(1, math_ceil(visibleMerchantItems / MERCHANT_ITEMS_PER_PAGE));
+	end
+
+	-- Show correct page count based on number of items shown
+	_G["MerchantPageText"]:SetFormattedText(MERCHANT_PAGE_NUMBER, _G["MerchantFrame"].page, math_ceil(visibleMerchantItems / MERCHANT_ITEMS_PER_PAGE));
+
+	--Display shit
+	for i = 1, MERCHANT_ITEMS_PER_PAGE do
+		 local index = ((_G["MerchantFrame"].page - 1) * MERCHANT_ITEMS_PER_PAGE) + i;
+		local itemButton = _G["MerchantItem" .. i .. "ItemButton"];
+		itemButton.link = nil;
+		local merchantButton = _G["MerchantItem" .. i];
+		local merchantMoney = _G["MerchantItem" .. i .. "MoneyFrame"];
+		local merchantAltCurrency = _G["MerchantItem" .. i .. "AltCurrencyFrame"];
+		if (index <= visibleMerchantItems) then
+			name, texture, price, quantity, numAvailable, isUsable, extendedCost = GetMerchantItemInfo(indexes[index]);
+			if (name ~= nil) then
+				_G["MerchantItem"..i.."Name"]:SetText(name);
+				SetItemButtonCount(itemButton, quantity);
+				SetItemButtonStock(itemButton, numAvailable);
+				SetItemButtonTexture(itemButton, texture);
+
+				-- update item's currency info
+				if ( extendedCost and (price <= 0) ) then
+					itemButton.price = nil;
+					itemButton.extendedCost = true;
+					itemButton.link = GetMerchantItemLink(indexes[index]);
+					itemButton.texture = texture;
+					MerchantFrame_UpdateAltCurrency(indexes[index], i);
+					merchantAltCurrency:ClearAllPoints();
+					merchantAltCurrency:SetPoint("BOTTOMLEFT", "MerchantItem"..i.."NameFrame", "BOTTOMLEFT", 0, 31);
+					merchantMoney:Hide();
+					merchantAltCurrency:Show();
+				elseif ( extendedCost and (price > 0) ) then
+					itemButton.price = price;
+					itemButton.extendedCost = true;
+					itemButton.link = GetMerchantItemLink(indexes[index]);
+					itemButton.texture = texture;
+					MerchantFrame_UpdateAltCurrency(indexes[index], i);
+					MoneyFrame_Update(merchantMoney:GetName(), price);
+					merchantAltCurrency:ClearAllPoints();
+					merchantAltCurrency:SetPoint("LEFT", merchantMoney:GetName(), "RIGHT", -14, 0);
+					merchantAltCurrency:Show();
+					merchantMoney:Show();
+				else
+					itemButton.price = price;
+					itemButton.extendedCost = nil;
+					itemButton.link = GetMerchantItemLink(indexes[index]);
+					itemButton.texture = texture;
+					MoneyFrame_Update(merchantMoney:GetName(), price);
+					merchantAltCurrency:Hide();
+					merchantMoney:Show();
+				end
+
+				quality = 1;
+				if (itemButton.link) and not IgnoreCurrency[name] then
+					_, _, quality, itemLevel, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, _, itemSellPrice = T.GetItemInfo(itemButton.link);
+				end
+
+				-- set color
+				r, g, b = T.GetItemQualityColor(quality);
+				_G["MerchantItem" .. i .. "Name"]:SetTextColor(r, g, b);
+
+				itemButton.hasItem = true;
+				itemButton:SetID(indexes[index]);
+				itemButton:Show();
+				local colorMult = 1.0;
+				local detailColor = {};
+				local slotColor = {};
+				-- unavailable items (limited stock, bought out) are darkened
+				if ( numAvailable == 0 ) then
+					colorMult = 0.5;
+				end
+				if ( not isUsable ) then
+					slotColor = {r = 1.0, g = 0, b = 0};
+					detailColor = {r = 1.0, g = 0, b = 0};
+				else
+					slotColor = {r = 1.0, g = 1.0, b = 1.0};
+					detailColor = {r = 0.5, g = 0.5, b = 0.5};
+				end
+				SetItemButtonNameFrameVertexColor(merchantButton, detailColor.r * colorMult, detailColor.g * colorMult, detailColor.b * colorMult);
+				SetItemButtonSlotVertexColor(merchantButton, slotColor.r * colorMult, slotColor.g * colorMult, slotColor.b * colorMult);
+				SetItemButtonTextureVertexColor(itemButton, slotColor.r * colorMult, slotColor.g * colorMult, slotColor.b * colorMult);
+				SetItemButtonNormalTextureVertexColor(itemButton, slotColor.r * colorMult, slotColor.g * colorMult, slotColor.b * colorMult);
+			end
+		else
+			itemButton.price = nil;
+			itemButton.hasItem = nil;
+			itemButton:Hide();
+			SetItemButtonNameFrameVertexColor(merchantButton, 0.5, 0.5, 0.5);
+			SetItemButtonSlotVertexColor(merchantButton,0.4, 0.4, 0.4);
+			_G["MerchantItem"..i.."Name"]:SetText("");
+			_G["MerchantItem"..i.."MoneyFrame"]:Hide();
+			_G["MerchantItem"..i.."AltCurrencyFrame"]:Hide();
+		end
+	end
+end
+
+local function RebuildMerchantFrame()
+	ItemsPerSubpage = MERCHANT_ITEMS_PER_PAGE
+	SubpagesPerPage = E.private.sle.skins.merchant.subpages
+	MERCHANT_ITEMS_PER_PAGE = SubpagesPerPage * 10 --Haven't seen this causing any taints so I asume it's ok
+	-- _G["MerchantFrame"]:SetWidth(60 + 330 * SubpagesPerPage)
+	_G["MerchantFrame"]:SetWidth(42 + (318 * SubpagesPerPage) + (12 * (SubpagesPerPage - 1)))
+	-- _G["MerchantFrame"]:SetWidth(690)
+
+	for i = 1, MERCHANT_ITEMS_PER_PAGE do
+		if (not _G["MerchantItem" .. i]) then
+			CreateFrame("Frame", "MerchantItem" .. i, _G["MerchantFrame"], "MerchantItemTemplate")
+			SkinVendorItems(i)
+		end
+	end
+	 -- alter the position of the buyback item slot on the merchant tab
+	_G["MerchantBuyBackItem"]:ClearAllPoints()
+	_G["MerchantBuyBackItem"]:SetPoint("TOPLEFT", _G["MerchantItem10"], "BOTTOMLEFT", -14, -20)
+
+	-- move the next/previous page buttons
+	_G["MerchantPrevPageButton"]:ClearAllPoints();
+	_G["MerchantPrevPageButton"]:SetPoint("CENTER", _G["MerchantFrame"], "BOTTOM", 50, 70);
+	_G["MerchantPageText"]:ClearAllPoints();
+	_G["MerchantPageText"]:SetPoint("BOTTOM", _G["MerchantFrame"], "BOTTOM", 160, 65);
+	_G["MerchantNextPageButton"]:ClearAllPoints();
+	_G["MerchantNextPageButton"]:SetPoint("CENTER", _G["MerchantFrame"], "BOTTOM", 270, 70);
+
+	-- currency insets
+	_G["MerchantExtraCurrencyInset"]:ClearAllPoints();
+	_G["MerchantExtraCurrencyInset"]:SetPoint("BOTTOMRIGHT", _G["MerchantMoneyInset"], "BOTTOMLEFT", 0, 0);
+	_G["MerchantExtraCurrencyInset"]:SetPoint("TOPLEFT", _G["MerchantMoneyInset"], "TOPLEFT", -165, 0);
+	_G["MerchantExtraCurrencyBg"]:ClearAllPoints();
+	_G["MerchantExtraCurrencyBg"]:SetPoint("TOPLEFT", _G["MerchantExtraCurrencyInset"], "TOPLEFT", 3, -2);
+	_G["MerchantExtraCurrencyBg"]:SetPoint("BOTTOMRIGHT", _G["MerchantExtraCurrencyInset"], "BOTTOMRIGHT", -3, 2);
+end
+
+local function MerchantSkinInit()
+	if E.private.skins.blizzard.enable ~= true or E.private.skins.blizzard.merchant ~= true or E.private.sle.skins.merchant.enable ~= true then return end
+	RebuildMerchantFrame()
+	UpdateButtonsPositions()
+
+	hooksecurefunc("MerchantFrame_UpdateMerchantInfo", UpdateMerchantInfo)
+	hooksecurefunc("MerchantFrame_UpdateBuybackInfo", UpdateBuybackInfo)
+end
+
+hooksecurefunc(S, "Initialize", MerchantSkinInit)
\ No newline at end of file
diff --git a/ElvUI_SLE/skins/blizzard/objectiveTracker.lua b/ElvUI_SLE/skins/blizzard/objectiveTracker.lua
new file mode 100644
index 0000000..dab3431
--- /dev/null
+++ b/ElvUI_SLE/skins/blizzard/objectiveTracker.lua
@@ -0,0 +1,209 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local S = E:GetModule('Skins');
+local Sk = SLE:GetModule("Skins")
+local LSM = LibStub("LibSharedMedia-3.0")
+local _G = _G
+-- Cache global variables
+-- GLOBALS: C_Scenario, BonusObjectiveTrackerProgressBar_PlayFlareAnim, hooksecurefunc, CreateFrame
+-- Lua functions
+local unpack = unpack
+
+local ScenarioStageBlock = ScenarioStageBlock
+local ScenarioProvingGroundsBlock = ScenarioProvingGroundsBlock
+local ScenarioProvingGroundsBlockAnim = ScenarioProvingGroundsBlockAnim
+
+local classColor = RAID_CLASS_COLORS[E.myclass]
+local width = 190
+local dummy = function() return end
+local underlines = {}
+
+function Sk:Update_ObjectiveTrackerUnderlinesVisibility()
+	local exe = E.db.sle.skins.objectiveTracker.underline and "Show" or "Hide"
+	for i = 1, #underlines do
+		underlines[i][exe](underlines[i])
+	end
+end
+
+function Sk:Update_ObjectiveTrackerUnderlinesColor()
+	local colorBar
+	if E.db.sle.skins.objectiveTracker.underlineClass then
+		colorBar = classColor
+	else
+		colorBar = E.db.sle.skins.objectiveTracker.underlineColor
+	end
+	for i = 1, #underlines do
+		underlines[i].Texture:SetVertexColor(colorBar.r, colorBar.g, colorBar.b)
+	end
+end
+
+-- Objective Tracker Bar
+local function skinObjectiveBar(self, block, line)
+	local progressBar = line.ProgressBar
+	local bar = progressBar.Bar
+	local icon = bar.Icon
+	local flare = progressBar.FullBarFlare1
+
+
+	if not progressBar.styled then
+		local label = bar.Label
+
+		bar.BarBG:Hide()
+		bar.BarFrame:Hide()
+		bar.BarFrame2:Hide()
+		bar.BarFrame3:Hide()
+		bar.BarGlow:Kill()
+		bar:SetSize(225, 18)
+
+		bar:SetStatusBarTexture(LSM:Fetch('statusbar', E.private.sle.skins.objectiveTracker.texture))
+		local COLOR
+		if E.private.sle.skins.objectiveTracker.class then
+			COLOR = classColor
+		else
+			COLOR = E.private.sle.skins.objectiveTracker.color
+		end
+		bar:SetStatusBarColor(COLOR.r, COLOR.g, COLOR.b)
+		bar:CreateBackdrop('Transparent')
+		bar:SetFrameStrata('HIGH')
+
+		flare:Hide()
+
+		label:ClearAllPoints()
+		label:SetPoint("CENTER", bar, "CENTER", 0, -1)
+		label:FontTemplate(LSM:Fetch('font', E.db.sle.media.fonts.objective.font), E.db.sle.media.fonts.objective.size, E.db.sle.media.fonts.objective.outline)
+		SLE:GetModule("Media").BonusObjectiveBarText = label
+
+		BonusObjectiveTrackerProgressBar_PlayFlareAnim = dummy
+		progressBar.styled = true
+	end
+
+	if icon then icon:Hide() end
+	bar.IconBG:Hide()
+end
+
+-- Objective Tracker from ObbleYeah - Modified to fit my style
+
+-- Timer bars. Seems to work atm. must still take a look at it.
+local function SkinTimerBar(self, block, line, duration, startTime)
+	local tb = self.usedTimerBars[block] and self.usedTimerBars[block][line]
+
+	if tb and tb:IsShown() and not tb.skinned then
+		tb.Bar.BorderMid:Hide()
+		tb.Bar:StripTextures()
+		tb.Bar:CreateBackdrop('Transparent')
+		tb.Bar:SetStatusBarTexture(LSM:Fetch('statusbar', E.private.sle.skins.objectiveTracker.texture))
+		local COLOR
+		if E.private.sle.skins.objectiveTracker.class then
+			COLOR = classColor
+		else
+			COLOR = E.private.sle.skins.objectiveTracker.color
+		end
+		tb.Bar:SetStatusBarColor(COLOR.r, COLOR.g, COLOR.b)
+		tb.skinned = true
+	end
+end
+
+-- Scenario buttons
+local function SkinScenarioButtons()
+	local block = ScenarioStageBlock
+	local _, currentStage, numStages, flags = C_Scenario.GetInfo()
+
+	-- we have to independently resize the artwork
+	-- because we're messing with the tracker width >_>
+	-- pop-up artwork
+	block.NormalBG:Hide()
+
+	-- pop-up final artwork
+	block.FinalBG:Hide()
+
+	-- pop-up glow
+	block.GlowTexture:SetSize(width+20, 75)
+	block.GlowTexture.AlphaAnim.Play = dummy
+end
+
+-- Proving grounds
+local function SkinProvingGroundButtons()
+	local block = ScenarioProvingGroundsBlock
+	local sb = block.StatusBar
+	local anim = ScenarioProvingGroundsBlockAnim
+
+	block.MedalIcon:SetSize(42, 42)
+	block.MedalIcon:ClearAllPoints()
+	block.MedalIcon:SetPoint("TOPLEFT", block, 20, -10)
+
+	block.WaveLabel:ClearAllPoints()
+	block.WaveLabel:SetPoint("LEFT", block.MedalIcon, "RIGHT", 3, 0)
+
+	block.BG:Hide()
+	block.BG:SetSize(width + 21, 75)
+
+	block.GoldCurlies:Hide()
+	block.GoldCurlies:ClearAllPoints()
+	block.GoldCurlies:SetPoint("TOPLEFT", block.BG, 6, -6)
+	block.GoldCurlies:SetPoint("BOTTOMRIGHT", block.BG, -6, 6)
+
+	anim.BGAnim:Hide()
+	anim.BGAnim:SetSize(width + 45, 85)
+	anim.BorderAnim:SetSize(width + 21, 75)
+	anim.BorderAnim:Hide()
+	anim.BorderAnim:ClearAllPoints()
+	anim.BorderAnim:SetPoint("TOPLEFT", block.BG, 8, -8)
+	anim.BorderAnim:SetPoint("BOTTOMRIGHT", block.BG, -8, 8)
+
+	-- Timer
+	sb:StripTextures()
+	sb:CreateBackdrop('Transparent')
+	sb:SetStatusBarTexture(LSM:Fetch('statusbar', E.private.sle.skins.objectiveTracker.texture))
+	local COLOR
+	if E.private.sle.skins.objectiveTracker.class then
+		COLOR = classColor
+	else
+		COLOR = E.private.sle.skins.objectiveTracker.color
+	end
+	sb:SetStatusBarColor(COLOR.r, COLOR.g, COLOR.b)
+	sb:ClearAllPoints()
+	sb:SetPoint('TOPLEFT', block.MedalIcon, 'BOTTOMLEFT', -4, -5)
+	sb:SetSize(200, 15)
+
+	-- Create a little border around the Bar.
+	local sb2 = sb:GetParent():CreateTexture(nil, 'BACKGROUND')
+	sb2:SetPoint('TOPLEFT', sb, -1, 1)
+	sb2:SetPoint('BOTTOMRIGHT', sb, 1, -1)
+	sb2:SetTexture(LSM:Fetch('statusbar', E.private.sle.skins.objectiveTracker.texture))
+	sb2:SetAlpha(0.5)
+	sb2:SetVertexColor(unpack(E.media.backdropcolor))
+end
+
+local function ObjectiveReskin()
+	if T.IsAddOnLoaded("Blizzard_ObjectiveTracker") then
+		-- _G["ObjectiveTrackerFrame"]:CreateBackdrop()
+		if E.private.skins.blizzard.enable ~= true or E.private.skins.blizzard.objectiveTracker ~= true or E.private.sle.skins.objectiveTracker.enable ~= true then return end
+		-- Objective Tracker Bar
+		hooksecurefunc(_G["BONUS_OBJECTIVE_TRACKER_MODULE"], "AddProgressBar", skinObjectiveBar)
+		-- scenario
+		hooksecurefunc(_G["DEFAULT_OBJECTIVE_TRACKER_MODULE"], "AddTimerBar", SkinTimerBar)
+		hooksecurefunc(_G["SCENARIO_CONTENT_TRACKER_MODULE"], "Update", SkinScenarioButtons)
+		hooksecurefunc("ScenarioBlocksFrame_OnLoad", SkinScenarioButtons)
+		-- proving grounds
+		hooksecurefunc("Scenario_ProvingGrounds_ShowBlock", SkinProvingGroundButtons)
+		_G["ObjectiveTrackerFrame"].HeaderMenu.MinimizeButton:SetSize(14,14)
+		_G["ObjectiveTrackerFrame"].HeaderMenu.MinimizeButton:SetNormalTexture([[Interface\AddOns\ElvUI_SLE\media\textures\NewQuestMinimize]])
+		_G["ObjectiveTrackerFrame"].HeaderMenu.MinimizeButton:SetPushedTexture([[Interface\AddOns\ElvUI_SLE\media\textures\NewQuestMinimize]])
+
+		--Doing Underlines
+		local flat = [[Interface\AddOns\ElvUI\media\textures\Minimalist]]
+		local height = E.private.sle.skins.objectiveTracker.underlineHeight
+		_G["ObjectiveTrackerBlocksFrame"].QuestHeader.SLE_Underline = Sk:CreateUnderline(_G["ObjectiveTrackerBlocksFrame"].QuestHeader, flat, true, height)
+		_G["ObjectiveTrackerBlocksFrame"].AchievementHeader.SLE_Underline = Sk:CreateUnderline(_G["ObjectiveTrackerBlocksFrame"].AchievementHeader, flat, true, height)
+		_G['BONUS_OBJECTIVE_TRACKER_MODULE'].Header.SLE_Underline = Sk:CreateUnderline(_G['BONUS_OBJECTIVE_TRACKER_MODULE'].Header, flat, true, height)
+		_G["ObjectiveTrackerBlocksFrame"].ScenarioHeader.SLE_Underline = Sk:CreateUnderline(_G["ObjectiveTrackerBlocksFrame"].ScenarioHeader, flat, true, height)
+
+		T.tinsert(underlines, _G["ObjectiveTrackerBlocksFrame"].QuestHeader.SLE_Underline)
+		T.tinsert(underlines, _G["ObjectiveTrackerBlocksFrame"].AchievementHeader.SLE_Underline)
+		T.tinsert(underlines, _G['BONUS_OBJECTIVE_TRACKER_MODULE'].Header.SLE_Underline)
+		T.tinsert(underlines, _G["ObjectiveTrackerBlocksFrame"].ScenarioHeader.SLE_Underline)
+
+		Sk:Update_ObjectiveTrackerUnderlinesVisibility()
+		Sk:Update_ObjectiveTrackerUnderlinesColor()
+	end
+end
+hooksecurefunc(S, "Initialize", ObjectiveReskin)
\ No newline at end of file
diff --git a/ElvUI_SLE/skins/blizzard/petbattle.lua b/ElvUI_SLE/skins/blizzard/petbattle.lua
index bb433c4..dc0bb53 100644
--- a/ElvUI_SLE/skins/blizzard/petbattle.lua
+++ b/ElvUI_SLE/skins/blizzard/petbattle.lua
@@ -1,14 +1,15 @@
-local E, L, V, P, G = unpack(ElvUI);
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
 local S = E:GetModule('Skins')
+local _G = _G

 local function PetBattle()
-	if E.private.skins.blizzard.enable ~= true or E.private.skins.blizzard.petbattleui ~= true then return end
-	local f = PetBattleFrame
-	local bar = ElvUIPetBattleActionBar
+	if E.private.skins.blizzard.enable ~= true or E.private.skins.blizzard.petbattleui ~= true and E.private.sle.skins.petbattles.enable ~= true then return end
+	local f = _G["PetBattleFrame"]
+	local bar = _G["ElvUIPetBattleActionBar"]

 	local a = CreateFrame("Frame", "ActiveAllyHolder", E.UIParent)
 	a:Size(918, 68)
-	a:Point("TOP", PetBattleFrame)
+	a:Point("TOP", f)

 	f.TopVersusText:ClearAllPoints()
 	f.TopVersusText:SetPoint("CENTER", a)
diff --git a/ElvUI_SLE/skins/load_skins.xml b/ElvUI_SLE/skins/load_skins.xml
index aee9aed..61ac327 100644
--- a/ElvUI_SLE/skins/load_skins.xml
+++ b/ElvUI_SLE/skins/load_skins.xml
@@ -1,3 +1,4 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<Script file="skins.lua"/>
 	<Include file='blizzard\load_blizzard.xml'/>
 </Ui>
\ No newline at end of file
diff --git a/ElvUI_SLE/skins/skins.lua b/ElvUI_SLE/skins/skins.lua
new file mode 100644
index 0000000..a4c567d
--- /dev/null
+++ b/ElvUI_SLE/skins/skins.lua
@@ -0,0 +1,34 @@
+local SLE, T, E, L, V, P, G = unpack(select(2, ...))
+local S = E:GetModule('Skins');
+local Sk = SLE:NewModule("Skins")
+local LSM = LibStub("LibSharedMedia-3.0")
+local _G = _G
+
+function Sk:CreateUnderline(frame, texture, shadow, height)
+	local line = CreateFrame("Frame", nil, frame)
+	if line then
+		line:SetPoint('BOTTOM', frame, -1, 1)
+		line:SetSize(frame:GetWidth(), height or 1)
+		line.Texture = line:CreateTexture(nil, 'OVERLAY')
+		line.Texture:SetTexture(texture)
+		if shadow then
+			if shadow == "backdrop" then
+				line:CreateShadow()
+			else
+				line:CreateBackdrop()
+			end
+		end
+		line.Texture:SetAllPoints(line)
+	end
+	return line
+end
+
+function Sk:Initialize()
+
+	function Sk:ForUpdateAll()
+		Sk:Update_ObjectiveTrackerUnderlinesVisibility()
+		Sk:Update_ObjectiveTrackerUnderlinesColor()
+	end
+end
+
+SLE:RegisterModule(Sk:GetName())
\ No newline at end of file