rename to next version

Martin Unkel [05-30-18 - 00:16]
rename to next version
Filename
AwesomeEvents/AE_DebugWindow.lua
AwesomeEvents/AE_HUD.lua
AwesomeEvents/AE_Settings.lua
AwesomeEvents/AwesomeEvents.lua
AwesomeEvents/AwesomeEvents.txt
AwesomeEvents/AwesomeEvents.xml
AwesomeEvents/Language/de.lua
AwesomeEvents/Language/ru.lua
AwesomeEvents/Language/strings.lua
AwesomeEvents/LibAddonMenu-2.0-exampleoptions.lua
AwesomeEvents/Libs/LibAddonMenu-2.0/LICENSE
AwesomeEvents/Libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
AwesomeEvents/Libs/LibAddonMenu-2.0/controls/button.lua
AwesomeEvents/Libs/LibAddonMenu-2.0/controls/checkbox.lua
AwesomeEvents/Libs/LibAddonMenu-2.0/controls/colorpicker.lua
AwesomeEvents/Libs/LibAddonMenu-2.0/controls/custom.lua
AwesomeEvents/Libs/LibAddonMenu-2.0/controls/description.lua
AwesomeEvents/Libs/LibAddonMenu-2.0/controls/divider.lua
AwesomeEvents/Libs/LibAddonMenu-2.0/controls/dropdown.lua
AwesomeEvents/Libs/LibAddonMenu-2.0/controls/editbox.lua
AwesomeEvents/Libs/LibAddonMenu-2.0/controls/header.lua
AwesomeEvents/Libs/LibAddonMenu-2.0/controls/iconpicker.lua
AwesomeEvents/Libs/LibAddonMenu-2.0/controls/panel.lua
AwesomeEvents/Libs/LibAddonMenu-2.0/controls/slider.lua
AwesomeEvents/Libs/LibAddonMenu-2.0/controls/submenu.lua
AwesomeEvents/Libs/LibAddonMenu-2.0/controls/texture.lua
AwesomeEvents/Libs/LibAwesomeModule-1.0/LibAwesomeModule-1.0.lua
AwesomeEvents/Libs/LibAwesomeModule-1.0/README
AwesomeEvents/Libs/LibMsgWin-1.0/LibMsgWin-1.0.lua
AwesomeEvents/Libs/LibMsgWin-1.0/LibMsgWin-1.0.txt
AwesomeEvents/Libs/LibStub/LibStub.lua
AwesomeEvents/Modules/BuffFood.lua
AwesomeEvents/Modules/Clock.lua
AwesomeEvents/Modules/Crafting.lua
AwesomeEvents/Modules/Durability.lua
AwesomeEvents/Modules/Fencing.lua
AwesomeEvents/Modules/Inventory.lua
AwesomeEvents/Modules/Mails.lua
AwesomeEvents/Modules/Mount.lua
AwesomeEvents/Modules/RepairKits.lua
AwesomeEvents/Modules/Skills.lua
AwesomeEvents/Modules/SkyShards.lua
AwesomeEvents/Modules/SoulGems.lua
AwesomeEvents/Modules/WeaponCharge.lua
AwesomeEvents/README
AwesomeEvents2/AE_DebugWindow.lua
AwesomeEvents2/AE_HUD.lua
AwesomeEvents2/AE_Settings.lua
AwesomeEvents2/AwesomeEvents.xml
AwesomeEvents2/AwesomeEvents2.lua
AwesomeEvents2/AwesomeEvents2.txt
AwesomeEvents2/Language/de.lua
AwesomeEvents2/Language/ru.lua
AwesomeEvents2/Language/strings.lua
AwesomeEvents2/LibAddonMenu-2.0-exampleoptions.lua
AwesomeEvents2/Libs/LibAddonMenu-2.0/LICENSE
AwesomeEvents2/Libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/button.lua
AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/checkbox.lua
AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/colorpicker.lua
AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/custom.lua
AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/description.lua
AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/divider.lua
AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/dropdown.lua
AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/editbox.lua
AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/header.lua
AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/iconpicker.lua
AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/panel.lua
AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/slider.lua
AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/submenu.lua
AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/texture.lua
AwesomeEvents2/Libs/LibAwesomeModule-2.0/LibAwesomeModule-2.0.lua
AwesomeEvents2/Libs/LibAwesomeModule-2.0/README
AwesomeEvents2/Libs/LibMsgWin-1.0/LibMsgWin-1.0.lua
AwesomeEvents2/Libs/LibMsgWin-1.0/LibMsgWin-1.0.txt
AwesomeEvents2/Libs/LibStub/LibStub.lua
AwesomeEvents2/Modules/BuffFood.lua
AwesomeEvents2/Modules/Clock.lua
AwesomeEvents2/Modules/Crafting.lua
AwesomeEvents2/Modules/Durability.lua
AwesomeEvents2/Modules/Fencing.lua
AwesomeEvents2/Modules/Inventory.lua
AwesomeEvents2/Modules/Mails.lua
AwesomeEvents2/Modules/Mount.lua
AwesomeEvents2/Modules/RepairKits.lua
AwesomeEvents2/Modules/Skills.lua
AwesomeEvents2/Modules/SkyShards.lua
AwesomeEvents2/Modules/SoulGems.lua
AwesomeEvents2/Modules/WeaponCharge.lua
AwesomeEvents2/README
AwesomeEvents2Mod/AwesomeEventsMod.lua
AwesomeEvents2Mod/AwesomeEventsMod.txt
AwesomeEvents2Mod/Language/de.lua
AwesomeEvents2Mod/Language/ru.lua
AwesomeEvents2Mod/Language/strings.lua
AwesomeEvents2Mod/Libs/LibAwesomeModule-1.0/LibAwesomeModule-1.0.lua
AwesomeEvents2Mod/Libs/LibAwesomeModule-1.0/README
AwesomeEvents2Mod/Libs/LibStub/LibStub.lua
AwesomeEvents2Mod/README
AwesomeEventsMod/AwesomeEventsMod.lua
AwesomeEventsMod/AwesomeEventsMod.txt
AwesomeEventsMod/Language/de.lua
AwesomeEventsMod/Language/ru.lua
AwesomeEventsMod/Language/strings.lua
AwesomeEventsMod/Libs/LibAwesomeModule-1.0/LibAwesomeModule-1.0.lua
AwesomeEventsMod/Libs/LibAwesomeModule-1.0/README
AwesomeEventsMod/Libs/LibStub/LibStub.lua
AwesomeEventsMod/README
diff --git a/AwesomeEvents/AE_DebugWindow.lua b/AwesomeEvents/AE_DebugWindow.lua
deleted file mode 100644
index e406848..0000000
--- a/AwesomeEvents/AE_DebugWindow.lua
+++ /dev/null
@@ -1,171 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: AE_DEBUG.lua
-  Last Modified: 23.04.18 20:59
-
-  Copyright (c) 2018 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-local debugWindow
-
-
-
-local function __boolToStr(value)
-    if(value)then
-        return 'true'
-    else
-        return 'false'
-    end
-end
-
-local function __tostring(object,level)
-    local lvlPrefix = ''
-    if(level~=nil)then
-        lvlPrefix = string.rep('--',level)
-    end
-    local str=''
-    if(type(object) == 'table')then
-        if(level==nil)then
-            for i in ipairs(object)do
-                if(i==1)then
-                    str = str .. __tostring(object[i],1)
-                else
-                    str = str .. '> ' .. __tostring(object[i],1)
-                end
-            end
-        else
-            str = 'Table\n'
-            for key,value in pairs(object)do
-                str = str .. lvlPrefix .. '> .' .. key .. ' = ' .. __tostring(value,level+1)
-            end
-        end
-    elseif(type(object) == 'number')then
-        str = tostring(object)
-    elseif(type(object) == 'boolean')then
-        str = __boolToStr(object)
-    elseif(type(object) == 'string')then
-        str = object
-    else
-        str = type(object)
-    end
-    return str..'\n'
-end
-
-local function WriteDebugMessage(...)
-    if(debugWindow == nil)then return end
-
-    local args = {... }
-
-    local str = ''
-    if(args[1] ~= nil and type(args[1])=="string")then
-        args[1] = '|cD4CD82[|c82D482' .. args[1] .. '|cD4CD82]|cFFFFFF '
-        if(type(args[2])=="string")then
-            args[1] = args[1] .. ' ' .. args[2]
-            table.remove(args,2)
-        end
-        if(#args==1)then
-            str = args[1]
-        end
-    end
-    if(str=='')then
-        str=__tostring(args)
-    end
-
-    debugWindow:AddText(value)
-end
-
--- Create Debug Window
-local function ToggleDebugWindow(show)
-    -- show debug window
-    if(show)then
-
-        if(debugWindow==nil)then
-            local libMW = LibStub:GetLibrary("LibMsgWin-1.0")
-            debugWindow = libMW:CreateMsgWindow("AwesomeEventsDebugWindow", "Awesome Events Debug Log", 0, 0)
-        else
-            debugWindow:SetHidden(false)
-        end
-
-        if(not libAM.debug)then
-            debugWindow:AddText('Debug-Log: '..GetString(SI_AWEVS_DEBUG_DISABLED))
-            debugWindow:AddText('Usage: /aedebug mod_id (on\off)')
-        end
-
-        libAM.CallbackManager:RegisterCallback('AwesomeEventsDebugMessage',WriteDebugMessage)
-
-    -- hide debug window
-    else
-        if(debugWindow~=nil)then
-            debugWindow:SetHidden(true)
-        end
-        libAM.CallbackManager:UnregisterCallback('AwesomeEventsDebugMessage',WriteDebugMessage)
-    end
-end -- ToggleDebugWindow
-
-
---------------------
--- SLASH COMMANDS --
---------------------
-
--- Typing /aedump as a command will activate this function. Primarily used for testing.
-local function __SlashAEDebug(command)
-    local args = {}
-    for word in command:gmatch("%w+") do table.insert(args, word) end
-
-    local task = args[1] or 'unknown';
-
-    if(task=='show')then
-        return ToggleDebugWindow(true)
-    end
-    if(task=='hide')then
-        return ToggleDebugWindow(false)
-    end
-
-    local mod_id = task
-    local value = args[2] or nil
-
-    if(mod_id ~= nil and libAM.modules[mod_id] ~= nil)then
-        local mod = libAM.modules[mod_id]
-        if(value ~= nil)then
-            if(value=='on' or value=='On' or value=='ON'or value=='oN')then
-                mod.debug = true
-                libAM.debug = true
-                ToggleDebugWindow(true)
-            else
-                mod.debug = false
-
-                -- any other module in debug mode ?
-                libAM.debug = false
-                for mod_id,mod in libAM:module_pairs() do
-                    if(mod.debug)then
-                        libAM.debug = true
-                    end
-                end
-
-                -- clear old logs
-                if(not libAM.debug)then
-                    if(debugWindow ~= nil)then
-                        debugWindow:SetHidden(true)
-                        debugWindow:ClearText()
-                    end
-                end
-            end
-        end
-        local enabled = GetString(SI_AWEVS_DEBUG_DISABLED)
-        if(mod.debug)then enabled =  GetString(SI_AWEVS_DEBUG_ENABLED) end
-        d('[AwesomeEvents] Debug [' .. mod_id .. ']: ' .. enabled)
-        libAM.d('Debug-Log: ' .. enabled)
-    else
-        d('[AwesomeEvents] Debug [' .. mod_id .. ']: '..GetString(SI_AWEVS_DEBUG_MODULE_NOT_FOUND),'Usage: /aedebug mod_id (on||off)')
-    end
-end -- __SlashAEDebug
-
-SLASH_COMMANDS['/aedebug'] = __SlashAEDebug
-
-libAM.CallbackManager:RegisterCallback("AwesomeEventsToggleDebugWindow", ToggleDebugWindow);
\ No newline at end of file
diff --git a/AwesomeEvents/AE_HUD.lua b/AwesomeEvents/AE_HUD.lua
deleted file mode 100644
index 2410a75..0000000
--- a/AwesomeEvents/AE_HUD.lua
+++ /dev/null
@@ -1,224 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: AE_HUD.lua
-  Last Modified: 23.04.18 20:19
-
-  Copyright (c) 2018 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-
-local ENTRY_TEMPLATE = "AWEVS_ListEntry"
-local LIST_ENTRY_LIMIT = 20
-local FADE_MS = 200
-
-local EntryList = {}
-
-function EntryList:Initialize(control)
-    self.control = control
-
-    self.freeList = {}
-    self.activeList = {}
-    self.nextControlId = 1
-end
-
-function EntryList:AddLine(iconPath, text, color)
-    --Initialize control
-    local newEntry = next(self.freeList)
-    if not newEntry then
-        newEntry = GetWindowManager():CreateControlFromVirtual(self.nextControlId, self.control, ENTRY_TEMPLATE)
-        self.nextControlId = self.nextControlId + 1
-    end
-    newEntry:SetHidden(false)
-    self.freeList[newEntry] = nil
-    self.activeList[newEntry] = true
-
-    --Set text
-    local textControl = newEntry:GetNamedChild("Text")
-    textControl:SetText(text)
-    textControl:SetColor(color)
-
-    --Set anchor
-    if(self.lastEntry) then
-        newEntry:SetAnchor(BOTTOMRIGHT, self.lastEntry, TOPRIGHT)
-    else
-        newEntry:SetAnchor(BOTTOMRIGHT, nil, BOTTOMRIGHT)
-    end
-    self.lastEntry = newEntry
-
-    --Set icon
-    local icon = newEntry:GetNamedChild("Icon")
-    icon:SetTexture(iconPath)
-    --"EsoUI/Art/VOIP/voip-group.dds"
-    icon:SetColor(color)
-    --VOICE_CHAT_COLORS_GROUP
-end
-
-function EntryList:Clear()
-    self.lastEntry = nil
-
-    for entry in pairs(self.activeList) do
-        self.activeList[entry] = nil
-        self.freeList[entry] = true
-        entry:SetHidden(true)
-    end
-end
-
-
-
-
-local AwesomeEventsHUD = {}
-
-function AwesomeEventsHUD:Initialize(control)
-    self.control = control
-
-    self.listData = {} --list of currently speaking users, including users who have stopped talking but their HUD entry is waiting to clear
-    self.delayedClears = {} --table that maps users who have stopped talking to the time that their HUD entry should clear
-
-    self.entryList = control:GetNamedChild("List")
-    zo_mixin(self.entryList, EntryList)
-    self.entryList:Initialize(self.entryList)
-
-    self.listFade = ZO_AlphaAnimation:New(control.entryList)
-
-    self:RegisterForEvents()
-end
-
-function AwesomeEventsHUD.GetUniqueId(modId, entryId)
-    if( modId ~= nil and entryId ~= nil)then
-        return modId .. '_' .. entryId
-    end
-
-    return ''
-end
-
-function AwesomeEventsHUD:Update()
-    --Clear entries for users who haven't spoken recently
-    local currentTime = GetFrameTimeMilliseconds()
-    for uniqueId, clearTime in pairs(self.delayedClears) do
-        if currentTime >= clearTime then
-            self:Remove(uniqueId)
-            self.delayedClears[uniqueId] = nil
-        end
-    end
-
-    --Create the list
-    self.entryList:Clear()
-    for i = 1, #self.listData do
-        local listData = self.listData[i]
-        self.entryList:AddLine(listData.icon, listData.text, listData.color)
-    end
-end
-
-function AwesomeEventsHUD:Insert(uniqueId, icon, text, color)
-    --The list is a stack with the users who spoke most recently on the bottom. The local player is an
-    --exception to this and always shows at the bottom.
-
-    local listDataEntry = {
-        uniqueId = uniqueId,
-        modId = modId,
-        icon = icon,
-        text = text,
-        color = color
-    }
-
-    --Remove any existing entry so it can be reinserted at the bottom
-    self:Remove(uniqueId)
-
-    table.insert(self.listData, 1, listDataEntry)
-
-    --Remove the oldest entry if we're over the limit
-    if #self.listData > LIST_ENTRY_LIMIT then
-        table.remove(self.listData)
-    end
-
-    self:Update()
-end
-
-function AwesomeEventsHUD:Remove(uniqueId)
-    for i = 1, #self.listData do
-        if self.listData[i].uniqueId == uniqueId then
-            table.remove(self.listData, i)
-            self:Update()
-            break
-        end
-    end
-end
-
-function AwesomeEventsHUD:RemoveEventsForModule(modId)
-    local newList = {}
-    for i = 1, #self.listData do
-        local data = self.listData[i]
-        if modId ~= data.modId then
-            table.insert(newList, data)
-        end
-    end
-
-    self.listData = newList
-    self:Update()
-end
-
---Events
-function AwesomeEventsHUD:RegisterForEvents()
-
-    local function OnShow()
-        self.listFade:FadeIn(0, FADE_MS)
-    end
-    local function OnHide()
-        self.listFade:FadeOut(0, 0)
-    end
-
-    libAM.CallbackManager:RegisterCallback("AwesomeEventsShow", OnShow())
-    libAM.CallbackManager:RegisterCallback("AwesomeEventsHide", OnHide())
-    libAM.CallbackManager:RegisterCallback("AwesomeEventsNewEntry", function(eventCode, ...) self:OnNewEntry(...) end)
-    libAM.CallbackManager:RegisterCallback("AwesomeEventsOutdatedEntry", function(eventCode, ...) self:OnOutdatedEntry(...) end)
-    libAM.CallbackManager:RegisterCallback("AwesomeEventsModuleDisabled", function(eventCode, ...) self:OnRemoveModule(...) end)
-end
-
-function AwesomeEventsHUD:OnNewEvent(modId, entryId, icon, text, color, duration_ms)
-    local uniqueId = self.GetUniqueId(modId, entryId)
-    if duration_ms == 0 then
-        self.delayedClears[uniqueId] = nil
-        self:Insert(uniqueId, icon, text, color)
-    else
-        self.delayedClears[uniqueId] = GetFrameTimeMilliseconds() + duration_ms
-    end
-end
-
-function AwesomeEventsHUD:OnOutdatedEvent(modId, entryId)
-    self:Remove(self.GetUniqueId(modId, entryId))
-end
-
-function AwesomeEventsHUD:OnRemoveModule(modId)
-    self:RemoveEventsForModule(modId)
-end
-
-
-function AwesomeEventsHUD_OnInitialize(control)
-    AwesomeEventsHUD:Initialize(control)
-end
-
-
-local LAST_FRAME_TIME = 0
-
-function AwesomeEventsHUD_OnUpdate(frameTime)
-    AwesomeEventsHUD:Update()
-
-    if(frameTime == nil)then frameTime = GetFrameTimeSeconds() end
-    frameTime = math.floor(frameTime)
-    -- Only run this update if a full second has elapsed since last time we did so.
-    --local timestamp = GetTimeStamp()
-    if ( frameTime ~= LAST_FRAME_TIME ) then
-        LAST_FRAME_TIME = frameTime
-        libAM.CallbackManager:FireCallbacks('AwesomeEventsUpdate',GetTimeStamp())
-    end
-end
-
-function AwesomeEventsHUD_OnMoveStop(control)
-    libAM.CallbackManager:FireCallbacks('AwesomeEventsPositionChanged',control:GetRight(),control:GetBottom())
-end
\ No newline at end of file
diff --git a/AwesomeEvents/AE_Settings.lua b/AwesomeEvents/AE_Settings.lua
deleted file mode 100644
index a6d4e17..0000000
--- a/AwesomeEvents/AE_Settings.lua
+++ /dev/null
@@ -1,391 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: AE_AddonMenu.lua
-  Last Modified: 23.04.18 21:08
-
-  Copyright (c) 2018 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-local addon = {
-    name = 'AwesomeEvents',
-    panelName = 'AwesomeEventsOptions',
-    title = 'Awesome Events',
-    version = '2.0-Alpha1',
-}
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-
-local vars = {}
-local defaults = {
-    isDefault = true,
-    window = {
-        left = GuiRoot:GetWidth()/2,
-        top = 100,
-        movable = true,
-        scaling = 1.0,
-        textAlign = TEXT_ALIGN_CENTER,
-        textColor = {
-            [COLOR_AWEVS_AVAILABLE] = {r=0.5,g=0.83,b=0.5},
-            [COLOR_AWEVS_HINT] = {r=0.83,g=0.8,b=0.5},
-            [COLOR_AWEVS_WARNING] = {r=0.83,g=0.59,b=0.5},
-        }
-    },
-}
-
-
-
-
-local function GetEnabledValue(enabledText)
-    if(enabledText == GetString(SI_AWEMOD_SHOW_ICON))then return 2 end
-    if(enabledText == GetString(SI_AWEMOD_SHOW_TEXT))then return 3 end
-    if(enabledText == GetString(SI_AWEMOD_SHOW_NONE))then return 0 end
-    return 1
-end
-
-local function GetEnabledString(enabled)
-    if(enabled == ENABLED_AWEVS_NONE)then return GetString(SI_AWEMOD_SHOW_NONE) end
-    if(enabled == ENABLED_AWEVS_ICON_AND_TEXT)then return GetString(SI_AWEMOD_SHOW_ICON_AND_TEXT) end
-    if(enabled == ENABLED_AWEVS_ICON_ONLY)then return GetString(SI_AWEMOD_SHOW_ICON) end
-    if(enabled == ENABLED_AWEVS_TEXT_ONLY)then return GetString(SI_AWEMOD_SHOW_TEXT) end
-    return nil
-end
-
---- return a spacingPosition property as localized string
-local function GetSpacingPositionValue(spacingPositionText)
-    if(spacingPositionText == GetString(SI_AWEMOD_SPACING_BOTTOM)) then return TEXT_ALIGN_BOTTOM end
-    if(spacingPositionText == GetString(SI_AWEMOD_SPACING_BOTH)) then return TEXT_ALIGN_CENTER end
-    return TEXT_ALIGN_TOP
-end
-
-local function GetSpacingPositionString(spacingPosition)
-    if(spacingPosition == TEXT_ALIGN_TOP) then return GetString(SI_AWEMOD_SPACING_TOP) end
-    if(spacingPosition == TEXT_ALIGN_BOTTOM) then return GetString(SI_AWEMOD_SPACING_BOTTOM) end
-    if(spacingPosition == TEXT_ALIGN_CENTER) then return GetString(SI_AWEMOD_SPACING_BOTH) end
-    return nil
-end -- GetSpacingPositionString
-
---- return a textAlign property as localized string
-local function GetTextAlignString(textAlign)
-    if(textAlign == TEXT_ALIGN_LEFT) then return GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_LEFT) end
-    if(textAlign == TEXT_ALIGN_CENTER) then return GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_CENTER) end
-    if(textAlign == TEXT_ALIGN_RIGHT) then return GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_RIGHT) end
-    return nil
-end -- GetTextAlignString
-
-
-
-
-
-local function __recursive_copy(orig)
-    local orig_type = type(orig)
-    local copy
-    if orig_type == 'table' then
-        copy = {}
-        for orig_key, orig_value in next, orig, nil do
-            copy[__recursive_copy(orig_key)] = __recursive_copy(orig_value)
-        end
-    else -- number, string, boolean, etc
-        copy = orig
-    end
-    return copy
-end -- __recursive_copy
-
-local function ImportConfigFromCharacter(characterName)
-    libAM.d('settings','ImportConfigFromCharacter',characterName)
-    if(characterName == nil or characterName == GetString(SI_AWEVS_IMPORT_CHARACTER_SELECT))then
-        return
-    end
-
-    local characterId
-    if(characterName ~= GetUnitName('player'))then
-        for i = 1, GetNumCharacters() do
-            local name, _, _, _, _, _, id = GetCharacterInfo(i)
-            if(characterName == zo_strformat("<<1>>", name))then
-                characterId = id
-            end
-        end
-    end
-
-    if(characterId ~= nil)then
-        local tempVars = ZO_SavedVars:New('AwesomeEvents', 2, nil, defaults, "Default", GetDisplayName(), characterName, characterId, ZO_SAVED_VARS_CHARACTER_NAME_KEY)
-        if(not tempVars.isDefault)then
-            for key in pairs(defaults) do
-                vars[key] = __recursive_copy(tempVars[key])
-            end
-            libAM.d('settings','Imported successfully!')
-            -- restore module user config
-            for mod_id,mod in libAM:module_pairs() do
-
-                libAM.CallbackManager:FireCallbacks('AwesomeEventsModConfig_'..mod_id, vars[mod_id])
-                mod:Disable()
-                if(vars[mod_id].enabled>0)then
-                    mod:Enable(vars[mod_id])
-                end
-            end
-            -- restore gui user config
-            for key,color in pairs(vars.window.textColor) do
-                libAM.SetColorDef(key,color.r,color.g,color.b)
-            end
-
-            libAM.CallbackManager:FireCallbacks("AwesomeEventsViewConfig",vars.window);
-        end
-    end
-end -- ImportConfigFromCharacter
-
---- create a getFcn function callback for LAM panelOptions
-local function __CreateSettingsGetter(mod_id,property,dataTransformer)
-    if(libAM.modules[mod_id] == nil) then return end
-    if(dataTransformer ~= nil)then
-        return function() return dataTransformer(vars[mod_id][property]) end
-    else
-        return function() return vars[mod_id][property] end
-    end
-end -- __CreateSettingsGetter
-
---- create a setFcn function callback for LAM panelOptions
-local function __CreateSettingsSetter(mod_id,key)
-    if(libAM.modules[mod_id] == nil) then return end
-    local mod = libAM.modules[mod_id]
-    if(key=='enabled')then
-        return function(value)
-            value = GetEnabledValue(value)
-            vars[mod.id][key] = value
-            libAM.d('SetEnabled',value)
-            if(value>0)then
-                libAM.d('main','Enable['..mod_id..']')
-                mod:Enable(vars[mod_id])
-            else
-                libAM.d('main','Disable['..mod_id..']')
-                mod:Disable()
-            end
-            SetEventListeners()
-            View_SetSize()
-        end
-    elseif(key=='spacingPosition')then
-        return function(value)
-            View_SetSpacingPosition(mod_id,value)
-        end
-    elseif(key=='spacing')then
-        return function(value)
-            vars[mod_id][key] = value
-            View_SetSize()
-        end
-    elseif(key=='fontSize')then
-        return function(value)
-            vars[mod_id][key] = value
-            View_SetTextSize()
-            View_SetSize()
-        end
-    end
-    return function(value)
-        vars[mod_id][key] = value
-        libAM.d('settings','Set['..mod_id..']: '..key,value)
-        mod:Set(key,value)
-    end
-end -- __CreateSettingsSetter
-
---- create a disabled function callback for LAM panelOptions
-local function __CreateSettingsDisabler(mod_id)
-    return function() return vars[mod_id].enabled > 0 end
-end -- __CreateSettingsDisabler
-
---- create the addon menu with libaddonmenu
-local function CreateSettingsMenu(panelOptions)
-    local LAM2 = LibStub('LibAddonMenu-2.0')
-    local panelData = {
-        type = 'panel',
-        name = addon.name,
-        author = 'Ze_Mi',
-        version = '|c60FF60' .. addon.version .. '|r',
-        displayName = '|c8080FF' .. addon.title .. '|r',
-        registerForRefresh  = true,
-        registerForDefaults = true,
-    }
-
-    LAM2:RegisterAddonPanel(addon.panelName, panelData)
-    LAM2:RegisterOptionControls(addon.panelName, panelOptions)
-end -- CreateSettingsMenu
-
---- load module configuration and inject getter/setter, build default configuration
-local function LoadModulesConfiguration()
-    -- load characters for copy button
-    local importOptions = {GetString(SI_AWEVS_IMPORT_CHARACTER_SELECT)}
-    for i = 1, GetNumCharacters() do
-        local name, _, _, _, _, _, characterId = GetCharacterInfo(i)
-        if(characterId ~= GetCurrentCharacterId())then
-            table.insert(importOptions,zo_strformat("<<1>>", name))
-        end
-    end
-
-    local panelOptions = {
-        {
-            type = 'description',
-            text = GetString(SI_AWEVS_DESCRIPTION),
-        },
-        {
-            type = 'header',
-            name = '|c45D7F7' .. GetString(SI_AWEVS_APPEARANCE) .. '|r',
-        },
-        {
-            type = 'checkbox',
-            name = GetString(SI_AWEVS_APPEARANCE_MOVABLE),
-            tooltip = GetString(SI_AWEVS_APPEARANCE_MOVABLE_HINT),
-            getFunc = function() return vars.window.movable end,
-            setFunc = function(newValue) View_SetMovable(newValue) end,
-            default = defaults.window.movable,
-        },
-        {
-            type = 'dropdown',
-            name = GetString(SI_AWEVS_APPEARANCE_TEXTALIGN),
-            tooltip = GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_HINT),
-            choices = {GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_LEFT),GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_CENTER),GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_RIGHT)},
-            getFunc = function() return GetTextAlignString(vars.window.textAlign) end,
-            setFunc = function(newValue) View_SetTextAlign(newValue) end,
-            default = function() return GetTextAlignString(defaults.window.textAlign) end,
-        },
-        {
-            type = 'slider',
-            name = GetString(SI_AWEVS_APPEARANCE_UISCALE),
-            tooltip = GetString(SI_AWEVS_APPEARANCE_UISCALE_HINT),
-            min  = 5,
-            max = 15,
-            getFunc = function() return 10 * vars.window.scaling end,
-            setFunc = function(newValue) View_SetScale(newValue) end,
-            default = 10 * defaults.window.scaling,
-        },
-        {
-            type = 'colorpicker',
-            name = GetString(SI_AWEVS_APPEARANCE_COLOR_AVAILABLE),
-            tooltip = GetString(SI_AWEVS_APPEARANCE_COLOR_AVAILABLE_HINT),
-            getFunc = function() local c=vars.window.textColor[COLOR_AWEVS_AVAILABLE]; return c.r,c.g,c.b,1 end,
-            setFunc = function(r, g, b, a) View_SetTextColor(COLOR_AWEVS_AVAILABLE,r,g,b) end,
-            default = defaults.window.textColor[COLOR_AWEVS_AVAILABLE],
-        },
-        {
-            type = 'colorpicker',
-            name = GetString(SI_AWEVS_APPEARANCE_COLOR_HINT),
-            tooltip = GetString(SI_AWEVS_APPEARANCE_COLOR_HINT_HINT),
-            getFunc = function() local c=vars.window.textColor[COLOR_AWEVS_HINT]; return c.r,c.g,c.b,1 end,
-            setFunc = function(r, g, b, a) View_SetTextColor(COLOR_AWEVS_HINT,r,g,b) end,
-            default = defaults.window.textColor[COLOR_AWEVS_HINT],
-        },
-        {
-            type = 'colorpicker',
-            name = GetString(SI_AWEVS_APPEARANCE_COLOR_WARNING),
-            tooltip = GetString(SI_AWEVS_APPEARANCE_COLOR_WARNING_HINT),
-            getFunc = function() local c=vars.window.textColor[COLOR_AWEVS_WARNING]; return c.r,c.g,c.b,1 end,
-            setFunc = function(r, g, b, a) View_SetTextColor(COLOR_AWEVS_WARNING,r,g,b) end,
-            default = defaults.window.textColor[COLOR_AWEVS_WARNING],
-        },
-        {
-            type = 'header',
-            name = '|c45D7F7' .. GetString(SI_AWEVS_IMPORT) .. '|r',
-        },
-        {
-            type = 'description',
-            text = GetString(SI_AWEVS_IMPORT_DESCRIPTION),
-        },
-        {
-            type = 'dropdown',
-            name = GetString(SI_AWEVS_IMPORT_CHARACTER_LABEL),
-            choices = importOptions,
-            getFunc = function() return GetString(SI_AWEVS_IMPORT_CHARACTER_SELECT) end,
-            setFunc = function(newValue) state.importFromCharacter = newValue end,
-            default = GetString(SI_AWEVS_IMPORT_CHARACTER_SELECT),
-        },
-        {
-            type = 'button',
-            name = GetString(SI_AWEVS_IMPORT_BUTTON),
-            func = function() ImportConfigFromCharacter(state.importFromCharacter) end,
-        },
-    }
-    -- foreach module
-    for mod_id,mod in libAM:module_pairs() do
-        libAM.d('main','LoadModule['..mod_id..']')
-        -- create defaults
-        defaults[mod_id] = defaults[mod_id] or {}
-        defaults[mod_id].enabled = 1
-        defaults[mod_id].spacingPosition = mod.spacingPosition or TEXT_ALIGN_BOTTOM
-        defaults[mod_id].spacing = mod.spacing or 5
-        defaults[mod_id].fontSize = mod.fontSize or 1
-        table.insert( panelOptions,{
-            type = 'header',
-            name = '|c45D7F7' .. mod.title .. '|r',
-        })
-        table.insert( panelOptions, {
-            type = 'dropdown',
-            name = GetString(SI_AWEMOD_SHOW),
-            tooltip = mod.hint .. '\n' .. GetString(SI_AWEMOD_SHOW_HINT),
-            choices = {GetString(SI_AWEMOD_SHOW_ICON_AND_TEXT),GetString(SI_AWEMOD_SHOW_ICON),GetString(SI_AWEMOD_SHOW_TEXT),GetString(SI_AWEMOD_SHOW_NONE)},
-            getFunc = __CreateSettingsGetter(mod_id,'enabled',GetEnabledString),
-            setFunc = __CreateSettingsSetter(mod_id,'enabled',GetEnabledValue),
-            default = GetEnabledString(defaults[mod_id].enabled),
-        })
-        table.insert( panelOptions, {
-            type = 'dropdown',
-            name = GetString(SI_AWEMOD_SPACING_POSITION),
-            tooltip = GetString(SI_AWEMOD_SPACING_POSITION_HINT),
-            choices = {GetString(SI_AWEMOD_SPACING_TOP),GetString(SI_AWEMOD_SPACING_BOTTOM),GetString(SI_AWEMOD_SPACING_BOTH)},
-            getFunc = __CreateSettingsGetter(mod_id,'spacingPosition',GetSpacingPositionString),
-            setFunc = __CreateSettingsSetter(mod_id,'spacingPosition',GetSpacingPositionValue),
-            disabled = __CreateSettingsDisabler(mod_id),
-            default = GetSpacingPositionString(defaults[mod_id].spacingPosition),
-        })
-        table.insert( panelOptions,{
-            type = 'slider',
-            name = GetString(SI_AWEMOD_SPACING),
-            tooltip = GetString(SI_AWEMOD_SPACING_HINT),
-            min  = 0,
-            max = 30,
-            getFunc = __CreateSettingsGetter(mod_id,'spacing'),
-            setFunc = __CreateSettingsSetter(mod_id,'spacing'),
-            disabled = __CreateSettingsDisabler(mod_id),
-            default = defaults[mod_id].spacing,
-        })
-        table.insert( panelOptions,{
-            type = 'slider',
-            name = GetString(SI_AWEMOD_FONTSIZE),
-            tooltip = GetString(SI_AWEMOD_FONTSIZE_HINT),
-            min  = 1,
-            max = 5,
-            getFunc = __CreateSettingsGetter(mod_id,'fontSize'),
-            setFunc = __CreateSettingsSetter(mod_id,'fontSize'),
-            disabled = __CreateSettingsDisabler(mod_id),
-            default = defaults[mod_id].fontSize,
-        })
-        -- foreach options
-        for key,option in mod:option_pairs() do
-            if(option.type~=nil and option.name ~= nil and option.tooltip ~= nil and option.default ~= nil)then
-                defaults[mod_id][key] = option.default
-                option.getFunc = __CreateSettingsGetter(mod_id,key)
-                option.setFunc = __CreateSettingsSetter(mod_id,key)
-                option.disabled = __CreateSettingsDisabler(mod_id)
-                table.insert( panelOptions, option )
-            else
-                libAM.d('main','LoadModule['..mod_id..']',GetString(SI_AWEVS_DEBUG_MODULE_OPTION_INVALID),option)
-            end
-        end
-    end
-    return panelOptions
-end -- LoadModulesConfiguration
-
-local function LAM_OnChangeActivePanel(panel)
-    if(panel==nil or panel:GetName() == '')then
-        panel = WINDOW_MANAGER:GetControlByName(addon.panelName)
-        if not panel:IsHidden() then
-            View_SetHidden(false)
-        end
-    elseif(panel:GetName()==addon.panelName)then
-        View_SetHidden(false)
-    else
-        View_SetHidden(true)
-    end
-end -- LAM_OnChangeActivePanel
-
-libAM.RegisterCallback('AwesomeEventsPositionChanged',function(right,bottom)
-        vars.window.
-    end)
\ No newline at end of file
diff --git a/AwesomeEvents/AwesomeEvents.lua b/AwesomeEvents/AwesomeEvents.lua
deleted file mode 100644
index 6d5435e..0000000
--- a/AwesomeEvents/AwesomeEvents.lua
+++ /dev/null
@@ -1,548 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: AwesomeEvents.lua
-  Last Modified: 23.04.18 08:43
-
-  Copyright (c) 2018 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local state = {
-    initialized = false,
-    dragging = false,
-    lastUpdate = 0,
-    lastWidth = 0,
-    updateFrequency = 10,
-
-    inSettingsPanel = false,
-    position = {left=1000,top=30},
-
-    importFromCharacter = nil
-}
-
-local defaults = {
-    isDefault = true,
-    window = {
-        left = GuiRoot:GetWidth()/2,
-        top = 100,
-        movable = true,
-        scaling = 1.0,
-        textAlign = TEXT_ALIGN_CENTER,
-        textColor = {
-            [COLOR_AWEVS_AVAILABLE] = {r=0.5,g=0.83,b=0.5},
-            [COLOR_AWEVS_HINT] = {r=0.83,g=0.8,b=0.5},
-            [COLOR_AWEVS_WARNING] = {r=0.83,g=0.59,b=0.5},
-        }
-    },
-}
-local vars = {}
-local events = {}
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-
----
---- VIEW FUNCTIONS
----
-
---- after resizing the window or at first load, the anchors have to be resetted
-local function View_SetAnchors()
-    --[[
-    AwesomeEventsView:ClearAnchors()
-    if (vars.window.textAlign == TEXT_ALIGN_LEFT) then
-        AwesomeEventsView:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, state.position.left, state.position.top)
-    elseif (vars.window.textAlign == TEXT_ALIGN_RIGHT) then
-        AwesomeEventsView:SetAnchor(TOPRIGHT, GuiRoot, TOPLEFT, state.position.left, state.position.top)
-    else
-        AwesomeEventsView:SetAnchor(TOP, GuiRoot, TOPLEFT, state.position.left, state.position.top)
-    end
-    ]]
-end -- View_SetAnchors
-
---- resize the window to show all visible labels
-local function View_SetSize()
-    --[[
-    if state.dragging then return end
-
-    local maxWidth,totalHeight,lastModId,lastLabel,lastModLabelCount = 0,0,nil,nil,0
-    local lazyAddSpacing = 0
-
-    -- starting at 1, but 1 = backgorund, 2 = title
-    for i = 3, AwesomeEventsView:GetNumChildren() do
-        local child = AwesomeEventsView:GetChild(i)
-        local text = child:GetText()
-
-        -- hide if text is empty
-        if(text == '')then
-            -- not hidden yet?
-            if(child:GetHeight() > 0)then
-                child:SetHeight(0)
-            end
-
-            -- show label with text
-        else
-            child:SetWidth(0)
-            local mod_id,spacing = libAM.labelToMod[i],0
-            -- last mod ended ?
-            if(lastModId~=mod_id)then
-                -- add bottom spacing to previous label (if mod has multiple label for)
-                if(lazyAddSpacing>0)then
-                    lastLabel:SetHeight(lastLabel:GetHeight() + lazyAddSpacing);
-                    totalHeight = totalHeight + lazyAddSpacing
-                    if(lastModLabelCount>1 or vars[lastModId].spacingPosition==TEXT_ALIGN_TOP)then
-                        lastLabel:SetVerticalAlignment(TEXT_ALIGN_TOP);
-                    else
-                        lastLabel:SetVerticalAlignment(TEXT_ALIGN_CENTER);
-                    end
-                    lazyAddSpacing = 0
-                end
-                lastModLabelCount = 0
-
-                -- add top spacing
-                if(vars[mod_id].spacingPosition==TEXT_ALIGN_BOTTOM)then
-                    spacing = vars[mod_id].spacing
-                    child:SetVerticalAlignment(TEXT_ALIGN_BOTTOM);
-                elseif(vars[mod_id].spacingPosition==TEXT_ALIGN_CENTER)then
-                    spacing = vars[mod_id].spacing
-                    child:SetVerticalAlignment(TEXT_ALIGN_BOTTOM);
-                    lazyAddSpacing = spacing
-                elseif(vars[mod_id].spacingPosition==TEXT_ALIGN_TOP)then
-                    child:SetVerticalAlignment(TEXT_ALIGN_TOP);
-                    lazyAddSpacing = vars[mod_id].spacing
-                end
-            end
-
-            local newHeight = child:GetTextHeight() + spacing
-            -- not yet visible or wrong spacing ?
-            if(newHeight ~= child:GetHeight())then
-                child:SetHeight(newHeight)
-            end
-            totalHeight = totalHeight + newHeight
-            maxWidth = math.max(maxWidth,child:GetTextWidth())
-
-            lastModLabelCount = lastModLabelCount+1
-            lastModId = mod_id
-            lastLabel = child
-        end
-    end
-
-    if(lazyAddSpacing>0)then
-        lastLabel:SetHeight(lastLabel:GetHeight() + lazyAddSpacing);
-        totalHeight = totalHeight + lazyAddSpacing
-        if(lastModLabelCount>1)then
-            lastLabel:SetVerticalAlignment(TEXT_ALIGN_TOP);
-        else
-            lastLabel:SetVerticalAlignment(TEXT_ALIGN_CENTER);
-        end
-    end
-
-    -- show awesome events label if no other label active
-    local child = AwesomeEventsView:GetChild(2)
-    local text = child:GetText()
-    if(totalHeight>0 and text~='')then
-        child:SetText('')
-        child:SetHeight(0)
-    elseif(totalHeight==0)then
-        text = GetString(SI_AWEVS_NO_ACTIVE_MOD)
-        for mod_id in libAM:module_pairs() do
-            if(vars[mod_id].enabled>0)then
-                text = addon.title
-            end
-        end
-        child:SetText(text)
-        child:SetWidth(0)
-        totalHeight = child:GetTextHeight()
-        child:SetHeight(totalHeight)
-        maxWidth = child:GetTextWidth()
-    end
-
-    maxWidth = (maxWidth+20)
-    totalHeight = totalHeight+10
-
-    for i = 2, AwesomeEventsView:GetNumChildren() do
-        local child = AwesomeEventsView:GetChild(i)
-        child:SetWidth(maxWidth)
-    end
-
-    AwesomeEventsView:SetWidth(maxWidth)
-    AwesomeEventsView:SetHeight(totalHeight)
-
-    if(state.lastWidth ~= maxWidth)then
-        state.lastWidth = maxWidth
-        View_SetAnchors();
-    end
-    ]]
-end -- View_SetSize
-
---- change view movability
-local function View_SetMovable(movable)
-    vars.window.movable = movable
-    AwesomeEventsView:SetMovable(movable)
-end -- View_SetMovable
-
---- change view scale
-local function View_SetScale(scaling)
-    vars.window.scaling = scaling / 10;
-    AwesomeEventsView:SetScale(vars.window.scaling)
-    View_SetSize()
-end -- View_SetScale
-
---- change vertical alignment of a label, adjust view size
-local function View_SetSpacingPosition(mod_id,newSpacingPosition)
-    --[[ translate value to key
-    if(newSpacingPosition == GetString(SI_AWEMOD_SPACING_TOP)) then
-        newSpacingPosition = TEXT_ALIGN_TOP
-    elseif(newSpacingPosition == GetString(SI_AWEMOD_SPACING_BOTTOM)) then
-        newSpacingPosition = TEXT_ALIGN_BOTTOM
-    elseif(newSpacingPosition == GetString(SI_AWEMOD_SPACING_BOTH)) then
-        newSpacingPosition = TEXT_ALIGN_CENTER
-    end
-    vars[mod_id].spacingPosition = newSpacingPosition
-    View_SetSize()
-    ]]
-end -- View_SetSpacingPosition
-
---- change horizontal alignment of all labels, adjust view position
-local function View_SetTextAlign(newTextAlign)
-    --[[ translate value to key
-    if(newTextAlign == GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_LEFT)) then
-        newTextAlign = TEXT_ALIGN_LEFT
-    elseif(newTextAlign == GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_RIGHT)) then
-        newTextAlign = TEXT_ALIGN_RIGHT
-    elseif(newTextAlign == GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_CENTER)) then
-        newTextAlign = TEXT_ALIGN_CENTER
-    end
-    -- keep the position even if the anchor changes
-    if(state.initialized)then
-        local halfWindowWidth,leftShift = math.floor(AwesomeEventsView:GetWidth()/2),0
-        if(vars.window.textAlign == TEXT_ALIGN_LEFT)then
-            leftShift = halfWindowWidth
-        elseif(vars.window.textAlign == TEXT_ALIGN_RIGHT)then
-            leftShift = 0 - halfWindowWidth
-        end
-        if(newTextAlign == TEXT_ALIGN_LEFT)then
-            leftShift = leftShift - halfWindowWidth
-        elseif(newTextAlign == TEXT_ALIGN_RIGHT)then
-            leftShift = leftShift + halfWindowWidth
-        end
-        state.position.left = state.position.left + leftShift
-        vars.window.left = vars.window.left + leftShift
-    end
-    vars.window.textAlign = newTextAlign
-
-    View_SetAnchors()
-    for i = 2, AwesomeEventsView:GetNumChildren() do
-        local child = AwesomeEventsView:GetChild(i)
-        child:SetHorizontalAlignment(newTextAlign)
-    end
-    ]]
-end -- View_SetTextAlign
-
-local function View_SetTextColor(type,rValue,gValue,bValue)
-    rValue = math.floor(rValue*100)/100
-    gValue = math.floor(gValue*100)/100
-    bValue = math.floor(bValue*100)/100
-    libAM.SetColorDef(type,rValue,gValue,bValue)
-    vars.window.textColor[type] = {r=rValue,g=gValue,b=bValue}
-    for mod_id,mod in libAM:module_pairs() do
-        if(vars[mod_id].enabled>0)then
-            mod.dataUpdated = true
-        end
-    end
-end -- View_SetTextColor
-
---- update the font size of all labels
-local function View_SetTextSize()
-    --[[ starting at 1, but 1 = background, 2 = title
-    for i = 3, AwesomeEventsView:GetNumChildren() do
-        local child = AwesomeEventsView:GetChild(i)
-        local mod_id = libAM.labelToMod[i]
-        local fontSize = 6-vars[mod_id].fontSize
-        if(fontSize<1)then fontSize = 1 end
-        if(fontSize>5)then fontSize = 5 end
-        child:SetFont('ZoFontWinH'..fontSize)
-    end
-    ]]
-end -- View_SetTextSize
-
-local function View_SetHidden(hidden)
-   --[[ if(hidden == null)then
-        hidden = false
-    end
-    if (not hidden and AwesomeEventsView:IsHidden()) then
-        if (state.inSettingsPanel) then
-            local sub = {
-                [TEXT_ALIGN_LEFT] = AwesomeEventsView:GetWidth(),
-                [TEXT_ALIGN_CENTER] = AwesomeEventsView:GetWidth()/2,
-                [TEXT_ALIGN_RIGHT] = 0,
-            }
-            state.position.left = math.floor(GuiRoot:GetWidth()*0.96) - sub[vars.window.textAlign]
-            state.position.top = 200
-
-            AwesomeEventsView:SetDrawLayer(DL_OVERLAY)
-            AwesomeEventsView:SetMovable(true)
-            AwesomeEventsViewBg:SetAlpha(1)
-        else
-            state.position.left = vars.window.left
-            state.position.top = vars.window.top
-
-            AwesomeEventsView:SetDrawLayer(DL_BACKGROUND)
-            AwesomeEventsView:SetMovable(vars.window.movable)
-            AwesomeEventsViewBg:SetAlpha(0)
-        end
-        View_SetAnchors()
-    end
-    AwesomeEventsView:SetHidden(false)
-    ]]
-    if(hidden == true)then
-        libAM.CallbackManager:FireCallbacks("AwesomeEventsShow")
-    else
-        libAM.CallbackManager:FireCallbacks("AwesomeEventsHide")
-    end
-end -- View_SetHidden
-
-
----
--- EVENT MANAGER
----
-
-local function OnEvent(...)
-    local args = {... }
-    local eventCode = args[1] or 'unknown'
-    if(events[eventCode] ~= nil)then
-        for mod_id,callback in pairs(events[eventCode]) do
-            -- slibAM.d('main','OnEvent['..mod_id..']: '..eventCode)
-            callback(unpack(args))
-        end
-    else
-        libAM.d('main','OnEvent: '..eventCode..' - ' .. GetString(SI_AWEVS_DEBUG_NO_EVENT_CALLBACKS),events)
-        EVENT_MANAGER:UnregisterForEvent('Awesome_Events', eventCode)
-    end
-end -- OnEvent
-
-local function SetEventListeners()
-    libAM.d('main','SetEventListeners')
-    -- remove old listeners
-    for eventCode,event in pairs(events) do
-        EVENT_MANAGER:UnregisterForEvent('Awesome_Events', eventCode)
-    end
-
-    events = {}
-    events[EVENT_AWESOME_MODULE_TIMER] = {}
-    -- foreach module
-    for mod_id,mod in libAM:module_pairs() do
-        if(vars[mod.id].enabled>0)then
-            local mod_events = mod:GetEventListeners()
-            for i,event in pairs(mod_events) do
-                if(event.eventCode ~= nil and event.callback ~= nil)then
-                    if(events[event.eventCode] == nil)then
-                        events[event.eventCode] = {}
-                        EVENT_MANAGER:RegisterForEvent('Awesome_Events', event.eventCode, function(...) OnEvent(unpack({...})) end)
-                    end
-                    events[event.eventCode][mod.id] = event.callback
-                else
-                    libAM.d('main','SetEventListeners['..mod_id..']',GetString(SI_AWEVS_DEBUG_MODULE_EVENT_INVALID),event)
-                end
-            end
-        end
-    end
-    libAM.timer = {}
-    if(events[EVENT_AWESOME_MODULE_TIMER] ~= nil)then
-        -- foreache awesome events timer
-        for mod_id,callback in pairs(events[EVENT_AWESOME_MODULE_TIMER]) do
-            libAM.timer[mod_id] = 1
-        end
-    end
-end -- SetEventListeners
-
-
---- Initialize modules, config menu, views and user configuration
-local function Initialize()
-    -- Only initialize the addon (after all addons are loaded)
-    EVENT_MANAGER:UnregisterForEvent('Awesome_Events', EVENT_PLAYER_ACTIVATED)
-
-    -- test if any mod is in debug mode
-    for mod_id,mod in libAM:module_pairs() do
-        if(mod.debug)then
-            libAM.debug = true
-        end
-    end
-    if(libAM.debug)then
-        libAM.CallbackManager:FireCallbacks("AwesomeEventsToggleDebugWindow",true)
-    end
-
-    libAM.RegisterCallback("AwesomeEventsConfigReloaded", function(_vars)
-        AwesomeEventsView:SetScale(_vars.window.scaling)
-        AwesomeEventsView:SetMovable(_vars.window.movable)
-        View_SetTextAlign(_vars.window.textAlign)
-        View_SetTextSize()
-        View_SetSize()
-    end);
-
-    -- load module- and user configuration
-    local panelOptions = LoadModulesConfiguration()
-    vars = ZO_SavedVars:New('AwesomeEvents', 2, nil, defaults)
-    vars.isDefault = false
-
-    -- init modules: create labels and preload data
-    for mod_id,mod in libAM:module_pairs() do
-        mod:Initialize( vars[mod_id] )
-    end
-    libAM.d('main','Complete!')
-
-    -- restore gui user config
-    for key,color in pairs(vars.window.textColor) do
-        libAM.SetColorDef(key,color.r,color.g,color.b)
-    end
-    AwesomeEventsView:SetScale(vars.window.scaling)
-    AwesomeEventsView:SetMovable(vars.window.movable)
-    View_SetTextAlign(vars.window.textAlign)
-    View_SetTextSize()
-    View_SetSize()
-
-    -- create addon menu (LAM)
-    CreateSettingsMenu(panelOptions)
-
-    -- register LAM/optionsPanel events
-    local lamControl = WINDOW_MANAGER:GetControlByName('LAMAddonSettingsWindow')
-    local lamOnShowHandler = lamControl:GetHandler('OnShow')
-    if(lamOnShowHandler ~= nil) then
-        lamControl:SetHandler('OnShow',function(self,hidden)
-            LAM_OnChangeActivePanel()
-            lamOnShowHandler(self,hidden)
-        end)
-    else
-        lamControl:SetHandler('OnShow',function(self,hidden)
-            LAM_OnChangeActivePanel()
-        end)
-    end
-    CALLBACK_MANAGER:RegisterCallback("LAM-RefreshPanel",LAM_OnChangeActivePanel)
-
-    -- register SCENE events
-    SCENE_MANAGER:RegisterCallback("SceneStateChanged", function(scene,oldState,newState)
-        if(scene.name == 'hud' or scene.name == 'hudui')then
-            if(newState == SCENE_HIDING)then
-                View_SetHidden(true)
-            elseif(newState == SCENE_SHOWN)then
-                View_SetHidden(false)
-            end
-        elseif(scene.name == 'gameMenuInGame')then
-            if(newState == SCENE_HIDING)then
-                state.inSettingsPanel = false
-                View_SetHidden(true)
-            elseif(newState == SCENE_SHOWN)then
-                state.inSettingsPanel = true
-            end
-        end
-    end)
-
-    -- register MODULE events
-    SetEventListeners()
-
-    state.initialized = true
-
-    View_SetHidden(false)
-end -- Initialize
-
-
----
--- MAIN FRAME UPDATE
----
-
--- main update: firering timer, call mod update functions, update the viewsize
-local function Update(timestamp)
-    -- trigger EVENT_AWESOME_MODULE_TIMER
-    if(events[EVENT_AWESOME_MODULE_TIMER] ~= nil)then
-        local secondsToNextMinute = 60 - timestamp%60
-        if(secondsToNextMinute<10)then
-            secondsToNextMinute = secondsToNextMinute + 60
-        end
-        for mod_id,callback in pairs(events[EVENT_AWESOME_MODULE_TIMER]) do
-            if(vars[mod_id].enabled > 0 and libAM.timer[mod_id] > 0 and libAM.timer[mod_id] <= timestamp)then
-                libAM.d('main','OnTimer['..mod_id..']')
-                local seconds = callback(EVENT_AWESOME_MODULE_TIMER,timestamp)
-                -- no return value => execute every minute
-                if(type(seconds)~= 'number') then
-                    seconds = secondsToNextMinute
-                elseif(seconds>0) then
-                    libAM.d('main','Next timer event ['..mod_id..'] in ' .. tostring(seconds) .. ' seconds')
-                end
-                -- timer still enabled ?
-                if(libAM.timer[mod_id]>0)then
-                    if(seconds<1)then
-                        libAM.d('main','Timer event autopaused ['..mod_id..']')
-                        libAM.timer[mod_id] = 0
-                    else
-                        libAM.timer[mod_id] = timestamp + seconds
-                    end
-                end
-            end
-        end
-    end
-    local resizeView = false
-    -- update each module
-    for mod_id,mod in libAM:module_pairs() do
-        if(vars[mod.id].enabled > 0 and mod:HasUpdate())then
-            mod.dataUpdated = false
-            mod:Update(vars[mod.id])
-            resizeView = true
-        end
-    end
-    if(resizeView)then
-        View_SetSize();
-    end
-end -- Update
-
-
--------------------------
--- VIEW EVENT LISTENER --
--------------------------
-
-function AWESOME_EVENTS_OnMoveStart()
-    if (not state.initialized) then return end
-
-    -- start dragging mode
-    state.dragging = true
-
-    -- do not change alpha in LAMSettingsPanel
-    if(not state.inSettingsPanel)then
-        AwesomeEventsViewBg:SetAlpha(0.5)
-    end
-end -- AWESOME_EVENTS_OnMoveStart
-
-function AWESOME_EVENTS_OnMoveStop()
-    --[[
-    if (not state.initialized) then return end
-
-    if (vars.window.textAlign == TEXT_ALIGN_LEFT) then
-        state.position.left = AwesomeEventsView:GetLeft()
-        state.position.top = AwesomeEventsView:GetTop()
-    elseif (vars.window.textAlign == TEXT_ALIGN_RIGHT) then
-        state.position.left = AwesomeEventsView:GetRight()
-        state.position.top = AwesomeEventsView:GetTop()
-    else
-        state.position.left = AwesomeEventsView:GetCenter()
-        state.position.top = AwesomeEventsView:GetTop()
-    end
-
-    -- do not store movement or change alpha in LAMSettingsPanel
-    if(not state.inSettingsPanel)then
-        AwesomeEventsViewBg:SetAlpha(0)
-        vars.window.left = math.floor(state.position.left*100)/100;
-        vars.window.top = math.floor(state.position.top*100)/100;
-    end
-    state.dragging = false
-    ]]
-end -- AWESOME_EVENTS_OnMoveStop
-
-
-
-
-----------------
--- INIT EVENT --
-----------------
-
-EVENT_MANAGER:RegisterForEvent('Awesome_Events', EVENT_PLAYER_ACTIVATED, Initialize)
\ No newline at end of file
diff --git a/AwesomeEvents/AwesomeEvents.txt b/AwesomeEvents/AwesomeEvents.txt
deleted file mode 100644
index bc0975d..0000000
--- a/AwesomeEvents/AwesomeEvents.txt
+++ /dev/null
@@ -1,49 +0,0 @@
-## APIVersion: 100022
-## Version: 1.4-Alpha9
-## Title: |cFFFFB0Awesome Events|r
-## Description: This addon adds many customizable notifications and information to your UI. (Version: 1.4-Alpha9)
-## Author: Ze_Mi
-## OptionalDependsOn: LibStub, LibAddonMenu-2.0, LibAwesomeModule-1.0
-## SavedVariables: AwesomeEvents
-##
-## This Add-on is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates.
-## The Elder Scrolls® and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries.
-## All rights reserved
-##
-## You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
-
-Libs/LibStub/LibStub.lua
-Libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
-Libs/LibAddonMenu-2.0/controls/panel.lua
-Libs/LibAddonMenu-2.0/controls/submenu.lua
-Libs/LibAddonMenu-2.0/controls/button.lua
-Libs/LibAddonMenu-2.0/controls/checkbox.lua
-Libs/LibAddonMenu-2.0/controls/colorpicker.lua
-Libs/LibAddonMenu-2.0/controls/custom.lua
-Libs/LibAddonMenu-2.0/controls/description.lua
-Libs/LibAddonMenu-2.0/controls/dropdown.lua
-Libs/LibAddonMenu-2.0/controls/header.lua
-Libs/LibAddonMenu-2.0/controls/slider.lua
-Libs/LibAddonMenu-2.0/controls/texture.lua
-Libs/LibAwesomeModule-1.0/LibAwesomeModule-1.0.lua
-Libs/LibMsgWin-1.0/LibMsgWin-1.0.lua
-
-Language/strings.lua
-Language/$(language).lua
-
-Modules/BuffFood.lua
-Modules/Clock.lua
-Modules/Crafting.lua
-Modules/Durability.lua
-Modules/Fencing.lua
-Modules/Inventory.lua
-Modules/Mails.lua
-Modules/Mount.lua
-Modules/RepairKits.lua
-Modules/Skills.lua
-Modules/SkyShards.lua
-Modules/SoulGems.lua
-Modules/WeaponCharge.lua
-AwesomeEvents.lua
-AwesomeEvents.xml
-AwesomeModuleLabel.xml
\ No newline at end of file
diff --git a/AwesomeEvents/AwesomeEvents.xml b/AwesomeEvents/AwesomeEvents.xml
deleted file mode 100644
index 95f552e..0000000
--- a/AwesomeEvents/AwesomeEvents.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-<GuiXml>
-    <Controls>
-        <Control name="AWEVS_ListEntry" virtual="true" inheritAlpha="true">
-            <Dimensions x="315" y="52" />
-            <Controls>
-                <Texture name="$(parent)Bg" textureFile="EsoUI/Art/Miscellaneous/listItem_backdrop.dds">
-                    <TextureCoords left="1" right="0.2" top="0" bottom=".8" />
-                    <AnchorFill/>
-                </Texture>
-
-                <Texture name="$(parent)Icon">
-                    <Dimensions x="32" y="32" />
-                    <Anchor point="BOTTOMRIGHT" offsetX="-15" offsetY="-11" />
-                </Texture>
-
-                <Label name="$(parent)Text" font="ZoFontWinH1" verticalAlignment="CENTER" color="FFFFFF" >
-                    <Anchor point="RIGHT" relativeTo="$(parent)Icon" relativePoint="LEFT" offsetX="-8" />
-                </Label>
-
-            </Controls>
-        </Control>
-
-        <TopLevelControl name="AwesomeEventsView" mouseEnabled="true" movable="true" clampedToScreen="true" hidden="true" allowBringToTop="true" resizeToFitDescendents="true">
-            <OnInitialize>
-                AwesomeEventsHUD_OnInitialize(self)
-            </OnInitialize>
-
-            <OnMouseEnter>
-                self:SetAlpha(1)
-            </OnMouseEnter>
-
-            <OnUpdate>
-                AwesomeEventsHUD_OnUpdate(time)
-            </OnUpdate>
-
-            <OnMoveStop>
-                AwesomeEventsHUD_OnMoveStop(self)
-            </OnMoveStop>
-
-            <Anchor point="BOTTOMRIGHT" offsetY="-10" />
-
-            <Controls>
-                <Control name="$(parent)List" resizeToFitDescendents="true" >
-                    <Anchor point="CENTER" />
-                    <Control name="AE_ModuleEntry0" virtual="true" inheritAlpha="true">
-                        <Dimensions x="315" y="52" />
-                        <Controls>
-                            <Texture name="$(parent)Bg" textureFile="EsoUI/Art/Miscellaneous/listItem_backdrop.dds">
-                                <TextureCoords left="1" right="0.2" top="0" bottom=".8" />
-                                <AnchorFill/>
-                            </Texture>
-
-                            <Texture name="$(parent)Icon">
-                                <Dimensions x="32" y="32" />
-                                <Anchor point="BOTTOMRIGHT" offsetX="-15" offsetY="-11" />
-                            </Texture>
-
-                            <Label name="$(parent)Text" font="ZoFontWinH5" verticalAlignment="CENTER" color="FFFFFF" text="SI_AWEVS_NO_ACTIVE_MOD" >
-                                <Anchor point="RIGHT" relativeTo="$(parent)Icon" relativePoint="LEFT" offsetX="-8" />
-                            </Label>
-
-                        </Controls>
-                    </Control>
-                </Control>
-            </Controls>
-
-        </TopLevelControl>
-    </Controls>
-</GuiXml>
\ No newline at end of file
diff --git a/AwesomeEvents/Language/de.lua b/AwesomeEvents/Language/de.lua
deleted file mode 100644
index ef22b33..0000000
--- a/AwesomeEvents/Language/de.lua
+++ /dev/null
@@ -1,197 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: de.lua
-  Last Modified: 17.07.17 12:56
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  Für weitere Informationen lies bitte die README Datei.
-  ]]
-
---main
-SafeAddString(SI_AWEVS_NO_ACTIVE_MOD, "Aktiviere ein AwesomeEvents Modul", 1)
-SafeAddString(SI_AWEVS_DESCRIPTION, "Mit AwesomeEvents kannst du während dem Spielen über viele interessante Ergeignisse informiert werden.\nDa es viele Module und Anpassungsmöglichkeiten gibt,\nsolltest du dir kurz Zeit nehmen und einmal alle Optionen bis unten durch stöbern.\nBei Verbesserungsvorschlägen, Wünschen, neuen Übersetzungen oder Fehlern, wende dich einfach an <zemi@unive.de> oder über das Spiel EU\PC @Ze_Mi :)", 1)
-
---debug
-SafeAddString(SI_AWEVS_DEBUG_NO_EVENT_CALLBACKS, "Keine Callbacks, EventListener entfernt!", 1)
-SafeAddString(SI_AWEVS_DEBUG_ENABLED, "|c82D482AKTIVIERT", 1)
-SafeAddString(SI_AWEVS_DEBUG_DISABLED, "|cD49682DEAKTIVIERT", 1)
-SafeAddString(SI_AWEVS_DEBUG_MODULE_EVENT_INVALID, "Ungültiges event Objekt!\nErwartet: event={eventCode=EVENT_...,callback=function() ... end}!\nBeide Schlüssel werden benötigt!\nIst:", 1)
-SafeAddString(SI_AWEVS_DEBUG_MODULE_OPTION_INVALID, "Ungültiges options Objekt!\nErwartet: option={type='',name='',tooltip='',default=...}!\nDiese Schlüssel werden mindestens benötigt!\nIst:", 1)
-SafeAddString(SI_AWEVS_DEBUG_MODULE_NOT_FOUND, "Modul nicht gefunden!", 1)
-SafeAddString(SI_AWEVS_DEBUG_MODULE_NO_TIMER, "Diese modul reagiert nicht auf das Event EVENT_AWESOME_MODULE_TIMER oder du versuchst eine Timer Funktion innerhalb der Enable Funktion aufzurufen, sorry das geht leider nicht. Der timer kann nicht genutzt werden.", 1)
-SafeAddString(SI_AWEVS_DEBUG_COMMAND_USAGE, "Befehl: /aedebug mod_id (on\off)", 1)
-
---appearance
-SafeAddString(SI_AWEVS_APPEARANCE, "Darstellung", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_MOVABLE, "Fenster verschiebbar", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_MOVABLE_HINT, "Entsperrt das Fenster, sodass es frei mit der Maus verschoben werden kann.", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN, "Text-Ausrichtung", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_HINT, "Verändere die Ausrichtung aller Benachrichtigungen.", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_LEFT, "Linksbündig", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_CENTER,"Zentriert", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_RIGHT, "Rechtsbündig", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_UISCALE, "Fenster Größe / Skalierung", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_UISCALE_HINT, "Vergrößere oder verkleinere die Darstellung des Fensters.", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_COLOR_AVAILABLE,"Farbe von Verfügbarkeiten", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_COLOR_AVAILABLE_HINT, "Ändere die Textfarbe von Verfügbarkeits-Meldungen.", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_COLOR_HINT,"Farbe von Hinweisen", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_COLOR_HINT_HINT, "Ändere die Textfarbe von Hinweis-Meldungen.", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_COLOR_WARNING,"Farbe von Warnungen", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_COLOR_WARNING_HINT, "Ändere die Textfarbe von Warnungen.", 1)
-
---import
-SafeAddString(SI_AWEVS_IMPORT,"Einstellungen Importieren", 1)
-SafeAddString(SI_AWEVS_IMPORT_DESCRIPTION,"Übernehme die Einstellungen von einem anderen Charakter", 1)
-SafeAddString(SI_AWEVS_IMPORT_CHARACTER_LABEL,"Importiere von", 1)
-SafeAddString(SI_AWEVS_IMPORT_CHARACTER_SELECT," - Wähle einen Charakter -", 1)
-SafeAddString(SI_AWEVS_IMPORT_BUTTON,"Importieren", 1)
-
---module-all
-SafeAddString(SI_AWEMOD_SHOW, "Anzeigen", 1)
-SafeAddString(SI_AWEMOD_SHOW_HINT, "Aktiviere oder deaktiviere alle Benachrichtigungen dieses Moduls", 1)
-SafeAddString(SI_AWEMOD_SHOW_ICON, "Icon", 1)
-SafeAddString(SI_AWEMOD_SHOW_ICON_AND_TEXT, "Icon und Text", 1)
-SafeAddString(SI_AWEMOD_SHOW_TEXT, "Text", 1)
-SafeAddString(SI_AWEMOD_SHOW_NONE, "Nichts (Deaktiviert)", 1)
-SafeAddString(SI_AWEMOD_SPACING_POSITION, "Abstand (Positionierung)", 1)
-SafeAddString(SI_AWEMOD_SPACING_POSITION_HINT, "Wähle die Positionierung des Abstands zwischen Nachrichten dieses Moduls und anderen Benachrichtigungen.", 1)
-SafeAddString(SI_AWEMOD_SPACING_BOTTOM, "Oben", 1)
-SafeAddString(SI_AWEMOD_SPACING_BOTH, "Oben und unten", 1)
-SafeAddString(SI_AWEMOD_SPACING_TOP, "Unten", 1)
-SafeAddString(SI_AWEMOD_SPACING, "Abstand (Größe)", 1)
-SafeAddString(SI_AWEMOD_SPACING_HINT, "Wähle den Abstand zwischen Nachrichten dieses Moduls und anderen Benachrichtigungen.", 1)
-SafeAddString(SI_AWEMOD_FONTSIZE, "Schriftgröße", 1)
-SafeAddString(SI_AWEMOD_FONTSIZE_HINT, "Wähle die Schriftgrößer aller Benachrichtigungen diese Moduls.", 1)
-
---module-bufffood
-SafeAddString(SI_AWEMOD_BUFFFOOD, "Versorgungs-Wirkzeit (Buff-Food)", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_HINT, "Erhalte eine Benachrichtigung mit verbleibender Zeit, wenn der Effekt deiner Nahrung kurz vor dem Ablauf steht oder du bereits neue Buff-Nahrung zu dir nehmen kannst.", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_TIMER_LABEL, "Effekt <<C:1>> endet in", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_READY_LABEL, "Keine Buff-Food Effekte aktiv!", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_TIMER, "Restzeit-Hinweis ab (Minuten)", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_TIMER_HINT, "Zeigt den Versorgungs-Hinweis mit Countdown an, sobald der Effekt der genommenen Nahrung in weniger als der hier festgelegten Minutenzahl auslaufen wird.", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT, "Blinken (im Kampf)", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT_HINT, "Die Warnung fängt an zu blinken, wenn du dich im Kampf befindest und keinen Buff-Food Effekt aktiv hast.", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT, "Ausblenden (Ohne Kampf)", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT_HINT, "Wenn du keinen Versorgungs-Effekt aktiv hast und 5 minuten lang an keinem Kampf teilnimmst, wird die Warnung bis zum nächsten Kampf oder bis zur nächsten Mahlzeit ausgeblendet.", 1)
-
---module-clock
-SafeAddString(SI_AWEMOD_CLOCK, "Uhrzeit und Datum", 1)
-SafeAddString(SI_AWEMOD_CLOCK_HINT, "Zeige die aktuelle Uhrzeit und das Datum auf dem Bildschirm an.", 1)
-SafeAddString(SI_AWEMOD_CLOCK_DATEFORMAT_SHORT, "day.month", 1)
-SafeAddString(SI_AWEMOD_CLOCK_DATEFORMAT_LONG, "day.month.year", 1)
-SafeAddString(SI_AWEMOD_CLOCK_STYLE, "Darstellung", 1)
-SafeAddString(SI_AWEMOD_CLOCK_STYLE_HINT, "Wähle deine bevorzugte Darstellung.", 1)
-SafeAddString(SI_AWEMOD_CLOCK_STYLE_TIME, "Nur Uhrzeit", 1)
-SafeAddString(SI_AWEMOD_CLOCK_STYLE_DATETIME_SHORT, "Datum & Uhrzeit (Einzeilig)", 1)
-SafeAddString(SI_AWEMOD_CLOCK_STYLE_DATETIME_LONG, "Datum & Uhrzeit (Zweizeilig)", 1)
-SafeAddString(SI_AWEMOD_CLOCK_FORMAT, "Format 24-Stunden", 1)
-SafeAddString(SI_AWEMOD_CLOCK_FORMAT_HINT, "Schalte auf das 24-Stunden Format statt 12-Stunden (+AM/PM) Format um.", 1)
-
---module-crafting
-SafeAddString(SI_AWEMOD_CRAFTING, "Handwerk", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_HINT, "Erhalte eine Benachrichtigung mit verbleinder Zeit, wenn deine laufende Analyse eines Handwerksberufs kurz vor dem Abschluss steht, oder ob du bereits eine neue Analyse starten kannst.", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_AVAILABLE_LABEL, "Analyse", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_BLACKSMITHING, "Schmiedekunst anzeigen", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_BLACKSMITHING_HINT, "Aktiviere die Anzeige in wie viel Minuten ein neuer Gegenstand in der Schmiede analysiert werden kann.", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_CLOTHING, "Schneiderei anzeigen", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_CLOTHING_HINT, "Aktiviere die Anzeige in wie viel Minuten ein neuer Gegenstand in der Schneiderbank analysiert werden kann.", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_WOODWORKING, "Schreinerei anzeigen", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_WOODWORKING_HINT, "Aktiviere die Anzeige in wie viel Minuten ein neuer Gegenstand in der Schreinerbank analysiert werden kann.", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_TIMER, "Analyse-Hinweis ab (Minuten)", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_TIMER_HINT, "Zeigt die oben gewählten Analyse-Hinweis mit Countdown an, sobald die Analyse in weniger als der hier festgelegten Minutenzahl abgeschlossen wird.", 1)
-
---module-durability
-SafeAddString(SI_AWEMOD_DURABILITY, "Haltbarkeit getragener Rüstung", 1)
-SafeAddString(SI_AWEMOD_DURABILITY_LABEL, "Rüstungszustand", 1)
-SafeAddString(SI_AWEMOD_DURABILITY_HINT, "Erhalte eine Benarichtigung über die Haltbarkeit deiner getragenen Rüstung, bevor diese zu schwach wird.", 1)
-SafeAddString(SI_AWEMOD_DURABILITY_INFO, "Haltbarkeit (|cFFFF60Hinweis|r) %", 1)
-SafeAddString(SI_AWEMOD_DURABILITY_INFO_HINT, "Wenn die Haltbarkeit eines deiner Rüstungsteile höchstens den hier eingestellte Wert hat, wird ein Hinweis angezeigt.", 1)
-SafeAddString(SI_AWEMOD_DURABILITY_WARNING, "Haltbarkeit (|cFF6060Warnung|r) %", 1)
-SafeAddString(SI_AWEMOD_DURABILITY_WARNING_HINT, "Wenn die Haltbarkeit eines deiner Rüstungsteile höchstens den hier eingestellte Wert hat, wird eine Warnung angezeigt.", 1)
-
---module-fencing
-SafeAddString(SI_AWEMOD_FENCING, "Diebesgilde", 1)
-SafeAddString(SI_AWEMOD_FENCING_HINT, "Erhalte eine Benarichtigung über die verbleibenden Transaktionen bei deinem Hehler, sobald diese unter die unten eingestellten Werte sinken, oder erhalte einen Countdown, wann du neue Transaktionen tätigen kannst.", 1)
-SafeAddString(SI_AWEMOD_FENCING_SELLS_LABEL, "Hehlerei", 1)
-SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_LABEL, "Schieben", 1)
-SafeAddString(SI_AWEMOD_FENCING_SELLS, "Verbleibende Verkäufe anzeigen", 1)
-SafeAddString(SI_AWEMOD_FENCING_SELLS_HINT, "Aktiviere Hinweise über die verbleibenden Verkäufe von Diebesgut, sobald diese unter die folgenden Werte fallen.", 1)
-SafeAddString(SI_AWEMOD_FENCING_SELLS_INFO, "Verkäufe (|cFFFF60Hinweis|r)", 1)
-SafeAddString(SI_AWEMOD_FENCING_SELLS_INFO_HINT,"Wenn du nur noch die hier eingestellte Anzahl an Diebesgut an den Hehler verkaufen kannst, wird ein Hinweis angezeigt.", 1)
-SafeAddString(SI_AWEMOD_FENCING_SELLS_WARNING, "Verkäufe (|cFF6060Warnung|r)", 1)
-SafeAddString(SI_AWEMOD_FENCING_SELLS_WARNING_HINT,"Wenn du nur noch die hier eingestellte Anzahl an Diebesgut an den Hehler verkaufen kannst, wird eine Warnung angezeigt.", 1)
-SafeAddString(SI_AWEMOD_FENCING_LAUNDERS, "Verbleibendes Schieben anzeigen", 1)
-SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_HINT, "Aktiviere Hinweise über die verbleibenden Schiebe-Vorgänge von Diebesgut, sobald diese unter die folgenden Werte fallen.", 1)
-SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_INFO,"Schieben/Reinwaschen (|cFFFF60Hinweis|r)", 1)
-SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_INFO_HINT,"Wenn du nur noch die hier eingestellte Anzahl an Diebesgut rein waschen kannst, wird ein Hinweis angezeigt.", 1)
-SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_WARNING,"Schieben/Reinwaschen (|cFF6060Warnung|r)", 1)
-SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_WARNING_HINT,"Wenn du nur noch die hier eingestellte Anzahl an Diebesgut rein waschen kannst, wird eine Warnung angezeigt.", 1)
-
---module-inventory
-SafeAddString(SI_AWEMOD_INVENTORY, "Inventar (Platz & Geld)", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_HINT, "Lass dir deine Inventarauslatung anzeigen, dein aktuelles Vermögen und/oder erhalte eine Benachrichtigung, bevor dir der Inventarplatz ausgeht.", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_LOW, "Verbleibende freie Plätze anzeigen", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_LOW_HINT, "Erhalte eine Benachrichtigung, bevor dir der Platz im Rucksack ausgeht.", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_LOW_INFO, "Freie Plätze (|cFFFF60Hinweis|r)", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_LOW_INFO_HINT, "Wenn nur noch die hier eingestellte Anzahl an Plätzen in deinem Rucksack unbelegt ist, wird ein Hinweis angezeigt.", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_LOW_WARNING, "Freie Plätze (|cFF6060Warnung|r)", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_LOW_WARNING_HINT,"Wenn nur noch die hier eingestellte Anzahl an Plätzen in deinem Rucksack unbelegt ist, wird eine Warnung angezeigt.", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_LOW_LABEL, "Rucksackplatz|r: <<1>>", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_DETAILS, "Inventarauslastung anzeigen", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_DETAILS_HINT, "Lasse dir die aktuelle Bank- und Rucksackauslastung anzeigen.", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_DETAILS_LABEL, "<<1>>Rucksack|r: <<2>>/<<3>> <<1>>|| Bank|r: <<4>>/<<5>>", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_MONEY, "Vermögen (Gold) anzeigen", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_MONEY_HINT, "Lasse dir dein eingelagertes und verfügbares Vermögen anzeigen.", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_MONEY_LABEL, "Gold|r: <<1>>k |t16:16:EsoUI/Art/currency/currency_gold.dds|t<<2[/ (+1k eingelagert)/ (+$dk eingelagert)]>>", 1)
-
---module-mails
-SafeAddString(SI_AWEMOD_MAILS, "Nachrichten", 1)
-SafeAddString(SI_AWEMOD_MAILS_HINT, "Erhalte eine Benachrichtigung, sobald du ungelesene Nachrichten im Posteingang hast.", 1)
-SafeAddString(SI_AWEMOD_MAILS_LABEL, "Neue Nachrichten", 1)
-
---module-mount
-SafeAddString(SI_AWEMOD_MOUNT, "Reittier Training", 1)
-SafeAddString(SI_AWEMOD_MOUNT_HINT, "Erhalte eine Benachrichtigung mit verbleibender Zeit, wenn das Training von deinem Reittier kurz vor dem Abschluss steht, oder du bereits ein neues Training starten kannst.", 1)
-SafeAddString(SI_AWEMOD_MOUNT_TIMER_LABEL, "Reittier trainiert", 1)
-SafeAddString(SI_AWEMOD_MOUNT_READY_LABEL, "Reittier kann trainieren", 1)
-SafeAddString(SI_AWEMOD_MOUNT_TIMER, "Trainigs-Hinweis ab (Minuten)", 1)
-SafeAddString(SI_AWEMOD_MOUNT_TIMER_HINT, "Zeigt den Trainings-Hinweis mit Countdown an, sobald das laufende Training in weniger als der hier festgelegten Minutenzahl abgeschlossen wird.", 1)
-
---module-repairkits
-SafeAddString(SI_AWEMOD_REPAIRKITS, "Reparatur-Kits", 1)
-SafeAddString(SI_AWEMOD_REPAIRKITS_HINT, "Lass dir anzeigen, wie viele Reparatur-Kisten du im Rucksack hast.", 1)
-SafeAddString(SI_AWEMOD_REPAIRKITS_LABEL, "Reparatur-Kits|r: |t16:16:EsoUI/Art/icons/store_repairkit_002.dds|t <<1[Keine/1 Kiste/$d Kisten]>>", 1)
-
---module-skills
-SafeAddString(SI_AWEMOD_SKILLS, "Attribute- und Fertigkeiten", 1)
-SafeAddString(SI_AWEMOD_SKILLS_HINT, "Erhalte eine Benachrichtigung, sobald du über nicht gesetzte Attributs- und Fertigkeitspunkte verfügst.", 1)
-SafeAddString(SI_AWEMOD_SKILLS_ATTRIBUTES_LABEL, "Attribute", 1)
-SafeAddString(SI_AWEMOD_SKILLS_CHAMPIONPOINTS_LABEL, "CP", 1)
-SafeAddString(SI_AWEMOD_SKILLS_SKILLS_LABEL, "Skills", 1)
-
---module-skyshards
-SafeAddString(SI_AWEMOD_SKYSHARDS, "Himmelsscherben", 1)
-SafeAddString(SI_AWEMOD_SKYSHARDS_HINT, "Er halte eine Benarichtigung darüber, wie viele Himmelsscherben dir noch zum nächsten Fertigkeitspunkt fehlen.", 1)
-SafeAddString(SI_AWEMOD_SKYSHARDS_REMAINING_LABEL, "Scherben", 1)
-SafeAddString(SI_AWEMOD_SKYSHARDS_REMAINING, "Scherben-Hinweis ab (fehlend)", 1)
-SafeAddString(SI_AWEMOD_SKYSHARDS_REMAINING_HINT, "Wenn du nur noch die hier eingestellte Anzahl an Himmelsscherben für einen Fertigkeitspunkt benötigst, wird ein Hinweis angezeigt.", 1)
-
---module-soulgems
-SafeAddString(SI_AWEMOD_SOULGEMS, "Seelensteine (Wiederbelebung)", 1)
-SafeAddString(SI_AWEMOD_SOULGEMS_HINT, "Lass dir anzeigen, wie viele leere oder gefüllte Seelensteine du für deine eigene Wiederbelebung hast.", 1)
-SafeAddString(SI_AWEMOD_SOULGEMS_LABEL, "Seelensteine|r: <<1>> |t16:16:EsoUI/Art/icons/soulgem_006_filled.dds|t <<2[/(1 leerer)/($d leere)]>>", 1)
-
---module-weaponchrage
-SafeAddString(SI_AWEMOD_WEAPONCHARGE, "Aufladung ausgerüsteter Waffen", 1)
-SafeAddString(SI_AWEMOD_WEAPONCHARGE_HINT, "Erhalte eine Benarichtigung über die verbleinden Aufladungen deiner ausgerüsteten Waffen, bevor diese leer geht.", 1)
-SafeAddString(SI_AWEMOD_WEAPONCHARGE_INFO, "Aufladung (|cFFFF60Hinweis|r) %", 1)
-SafeAddString(SI_AWEMOD_WEAPONCHARGE_INFO_HINT, "Wenn die Aufladung deiner Waffen-Verzauberung höchstens den hier eingestellte Wert hat, wird ein Hinweis angezeigt.", 1)
-SafeAddString(SI_AWEMOD_WEAPONCHARGE_WARNING, "Aufladung (|cFF6060Warnung|r) %", 1)
-SafeAddString(SI_AWEMOD_WEAPONCHARGE_WARNING_HINT, "Wenn die Aufladung deiner Waffen-Verzauberung höchstens den hier eingestellte Wert hat, wird eine Warnung angezeigt.", 1)
-SafeAddString(SI_AWEMOD_WEAPONCHARGE_SET_LABEL, "Set", 1)
\ No newline at end of file
diff --git a/AwesomeEvents/Language/ru.lua b/AwesomeEvents/Language/ru.lua
deleted file mode 100644
index c5fbc84..0000000
--- a/AwesomeEvents/Language/ru.lua
+++ /dev/null
@@ -1,192 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: Memoraike
-  Filename: ru.lua
-  Last Modified: 05.07.17 18:24
-
-  Copyright (c) 2017 by Memoraike
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  Пожалуйста, прочтите README файл для дополнительной информации.
-  ]]
-
----
---- Translated by: Memoraike <http://www.esoui.com/forums/member.php?u=32546>
----
-
---main
-SafeAddString(SI_AWEVS_NO_ACTIVE_MOD, "Нет активных модулей", 1)
-SafeAddString(SI_AWEVS_DESCRIPTION, "С AwesomeEvents Вы можете получить уведомления о множестве интересных событий во время игры,\nтак как здесь множество модулей и путей для настройки под Ваш стиль игры, не забудьте просмотреть все настройки.\nЕсли у Вас есть какие-либо пожелания, улучшения, переводы или же заметили ошибку, то не стесняйтесь и пишите автору <zemi@unive.de> или же в игре EU\PC @Ze_Mi :)", 1)
-
---debug
-SafeAddString(SI_AWEVS_DEBUG_NO_EVENT_CALLBACKS, "Нет обратных вызовов, прослушиватель событий удален!", 1)
-SafeAddString(SI_AWEVS_DEBUG_ENABLED, "|c82D482Включено", 1)
-SafeAddString(SI_AWEVS_DEBUG_DISABLED, "|cD49682Отключено", 1)
-SafeAddString(SI_AWEVS_DEBUG_MODULE_EVENT_INVALID, "Ошибочный объект события!\nОжидалось: event={eventCode=EVENT_...,callback=function() ... end}!\nЭти ключи обязательны!\nКлючи:", 1)
-SafeAddString(SI_AWEVS_DEBUG_MODULE_OPTION_INVALID, "Ошибочный объект опций!\nОжидалось: option={type='',name='',tooltip='',default=...}!\nЭти ключи обязательны!\nКлючи:", 1)
-SafeAddString(SI_AWEVS_DEBUG_MODULE_NOT_FOUND, "Модуль не найден!", 1)
-SafeAddString(SI_AWEVS_DEBUG_MODULE_NO_TIMER, "Этот модуль не прослушивает событие EVENT_AWESOME_MODULE_TIMER или Вы пытаетесь вызвать функцию таймера в Enable функции, извините, это не возможно. Таймер не может быть использован.", 1)
-SafeAddString(SI_AWEVS_DEBUG_COMMAND_USAGE, "Используйте: /aedebug mod_id (on\off)", 1)
-
---appearance
-SafeAddString(SI_AWEVS_APPEARANCE, "Внешний вид", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_MOVABLE, "Динамическое окно", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_MOVABLE_HINT, "Позволяет перетаскивать окно.", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN, "Выравнивание текста", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_HINT, "Расположение всего текста в окне аддона.", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_LEFT, "По левому краю", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_CENTER,"По центру", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_RIGHT, "По правому краю", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_UISCALE, "Масштаб окна", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_UISCALE_HINT, "Масшатабирует окно и его содержимое.", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_COLOR_AVAILABLE,"Цвет доступности", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_COLOR_AVAILABLE_HINT, "Изменить цвет текста сообщений о доступности(?).", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_COLOR_HINT,"Цвет уведомлений", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_COLOR_HINT_HINT, "Изменить цвет текста уведомлений.", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_COLOR_WARNING,"Цвет предупреждений", 1)
-SafeAddString(SI_AWEVS_APPEARANCE_COLOR_WARNING_HINT, "Изменить цвет текста предупреждений.", 1)
-
---import
-SafeAddString(SI_AWEVS_IMPORT, "Импорт настроек", 1)
-SafeAddString(SI_AWEVS_IMPORT_DESCRIPTION, "Заменить Ваши настройки настройками другого персонажа.", 1)
-SafeAddString(SI_AWEVS_IMPORT_CHARACTER_LABEL, "Импорт из", 1)
-SafeAddString(SI_AWEVS_IMPORT_CHARACTER_SELECT, " - Выбрать персонажа -", 1)
-SafeAddString(SI_AWEVS_IMPORT_BUTTON, "Импорт", 1)
-
---module-all
-SafeAddString(SI_AWEMOD_SHOW, "Отображать", 1)
-SafeAddString(SI_AWEMOD_SHOW_HINT, "Показывать или скрывать все уведомления этого молуля", 1)
-SafeAddString(SI_AWEMOD_SPACING_POSITION, "Расположение отступа", 1)
-SafeAddString(SI_AWEMOD_SPACING_POSITION_HINT, "Установить расположение отступа между уведомлением модуля и другими уведомлениями.", 1)
-SafeAddString(SI_AWEMOD_SPACING_BOTTOM, "Сверху", 1)
-SafeAddString(SI_AWEMOD_SPACING_BOTH, "Сверху и снизу", 1)
-SafeAddString(SI_AWEMOD_SPACING_TOP, "Снизу", 1)
-SafeAddString(SI_AWEMOD_SPACING, "Отступ", 1)
-SafeAddString(SI_AWEMOD_SPACING_HINT, "Установить отступ между уведомлением модуля и другими уведомлениями.", 1)
-SafeAddString(SI_AWEMOD_FONTSIZE, "Размер шрифта", 1)
-SafeAddString(SI_AWEMOD_FONTSIZE_HINT, "Установить размер шрифта для уведомления.", 1)
-
---module-bufffood
-SafeAddString(SI_AWEMOD_BUFFFOOD, "Бафф еды", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_HINT, "Получение обратного отчета окончания баффа или предупреждение о его отсутствии.", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_TIMER_LABEL, "Эффект <<C:1>> закончится через ", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_READY_LABEL, "Бафф от еды отсутствует!", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_TIMER, "Запустить тамер баффа еды (минуты)", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_TIMER_HINT, "Показать обратный отчет, если бафф от еды заканчивается через установленное время.", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT, "Бафф еды (варн)", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT_HINT, "Если в бою у вас не будет баффа от еды, появится мигающее предупреждение.", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT, "Скрыть вне боя", 1)
-SafeAddString(SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT_HINT, "Если у Вас не активного баффа от еды и Вы не вне боя более 5 минут, то предупреждение (Бафф от еды отсутствует!) будет скрыто пока Вы снова не окажетесь в бою или не поедите.", 1)
-
---module-clock
-SafeAddString(SI_AWEMOD_CLOCK, "Время и дата", 1)
-SafeAddString(SI_AWEMOD_CLOCK_HINT, "Отображать текущее системное время.", 1)
-SafeAddString(SI_AWEMOD_CLOCK_DATEFORMAT_SHORT, "day.month", 1) -- do not translate the words, just change the order or the seperator chars between
-SafeAddString(SI_AWEMOD_CLOCK_DATEFORMAT_LONG, "day.month.year", 1) -- do not translate the words, just change the order or the seperator chars between
-SafeAddString(SI_AWEMOD_CLOCK_STYLE, "Appearance", 1)
-SafeAddString(SI_AWEMOD_CLOCK_STYLE_HINT, "Choose your preferred appearance.", 1)
-SafeAddString(SI_AWEMOD_CLOCK_STYLE_TIME, "Time only", 1)
-SafeAddString(SI_AWEMOD_CLOCK_STYLE_DATETIME_SHORT, "Date & Time (1-line)", 1)
-SafeAddString(SI_AWEMOD_CLOCK_STYLE_DATETIME_LONG, "Date & Time (2-lines)", 1)
-SafeAddString(SI_AWEMOD_CLOCK_FORMAT, "24 формат времени", 1)
-SafeAddString(SI_AWEMOD_CLOCK_FORMAT_HINT, "Отображать время в 24 формате или в 12 формате.", 1)
-
---module-crafting
-SafeAddString(SI_AWEMOD_CRAFTING, "Исследования", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_HINT, "Отображать таймер исследования или же уведомление о кол-ве возможных исследований.", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_AVAILABLE_LABEL, "возможно исследовать", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_BLACKSMITHING, "Таймер для кузнечного дела", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_BLACKSMITHING_HINT, "Отображать таймер, когда исследования кузнечного дела почти завершены или есть возможность исследовать, отрегулируйте значение ниже.", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_CLOTHING, "Таймер для портняжного дела", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_CLOTHING_HINT, "Отображать таймер, когда исследования портняжного дела почти завершены или есть возможность исследовать, отрегулируйте значение ниже.", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_WOODWORKING, "Таймер для столярного дела", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_WOODWORKING_HINT, "Отображать таймер, когда исследования столярного дела почти завершены или есть возможность исследовать, отрегулируйте значение ниже.", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_TIMER, "Предупреждающий таймер исследования", 1)
-SafeAddString(SI_AWEMOD_CRAFTING_TIMER_HINT, "Отображать таймер, предупреждающий о скором окончании исследования.", 1)
-
---module-durability
-SafeAddString(SI_AWEMOD_DURABILITY, "Прочность доспехов", 1)
-SafeAddString(SI_AWEMOD_DURABILITY_LABEL, "Прочность доспехов", 1)
-SafeAddString(SI_AWEMOD_DURABILITY_HINT, "Отображать уведомление, прежде чем доспехи будут сломаны.", 1)
-SafeAddString(SI_AWEMOD_DURABILITY_INFO, "Прочность доспехов(|cFFFF60Инфо|r) %", 1)
-SafeAddString(SI_AWEMOD_DURABILITY_INFO_HINT, "Когда прочность доспехов будет меньше или равна указаному значению, то появится уведомление.", 1)
-SafeAddString(SI_AWEMOD_DURABILITY_WARNING, "Прочность доспехов(|cFF6060Внимание|r) %", 1)
-SafeAddString(SI_AWEMOD_DURABILITY_WARNING_HINT, "Когда прочность доспехов будет меньше или равна указаному значению, то появится предупреждение.", 1)
-
---module-fencing
-SafeAddString(SI_AWEMOD_FENCING, "Воровство", 1)
-SafeAddString(SI_AWEMOD_FENCING_HINT, "Отображать уведомление, если количество продаж у скупщика превысит указанные значения или же отображать время до перезарядки скупщика.", 1)
-SafeAddString(SI_AWEMOD_FENCING_SELLS_LABEL, "Еще можно продать", 1)
-SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_LABEL, "Еще можно отмыть", 1)
-SafeAddString(SI_AWEMOD_FENCING_SELLS, "Продано вещей", 1)
-SafeAddString(SI_AWEMOD_FENCING_SELLS_HINT, "Отображать уведомление, когда количество доступных продаж будет ниже установленного значения.", 1)
-SafeAddString(SI_AWEMOD_FENCING_SELLS_INFO, "Продано вещей(|cFFFF60Инфо|r)", 1)
-SafeAddString(SI_AWEMOD_FENCING_SELLS_INFO_HINT,"Когда доступное кол-во проданных товаров станет меньше или равно указаному значению, то появится уведомление.", 1)
-SafeAddString(SI_AWEMOD_FENCING_SELLS_WARNING, "Продано вещей(|cFF6060Внимание|r)", 1)
-SafeAddString(SI_AWEMOD_FENCING_SELLS_WARNING_HINT,"Когда доступное кол-во проданных товаров станет меньше или равно указаному значению, то появится предупреждение.", 1)
-SafeAddString(SI_AWEMOD_FENCING_LAUNDERS, "Отмыто вещей", 1)
-SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_HINT, "Отображать уведомление, когда доступное количество отмытых вещей окажется ниже установленных значений.", 1)
-SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_INFO,"Отмыто вещей(|cFFFF60Инфо|r)", 1)
-SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_INFO_HINT,"Когда доступное кол-во отмытых вещей станет меньше или равно указаному значению, то появится уведомление.", 1)
-SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_WARNING,"Отмыто вещей(|cFF6060Внимание|r)", 1)
-SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_WARNING_HINT,"Когда доступное кол-во отмытых вещей станет меньше или равно указаному значению, то появится предупреждение.", 1)
-
---module-inventory
-SafeAddString(SI_AWEMOD_INVENTORY, "Инвентарь", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_HINT, "Показывать информацию о текущей заполненности инвентаря, количестве Вашего золота и/или получение уведомления об отсутствии места в инвентаре.", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_LOW, "Показать предупреждение о нехватке места", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_LOW_HINT, "Получить уведомление прежде, чем место в инвентаре кончится.", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_LOW_INFO, "Доступно места в инвентаре(|cFFFF60Инфо|r)", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_LOW_INFO_HINT, "Если в инвентаре доступно места меньше или равное указанному значению, появится уведомление.", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_LOW_WARNING, "Доступно места в инвентаре(|cFF6060Внимание|r)", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_LOW_WARNING_HINT,"Если в инвентаре доступно места меньше или равное указанному значению, появится предупреждение.", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_LOW_LABEL, "Инвентарь (доступно)", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_DETAILS, "Доп. инфо об инвентаре", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_DETAILS_HINT, "Показать информацию о текущей заполненности инвентаря и банка.", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_DETAILS_LABEL, "<<1>>Инвентарь|r: <<2>>/<<3>> <<1>>|| Банк|r: <<4>>/<<5>>", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_MONEY, "Показать золото", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_MONEY_HINT, "Отобразить Ваше золото (банк и инвентарь).", 1)
-SafeAddString(SI_AWEMOD_INVENTORY_MONEY_LABEL, "Золото|r: <<1>>k |t16:16:EsoUI/Art/currency/currency_gold.dds|t<<2[/ (+1k в банке)/ (+$dk в банке)]>>", 1)
-
---module-mails
-SafeAddString(SI_AWEMOD_MAILS, "Почта", 1)
-SafeAddString(SI_AWEMOD_MAILS_HINT, "Отображать уведомление, если есть непрочитанные письма.", 1)
-SafeAddString(SI_AWEMOD_MAILS_LABEL, "Непрочитанные письма", 1)
-
---module-mount
-SafeAddString(SI_AWEMOD_MOUNT, "Ездовой питомец", 1)
-SafeAddString(SI_AWEMOD_MOUNT_HINT, "Отображение таймера с обратным отчетом тренировки ездового питомца или отображение о возможности его тренировки.", 1)
-SafeAddString(SI_AWEMOD_MOUNT_TIMER_LABEL, "Тренировка окончится через", 1)
-SafeAddString(SI_AWEMOD_MOUNT_READY_LABEL, "Ездовой питомец готов к тренировке", 1)
-SafeAddString(SI_AWEMOD_MOUNT_TIMER, "Запустить таймер тренировки (минуты)", 1)
-SafeAddString(SI_AWEMOD_MOUNT_TIMER_HINT, "Отображение таймера обратного отчета, если ездовой питомец может быть тренирован в течение указаного времени.", 1)
-
---module-skills
-SafeAddString(SI_AWEMOD_SKILLS, "Атрибуты и очки умений", 1)
-SafeAddString(SI_AWEMOD_SKILLS_HINT, "Отображение уведомления, когда у Вас есть неиспользованные атрибуты или очки умений.", 1)
-SafeAddString(SI_AWEMOD_SKILLS_ATTRIBUTES_LABEL, "Атрибуты", 1)
-SafeAddString(SI_AWEMOD_SKILLS_CHAMPIONPOINTS_LABEL, "Очки чемпиона", 1)
-SafeAddString(SI_AWEMOD_SKILLS_SKILLS_LABEL, "Умения", 1)
-
---module-skyshards
-SafeAddString(SI_AWEMOD_SKYSHARDS, "Небесные осколки", 1)
-SafeAddString(SI_AWEMOD_SKYSHARDS_HINT, "Отображать уведомление о том, как много осколков Вам нужно собрать для получения очка умения.", 1)
-SafeAddString(SI_AWEMOD_SKYSHARDS_REMAINING_LABEL, "Осталось осколков", 1)
-SafeAddString(SI_AWEMOD_SKYSHARDS_REMAINING, "Кол-во нехватающих осколков", 1)
-SafeAddString(SI_AWEMOD_SKYSHARDS_REMAINING_HINT, "Отображать уведомление, если указанное значение равно кол-ву нехватающих осколков.", 1)
-
---module-soulgems
-SafeAddString(SI_AWEMOD_SOULGEMS, "Камни душ", 1)
-SafeAddString(SI_AWEMOD_SOULGEMS_HINT, "Показывает, как много камней душ, заполненных и пустых, есть у Вас.", 1)
-SafeAddString(SI_AWEMOD_SOULGEMS_LABEL, "Камни душ|r: <<1>> |t16:16:EsoUI/Art/icons/soulgem_006_filled.dds|t <<2[/(1 не заполнено)/($d не заполнено)]>>", 1)
-
---module-weaponchrage
-SafeAddString(SI_AWEMOD_WEAPONCHARGE, "Заряд оружия", 1)
-SafeAddString(SI_AWEMOD_WEAPONCHARGE_HINT, "Отображать уведомление, прежде чем заряд оружия будет исчерпан", 1)
-SafeAddString(SI_AWEMOD_WEAPONCHARGE_INFO, "Заряд оружия (|cFFFF60Инфо|r) %", 1)
-SafeAddString(SI_AWEMOD_WEAPONCHARGE_INFO_HINT, "Если заряд экипированного оружия меньше или равен этому значению, то появится уведомление.", 1)
-SafeAddString(SI_AWEMOD_WEAPONCHARGE_WARNING, "Заряд оружия (|cFF6060Внимание|r) %", 1)
-SafeAddString(SI_AWEMOD_WEAPONCHARGE_WARNING_HINT, "Если заряд экипированного оружия меньше или равен этому значению, то появится предупреждение.", 1)
-SafeAddString(SI_AWEMOD_WEAPONCHARGE_SET_LABEL, "Панель навыков", 1)
\ No newline at end of file
diff --git a/AwesomeEvents/Language/strings.lua b/AwesomeEvents/Language/strings.lua
deleted file mode 100644
index 40b05e2..0000000
--- a/AwesomeEvents/Language/strings.lua
+++ /dev/null
@@ -1,203 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: strings.lua
-  Last Modified: 17.07.17 12:56
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local strings = {
-	--main
-	SI_AWEVS_NO_ACTIVE_MOD="Enable an AwesomeEvents module",
-	SI_AWEVS_DESCRIPTION="With AwesomeEvents you can get notified about many interesting events while playing.\nSince there are many modules and ways you can customise your experience,\ndon't forget to scroll down the options page.\nIf you have any wishes, improvements, new translations or found a bug, don't hesitate to write me at <zemi@unive.de> or Ingame EU\PC @Ze_Mi :)",
-
-	--debug
-	SI_AWEVS_DEBUG_NO_EVENT_CALLBACKS="No callbacks, event listener removed!",
-	SI_AWEVS_DEBUG_ENABLED="|c82D482ENABLED",
-	SI_AWEVS_DEBUG_DISABLED="|cD49682DISABLED",
-	SI_AWEVS_DEBUG_MODULE_EVENT_INVALID="Invalid event object!\nExpected: event={eventCode=EVENT_...,callback=function() ... end}!\nBoth keys are mandatory!\nIs:",
-	SI_AWEVS_DEBUG_MODULE_OPTION_INVALID="Invalid options object!\nExpected: option={type='',name='',tooltip='',default=...}!\nAt least those keys are mandatory!\nIs:",
-	SI_AWEVS_DEBUG_MODULE_NOT_FOUND="Module not found!",
-	SI_AWEVS_DEBUG_MODULE_NO_TIMER="This module doesn't listen to the EVENT_AWESOME_MODULE_TIMER event or you are trying to call a Timer Function inside the Enable Function, sorry thats not possible. The timer cannot be used.",
-	SI_AWEVS_DEBUG_COMMAND_USAGE="Usage: /aedebug mod_id (on\off)",
-
-	--appearance
-	SI_AWEVS_APPEARANCE="Appearance",
-	SI_AWEVS_APPEARANCE_MOVABLE="Movable Window",
-	SI_AWEVS_APPEARANCE_MOVABLE_HINT="UnLocks the window so it can be moved.",
-	SI_AWEVS_APPEARANCE_TEXTALIGN="Text alignment",
-	SI_AWEVS_APPEARANCE_TEXTALIGN_HINT="The alignment of all text within the add-on.",
-	SI_AWEVS_APPEARANCE_TEXTALIGN_LEFT="Left",
-	SI_AWEVS_APPEARANCE_TEXTALIGN_CENTER="Center",
-	SI_AWEVS_APPEARANCE_TEXTALIGN_RIGHT="Right",
-	SI_AWEVS_APPEARANCE_UISCALE="UI scale",
-	SI_AWEVS_APPEARANCE_UISCALE_HINT="Set the scale of the UI.",
-	SI_AWEVS_APPEARANCE_COLOR_AVAILABLE="Color (availability)",
-	SI_AWEVS_APPEARANCE_COLOR_AVAILABLE_HINT="Change the text color of availability messages.",
-	SI_AWEVS_APPEARANCE_COLOR_HINT="Color (hint)",
-	SI_AWEVS_APPEARANCE_COLOR_HINT_HINT="Change the text color of hints.",
-	SI_AWEVS_APPEARANCE_COLOR_WARNING="Color (warning)",
-	SI_AWEVS_APPEARANCE_COLOR_WARNING_HINT="Change the text color of warnings.",
-
-	--import
-	SI_AWEVS_IMPORT="Import Settings",
-	SI_AWEVS_IMPORT_DESCRIPTION="Overwrite your settings with those from another character",
-	SI_AWEVS_IMPORT_CHARACTER_LABEL="Import from",
-	SI_AWEVS_IMPORT_CHARACTER_SELECT=" - Select a charakter -",
-	SI_AWEVS_IMPORT_BUTTON="Import",
-
-	--module-all
-	SI_AWEMOD_SHOW="Show",
-	SI_AWEMOD_SHOW_HINT="Show or hide all notifications from this module",
-	SI_AWEMOD_SHOW_ICON="Icon",
-	SI_AWEMOD_SHOW_ICON_AND_TEXT="Icon and Text",
-	SI_AWEMOD_SHOW_TEXT="Text",
-	SI_AWEMOD_SHOW_NONE="None (Disabled)",
-	SI_AWEMOD_SPACING_POSITION="Spacing (Position)",
-	SI_AWEMOD_SPACING_POSITION_HINT="Set the gap position between notifications of this module and the following notifications.",
-	SI_AWEMOD_SPACING_BOTTOM="at bottom",
-	SI_AWEMOD_SPACING_BOTH="at top and at bottom",
-	SI_AWEMOD_SPACING_TOP="at top",
-	SI_AWEMOD_SPACING="Spacing (Size)",
-	SI_AWEMOD_SPACING_HINT="Set the gap between notifications of this module and the following notifications.",
-	SI_AWEMOD_FONTSIZE="Fontsize",
-	SI_AWEMOD_FONTSIZE_HINT="Set the fontsize of all notifications from this module.",
-
-	--module-bufffood
-	SI_AWEMOD_BUFFFOOD="Buff-Food",
-	SI_AWEMOD_BUFFFOOD_HINT="Get a countdown when your bufffoods effect is nearly complete, or a notification if you don't have any food effect.",
-	SI_AWEMOD_BUFFFOOD_TIMER_LABEL="Effect <<C:1>> ends in",
-	SI_AWEMOD_BUFFFOOD_READY_LABEL="Take your buff-food!",
-	SI_AWEMOD_BUFFFOOD_TIMER="Start buff-food timer (minutes)",
-	SI_AWEMOD_BUFFFOOD_TIMER_HINT="Will show the countdown timer if your buff-food's effect ends within the number of minutes below.",
-	SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT="Blink in combat",
-	SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT_HINT="The warning will start blinking while you don't have any bufffood effect in combat.",
-	SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT="Hide out of combat",
-	SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT_HINT="If you don't have any active bufffood effect and you are not in combat for 5 minutes, the (Take your buff-food!) warning will be hidden till the next combat or your next lunch.",
-
-	--module-clock
-	SI_AWEMOD_CLOCK="Time and Date",
-	SI_AWEMOD_CLOCK_HINT="Get a clock on your screen, optionally with the current date.",
-	SI_AWEMOD_CLOCK_DATEFORMAT_SHORT="month/day",
-	SI_AWEMOD_CLOCK_DATEFORMAT_LONG="month/day/year",
-	SI_AWEMOD_CLOCK_STYLE="Appearance",
-	SI_AWEMOD_CLOCK_STYLE_HINT="Choose your preferred appearance.",
-	SI_AWEMOD_CLOCK_STYLE_TIME="Time only",
-	SI_AWEMOD_CLOCK_STYLE_DATETIME_SHORT="Date & Time (single-spaced)",
-	SI_AWEMOD_CLOCK_STYLE_DATETIME_LONG="Date & Time (double-spaced)",
-	SI_AWEMOD_CLOCK_FORMAT="Clock format - 24 hour",
-	SI_AWEMOD_CLOCK_FORMAT_HINT="Display the clock in 24-hour/military format or in 12-hour with AM/PM.",
-
-	--module-crafting
-	SI_AWEMOD_CRAFTING="Crafting Research",
-	SI_AWEMOD_CRAFTING_HINT="Get a countdown when your next research is nearly complete, or a notification if a research slot is available.",
-	SI_AWEMOD_CRAFTING_AVAILABLE_LABEL="can research",
-	SI_AWEMOD_CRAFTING_BLACKSMITHING="Show timer for Blacksmithing",
-	SI_AWEMOD_CRAFTING_BLACKSMITHING_HINT="Display a countdown timer when your Blacksmithing research is nearly complete. Adjust the threshold below.",
-	SI_AWEMOD_CRAFTING_CLOTHING="Show timer for Clothing",
-	SI_AWEMOD_CRAFTING_CLOTHING_HINT="Display a countdown timer when your Clothing research is nearly complete. Adjust the threshold below.",
-	SI_AWEMOD_CRAFTING_WOODWORKING="Show timer for Woodworking",
-	SI_AWEMOD_CRAFTING_WOODWORKING_HINT="Display a countdown timer when your Woodworking research is nearly complete. Adjust the threshold below.",
-	SI_AWEMOD_CRAFTING_TIMER="Research warning timer (minutes)",
-	SI_AWEMOD_CRAFTING_TIMER_HINT="Will show the countdown warning timer if any research completes within this many minutes.",
-
-	--module-durability
-	SI_AWEMOD_DURABILITY="Durability of equipped Armor",
-	SI_AWEMOD_DURABILITY_LABEL="Durability",
-	SI_AWEMOD_DURABILITY_HINT="Get a notification before the durability of your equipped armor gets to weak.",
-	SI_AWEMOD_DURABILITY_INFO="Durability (|cFFFF60info|r) %",
-	SI_AWEMOD_DURABILITY_INFO_HINT="If durability of one of your equipped items is this many or less, you will see a notification.",
-	SI_AWEMOD_DURABILITY_WARNING="Durability (|cFF6060warning|r) %",
-	SI_AWEMOD_DURABILITY_WARNING_HINT="If durability of one of your equipped items is this many or less, you will see a warning.",
-
-	--module-fencing
-	SI_AWEMOD_FENCING="Thieves Guild",
-	SI_AWEMOD_FENCING_HINT="Get a notification if the number of available transactions at your thieves guild is lower then the following values, or a countdown timer until you get new transactions.",
-	SI_AWEMOD_FENCING_SELLS_LABEL="Sells left",
-	SI_AWEMOD_FENCING_LAUNDERS_LABEL="Launders left",
-	SI_AWEMOD_FENCING_SELLS="Show warning for low sells",
-	SI_AWEMOD_FENCING_SELLS_HINT="Display a notification when the number of sells remaining falls below the info and warning values set below.",
-	SI_AWEMOD_FENCING_SELLS_INFO="Sells remaining (|cFFFF60info|r)",
-	SI_AWEMOD_FENCING_SELLS_INFO_HINT="If the number of sells left is this many or less, you will see a notification.",
-	SI_AWEMOD_FENCING_SELLS_WARNING="Sells remaining (|cFF6060warning|r)",
-	SI_AWEMOD_FENCING_SELLS_WARNING_HINT="If the number of sells remaining is this many or less, you will see a warning.",
-	SI_AWEMOD_FENCING_LAUNDERS="Show warning for low launders",
-	SI_AWEMOD_FENCING_LAUNDERS_HINT="Display a notification when the number of launders remaining falls below the info and warning values set below.",
-	SI_AWEMOD_FENCING_LAUNDERS_INFO="Launders remaining (|cFFFF60info|r)",
-	SI_AWEMOD_FENCING_LAUNDERS_INFO_HINT="If the number of launders left is this many or less, you will see a notification.",
-	SI_AWEMOD_FENCING_LAUNDERS_WARNING="Launders remaining (|cFF6060warning|r)",
-	SI_AWEMOD_FENCING_LAUNDERS_WARNING_HINT="If the number of launders remaining is this many or less, you will see a warning.",
-
-	--module-inventory
-	SI_AWEMOD_INVENTORY="Inventory (Space & Money)",
-	SI_AWEMOD_INVENTORY_HINT="Show details about your current inventor usage, the money you own and/or get a notification before you go out of backpack space.",
-	SI_AWEMOD_INVENTORY_LOW="Show low space warning",
-	SI_AWEMOD_INVENTORY_LOW_HINT="Get a notification before you go out of backpack space.",
-	SI_AWEMOD_INVENTORY_LOW_INFO="Backpack space low (|cFFFF60info|r)",
-	SI_AWEMOD_INVENTORY_LOW_INFO_HINT="If remaining backpack space is this many or less, you will see a notification",
-	SI_AWEMOD_INVENTORY_LOW_WARNING="Backpack space low (|cFF6060warning|r)",
-	SI_AWEMOD_INVENTORY_LOW_WARNING_HINT="If remaining backpack space is this many or less, you will see a warning.",
-	SI_AWEMOD_INVENTORY_LOW_LABEL="Bag space|r: <<1>>",
-	SI_AWEMOD_INVENTORY_DETAILS="Show inventory details",
-	SI_AWEMOD_INVENTORY_DETAILS_HINT="Show details about your current bank und backpack usage.",
-	SI_AWEMOD_INVENTORY_DETAILS_LABEL="<<1>>Backpack|r: <<2>>/<<3>> <<1>>|| Bank|r: <<4>>/<<5>>",
-	SI_AWEMOD_INVENTORY_MONEY="Show money",
-	SI_AWEMOD_INVENTORY_MONEY_HINT="Show the money you own (bank and backpack).",
-	SI_AWEMOD_INVENTORY_MONEY_LABEL="Money|r: <<1>>k |t16:16:EsoUI/Art/currency/currency_gold.dds|t<<2[/ (+1k banked)/ (+$dk banked)]>>",
-
-	--module-mails
-	SI_AWEMOD_MAILS="Mails",
-	SI_AWEMOD_MAILS_HINT="Get a notification if you have unread mails.",
-	SI_AWEMOD_MAILS_LABEL="Unread Mails",
-
-	--module-mount
-	SI_AWEMOD_MOUNT="Mount Training",
-	SI_AWEMOD_MOUNT_HINT="Get a countdown when your mount's training is nearly complete, or a notification if the mount can be trained.",
-	SI_AWEMOD_MOUNT_TIMER_LABEL="Train mount in",
-	SI_AWEMOD_MOUNT_READY_LABEL="Mount can be trained",
-	SI_AWEMOD_MOUNT_TIMER="Start training timer (minutes)",
-	SI_AWEMOD_MOUNT_TIMER_HINT="Will show the countdown timer if mount can be trained within the number of minutes below.",
-
-	--module-repairkits
-	SI_AWEMOD_REPAIRKITS="Repair Kits",
-	SI_AWEMOD_REPAIRKITS_HINT="See how many repair kits you have in your inventory.",
-	SI_AWEMOD_REPAIRKITS_LABEL="Repair Kits|r: |t16:16:EsoUI/Art/icons/store_repairkit_002.dds|t <<1[None/1 kit/$d kits]>>",
-
-	--module-skills
-	SI_AWEMOD_SKILLS="Attribute- & Skillpoints",
-	SI_AWEMOD_SKILLS_HINT="Get a notification if you have unspent attribute- or skillpoints.",
-	SI_AWEMOD_SKILLS_ATTRIBUTES_LABEL="Attributes",
-	SI_AWEMOD_SKILLS_CHAMPIONPOINTS_LABEL="CP",
-	SI_AWEMOD_SKILLS_SKILLS_LABEL="Skills",
-
-	--module-skyshards
-	SI_AWEMOD_SKYSHARDS="Skyshards",
-	SI_AWEMOD_SKYSHARDS_HINT="Get a notification about how many shards you have to collect to get a new skillpoint.",
-	SI_AWEMOD_SKYSHARDS_REMAINING_LABEL="Shards missing",
-	SI_AWEMOD_SKYSHARDS_REMAINING="Shards missing",
-	SI_AWEMOD_SKYSHARDS_REMAINING_HINT="Display a notification when you miss less shards.",
-
-	--module-soulgems
-	SI_AWEMOD_SOULGEMS="Soul Gems",
-	SI_AWEMOD_SOULGEMS_HINT="See how many empty or filled soul gems you have for your revival.",
-	SI_AWEMOD_SOULGEMS_LABEL="Soul gems|r: <<1>> |t16:16:EsoUI/Art/icons/soulgem_006_filled.dds|t <<2[/(1 empty)/($d empty)]>>",
-
-	--module-weaponcharge
-	SI_AWEMOD_WEAPONCHARGE="Charge of equipped Weapons",
-	SI_AWEMOD_WEAPONCHARGE_HINT="Get a notification before the charge of your equipped weapons goes to low.",
-	SI_AWEMOD_WEAPONCHARGE_INFO="Weapon Charge (|cFFFF60info|r) %",
-	SI_AWEMOD_WEAPONCHARGE_INFO_HINT="If the charge of your equipped weapon is less or equal to this value, you will see a notification.",
-	SI_AWEMOD_WEAPONCHARGE_WARNING="Weapon Charge (|cFF6060warning|r) %",
-	SI_AWEMOD_WEAPONCHARGE_WARNING_HINT="If the charge of your equipped weapon is less or equal to this value, you will see a warning.",
-	SI_AWEMOD_WEAPONCHARGE_SET_LABEL="Set",
-}
-
-for stringId, stringValue in pairs(strings) do
-   ZO_CreateStringId(stringId, stringValue)
-   SafeAddVersion(stringId, 1)
-end
diff --git a/AwesomeEvents/LibAddonMenu-2.0-exampleoptions.lua b/AwesomeEvents/LibAddonMenu-2.0-exampleoptions.lua
deleted file mode 100644
index 3b02d44..0000000
--- a/AwesomeEvents/LibAddonMenu-2.0-exampleoptions.lua
+++ /dev/null
@@ -1,119 +0,0 @@
-local panelData = {
-    type = "panel",
-    name = "Window Title",
-    displayName = "Longer Window Title",
-    author = "Seerah",
-    version = "1.3",
-    slashCommand = "/myaddon",	--(optional) will register a keybind to open to this panel
-    registerForRefresh = true,	--boolean (optional) (will refresh all options controls when a setting is changed and when the panel is shown)
-    registerForDefaults = true,	--boolean (optional) (will set all options controls back to default values)
-}
-
-local optionsTable = {
-    [1] = {
-        type = "header",
-        name = "My Header",
-        width = "full",	--or "half" (optional)
-    },
-    [2] = {
-        type = "description",
-        --title = "My Title",	--(optional)
-        title = nil,	--(optional)
-        text = "My description text to display. blah blah blah blah blah blah blah - even more sample text!!",
-        width = "full",	--or "half" (optional)
-    },
-    [3] = {
-        type = "dropdown",
-        name = "My Dropdown",
-        tooltip = "Dropdown's tooltip text.",
-        choices = {"table", "of", "choices"},
-        getFunc = function() return "of" end,
-        setFunc = function(var) print(var) end,
-        width = "half",	--or "half" (optional)
-        warning = "Will need to reload the UI.",	--(optional)
-    },
-    [4] = {
-        type = "dropdown",
-        name = "My Dropdown",
-        tooltip = "Dropdown's tooltip text.",
-        choices = {"table", "of", "choices"},
-        getFunc = function() return "of" end,
-        setFunc = function(var) print(var) end,
-        width = "half",	--or "half" (optional)
-        warning = "Will need to reload the UI.",	--(optional)
-    },
-    [5] = {
-        type = "slider",
-        name = "My Slider",
-        tooltip = "Slider's tooltip text.",
-        min = 0,
-        max = 20,
-        step = 1,	--(optional)
-        getFunc = function() return 3 end,
-        setFunc = function(value) d(value) end,
-        width = "half",	--or "half" (optional)
-        default = 5,	--(optional)
-    },
-    [6] = {
-        type = "button",
-        name = "My Button",
-        tooltip = "Button's tooltip text.",
-        func = function() d("button pressed!") end,
-        width = "half",	--or "half" (optional)
-        warning = "Will need to reload the UI.",	--(optional)
-    },
-    [7] = {
-        type = "submenu",
-        name = "Submenu Title",
-        tooltip = "My submenu tooltip",	--(optional)
-        controls = {
-            [1] = {
-                type = "checkbox",
-                name = "My Checkbox",
-                tooltip = "Checkbox's tooltip text.",
-                getFunc = function() return true end,
-                setFunc = function(value) d(value) end,
-                width = "half",	--or "half" (optional)
-                warning = "Will need to reload the UI.",	--(optional)
-            },
-            [2] = {
-                type = "colorpicker",
-                name = "My Color Picker",
-                tooltip = "Color Picker's tooltip text.",
-                getFunc = function() return 1, 0, 0, 1 end,	--(alpha is optional)
-                setFunc = function(r,g,b,a) print(r, g, b, a) end,	--(alpha is optional)
-                width = "half",	--or "half" (optional)
-                warning = "warning text",
-            },
-            [3] = {
-                type = "editbox",
-                name = "My Editbox",
-                tooltip = "Editbox's tooltip text.",
-                getFunc = function() return "this is some text" end,
-                setFunc = function(text) print(text) end,
-                isMultiline = false,	--boolean
-                width = "half",	--or "half" (optional)
-                warning = "Will need to reload the UI.",	--(optional)
-                default = "",	--(optional)
-            },
-        },
-    },
-    [8] = {
-        type = "custom",
-        reference = "MyAddonCustomControl",	--unique name for your control to use as reference
-        refreshFunc = function(customControl) end,	--(optional) function to call when panel/controls refresh
-        width = "half",	--or "half" (optional)
-    },
-    [9] = {
-        type = "texture",
-        image = "EsoUI\\Art\\ActionBar\\abilityframe64_up.dds",
-        imageWidth = 64,	--max of 250 for half width, 510 for full
-        imageHeight = 64,	--max of 100
-        tooltip = "Image's tooltip text.",	--(optional)
-        width = "half",	--or "half" (optional)
-    },
-}
-
-local LAM = LibStub("LibAddonMenu-2.0")
-LAM:RegisterAddonPanel("MyAddon", panelData)
-LAM:RegisterOptionControls("MyAddon", optionsTable)
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/LICENSE b/AwesomeEvents/Libs/LibAddonMenu-2.0/LICENSE
deleted file mode 100644
index f69cbd4..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
-               The Artistic License 2.0
-
-           Copyright (c) 2016 Ryan Lakanen (Seerah)
-
-     Everyone is permitted to copy and distribute verbatim copies
-      of this license document, but changing it is not allowed.
-
-Preamble
-
-This license establishes the terms under which a given free software
-Package may be copied, modified, distributed, and/or redistributed.
-The intent is that the Copyright Holder maintains some artistic
-control over the development of that Package while still keeping the
-Package available as open source and free software.
-
-You are always permitted to make arrangements wholly outside of this
-license directly with the Copyright Holder of a given Package.  If the
-terms of this license do not permit the full use that you propose to
-make of the Package, you should contact the Copyright Holder and seek
-a different licensing arrangement.
-
-Definitions
-
-    "Copyright Holder" means the individual(s) or organization(s)
-    named in the copyright notice for the entire Package.
-
-    "Contributor" means any party that has contributed code or other
-    material to the Package, in accordance with the Copyright Holder's
-    procedures.
-
-    "You" and "your" means any person who would like to copy,
-    distribute, or modify the Package.
-
-    "Package" means the collection of files distributed by the
-    Copyright Holder, and derivatives of that collection and/or of
-    those files. A given Package may consist of either the Standard
-    Version, or a Modified Version.
-
-    "Distribute" means providing a copy of the Package or making it
-    accessible to anyone else, or in the case of a company or
-    organization, to others outside of your company or organization.
-
-    "Distributor Fee" means any fee that you charge for Distributing
-    this Package or providing support for this Package to another
-    party.  It does not mean licensing fees.
-
-    "Standard Version" refers to the Package if it has not been
-    modified, or has been modified only in ways explicitly requested
-    by the Copyright Holder.
-
-    "Modified Version" means the Package, if it has been changed, and
-    such changes were not explicitly requested by the Copyright
-    Holder.
-
-    "Original License" means this Artistic License as Distributed with
-    the Standard Version of the Package, in its current version or as
-    it may be modified by The Perl Foundation in the future.
-
-    "Source" form means the source code, documentation source, and
-    configuration files for the Package.
-
-    "Compiled" form means the compiled bytecode, object code, binary,
-    or any other form resulting from mechanical transformation or
-    translation of the Source form.
-
-
-Permission for Use and Modification Without Distribution
-
-(1)  You are permitted to use the Standard Version and create and use
-Modified Versions for any purpose without restriction, provided that
-you do not Distribute the Modified Version.
-
-
-Permissions for Redistribution of the Standard Version
-
-(2)  You may Distribute verbatim copies of the Source form of the
-Standard Version of this Package in any medium without restriction,
-either gratis or for a Distributor Fee, provided that you duplicate
-all of the original copyright notices and associated disclaimers.  At
-your discretion, such verbatim copies may or may not include a
-Compiled form of the Package.
-
-(3)  You may apply any bug fixes, portability changes, and other
-modifications made available from the Copyright Holder.  The resulting
-Package will still be considered the Standard Version, and as such
-will be subject to the Original License.
-
-
-Distribution of Modified Versions of the Package as Source
-
-(4)  You may Distribute your Modified Version as Source (either gratis
-or for a Distributor Fee, and with or without a Compiled form of the
-Modified Version) provided that you clearly document how it differs
-from the Standard Version, including, but not limited to, documenting
-any non-standard features, executables, or modules, and provided that
-you do at least ONE of the following:
-
-    (a)  make the Modified Version available to the Copyright Holder
-    of the Standard Version, under the Original License, so that the
-    Copyright Holder may include your modifications in the Standard
-    Version.
-
-    (b)  ensure that installation of your Modified Version does not
-    prevent the user installing or running the Standard Version. In
-    addition, the Modified Version must bear a name that is different
-    from the name of the Standard Version.
-
-    (c)  allow anyone who receives a copy of the Modified Version to
-    make the Source form of the Modified Version available to others
-    under
-
-    (i)  the Original License or
-
-    (ii)  a license that permits the licensee to freely copy,
-    modify and redistribute the Modified Version using the same
-    licensing terms that apply to the copy that the licensee
-    received, and requires that the Source form of the Modified
-    Version, and of any works derived from it, be made freely
-    available in that license fees are prohibited but Distributor
-    Fees are allowed.
-
-
-Distribution of Compiled Forms of the Standard Version
-or Modified Versions without the Source
-
-(5)  You may Distribute Compiled forms of the Standard Version without
-the Source, provided that you include complete instructions on how to
-get the Source of the Standard Version.  Such instructions must be
-valid at the time of your distribution.  If these instructions, at any
-time while you are carrying out such distribution, become invalid, you
-must provide new instructions on demand or cease further distribution.
-If you provide valid instructions or cease distribution within thirty
-days after you become aware that the instructions are invalid, then
-you do not forfeit any of your rights under this license.
-
-(6)  You may Distribute a Modified Version in Compiled form without
-the Source, provided that you comply with Section 4 with respect to
-the Source of the Modified Version.
-
-
-Aggregating or Linking the Package
-
-(7)  You may aggregate the Package (either the Standard Version or
-Modified Version) with other packages and Distribute the resulting
-aggregation provided that you do not charge a licensing fee for the
-Package.  Distributor Fees are permitted, and licensing fees for other
-components in the aggregation are permitted. The terms of this license
-apply to the use and Distribution of the Standard or Modified Versions
-as included in the aggregation.
-
-(8) You are permitted to link Modified and Standard Versions with
-other works, to embed the Package in a larger work of your own, or to
-build stand-alone binary or bytecode versions of applications that
-include the Package, and Distribute the result without restriction,
-provided the result does not expose a direct interface to the Package.
-
-
-Items That are Not Considered Part of a Modified Version
-
-(9) Works (including, but not limited to, modules and scripts) that
-merely extend or make use of the Package, do not, by themselves, cause
-the Package to be a Modified Version.  In addition, such works are not
-considered parts of the Package itself, and are not subject to the
-terms of this license.
-
-
-General Provisions
-
-(10)  Any use, modification, and distribution of the Standard or
-Modified Versions is governed by this Artistic License. By using,
-modifying or distributing the Package, you accept this license. Do not
-use, modify, or distribute the Package, if you do not accept this
-license.
-
-(11)  If your Modified Version has been derived from a Modified
-Version made by someone other than you, you are nevertheless required
-to ensure that your Modified Version complies with the requirements of
-this license.
-
-(12)  This license does not grant you the right to use any trademark,
-service mark, tradename, or logo of the Copyright Holder.
-
-(13)  This license includes the non-exclusive, worldwide,
-free-of-charge patent license to make, have made, use, offer to sell,
-sell, import and otherwise transfer the Package with respect to any
-patent claims licensable by the Copyright Holder that are necessarily
-infringed by the Package. If you institute patent litigation
-(including a cross-claim or counterclaim) against any party alleging
-that the Package constitutes direct or contributory patent
-infringement, then this Artistic License to you shall terminate on the
-date that such litigation is filed.
-
-(14)  Disclaimer of Warranty:
-THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS
-IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED
-WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
-NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL
-LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF
-ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua b/AwesomeEvents/Libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
deleted file mode 100644
index b1070ca..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
+++ /dev/null
@@ -1,1218 +0,0 @@
--- LibAddonMenu-2.0 & its files © Ryan Lakanen (Seerah)         --
--- Distributed under The Artistic License 2.0 (see LICENSE)     --
-------------------------------------------------------------------
-
-
---Register LAM with LibStub
-local MAJOR, MINOR = "LibAddonMenu-2.0", 24
-local lam, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
-if not lam then return end --the same or newer version of this lib is already loaded into memory
-
-local messages = {}
-local MESSAGE_PREFIX = "[LAM2] "
-local function PrintLater(msg)
-    if CHAT_SYSTEM.primaryContainer then
-        d(MESSAGE_PREFIX .. msg)
-    else
-        messages[#messages + 1] = msg
-    end
-end
-
-local function FlushMessages()
-    for i = 1, #messages do
-        d(MESSAGE_PREFIX .. messages[i])
-    end
-    messages = {}
-end
-
-if LAMSettingsPanelCreated and not LAMCompatibilityWarning then
-    PrintLater("An old version of LibAddonMenu with compatibility issues was detected. For more information on how to proceed search for LibAddonMenu on esoui.com")
-    LAMCompatibilityWarning = true
-end
-
---UPVALUES--
-local wm = WINDOW_MANAGER
-local em = EVENT_MANAGER
-local sm = SCENE_MANAGER
-local cm = CALLBACK_MANAGER
-local tconcat = table.concat
-local tinsert = table.insert
-
-local MIN_HEIGHT = 26
-local HALF_WIDTH_LINE_SPACING = 2
-local OPTIONS_CREATION_RUNNING = 1
-local OPTIONS_CREATED = 2
-local LAM_CONFIRM_DIALOG = "LAM_CONFIRM_DIALOG"
-local LAM_DEFAULTS_DIALOG = "LAM_DEFAULTS"
-local LAM_RELOAD_DIALOG = "LAM_RELOAD_DIALOG"
-
-local addonsForList = {}
-local addonToOptionsMap = {}
-local optionsState = {}
-lam.widgets = lam.widgets or {}
-local widgets = lam.widgets
-lam.util = lam.util or {}
-local util = lam.util
-lam.controlsForReload = lam.controlsForReload or {}
-local controlsForReload = lam.controlsForReload
-
-local function GetDefaultValue(default)
-    if type(default) == "function" then
-        return default()
-    end
-    return default
-end
-
-local function GetStringFromValue(value)
-    if type(value) == "function" then
-        return value()
-    elseif type(value) == "number" then
-        return GetString(value)
-    end
-    return value
-end
-
-local function CreateBaseControl(parent, controlData, controlName)
-    local control = wm:CreateControl(controlName or controlData.reference, parent.scroll or parent, CT_CONTROL)
-    control.panel = parent.panel or parent -- if this is in a submenu, panel is the submenu's parent
-    control.data = controlData
-
-    control.isHalfWidth = controlData.width == "half"
-    local width = 510 -- set default width in case a custom parent object is passed
-    if control.panel.GetWidth ~= nil then width = control.panel:GetWidth() - 60 end
-    control:SetWidth(width)
-    return control
-end
-
-local function CreateLabelAndContainerControl(parent, controlData, controlName)
-    local control = CreateBaseControl(parent, controlData, controlName)
-    local width = control:GetWidth()
-
-    local container = wm:CreateControl(nil, control, CT_CONTROL)
-    container:SetDimensions(width / 3, MIN_HEIGHT)
-    control.container = container
-
-    local label = wm:CreateControl(nil, control, CT_LABEL)
-    label:SetFont("ZoFontWinH4")
-    label:SetHeight(MIN_HEIGHT)
-    label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
-    label:SetText(GetStringFromValue(controlData.name))
-    control.label = label
-
-    if control.isHalfWidth then
-        control:SetDimensions(width / 2, MIN_HEIGHT * 2 + HALF_WIDTH_LINE_SPACING)
-        label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 0)
-        label:SetAnchor(TOPRIGHT, control, TOPRIGHT, 0, 0)
-        container:SetAnchor(TOPRIGHT, control.label, BOTTOMRIGHT, 0, HALF_WIDTH_LINE_SPACING)
-    else
-        control:SetDimensions(width, MIN_HEIGHT)
-        container:SetAnchor(TOPRIGHT, control, TOPRIGHT, 0, 0)
-        label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 0)
-        label:SetAnchor(TOPRIGHT, container, TOPLEFT, 5, 0)
-    end
-
-    control.data.tooltipText = GetStringFromValue(control.data.tooltip)
-    control:SetMouseEnabled(true)
-    control:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
-    control:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
-    return control
-end
-
-local function GetTopPanel(panel)
-    while panel.panel and panel.panel ~= panel do
-        panel = panel.panel
-    end
-    return panel
-end
-
-local function IsSame(objA, objB)
-    if #objA ~= #objB then return false end
-    for i = 1, #objA do
-        if objA[i] ~= objB[i] then return false end
-    end
-    return true
-end
-
-local function RefreshReloadUIButton()
-    lam.requiresReload = false
-
-    for i = 1, #controlsForReload do
-        local reloadControl = controlsForReload[i]
-        if not IsSame(reloadControl.startValue, {reloadControl.data.getFunc()}) then
-            lam.requiresReload = true
-            break
-        end
-    end
-
-    lam.applyButton:SetHidden(not lam.requiresReload)
-end
-
-local function RequestRefreshIfNeeded(control)
-    -- if our parent window wants to refresh controls, then fire the callback
-    local panel = GetTopPanel(control.panel)
-    local panelData = panel.data
-    if panelData.registerForRefresh then
-        cm:FireCallbacks("LAM-RefreshPanel", control)
-    end
-    RefreshReloadUIButton()
-end
-
-local function RegisterForRefreshIfNeeded(control)
-    -- if our parent window wants to refresh controls, then add this to the list
-    local panel = GetTopPanel(control.panel)
-    local panelData = panel.data
-    if panelData.registerForRefresh or panelData.registerForDefaults then
-        tinsert(panel.controlsToRefresh or {}, control) -- prevent errors on custom panels
-    end
-end
-
-local function RegisterForReloadIfNeeded(control)
-    if control.data.requiresReload then
-        tinsert(controlsForReload, control)
-        control.startValue = {control.data.getFunc()}
-    end
-end
-
-local function GetConfirmDialog()
-    if(not ESO_Dialogs[LAM_CONFIRM_DIALOG]) then
-        ESO_Dialogs[LAM_CONFIRM_DIALOG] = {
-            canQueue = true,
-            title = {
-                text = "",
-            },
-            mainText = {
-                text = "",
-            },
-            buttons = {
-                [1] = {
-                    text = SI_DIALOG_CONFIRM,
-                    callback = function(dialog) end,
-                },
-                [2] = {
-                    text = SI_DIALOG_CANCEL,
-                }
-            }
-        }
-    end
-    return ESO_Dialogs[LAM_CONFIRM_DIALOG]
-end
-
-local function ShowConfirmationDialog(title, body, callback)
-    local dialog = GetConfirmDialog()
-    dialog.title.text = title
-    dialog.mainText.text = body
-    dialog.buttons[1].callback = callback
-    ZO_Dialogs_ShowDialog(LAM_CONFIRM_DIALOG)
-end
-
-local function GetDefaultsDialog()
-    if(not ESO_Dialogs[LAM_DEFAULTS_DIALOG]) then
-        ESO_Dialogs[LAM_DEFAULTS_DIALOG] = {
-            canQueue = true,
-            title = {
-                text = SI_INTERFACE_OPTIONS_RESET_TO_DEFAULT_TOOLTIP,
-            },
-            mainText = {
-                text = SI_OPTIONS_RESET_PROMPT,
-            },
-            buttons = {
-                [1] = {
-                    text = SI_OPTIONS_RESET,
-                    callback = function(dialog) end,
-                },
-                [2] = {
-                    text = SI_DIALOG_CANCEL,
-                }
-            }
-        }
-    end
-    return ESO_Dialogs[LAM_DEFAULTS_DIALOG]
-end
-
-local function ShowDefaultsDialog(panel)
-    local dialog = GetDefaultsDialog()
-    dialog.buttons[1].callback = function()
-        panel:ForceDefaults()
-        RefreshReloadUIButton()
-    end
-    ZO_Dialogs_ShowDialog(LAM_DEFAULTS_DIALOG)
-end
-
-local function DiscardChangesOnReloadControls()
-    for i = 1, #controlsForReload do
-        local reloadControl = controlsForReload[i]
-        if not IsSame(reloadControl.startValue, {reloadControl.data.getFunc()}) then
-            reloadControl:UpdateValue(false, unpack(reloadControl.startValue))
-        end
-    end
-    lam.requiresReload = false
-    lam.applyButton:SetHidden(true)
-end
-
-local function StorePanelForReopening()
-    local saveData = ZO_Ingame_SavedVariables["LAM"] or {}
-    saveData.reopenPanel = lam.currentAddonPanel:GetName()
-    ZO_Ingame_SavedVariables["LAM"] = saveData
-end
-
-local function RetrievePanelForReopening()
-    local saveData = ZO_Ingame_SavedVariables["LAM"]
-    if(saveData) then
-        ZO_Ingame_SavedVariables["LAM"] = nil
-        return _G[saveData.reopenPanel]
-    end
-end
-
-local function HandleReloadUIPressed()
-    StorePanelForReopening()
-    ReloadUI()
-end
-
-local function HandleLoadDefaultsPressed()
-    ShowDefaultsDialog(lam.currentAddonPanel)
-end
-
-local function GetReloadDialog()
-    if(not ESO_Dialogs[LAM_RELOAD_DIALOG]) then
-        ESO_Dialogs[LAM_RELOAD_DIALOG] = {
-            canQueue = true,
-            title = {
-                text = util.L["RELOAD_DIALOG_TITLE"],
-            },
-            mainText = {
-                text = util.L["RELOAD_DIALOG_TEXT"],
-            },
-            buttons = {
-                [1] = {
-                    text = util.L["RELOAD_DIALOG_RELOAD_BUTTON"],
-                    callback = function() ReloadUI() end,
-                },
-                [2] = {
-                    text = util.L["RELOAD_DIALOG_DISCARD_BUTTON"],
-                    callback = DiscardChangesOnReloadControls,
-                }
-            },
-            noChoiceCallback = DiscardChangesOnReloadControls,
-        }
-    end
-    return ESO_Dialogs[LAM_CONFIRM_DIALOG]
-end
-
-local function ShowReloadDialogIfNeeded()
-    if lam.requiresReload then
-        local dialog = GetReloadDialog()
-        ZO_Dialogs_ShowDialog(LAM_RELOAD_DIALOG)
-    end
-end
-
-local function UpdateWarning(control)
-    local warning
-    if control.data.warning ~= nil then
-        warning = util.GetStringFromValue(control.data.warning)
-    end
-
-    if control.data.requiresReload then
-        if not warning then
-            warning = string.format("|cff0000%s", util.L["RELOAD_UI_WARNING"])
-        else
-            warning = string.format("%s\n\n|cff0000%s", warning, util.L["RELOAD_UI_WARNING"])
-        end
-    end
-
-    if not warning then
-        control.warning:SetHidden(true)
-    else
-        control.warning.data = {tooltipText = warning}
-        control.warning:SetHidden(false)
-    end
-end
-
-local localization = {
-    en = {
-        PANEL_NAME = "Addons",
-        AUTHOR = string.format("%s: <<X:1>>", GetString(SI_ADDON_MANAGER_AUTHOR)), -- "Author: <<X:1>>"
-        VERSION = "Version: <<X:1>>",
-        WEBSITE = "Visit Website",
-        PANEL_INFO_FONT = "$(CHAT_FONT)|14|soft-shadow-thin",
-        RELOAD_UI_WARNING = "Changes to this setting require an UI reload in order to take effect.",
-        RELOAD_DIALOG_TITLE = "UI Reload required",
-        RELOAD_DIALOG_TEXT = "Some changes require an UI reload in order to take effect. Do you want to reload now or discard the changes?",
-        RELOAD_DIALOG_RELOAD_BUTTON = "Reload",
-        RELOAD_DIALOG_DISCARD_BUTTON = "Discard",
-    },
-    it = { -- provided by JohnnyKing
-        PANEL_NAME = "Addon",
-        VERSION = "Versione: <<X:1>>",
-        WEBSITE = "Visita il Sitoweb",
-        RELOAD_UI_WARNING = "Cambiare questa impostazione richiede un Ricarica UI al fine che faccia effetto.",
-        RELOAD_DIALOG_TITLE = "Ricarica UI richiesto",
-        RELOAD_DIALOG_TEXT = "Alcune modifiche richiedono un Ricarica UI al fine che facciano effetto. Sei sicuro di voler ricaricare ora o di voler annullare le modifiche?",
-        RELOAD_DIALOG_RELOAD_BUTTON = "Ricarica",
-        RELOAD_DIALOG_DISCARD_BUTTON = "Annulla",
-    },
-    fr = { -- provided by Ayantir
-        PANEL_NAME = "Extensions",
-        WEBSITE = "Visiter le site Web",
-        RELOAD_UI_WARNING = "La modification de ce paramètre requiert un rechargement de l'UI pour qu'il soit pris en compte.",
-        RELOAD_DIALOG_TITLE = "Reload UI requis",
-        RELOAD_DIALOG_TEXT = "Certaines modifications requièrent un rechargement de l'UI pour qu'ils soient pris en compte. Souhaitez-vous recharger l'interface maintenant ou annuler les modifications ?",
-        RELOAD_DIALOG_RELOAD_BUTTON = "Recharger",
-        RELOAD_DIALOG_DISCARD_BUTTON = "Annuler",
-    },
-    de = { -- provided by sirinsidiator
-        PANEL_NAME = "Erweiterungen",
-        WEBSITE = "Webseite besuchen",
-        RELOAD_UI_WARNING = "Änderungen an dieser Option werden erst übernommen nachdem die Benutzeroberfläche neu geladen wird.",
-        RELOAD_DIALOG_TITLE = "Neuladen benötigt",
-        RELOAD_DIALOG_TEXT = "Einige Änderungen werden erst übernommen nachdem die Benutzeroberfläche neu geladen wird. Wollt Ihr sie jetzt neu laden oder die Änderungen verwerfen?",
-        RELOAD_DIALOG_RELOAD_BUTTON = "Neu laden",
-        RELOAD_DIALOG_DISCARD_BUTTON = "Verwerfen",
-    },
-    ru = { -- provided by TERAB1T
-        PANEL_NAME = "Дополнения",
-        VERSION = "Версия: <<X:1>>",
-        WEBSITE = "Посетить сайт",
-        PANEL_INFO_FONT = "RuESO/fonts/Univers57.otf|14|soft-shadow-thin",
-        RELOAD_UI_WARNING = "Для применения этой настройки необходима перезагрузка интерфейса.",
-        RELOAD_DIALOG_TITLE = "Необходима перезагрузка интерфейса",
-        RELOAD_DIALOG_TEXT = "Для применения некоторых изменений необходима перезагрузка интерфейса. Перезагрузить интерфейс сейчас или отменить изменения?",
-        RELOAD_DIALOG_RELOAD_BUTTON = "Перезагрузить",
-        RELOAD_DIALOG_DISCARD_BUTTON = "Отменить изменения",
-    },
-    es = { -- provided by Morganlefai, checked by Kwisatz
-        PANEL_NAME = "Configuración",
-        VERSION = "Versión: <<X:1>>",
-        WEBSITE = "Visita la página web",
-        RELOAD_UI_WARNING = "Cambiar este ajuste recargará la interfaz del usuario.",
-        RELOAD_DIALOG_TITLE = "Requiere recargar la interfaz",
-        RELOAD_DIALOG_TEXT = "Algunos cambios requieren recargar la interfaz para poder aplicarse. Quieres aplicar los cambios y recargar la interfaz?",
-        RELOAD_DIALOG_RELOAD_BUTTON = "Recargar",
-        RELOAD_DIALOG_DISCARD_BUTTON = "Cancelar",
-    },
-    jp = { -- provided by k0ta0uchi
-        PANEL_NAME = "アドオン設定",
-        WEBSITE = "ウェブサイトを見る",
-    },
-    zh = { -- provided by bssthu
-        PANEL_NAME = "插件",
-        VERSION = "版本: <<X:1>>",
-        WEBSITE = "访问网站",
-        PANEL_INFO_FONT = "EsoZh/fonts/univers57.otf|14|soft-shadow-thin",
-    },
-    pl = { -- provided by EmiruTegryfon
-        PANEL_NAME = "Dodatki",
-        VERSION = "Wersja: <<X:1>>",
-        WEBSITE = "Odwiedź stronę",
-        RELOAD_UI_WARNING = "Zmiany będą widoczne po ponownym załadowaniu UI.",
-        RELOAD_DIALOG_TITLE = "Wymagane przeładowanie UI",
-        RELOAD_DIALOG_TEXT = "Niektóre zmiany wymagają ponownego załadowania UI. Czy chcesz teraz ponownie załadować, czy porzucić zmiany?",
-        RELOAD_DIALOG_RELOAD_BUTTON = "Przeładuj",
-        RELOAD_DIALOG_DISCARD_BUTTON = "Porzuć",
-    },
-}
-
-util.L = ZO_ShallowTableCopy(localization[GetCVar("Language.2")], localization["en"])
-util.GetTooltipText = GetStringFromValue -- deprecated, use util.GetStringFromValue instead
-util.GetStringFromValue = GetStringFromValue
-util.GetDefaultValue = GetDefaultValue
-util.CreateBaseControl = CreateBaseControl
-util.CreateLabelAndContainerControl = CreateLabelAndContainerControl
-util.RequestRefreshIfNeeded = RequestRefreshIfNeeded
-util.RegisterForRefreshIfNeeded = RegisterForRefreshIfNeeded
-util.RegisterForReloadIfNeeded = RegisterForReloadIfNeeded
-util.GetTopPanel = GetTopPanel
-util.ShowConfirmationDialog = ShowConfirmationDialog
-util.UpdateWarning = UpdateWarning
-
-local ADDON_DATA_TYPE = 1
-local RESELECTING_DURING_REBUILD = true
-local USER_REQUESTED_OPEN = true
-
-
---INTERNAL FUNCTION
---scrolls ZO_ScrollList `list` to move the row corresponding to `data`
--- into view (does nothing if there is no such row in the list)
---unlike ZO_ScrollList_ScrollDataIntoView, this function accounts for
--- fading near the list's edges - it avoids the fading area by scrolling
--- a little further than the ZO function
-local function ScrollDataIntoView(list, data)
-    local targetIndex = data.sortIndex
-    if not targetIndex then return end
-
-    local scrollMin, scrollMax = list.scrollbar:GetMinMax()
-    local scrollTop = list.scrollbar:GetValue()
-    local controlHeight = list.controlHeight
-    local targetMin = controlHeight * (targetIndex - 1) - 64
-    -- subtracting 64 ain't arbitrary, it's the maximum fading height
-    -- (libraries/zo_templates/scrolltemplates.lua/UpdateScrollFade)
-
-    if targetMin < scrollTop then
-        ZO_ScrollList_ScrollAbsolute(list, zo_max(targetMin, scrollMin))
-    else
-        local listHeight = ZO_ScrollList_GetHeight(list)
-        local targetMax = controlHeight * targetIndex + 64 - listHeight
-
-        if targetMax > scrollTop then
-            ZO_ScrollList_ScrollAbsolute(list, zo_min(targetMax, scrollMax))
-        end
-    end
-end
-
-
---INTERNAL FUNCTION
---constructs a string pattern from the text in `searchEdit` control
--- * metacharacters are escaped, losing their special meaning
--- * whitespace matches anything (including empty substring)
---if there is nothing but whitespace, returns nil
---otherwise returns a filter function, which takes a `data` table argument
--- and returns true iff `data.filterText` matches the pattern
-local function GetSearchFilterFunc(searchEdit)
-    local text = searchEdit:GetText():lower()
-    local pattern = text:match("(%S+.-)%s*$")
-
-    if not pattern then -- nothing but whitespace
-        return nil
-    end
-
-    -- escape metacharacters, e.g. "ESO-Datenbank.de" => "ESO%-Datenbank%.de"
-    pattern = pattern:gsub("[-*+?^$().[%]%%]", "%%%0")
-
-    -- replace whitespace with "match shortest anything"
-    pattern = pattern:gsub("%s+", ".-")
-
-    return function(data)
-        return data.filterText:lower():find(pattern) ~= nil
-    end
-end
-
-
---INTERNAL FUNCTION
---populates `addonList` with entries from `addonsForList`
--- addonList = ZO_ScrollList control
--- filter = [optional] function(data)
-local function PopulateAddonList(addonList, filter)
-    local entryList = ZO_ScrollList_GetDataList(addonList)
-    local numEntries = 0
-    local selectedData = nil
-
-    ZO_ScrollList_Clear(addonList)
-
-    for i, data in ipairs(addonsForList) do
-        if not filter or filter(data) then
-            local dataEntry = ZO_ScrollList_CreateDataEntry(ADDON_DATA_TYPE, data)
-            numEntries = numEntries + 1
-            data.sortIndex = numEntries
-            entryList[numEntries] = dataEntry
-            -- select the first panel passing the filter, or the currently
-            -- shown panel, but only if it passes the filter as well
-            if selectedData == nil or data.panel == lam.currentAddonPanel then
-                selectedData = data
-            end
-        else
-            data.sortIndex = nil
-        end
-    end
-
-    ZO_ScrollList_Commit(addonList)
-
-    if selectedData then
-        if selectedData.panel == lam.currentAddonPanel then
-            ZO_ScrollList_SelectData(addonList, selectedData, nil, RESELECTING_DURING_REBUILD)
-        else
-            ZO_ScrollList_SelectData(addonList, selectedData, nil)
-        end
-        ScrollDataIntoView(addonList, selectedData)
-    end
-end
-
-
---METHOD: REGISTER WIDGET--
---each widget has its version checked before loading,
---so we only have the most recent one in memory
---Usage:
--- widgetType = "string"; the type of widget being registered
--- widgetVersion = integer; the widget's version number
-LAMCreateControl = LAMCreateControl or {}
-local lamcc = LAMCreateControl
-
-function lam:RegisterWidget(widgetType, widgetVersion)
-    if widgets[widgetType] and widgets[widgetType] >= widgetVersion then
-        return false
-    else
-        widgets[widgetType] = widgetVersion
-        return true
-    end
-end
-
--- INTERNAL METHOD: hijacks the handlers for the actions in the OptionsWindow layer if not already done
-local function InitKeybindActions()
-    if not lam.keybindsInitialized then
-        lam.keybindsInitialized = true
-        ZO_PreHook(KEYBOARD_OPTIONS, "ApplySettings", function()
-            if lam.currentPanelOpened then
-                if not lam.applyButton:IsHidden() then
-                    HandleReloadUIPressed()
-                end
-                return true
-            end
-        end)
-        ZO_PreHook("ZO_Dialogs_ShowDialog", function(dialogName)
-            if lam.currentPanelOpened and dialogName == "OPTIONS_RESET_TO_DEFAULTS" then
-                if not lam.defaultButton:IsHidden() then
-                    HandleLoadDefaultsPressed()
-                end
-                return true
-            end
-        end)
-    end
-end
-
--- INTERNAL METHOD: fires the LAM-PanelOpened callback if not already done
-local function OpenCurrentPanel()
-    if lam.currentAddonPanel and not lam.currentPanelOpened then
-        lam.currentPanelOpened = true
-        lam.defaultButton:SetHidden(not lam.currentAddonPanel.data.registerForDefaults)
-        cm:FireCallbacks("LAM-PanelOpened", lam.currentAddonPanel)
-    end
-end
-
--- INTERNAL METHOD: fires the LAM-PanelClosed callback if not already done
-local function CloseCurrentPanel()
-    if lam.currentAddonPanel and lam.currentPanelOpened then
-        lam.currentPanelOpened = false
-        cm:FireCallbacks("LAM-PanelClosed", lam.currentAddonPanel)
-    end
-end
-
---METHOD: OPEN TO ADDON PANEL--
---opens to a specific addon's option panel
---Usage:
--- panel = userdata; the panel returned by the :RegisterOptionsPanel method
-local locSettings = GetString(SI_GAME_MENU_SETTINGS)
-function lam:OpenToPanel(panel)
-
-    -- find and select the panel's row in addon list
-
-    local addonList = lam.addonList
-    local selectedData = nil
-
-    for _, addonData in ipairs(addonsForList) do
-        if addonData.panel == panel then
-            selectedData = addonData
-            ScrollDataIntoView(addonList, selectedData)
-            break
-        end
-    end
-
-    ZO_ScrollList_SelectData(addonList, selectedData)
-    ZO_ScrollList_RefreshVisible(addonList, selectedData)
-
-    local srchEdit = LAMAddonSettingsWindow:GetNamedChild("SearchFilterEdit")
-    srchEdit:Clear()
-
-    -- note that ZO_ScrollList doesn't require `selectedData` to be actually
-    -- present in the list, and that the list will only be populated once LAM
-    -- "Addon Settings" menu entry is selected for the first time
-
-    local function openAddonSettingsMenu()
-        local gameMenu = ZO_GameMenu_InGame.gameMenu
-        local settingsMenu = gameMenu.headerControls[locSettings]
-
-        if settingsMenu then -- an instance of ZO_TreeNode
-            local children = settingsMenu:GetChildren()
-            for i = 1, (children and #children or 0) do
-                local childNode = children[i]
-                local data = childNode:GetData()
-                if data and data.id == lam.panelId then
-                    -- found LAM "Addon Settings" node, yay!
-                    childNode:GetTree():SelectNode(childNode)
-                    break
-                end
-            end
-        end
-    end
-
-    if sm:GetScene("gameMenuInGame"):GetState() == SCENE_SHOWN then
-        openAddonSettingsMenu()
-    else
-        sm:CallWhen("gameMenuInGame", SCENE_SHOWN, openAddonSettingsMenu)
-        sm:Show("gameMenuInGame")
-    end
-end
-
-local TwinOptionsContainer_Index = 0
-local function TwinOptionsContainer(parent, leftWidget, rightWidget)
-    TwinOptionsContainer_Index = TwinOptionsContainer_Index + 1
-    local cParent = parent.scroll or parent
-    local panel = parent.panel or cParent
-    local container = wm:CreateControl("$(parent)TwinContainer" .. tostring(TwinOptionsContainer_Index),
-        cParent, CT_CONTROL)
-    container:SetResizeToFitDescendents(true)
-    container:SetAnchor(select(2, leftWidget:GetAnchor(0) ))
-
-    leftWidget:ClearAnchors()
-    leftWidget:SetAnchor(TOPLEFT, container, TOPLEFT)
-    rightWidget:SetAnchor(TOPLEFT, leftWidget, TOPRIGHT, 5, 0)
-
-    leftWidget:SetWidth( leftWidget:GetWidth() - 2.5 ) -- fixes bad alignment with 'full' controls
-    rightWidget:SetWidth( rightWidget:GetWidth() - 2.5 )
-
-    leftWidget:SetParent(container)
-    rightWidget:SetParent(container)
-
-    container.data = {type = "container"}
-    container.panel = panel
-    return container
-end
-
---INTERNAL FUNCTION
---creates controls when options panel is first shown
---controls anchoring of these controls in the panel
-local function CreateOptionsControls(panel)
-    local addonID = panel:GetName()
-    if(optionsState[addonID] == OPTIONS_CREATED) then
-        return false
-    elseif(optionsState[addonID] == OPTIONS_CREATION_RUNNING) then
-        return true
-    end
-    optionsState[addonID] = OPTIONS_CREATION_RUNNING
-
-    local function CreationFinished()
-        optionsState[addonID] = OPTIONS_CREATED
-        cm:FireCallbacks("LAM-PanelControlsCreated", panel)
-        OpenCurrentPanel()
-    end
-
-    local optionsTable = addonToOptionsMap[addonID]
-    if optionsTable then
-        local function CreateAndAnchorWidget(parent, widgetData, offsetX, offsetY, anchorTarget, wasHalf)
-            local widget
-            local status, err = pcall(function() widget = LAMCreateControl[widgetData.type](parent, widgetData) end)
-            if not status then
-                return err or true, offsetY, anchorTarget, wasHalf
-            else
-                local isHalf = (widgetData.width == "half")
-                if not anchorTarget then -- the first widget in a panel is just placed in the top left corner
-                    widget:SetAnchor(TOPLEFT)
-                    anchorTarget = widget
-                elseif wasHalf and isHalf then -- when the previous widget was only half width and this one is too, we place it on the right side
-                    widget.lineControl = anchorTarget
-                    isHalf = false
-                    offsetY = 0
-                    anchorTarget = TwinOptionsContainer(parent, anchorTarget, widget)
-                else -- otherwise we just put it below the previous one normally
-                    widget:SetAnchor(TOPLEFT, anchorTarget, BOTTOMLEFT, 0, 15)
-                    offsetY = 0
-                    anchorTarget = widget
-                end
-                return false, offsetY, anchorTarget, isHalf
-            end
-        end
-
-        local THROTTLE_TIMEOUT, THROTTLE_COUNT = 10, 20
-        local fifo = {}
-        local anchorOffset, lastAddedControl, wasHalf
-        local CreateWidgetsInPanel, err
-
-        local function PrepareForNextPanel()
-            anchorOffset, lastAddedControl, wasHalf = 0, nil, false
-        end
-
-        local function SetupCreationCalls(parent, widgetDataTable)
-            fifo[#fifo + 1] = PrepareForNextPanel
-            local count = #widgetDataTable
-            for i = 1, count, THROTTLE_COUNT do
-                fifo[#fifo + 1] = function()
-                    CreateWidgetsInPanel(parent, widgetDataTable, i, zo_min(i + THROTTLE_COUNT - 1, count))
-                end
-            end
-            return count ~= NonContiguousCount(widgetDataTable)
-        end
-
-        CreateWidgetsInPanel = function(parent, widgetDataTable, startIndex, endIndex)
-            for i=startIndex,endIndex do
-                local widgetData = widgetDataTable[i]
-                if not widgetData then
-                    PrintLater("Skipped creation of missing entry in the settings menu of " .. addonID .. ".")
-                else
-                    local widgetType = widgetData.type
-                    local offsetX = 0
-                    local isSubmenu = (widgetType == "submenu")
-                    if isSubmenu then
-                        wasHalf = false
-                        offsetX = 5
-                    end
-
-                    err, anchorOffset, lastAddedControl, wasHalf = CreateAndAnchorWidget(parent, widgetData, offsetX, anchorOffset, lastAddedControl, wasHalf)
-                    if err then
-                        PrintLater(("Could not create %s '%s' of %s."):format(widgetData.type, GetStringFromValue(widgetData.name or "unnamed"), addonID))
-                    end
-
-                    if isSubmenu then
-                        if SetupCreationCalls(lastAddedControl, widgetData.controls) then
-                            PrintLater(("The sub menu '%s' of %s is missing some entries."):format(GetStringFromValue(widgetData.name or "unnamed"), addonID))
-                        end
-                    end
-                end
-            end
-        end
-
-        local function DoCreateSettings()
-            if #fifo > 0 then
-                local nextCall = table.remove(fifo, 1)
-                nextCall()
-                if(nextCall == PrepareForNextPanel) then
-                    DoCreateSettings()
-                else
-                    zo_callLater(DoCreateSettings, THROTTLE_TIMEOUT)
-                end
-            else
-                CreationFinished()
-            end
-        end
-
-        if SetupCreationCalls(panel, optionsTable) then
-            PrintLater(("The settings menu of %s is missing some entries."):format(addonID))
-        end
-        DoCreateSettings()
-    else
-        CreationFinished()
-    end
-
-    return true
-end
-
---INTERNAL FUNCTION
---handles switching between panels
-local function ToggleAddonPanels(panel) --called in OnShow of newly shown panel
-    local currentlySelected = lam.currentAddonPanel
-    if currentlySelected and currentlySelected ~= panel then
-        currentlySelected:SetHidden(true)
-        CloseCurrentPanel()
-    end
-    lam.currentAddonPanel = panel
-
-    -- refresh visible rows to reflect panel IsHidden status
-    ZO_ScrollList_RefreshVisible(lam.addonList)
-
-    if not CreateOptionsControls(panel) then
-        OpenCurrentPanel()
-    end
-
-    cm:FireCallbacks("LAM-RefreshPanel", panel)
-end
-
-local CheckSafetyAndInitialize
-
---METHOD: REGISTER ADDON PANEL
---registers your addon with LibAddonMenu and creates a panel
---Usage:
--- addonID = "string"; unique ID which will be the global name of your panel
--- panelData = table; data object for your panel - see controls\panel.lua
-function lam:RegisterAddonPanel(addonID, panelData)
-    CheckSafetyAndInitialize(addonID)
-    local container = lam:GetAddonPanelContainer()
-    local panel = lamcc.panel(container, panelData, addonID) --addonID==global name of panel
-    panel:SetHidden(true)
-    panel:SetAnchorFill(container)
-    panel:SetHandler("OnShow", ToggleAddonPanels)
-
-    local function stripMarkup(str)
-        return str:gsub("|[Cc]%x%x%x%x%x%x", ""):gsub("|[Rr]", "")
-    end
-
-    local filterParts = {panelData.name, nil, nil}
-    -- append keywords and author separately, the may be nil
-    filterParts[#filterParts + 1] = panelData.keywords
-    filterParts[#filterParts + 1] = panelData.author
-
-    local addonData = {
-        panel = panel,
-        name = stripMarkup(panelData.name),
-        filterText = stripMarkup(tconcat(filterParts, "\t")):lower(),
-    }
-
-    tinsert(addonsForList, addonData)
-
-    if panelData.slashCommand then
-        SLASH_COMMANDS[panelData.slashCommand] = function()
-            lam:OpenToPanel(panel)
-        end
-    end
-
-    return panel --return for authors creating options manually
-end
-
-
---METHOD: REGISTER OPTION CONTROLS
---registers the options you want shown for your addon
---these are stored in a table where each key-value pair is the order
---of the options in the panel and the data for that control, respectively
---see exampleoptions.lua for an example
---see controls\<widget>.lua for each widget type
---Usage:
--- addonID = "string"; the same string passed to :RegisterAddonPanel
--- optionsTable = table; the table containing all of the options controls and their data
-function lam:RegisterOptionControls(addonID, optionsTable) --optionsTable = {sliderData, buttonData, etc}
-    addonToOptionsMap[addonID] = optionsTable
-end
-
---INTERNAL FUNCTION
---creates LAM's Addon Settings entry in ZO_GameMenu
-local function CreateAddonSettingsMenuEntry()
-    local panelData = {
-        id = KEYBOARD_OPTIONS.currentPanelId,
-        name = util.L["PANEL_NAME"],
-    }
-
-    KEYBOARD_OPTIONS.currentPanelId = panelData.id + 1
-    KEYBOARD_OPTIONS.panelNames[panelData.id] = panelData.name
-
-    lam.panelId = panelData.id
-
-    local addonListSorted = false
-
-    function panelData.callback()
-        sm:AddFragment(lam:GetAddonSettingsFragment())
-        KEYBOARD_OPTIONS:ChangePanels(lam.panelId)
-
-        local title = LAMAddonSettingsWindow:GetNamedChild("Title")
-        title:SetText(panelData.name)
-
-        if not addonListSorted and #addonsForList > 0 then
-            local searchEdit = LAMAddonSettingsWindow:GetNamedChild("SearchFilterEdit")
-            --we're about to show our list for the first time - let's sort it
-            table.sort(addonsForList, function(a, b) return a.name < b.name end)
-            PopulateAddonList(lam.addonList, GetSearchFilterFunc(searchEdit))
-            addonListSorted = true
-        end
-    end
-
-    function panelData.unselectedCallback()
-        sm:RemoveFragment(lam:GetAddonSettingsFragment())
-        if SetCameraOptionsPreviewModeEnabled then -- available since API version 100011
-            SetCameraOptionsPreviewModeEnabled(false)
-        end
-    end
-
-    ZO_GameMenu_AddSettingPanel(panelData)
-end
-
-
---INTERNAL FUNCTION
---creates the left-hand menu in LAM's window
-local function CreateAddonList(name, parent)
-    local addonList = wm:CreateControlFromVirtual(name, parent, "ZO_ScrollList")
-
-    local function addonListRow_OnMouseDown(control, button)
-        if button == 1 then
-            local data = ZO_ScrollList_GetData(control)
-            ZO_ScrollList_SelectData(addonList, data, control)
-        end
-    end
-
-    local function addonListRow_OnMouseEnter(control)
-        ZO_ScrollList_MouseEnter(addonList, control)
-    end
-
-    local function addonListRow_OnMouseExit(control)
-        ZO_ScrollList_MouseExit(addonList, control)
-    end
-
-    local function addonListRow_Select(previouslySelectedData, selectedData, reselectingDuringRebuild)
-        if not reselectingDuringRebuild then
-            if previouslySelectedData then
-                previouslySelectedData.panel:SetHidden(true)
-            end
-            if selectedData then
-                selectedData.panel:SetHidden(false)
-                PlaySound(SOUNDS.MENU_SUBCATEGORY_SELECTION)
-            end
-        end
-    end
-
-    local function addonListRow_Setup(control, data)
-        control:SetText(data.name)
-        control:SetSelected(not data.panel:IsHidden())
-    end
-
-    ZO_ScrollList_AddDataType(addonList, ADDON_DATA_TYPE, "ZO_SelectableLabel", 28, addonListRow_Setup)
-    -- I don't know how to make highlights clear properly; they often
-    -- get stuck and after a while the list is full of highlighted rows
-    --ZO_ScrollList_EnableHighlight(addonList, "ZO_ThinListHighlight")
-    ZO_ScrollList_EnableSelection(addonList, "ZO_ThinListHighlight", addonListRow_Select)
-
-    local addonDataType = ZO_ScrollList_GetDataTypeTable(addonList, ADDON_DATA_TYPE)
-    local addonListRow_CreateRaw = addonDataType.pool.m_Factory
-
-    local function addonListRow_Create(pool)
-        local control = addonListRow_CreateRaw(pool)
-        control:SetHandler("OnMouseDown", addonListRow_OnMouseDown)
-        --control:SetHandler("OnMouseEnter", addonListRow_OnMouseEnter)
-        --control:SetHandler("OnMouseExit", addonListRow_OnMouseExit)
-        control:SetHeight(28)
-        control:SetFont("ZoFontHeader")
-        control:SetHorizontalAlignment(TEXT_ALIGN_LEFT)
-        control:SetVerticalAlignment(TEXT_ALIGN_CENTER)
-        control:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
-        return control
-    end
-
-    addonDataType.pool.m_Factory = addonListRow_Create
-
-    return addonList
-end
-
-
---INTERNAL FUNCTION
-local function CreateSearchFilterBox(name, parent)
-    local boxControl = wm:CreateControl(name, parent, CT_CONTROL)
-
-    local srchButton =  wm:CreateControl("$(parent)Button", boxControl, CT_BUTTON)
-    srchButton:SetDimensions(32, 32)
-    srchButton:SetAnchor(LEFT, nil, LEFT, 2, 0)
-    srchButton:SetNormalTexture("EsoUI/Art/LFG/LFG_tabIcon_groupTools_up.dds")
-    srchButton:SetPressedTexture("EsoUI/Art/LFG/LFG_tabIcon_groupTools_down.dds")
-    srchButton:SetMouseOverTexture("EsoUI/Art/LFG/LFG_tabIcon_groupTools_over.dds")
-
-    local srchEdit = wm:CreateControlFromVirtual("$(parent)Edit", boxControl, "ZO_DefaultEdit")
-    srchEdit:SetAnchor(LEFT, srchButton, RIGHT, 4, 1)
-    srchEdit:SetAnchor(RIGHT, nil, RIGHT, -4, 1)
-    srchEdit:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
-
-    local srchBg = wm:CreateControl("$(parent)Bg", boxControl, CT_BACKDROP)
-    srchBg:SetAnchorFill()
-    srchBg:SetAlpha(0)
-    srchBg:SetCenterColor(0, 0, 0, 0.5)
-    srchBg:SetEdgeColor(ZO_DISABLED_TEXT:UnpackRGBA())
-    srchBg:SetEdgeTexture("", 1, 1, 0, 0)
-
-    -- search backdrop should appear whenever you hover over either
-    -- the magnifying glass button or the edit field (which is only
-    -- visible when it contains some text), and also while the edit
-    -- field has keyboard focus
-
-    local srchActive = false
-    local srchHover = false
-
-    local function srchBgUpdateAlpha()
-        if srchActive or srchEdit:HasFocus() then
-            srchBg:SetAlpha(srchHover and 0.8 or 0.6)
-        else
-            srchBg:SetAlpha(srchHover and 0.6 or 0.0)
-        end
-    end
-
-    local function srchMouseEnter(control)
-        srchHover = true
-        srchBgUpdateAlpha()
-    end
-
-    local function srchMouseExit(control)
-        srchHover = false
-        srchBgUpdateAlpha()
-    end
-
-    boxControl:SetMouseEnabled(true)
-    boxControl:SetHitInsets(1, 1, -1, -1)
-    boxControl:SetHandler("OnMouseEnter", srchMouseEnter)
-    boxControl:SetHandler("OnMouseExit", srchMouseExit)
-
-    srchButton:SetHandler("OnMouseEnter", srchMouseEnter)
-    srchButton:SetHandler("OnMouseExit", srchMouseExit)
-
-    local focusLostTime = 0
-
-    srchButton:SetHandler("OnClicked", function(self)
-        srchEdit:Clear()
-        if GetFrameTimeMilliseconds() - focusLostTime < 100 then
-            -- re-focus the edit box if it lost focus due to this
-            -- button click (note that this handler may run a few
-            -- frames later)
-            srchEdit:TakeFocus()
-        end
-    end)
-
-    srchEdit:SetHandler("OnMouseEnter", srchMouseEnter)
-    srchEdit:SetHandler("OnMouseExit", srchMouseExit)
-    srchEdit:SetHandler("OnFocusGained", srchBgUpdateAlpha)
-
-    srchEdit:SetHandler("OnFocusLost", function()
-        focusLostTime = GetFrameTimeMilliseconds()
-        srchBgUpdateAlpha()
-    end)
-
-    srchEdit:SetHandler("OnEscape", function(self)
-        self:Clear()
-        self:LoseFocus()
-    end)
-
-    srchEdit:SetHandler("OnTextChanged", function(self)
-        local filterFunc = GetSearchFilterFunc(self)
-        if filterFunc then
-            srchActive = true
-            srchBg:SetEdgeColor(ZO_SECOND_CONTRAST_TEXT:UnpackRGBA())
-            srchButton:SetState(BSTATE_PRESSED)
-        else
-            srchActive = false
-            srchBg:SetEdgeColor(ZO_DISABLED_TEXT:UnpackRGBA())
-            srchButton:SetState(BSTATE_NORMAL)
-        end
-        srchBgUpdateAlpha()
-        PopulateAddonList(lam.addonList, filterFunc)
-        PlaySound(SOUNDS.SPINNER_DOWN)
-    end)
-
-    return boxControl
-end
-
-
---INTERNAL FUNCTION
---creates LAM's Addon Settings top-level window
-local function CreateAddonSettingsWindow()
-    local tlw = wm:CreateTopLevelWindow("LAMAddonSettingsWindow")
-    tlw:SetHidden(true)
-    tlw:SetDimensions(1010, 914) -- same height as ZO_OptionsWindow
-
-    ZO_ReanchorControlForLeftSidePanel(tlw)
-
-    -- create black background for the window (mimic ZO_RightFootPrintBackground)
-
-    local bgLeft = wm:CreateControl("$(parent)BackgroundLeft", tlw, CT_TEXTURE)
-    bgLeft:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_left.dds")
-    bgLeft:SetDimensions(1024, 1024)
-    bgLeft:SetAnchor(TOPLEFT, nil, TOPLEFT)
-    bgLeft:SetDrawLayer(DL_BACKGROUND)
-    bgLeft:SetExcludeFromResizeToFitExtents(true)
-
-    local bgRight = wm:CreateControl("$(parent)BackgroundRight", tlw, CT_TEXTURE)
-    bgRight:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_right.dds")
-    bgRight:SetDimensions(64, 1024)
-    bgRight:SetAnchor(TOPLEFT, bgLeft, TOPRIGHT)
-    bgRight:SetDrawLayer(DL_BACKGROUND)
-    bgRight:SetExcludeFromResizeToFitExtents(true)
-
-    -- create gray background for addon list (mimic ZO_TreeUnderlay)
-
-    local underlayLeft = wm:CreateControl("$(parent)UnderlayLeft", tlw, CT_TEXTURE)
-    underlayLeft:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_indexArea_left.dds")
-    underlayLeft:SetDimensions(256, 1024)
-    underlayLeft:SetAnchor(TOPLEFT, bgLeft, TOPLEFT)
-    underlayLeft:SetDrawLayer(DL_BACKGROUND)
-    underlayLeft:SetExcludeFromResizeToFitExtents(true)
-
-    local underlayRight = wm:CreateControl("$(parent)UnderlayRight", tlw, CT_TEXTURE)
-    underlayRight:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_indexArea_right.dds")
-    underlayRight:SetDimensions(128, 1024)
-    underlayRight:SetAnchor(TOPLEFT, underlayLeft, TOPRIGHT)
-    underlayRight:SetDrawLayer(DL_BACKGROUND)
-    underlayRight:SetExcludeFromResizeToFitExtents(true)
-
-    -- create title bar (mimic ZO_OptionsWindow)
-
-    local title = wm:CreateControl("$(parent)Title", tlw, CT_LABEL)
-    title:SetAnchor(TOPLEFT, nil, TOPLEFT, 65, 70)
-    title:SetFont("ZoFontWinH1")
-    title:SetModifyTextType(MODIFY_TEXT_TYPE_UPPERCASE)
-
-    local divider = wm:CreateControlFromVirtual("$(parent)Divider", tlw, "ZO_Options_Divider")
-    divider:SetAnchor(TOPLEFT, nil, TOPLEFT, 65, 108)
-
-    -- create search filter box
-
-    local srchBox = CreateSearchFilterBox("$(parent)SearchFilter", tlw)
-    srchBox:SetAnchor(TOPLEFT, nil, TOPLEFT, 63, 120)
-    srchBox:SetDimensions(260, 30)
-
-    -- create scrollable addon list
-
-    local addonList = CreateAddonList("$(parent)AddonList", tlw)
-    addonList:SetAnchor(TOPLEFT, nil, TOPLEFT, 65, 160)
-    addonList:SetDimensions(285, 665)
-
-    lam.addonList = addonList -- for easy access from elsewhere
-
-    -- create container for option panels
-
-    local panelContainer = wm:CreateControl("$(parent)PanelContainer", tlw, CT_CONTROL)
-    panelContainer:SetAnchor(TOPLEFT, nil, TOPLEFT, 365, 120)
-    panelContainer:SetDimensions(645, 675)
-
-    local defaultButton = wm:CreateControlFromVirtual("$(parent)ResetToDefaultButton", tlw, "ZO_DialogButton")
-    ZO_KeybindButtonTemplate_Setup(defaultButton, "OPTIONS_LOAD_DEFAULTS", HandleLoadDefaultsPressed, GetString(SI_OPTIONS_DEFAULTS))
-    defaultButton:SetAnchor(TOPLEFT, panelContainer, BOTTOMLEFT, 0, 2)
-    lam.defaultButton = defaultButton
-
-    local applyButton = wm:CreateControlFromVirtual("$(parent)ApplyButton", tlw, "ZO_DialogButton")
-    ZO_KeybindButtonTemplate_Setup(applyButton, "OPTIONS_APPLY_CHANGES", HandleReloadUIPressed, GetString(SI_ADDON_MANAGER_RELOAD))
-    applyButton:SetAnchor(TOPRIGHT, panelContainer, BOTTOMRIGHT, 0, 2)
-    applyButton:SetHidden(true)
-    lam.applyButton = applyButton
-
-    return tlw
-end
-
-
---INITIALIZING
-local safeToInitialize = false
-local hasInitialized = false
-
-local eventHandle = table.concat({MAJOR, MINOR}, "r")
-local function OnLoad(_, addonName)
-    -- wait for the first loaded event
-    em:UnregisterForEvent(eventHandle, EVENT_ADD_ON_LOADED)
-    safeToInitialize = true
-end
-em:RegisterForEvent(eventHandle, EVENT_ADD_ON_LOADED, OnLoad)
-
-local function OnActivated(_, initial)
-    em:UnregisterForEvent(eventHandle, EVENT_PLAYER_ACTIVATED)
-    FlushMessages()
-
-    local reopenPanel = RetrievePanelForReopening()
-    if not initial and reopenPanel then
-        lam:OpenToPanel(reopenPanel)
-    end
-end
-em:RegisterForEvent(eventHandle, EVENT_PLAYER_ACTIVATED, OnActivated)
-
-function CheckSafetyAndInitialize(addonID)
-    if not safeToInitialize then
-        local msg = string.format("The panel with id '%s' was registered before addon loading has completed. This might break the AddOn Settings menu.", addonID)
-        PrintLater(msg)
-    end
-    if not hasInitialized then
-        hasInitialized = true
-    end
-end
-
-
---TODO documentation
-function lam:GetAddonPanelContainer()
-    local fragment = lam:GetAddonSettingsFragment()
-    local window = fragment:GetControl()
-    return window:GetNamedChild("PanelContainer")
-end
-
-
---TODO documentation
-function lam:GetAddonSettingsFragment()
-    assert(hasInitialized or safeToInitialize)
-    if not LAMAddonSettingsFragment then
-        local window = CreateAddonSettingsWindow()
-        LAMAddonSettingsFragment = ZO_FadeSceneFragment:New(window, true, 100)
-        LAMAddonSettingsFragment:RegisterCallback("StateChange", function(oldState, newState)
-            if(newState == SCENE_FRAGMENT_SHOWN) then
-                InitKeybindActions()
-                PushActionLayerByName("OptionsWindow")
-                OpenCurrentPanel()
-            elseif(newState == SCENE_FRAGMENT_HIDDEN) then
-                CloseCurrentPanel()
-                RemoveActionLayerByName("OptionsWindow")
-                ShowReloadDialogIfNeeded()
-            end
-        end)
-        CreateAddonSettingsMenuEntry()
-    end
-    return LAMAddonSettingsFragment
-end
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/button.lua b/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/button.lua
deleted file mode 100644
index 82b5032..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/button.lua
+++ /dev/null
@@ -1,91 +0,0 @@
---[[buttonData = {
-    type = "button",
-    name = "My Button", -- string id or function returning a string
-    func = function() end,
-    tooltip = "Button's tooltip text.", -- string id or function returning a string (optional)
-    width = "full", --or "half" (optional)
-    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
-    icon = "icon\\path.dds", --(optional)
-    isDangerous = false, -- boolean, if set to true, the button text will be red and a confirmation dialog with the button label and warning text will show on click before the callback is executed (optional)
-    warning = "Will need to reload the UI.", --(optional)
-    reference = "MyAddonButton", -- unique global reference to control (optional)
-} ]]
-
-local widgetVersion = 11
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("button", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local function UpdateDisabled(control)
-    local disable = control.data.disabled
-    if type(disable) == "function" then
-        disable = disable()
-    end
-    control.button:SetEnabled(not disable)
-end
-
---controlName is optional
-local MIN_HEIGHT = 28 -- default_button height
-local HALF_WIDTH_LINE_SPACING = 2
-function LAMCreateControl.button(parent, buttonData, controlName)
-    local control = LAM.util.CreateBaseControl(parent, buttonData, controlName)
-    control:SetMouseEnabled(true)
-
-    local width = control:GetWidth()
-    if control.isHalfWidth then
-        control:SetDimensions(width / 2, MIN_HEIGHT * 2 + HALF_WIDTH_LINE_SPACING)
-    else
-        control:SetDimensions(width, MIN_HEIGHT)
-    end
-
-    if buttonData.icon then
-        control.button = wm:CreateControl(nil, control, CT_BUTTON)
-        control.button:SetDimensions(26, 26)
-        control.button:SetNormalTexture(buttonData.icon)
-        control.button:SetPressedOffset(2, 2)
-    else
-        --control.button = wm:CreateControlFromVirtual(controlName.."Button", control, "ZO_DefaultButton")
-        control.button = wm:CreateControlFromVirtual(nil, control, "ZO_DefaultButton")
-        control.button:SetWidth(width / 3)
-        control.button:SetText(LAM.util.GetStringFromValue(buttonData.name))
-        if buttonData.isDangerous then control.button:SetNormalFontColor(ZO_ERROR_COLOR:UnpackRGBA()) end
-    end
-    local button = control.button
-    button:SetAnchor(control.isHalfWidth and CENTER or RIGHT)
-    button:SetClickSound("Click")
-    button.data = {tooltipText = LAM.util.GetStringFromValue(buttonData.tooltip)}
-    button:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
-    button:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
-    button:SetHandler("OnClicked", function(...)
-        local args = {...}
-        local function callback()
-            buttonData.func(unpack(args))
-            LAM.util.RequestRefreshIfNeeded(control)
-        end
-
-        if(buttonData.isDangerous) then
-            local title = LAM.util.GetStringFromValue(buttonData.name)
-            local body = LAM.util.GetStringFromValue(buttonData.warning)
-            LAM.util.ShowConfirmationDialog(title, body, callback)
-        else
-            callback()
-        end
-    end)
-
-    if buttonData.warning ~= nil then
-        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-        control.warning:SetAnchor(RIGHT, button, LEFT, -5, 0)
-        control.UpdateWarning = LAM.util.UpdateWarning
-        control:UpdateWarning()
-    end
-
-    if buttonData.disabled ~= nil then
-        control.UpdateDisabled = UpdateDisabled
-        control:UpdateDisabled()
-    end
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-
-    return control
-end
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/checkbox.lua b/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/checkbox.lua
deleted file mode 100644
index 6696dd7..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/checkbox.lua
+++ /dev/null
@@ -1,142 +0,0 @@
---[[checkboxData = {
-    type = "checkbox",
-    name = "My Checkbox", -- or string id or function returning a string
-    getFunc = function() return db.var end,
-    setFunc = function(value) db.var = value doStuff() end,
-    tooltip = "Checkbox's tooltip text.", -- or string id or function returning a string (optional)
-    width = "full", -- or "half" (optional)
-    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
-    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
-    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
-    default = defaults.var, -- a boolean or function that returns a boolean (optional)
-    reference = "MyAddonCheckbox", -- unique global reference to control (optional)
-} ]]
-
-
-local widgetVersion = 14
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("checkbox", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
---label
-local enabledColor = ZO_DEFAULT_ENABLED_COLOR
-local enabledHLcolor = ZO_HIGHLIGHT_TEXT
-local disabledColor = ZO_DEFAULT_DISABLED_COLOR
-local disabledHLcolor = ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR
---checkbox
-local checkboxColor = ZO_NORMAL_TEXT
-local checkboxHLcolor = ZO_HIGHLIGHT_TEXT
-
-
-local function UpdateDisabled(control)
-    local disable
-    if type(control.data.disabled) == "function" then
-        disable = control.data.disabled()
-    else
-        disable = control.data.disabled
-    end
-
-    control.label:SetColor((disable and ZO_DEFAULT_DISABLED_COLOR or control.value and ZO_DEFAULT_ENABLED_COLOR or ZO_DEFAULT_DISABLED_COLOR):UnpackRGBA())
-    control.checkbox:SetColor((disable and ZO_DEFAULT_DISABLED_COLOR or ZO_NORMAL_TEXT):UnpackRGBA())
-    --control:SetMouseEnabled(not disable)
-    --control:SetMouseEnabled(true)
-
-    control.isDisabled = disable
-end
-
-local function ToggleCheckbox(control)
-    if control.value then
-        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-        control.checkbox:SetText(control.checkedText)
-    else
-        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-        control.checkbox:SetText(control.uncheckedText)
-    end
-end
-
-local function UpdateValue(control, forceDefault, value)
-    if forceDefault then --if we are forcing defaults
-        value = LAM.util.GetDefaultValue(control.data.default)
-        control.data.setFunc(value)
-    elseif value ~= nil then --our value could be false
-        control.data.setFunc(value)
-        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-        LAM.util.RequestRefreshIfNeeded(control)
-    else
-        value = control.data.getFunc()
-    end
-    control.value = value
-
-    ToggleCheckbox(control)
-end
-
-local function OnMouseEnter(control)
-    ZO_Options_OnMouseEnter(control)
-
-    if control.isDisabled then return end
-
-    local label = control.label
-    if control.value then
-        label:SetColor(ZO_HIGHLIGHT_TEXT:UnpackRGBA())
-    else
-        label:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
-    end
-    control.checkbox:SetColor(ZO_HIGHLIGHT_TEXT:UnpackRGBA())
-end
-
-local function OnMouseExit(control)
-    ZO_Options_OnMouseExit(control)
-
-    if control.isDisabled then return end
-
-    local label = control.label
-    if control.value then
-        label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-    else
-        label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-    end
-    control.checkbox:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
-end
-
---controlName is optional
-function LAMCreateControl.checkbox(parent, checkboxData, controlName)
-    local control = LAM.util.CreateLabelAndContainerControl(parent, checkboxData, controlName)
-    control:SetHandler("OnMouseEnter", OnMouseEnter)
-    control:SetHandler("OnMouseExit", OnMouseExit)
-    control:SetHandler("OnMouseUp", function(control)
-        if control.isDisabled then return end
-        PlaySound(SOUNDS.DEFAULT_CLICK)
-        control.value = not control.value
-        control:UpdateValue(false, control.value)
-    end)
-
-    control.checkbox = wm:CreateControl(nil, control.container, CT_LABEL)
-    local checkbox = control.checkbox
-    checkbox:SetAnchor(LEFT, control.container, LEFT, 0, 0)
-    checkbox:SetFont("ZoFontGameBold")
-    checkbox:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
-    control.checkedText = GetString(SI_CHECK_BUTTON_ON):upper()
-    control.uncheckedText = GetString(SI_CHECK_BUTTON_OFF):upper()
-
-    if checkboxData.warning ~= nil or checkboxData.requiresReload then
-        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-        control.warning:SetAnchor(RIGHT, checkbox, LEFT, -5, 0)
-        control.UpdateWarning = LAM.util.UpdateWarning
-        control:UpdateWarning()
-    end
-
-    control.data.tooltipText = LAM.util.GetStringFromValue(checkboxData.tooltip)
-
-    control.UpdateValue = UpdateValue
-    control:UpdateValue()
-    if checkboxData.disabled ~= nil then
-        control.UpdateDisabled = UpdateDisabled
-        control:UpdateDisabled()
-    end
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-    LAM.util.RegisterForReloadIfNeeded(control)
-
-    return control
-end
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/colorpicker.lua b/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/colorpicker.lua
deleted file mode 100644
index a57aab0..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/colorpicker.lua
+++ /dev/null
@@ -1,106 +0,0 @@
---[[colorpickerData = {
-    type = "colorpicker",
-    name = "My Color Picker", -- or string id or function returning a string
-    getFunc = function() return db.r, db.g, db.b, db.a end, --(alpha is optional)
-    setFunc = function(r,g,b,a) db.r=r, db.g=g, db.b=b, db.a=a end, --(alpha is optional)
-    tooltip = "Color Picker's tooltip text.", -- or string id or function returning a string (optional)
-    width = "full", --or "half" (optional)
-    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
-    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
-    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
-    default = {r = defaults.r, g = defaults.g, b = defaults.b, a = defaults.a}, --(optional) table of default color values (or default = defaultColor, where defaultColor is a table with keys of r, g, b[, a]) or a function that returns the color
-    reference = "MyAddonColorpicker" -- unique global reference to control (optional)
-} ]]
-
-
-local widgetVersion = 13
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("colorpicker", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local function UpdateDisabled(control)
-    local disable
-    if type(control.data.disabled) == "function" then
-        disable = control.data.disabled()
-    else
-        disable = control.data.disabled
-    end
-
-    if disable then
-        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-    else
-        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-    end
-
-    control.isDisabled = disable
-end
-
-local function UpdateValue(control, forceDefault, valueR, valueG, valueB, valueA)
-    if forceDefault then --if we are forcing defaults
-        local color = LAM.util.GetDefaultValue(control.data.default)
-        valueR, valueG, valueB, valueA = color.r, color.g, color.b, color.a
-        control.data.setFunc(valueR, valueG, valueB, valueA)
-    elseif valueR and valueG and valueB then
-        control.data.setFunc(valueR, valueG, valueB, valueA or 1)
-        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-        LAM.util.RequestRefreshIfNeeded(control)
-    else
-        valueR, valueG, valueB, valueA = control.data.getFunc()
-    end
-
-    control.thumb:SetColor(valueR, valueG, valueB, valueA or 1)
-end
-
-function LAMCreateControl.colorpicker(parent, colorpickerData, controlName)
-    local control = LAM.util.CreateLabelAndContainerControl(parent, colorpickerData, controlName)
-
-    control.color = control.container
-    local color = control.color
-
-    control.thumb = wm:CreateControl(nil, color, CT_TEXTURE)
-    local thumb = control.thumb
-    thumb:SetDimensions(36, 18)
-    thumb:SetAnchor(LEFT, color, LEFT, 4, 0)
-
-    color.border = wm:CreateControl(nil, color, CT_TEXTURE)
-    local border = color.border
-    border:SetTexture("EsoUI\\Art\\ChatWindow\\chatOptions_bgColSwatch_frame.dds")
-    border:SetTextureCoords(0, .625, 0, .8125)
-    border:SetDimensions(40, 22)
-    border:SetAnchor(CENTER, thumb, CENTER, 0, 0)
-
-    local function ColorPickerCallback(r, g, b, a)
-        control:UpdateValue(false, r, g, b, a)
-    end
-
-    control:SetHandler("OnMouseUp", function(self, btn, upInside)
-        if self.isDisabled then return end
-
-        if upInside then
-            local r, g, b, a = colorpickerData.getFunc()
-            COLOR_PICKER:Show(ColorPickerCallback, r, g, b, a, LAM.util.GetStringFromValue(colorpickerData.name))
-        end
-    end)
-
-    if colorpickerData.warning ~= nil or colorpickerData.requiresReload then
-        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-        control.warning:SetAnchor(RIGHT, control.color, LEFT, -5, 0)
-        control.UpdateWarning = LAM.util.UpdateWarning
-        control:UpdateWarning()
-    end
-
-    control.data.tooltipText = LAM.util.GetStringFromValue(colorpickerData.tooltip)
-
-    control.UpdateValue = UpdateValue
-    control:UpdateValue()
-    if colorpickerData.disabled ~= nil then
-        control.UpdateDisabled = UpdateDisabled
-        control:UpdateDisabled()
-    end
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-    LAM.util.RegisterForReloadIfNeeded(control)
-
-    return control
-end
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/custom.lua b/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/custom.lua
deleted file mode 100644
index 40a7c42..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/custom.lua
+++ /dev/null
@@ -1,35 +0,0 @@
---[[customData = {
-    type = "custom",
-    reference = "MyAddonCustomControl", --(optional) unique name for your control to use as reference
-    refreshFunc = function(customControl) end, --(optional) function to call when panel/controls refresh
-    width = "full", --or "half" (optional)
-} ]]
-
-local widgetVersion = 7
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("custom", widgetVersion) then return end
-
-local function UpdateValue(control)
-    if control.data.refreshFunc then
-        control.data.refreshFunc(control)
-    end
-end
-
-local MIN_HEIGHT = 26
-function LAMCreateControl.custom(parent, customData, controlName)
-    local control = LAM.util.CreateBaseControl(parent, customData, controlName)
-    local width = control:GetWidth()
-    control:SetResizeToFitDescendents(true)
-
-    if control.isHalfWidth then --note these restrictions
-        control:SetDimensionConstraints(width / 2, MIN_HEIGHT, width / 2, MIN_HEIGHT * 4)
-    else
-        control:SetDimensionConstraints(width, MIN_HEIGHT, width, MIN_HEIGHT * 4)
-    end
-
-    control.UpdateValue = UpdateValue
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-
-    return control
-end
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/description.lua b/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/description.lua
deleted file mode 100644
index da207a0..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/description.lua
+++ /dev/null
@@ -1,60 +0,0 @@
---[[descriptionData = {
-    type = "description",
-    text = "My description text to display.", -- or string id or function returning a string
-    title = "My Title", -- or string id or function returning a string (optional)
-    width = "full", --or "half" (optional)
-    reference = "MyAddonDescription" -- unique global reference to control (optional)
-} ]]
-
-
-local widgetVersion = 8
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("description", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local function UpdateValue(control)
-    if control.title then
-        control.title:SetText(LAM.util.GetStringFromValue(control.data.title))
-    end
-    control.desc:SetText(LAM.util.GetStringFromValue(control.data.text))
-end
-
-function LAMCreateControl.description(parent, descriptionData, controlName)
-    local control = LAM.util.CreateBaseControl(parent, descriptionData, controlName)
-    local isHalfWidth = control.isHalfWidth
-    local width = control:GetWidth()
-    control:SetResizeToFitDescendents(true)
-
-    if isHalfWidth then
-        control:SetDimensionConstraints(width / 2, 0, width / 2, 0)
-    else
-        control:SetDimensionConstraints(width, 0, width, 0)
-    end
-
-    control.desc = wm:CreateControl(nil, control, CT_LABEL)
-    local desc = control.desc
-    desc:SetVerticalAlignment(TEXT_ALIGN_TOP)
-    desc:SetFont("ZoFontGame")
-    desc:SetText(LAM.util.GetStringFromValue(descriptionData.text))
-    desc:SetWidth(isHalfWidth and width / 2 or width)
-
-    if descriptionData.title then
-        control.title = wm:CreateControl(nil, control, CT_LABEL)
-        local title = control.title
-        title:SetWidth(isHalfWidth and width / 2 or width)
-        title:SetAnchor(TOPLEFT, control, TOPLEFT)
-        title:SetFont("ZoFontWinH4")
-        title:SetText(LAM.util.GetStringFromValue(descriptionData.title))
-        desc:SetAnchor(TOPLEFT, title, BOTTOMLEFT)
-    else
-        desc:SetAnchor(TOPLEFT)
-    end
-
-    control.UpdateValue = UpdateValue
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-
-    return control
-
-end
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/divider.lua b/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/divider.lua
deleted file mode 100644
index 8089539..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/divider.lua
+++ /dev/null
@@ -1,45 +0,0 @@
---[[dividerData = {
-    type = "divider",
-    width = "full", --or "half" (optional)
-    height = 10, (optional)
-    alpha = 0.25, (optional)
-    reference = "MyAddonDivider" -- unique global reference to control (optional)
-} ]]
-
-
-local widgetVersion = 2
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("divider", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local MIN_HEIGHT = 10
-local MAX_HEIGHT = 50
-local MIN_ALPHA = 0
-local MAX_ALPHA = 1
-local DEFAULT_ALPHA = 0.25
-
-local function GetValueInRange(value, min, max, default)
-    if not value or type(value) ~= "number" then
-        return default
-    end
-    return math.min(math.max(min, value), max)
-end
-
-function LAMCreateControl.divider(parent, dividerData, controlName)
-    local control = LAM.util.CreateBaseControl(parent, dividerData, controlName)
-    local isHalfWidth = control.isHalfWidth
-    local width = control:GetWidth()
-    local height = GetValueInRange(dividerData.height, MIN_HEIGHT, MAX_HEIGHT, MIN_HEIGHT)
-    local alpha = GetValueInRange(dividerData.alpha, MIN_ALPHA, MAX_ALPHA, DEFAULT_ALPHA)
-
-    control:SetDimensions(isHalfWidth and width / 2 or width, height)
-
-    control.divider = wm:CreateControlFromVirtual(nil, control, "ZO_Options_Divider")
-    local divider = control.divider
-    divider:SetWidth(isHalfWidth and width / 2 or width)
-    divider:SetAnchor(TOPLEFT)
-    divider:SetAlpha(alpha)
-
-    return control
-end
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/dropdown.lua b/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/dropdown.lua
deleted file mode 100644
index f8ea731..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/dropdown.lua
+++ /dev/null
@@ -1,349 +0,0 @@
---[[dropdownData = {
-    type = "dropdown",
-    name = "My Dropdown", -- or string id or function returning a string
-    choices = {"table", "of", "choices"},
-    choicesValues = {"foo", 2, "three"}, -- if specified, these values will get passed to setFunc instead (optional)
-    getFunc = function() return db.var end,
-    setFunc = function(var) db.var = var doStuff() end,
-    tooltip = "Dropdown's tooltip text.", -- or string id or function returning a string (optional)
-    choicesTooltips = {"tooltip 1", "tooltip 2", "tooltip 3"}, -- or array of string ids or array of functions returning a string (optional)
-    sort = "name-up", --or "name-down", "numeric-up", "numeric-down", "value-up", "value-down", "numericvalue-up", "numericvalue-down" (optional) - if not provided, list will not be sorted
-    width = "full", --or "half" (optional)
-    scrollable = true, -- boolean or number, if set the dropdown will feature a scroll bar if there are a large amount of choices and limit the visible lines to the specified number or 10 if true is used (optional)
-    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
-    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
-    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
-    default = defaults.var, -- default value or function that returns the default value (optional)
-    reference = "MyAddonDropdown" -- unique global reference to control (optional)
-} ]]
-
-
-local widgetVersion = 17
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("dropdown", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local SORT_BY_VALUE         = { ["value"] = {} }
-local SORT_BY_VALUE_NUMERIC = { ["value"] = { isNumeric = true } }
-local SORT_TYPES = {
-    name = ZO_SORT_BY_NAME,
-    numeric = ZO_SORT_BY_NAME_NUMERIC,
-    value = SORT_BY_VALUE,
-    numericvalue = SORT_BY_VALUE_NUMERIC,
-}
-local SORT_ORDERS = {
-    up = ZO_SORT_ORDER_UP,
-    down = ZO_SORT_ORDER_DOWN,
-}
-
-local function UpdateDisabled(control)
-    local disable
-    if type(control.data.disabled) == "function" then
-        disable = control.data.disabled()
-    else
-        disable = control.data.disabled
-    end
-
-    control.dropdown:SetEnabled(not disable)
-    if disable then
-        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-    else
-        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-    end
-end
-
-local function UpdateValue(control, forceDefault, value)
-    if forceDefault then --if we are forcing defaults
-        value = LAM.util.GetDefaultValue(control.data.default)
-        control.data.setFunc(value)
-        control.dropdown:SetSelectedItem(control.choices[value])
-    elseif value then
-        control.data.setFunc(value)
-        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-        LAM.util.RequestRefreshIfNeeded(control)
-    else
-        value = control.data.getFunc()
-        control.dropdown:SetSelectedItem(control.choices[value])
-    end
-end
-
-local function DropdownCallback(control, choiceText, choice)
-    choice.control:UpdateValue(false, choice.value or choiceText)
-end
-
-local function SetupTooltips(comboBox, choicesTooltips)
-    local function ShowTooltip(control)
-        InitializeTooltip(InformationTooltip, control, TOPLEFT, 0, 0, BOTTOMRIGHT)
-        SetTooltipText(InformationTooltip, LAM.util.GetStringFromValue(control.tooltip))
-        InformationTooltipTopLevel:BringWindowToTop()
-    end
-    local function HideTooltip(control)
-        ClearTooltip(InformationTooltip)
-    end
-
-    -- allow for tooltips on the drop down entries
-    local originalShow = comboBox.ShowDropdownInternal
-    comboBox.ShowDropdownInternal = function(comboBox)
-        originalShow(comboBox)
-        local entries = ZO_Menu.items
-        for i = 1, #entries do
-            local entry = entries[i]
-            local control = entries[i].item
-            control.tooltip = choicesTooltips[i]
-            entry.onMouseEnter = control:GetHandler("OnMouseEnter")
-            entry.onMouseExit = control:GetHandler("OnMouseExit")
-            ZO_PreHookHandler(control, "OnMouseEnter", ShowTooltip)
-            ZO_PreHookHandler(control, "OnMouseExit", HideTooltip)
-        end
-    end
-
-    local originalHide = comboBox.HideDropdownInternal
-    comboBox.HideDropdownInternal = function(self)
-        local entries = ZO_Menu.items
-        for i = 1, #entries do
-            local entry = entries[i]
-            local control = entries[i].item
-            control:SetHandler("OnMouseEnter", entry.onMouseEnter)
-            control:SetHandler("OnMouseExit", entry.onMouseExit)
-            control.tooltip = nil
-        end
-        originalHide(self)
-    end
-end
-
-local function UpdateChoices(control, choices, choicesValues, choicesTooltips)
-    control.dropdown:ClearItems() --remove previous choices --(need to call :SetSelectedItem()?)
-    ZO_ClearTable(control.choices)
-
-    --build new list of choices
-    local choices = choices or control.data.choices
-    local choicesValues = choicesValues or control.data.choicesValues
-    local choicesTooltips = choicesTooltips or control.data.choicesTooltips
-
-    if choicesValues then
-        assert(#choices == #choicesValues, "choices and choicesValues need to have the same size")
-    end
-
-    if choicesTooltips then
-        assert(#choices == #choicesTooltips, "choices and choicesTooltips need to have the same size")
-        SetupTooltips(control.dropdown, choicesTooltips)
-    end
-
-    for i = 1, #choices do
-        local entry = control.dropdown:CreateItemEntry(choices[i], DropdownCallback)
-        entry.control = control
-        if choicesValues then
-            entry.value = choicesValues[i]
-        end
-        control.choices[entry.value or entry.name] = entry.name
-        control.dropdown:AddItem(entry, not control.data.sort and ZO_COMBOBOX_SUPRESS_UPDATE) --if sort type/order isn't specified, then don't sort
-    end
-end
-
-local function GrabSortingInfo(sortInfo)
-    local t, i = {}, 1
-    for info in string.gmatch(sortInfo, "([^%-]+)") do
-        t[i] = info
-        i = i + 1
-    end
-
-    return t
-end
-
-local DEFAULT_VISIBLE_ROWS = 10
-local SCROLLABLE_ENTRY_TEMPLATE_HEIGHT = 25 -- same as in zo_combobox.lua
-local CONTENT_PADDING = 24
-local SCROLLBAR_PADDING = 16
-local PADDING = GetMenuPadding() / 2 -- half the amount looks closer to the regular dropdown
-local ScrollableDropdownHelper = ZO_Object:Subclass()
-
-function ScrollableDropdownHelper:New(...)
-    local object = ZO_Object.New(self)
-    object:Initialize(...)
-    return object
-end
-
-function ScrollableDropdownHelper:Initialize(parent, control, visibleRows)
-    local combobox = control.combobox
-    local dropdown = control.dropdown
-    self.parent = parent
-    self.control = control
-    self.combobox = combobox
-    self.dropdown = dropdown
-    self.visibleRows = visibleRows
-
-    -- clear anchors so we can adjust the width dynamically
-    dropdown.m_dropdown:ClearAnchors()
-    dropdown.m_dropdown:SetAnchor(TOPLEFT, combobox, BOTTOMLEFT)
-
-    -- handle dropdown or settingsmenu opening/closing
-    local function onShow() self:OnShow() end
-    local function onHide() self:OnHide() end
-    local function doHide() self:DoHide() end
-
-    ZO_PreHook(dropdown, "ShowDropdownOnMouseUp", onShow)
-    ZO_PreHook(dropdown, "HideDropdownInternal", onHide)
-    combobox:SetHandler("OnEffectivelyHidden", onHide)
-    parent:SetHandler("OnEffectivelyHidden", doHide)
-
-    -- dont fade entries near the edges
-    local scrollList = dropdown.m_scroll
-    scrollList.selectionTemplate = nil
-    scrollList.highlightTemplate = nil
-    ZO_ScrollList_EnableSelection(scrollList, "ZO_SelectionHighlight")
-    ZO_ScrollList_EnableHighlight(scrollList, "ZO_SelectionHighlight")
-    ZO_Scroll_SetUseFadeGradient(scrollList, false)
-
-    -- adjust scroll content anchor to mimic menu padding
-    local scroll = dropdown.m_dropdown:GetNamedChild("Scroll")
-    local anchor1 = {scroll:GetAnchor(0)}
-    local anchor2 = {scroll:GetAnchor(1)}
-    scroll:ClearAnchors()
-    scroll:SetAnchor(anchor1[2], anchor1[3], anchor1[4], anchor1[5] + PADDING, anchor1[6] + PADDING)
-    scroll:SetAnchor(anchor2[2], anchor2[3], anchor2[4], anchor2[5] - PADDING, anchor2[6] - PADDING)
-    ZO_ScrollList_Commit(scrollList)
-
-    -- adjust row setup to mimic the highlight padding
-    local dataType1 = ZO_ScrollList_GetDataTypeTable(dropdown.m_scroll, 1)
-    local dataType2 = ZO_ScrollList_GetDataTypeTable(dropdown.m_scroll, 2)
-    local oSetup = dataType1.setupCallback -- both types have the same setup function
-    local function SetupEntry(control, data, list)
-        oSetup(control, data, list)
-        control.m_label:SetAnchor(LEFT, nil, nil, 2)
-    end
-    dataType1.setupCallback = SetupEntry
-    dataType2.setupCallback = SetupEntry
-
-    -- adjust dimensions based on entries
-    local scrollContent = scroll:GetNamedChild("Contents")
-    ZO_PreHook(dropdown, "AddMenuItems", function()
-        local width = PADDING * 2 + zo_max(self:GetMaxWidth(), combobox:GetWidth())
-        local numItems = #dropdown.m_sortedItems
-        local anchorOffset = 0
-        if(numItems > self.visibleRows) then
-            width = width + CONTENT_PADDING + SCROLLBAR_PADDING
-            anchorOffset = -SCROLLBAR_PADDING
-            numItems = self.visibleRows
-        end
-        scrollContent:SetAnchor(BOTTOMRIGHT, nil, nil, anchorOffset)
-        local height = PADDING * 2 + numItems * (SCROLLABLE_ENTRY_TEMPLATE_HEIGHT + dropdown.m_spacing) - dropdown.m_spacing
-        dropdown.m_dropdown:SetWidth(width)
-        dropdown.m_dropdown:SetHeight(height)
-    end)
-end
-
-function ScrollableDropdownHelper:OnShow()
-    local dropdown = self.dropdown
-    if dropdown.m_lastParent ~= ZO_Menus then
-        dropdown.m_lastParent = dropdown.m_dropdown:GetParent()
-        dropdown.m_dropdown:SetParent(ZO_Menus)
-        ZO_Menus:BringWindowToTop()
-    end
-end
-
-function ScrollableDropdownHelper:OnHide()
-    local dropdown = self.dropdown
-    if dropdown.m_lastParent then
-        dropdown.m_dropdown:SetParent(dropdown.m_lastParent)
-        dropdown.m_lastParent = nil
-    end
-end
-
-function ScrollableDropdownHelper:DoHide()
-    local dropdown = self.dropdown
-    if dropdown:IsDropdownVisible() then
-        dropdown:HideDropdown()
-    end
-end
-
-function ScrollableDropdownHelper:GetMaxWidth()
-    local dropdown = self.dropdown
-    local dataType = ZO_ScrollList_GetDataTypeTable(dropdown.m_scroll, 1)
-
-    local dummy = dataType.pool:AcquireObject()
-    dataType.setupCallback(dummy, {
-        m_owner = dropdown,
-        name = "Dummy"
-    }, dropdown)
-
-    local maxWidth = 0
-    local label = dummy.m_label
-    local entries = dropdown.m_sortedItems
-    local numItems = #entries
-    for index = 1, numItems do
-        label:SetText(entries[index].name)
-        local width = label:GetTextWidth()
-        if (width > maxWidth) then
-            maxWidth = width
-        end
-    end
-
-    dataType.pool:ReleaseObject(dummy.key)
-    return maxWidth
-end
-
-function LAMCreateControl.dropdown(parent, dropdownData, controlName)
-    local control = LAM.util.CreateLabelAndContainerControl(parent, dropdownData, controlName)
-    control.choices = {}
-
-    local countControl = parent
-    local name = parent:GetName()
-    if not name or #name == 0 then
-        countControl = LAMCreateControl
-        name = "LAM"
-    end
-    local comboboxCount = (countControl.comboboxCount or 0) + 1
-    countControl.comboboxCount = comboboxCount
-    control.combobox = wm:CreateControlFromVirtual(zo_strjoin(nil, name, "Combobox", comboboxCount), control.container, dropdownData.scrollable and "ZO_ScrollableComboBox" or "ZO_ComboBox")
-
-    local combobox = control.combobox
-    combobox:SetAnchor(TOPLEFT)
-    combobox:SetDimensions(control.container:GetDimensions())
-    combobox:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
-    combobox:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
-    control.dropdown = ZO_ComboBox_ObjectFromContainer(combobox)
-    local dropdown = control.dropdown
-    dropdown:SetSortsItems(false) -- need to sort ourselves in order to be able to sort by value
-
-    if dropdownData.scrollable then
-        local visibleRows = type(dropdownData.scrollable) == "number" and dropdownData.scrollable or DEFAULT_VISIBLE_ROWS
-        control.scrollHelper = ScrollableDropdownHelper:New(parent, control, visibleRows)
-    end
-
-    ZO_PreHook(dropdown, "UpdateItems", function(self)
-        assert(not self.m_sortsItems, "built-in dropdown sorting was reactivated, sorting is handled by LAM")
-        if control.m_sortOrder ~= nil and control.m_sortType then
-            local sortKey = next(control.m_sortType)
-            local sortFunc = function(item1, item2) return ZO_TableOrderingFunction(item1, item2, sortKey, control.m_sortType, control.m_sortOrder) end
-            table.sort(self.m_sortedItems, sortFunc)
-        end
-    end)
-
-    if dropdownData.sort then
-        local sortInfo = GrabSortingInfo(dropdownData.sort)
-        control.m_sortType, control.m_sortOrder = SORT_TYPES[sortInfo[1]], SORT_ORDERS[sortInfo[2]]
-    elseif dropdownData.choicesValues then
-        control.m_sortType, control.m_sortOrder = ZO_SORT_ORDER_UP, SORT_BY_VALUE
-    end
-
-    if dropdownData.warning ~= nil or dropdownData.requiresReload then
-        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-        control.warning:SetAnchor(RIGHT, combobox, LEFT, -5, 0)
-        control.UpdateWarning = LAM.util.UpdateWarning
-        control:UpdateWarning()
-    end
-
-    control.UpdateChoices = UpdateChoices
-    control:UpdateChoices(dropdownData.choices, dropdownData.choicesValues)
-    control.UpdateValue = UpdateValue
-    control:UpdateValue()
-    if dropdownData.disabled ~= nil then
-        control.UpdateDisabled = UpdateDisabled
-        control:UpdateDisabled()
-    end
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-    LAM.util.RegisterForReloadIfNeeded(control)
-
-    return control
-end
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/editbox.lua b/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/editbox.lua
deleted file mode 100644
index d6baf11..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/editbox.lua
+++ /dev/null
@@ -1,156 +0,0 @@
---[[editboxData = {
-    type = "editbox",
-    name = "My Editbox", -- or string id or function returning a string
-    getFunc = function() return db.text end,
-    setFunc = function(text) db.text = text doStuff() end,
-    tooltip = "Editbox's tooltip text.", -- or string id or function returning a string (optional)
-    isMultiline = true, --boolean (optional)
-    isExtraWide = true, --boolean (optional)
-    width = "full", --or "half" (optional)
-    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
-    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
-    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
-    default = defaults.text, -- default value or function that returns the default value (optional)
-    reference = "MyAddonEditbox" -- unique global reference to control (optional)
-} ]]
-
-
-local widgetVersion = 14
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("editbox", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local function UpdateDisabled(control)
-    local disable
-    if type(control.data.disabled) == "function" then
-        disable = control.data.disabled()
-    else
-        disable = control.data.disabled
-    end
-
-    if disable then
-        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-        control.editbox:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
-    else
-        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-        control.editbox:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-    end
-    --control.editbox:SetEditEnabled(not disable)
-    control.editbox:SetMouseEnabled(not disable)
-end
-
-local function UpdateValue(control, forceDefault, value)
-    if forceDefault then --if we are forcing defaults
-        value = LAM.util.GetDefaultValue(control.data.default)
-        control.data.setFunc(value)
-        control.editbox:SetText(value)
-    elseif value then
-        control.data.setFunc(value)
-        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-        LAM.util.RequestRefreshIfNeeded(control)
-    else
-        value = control.data.getFunc()
-        control.editbox:SetText(value)
-    end
-end
-
-local MIN_HEIGHT = 24
-local HALF_WIDTH_LINE_SPACING = 2
-function LAMCreateControl.editbox(parent, editboxData, controlName)
-    local control = LAM.util.CreateLabelAndContainerControl(parent, editboxData, controlName)
-
-    local container = control.container
-    control.bg = wm:CreateControlFromVirtual(nil, container, "ZO_EditBackdrop")
-    local bg = control.bg
-    bg:SetAnchorFill()
-
-    if editboxData.isMultiline then
-        control.editbox = wm:CreateControlFromVirtual(nil, bg, "ZO_DefaultEditMultiLineForBackdrop")
-        control.editbox:SetHandler("OnMouseWheel", function(self, delta)
-            if self:HasFocus() then --only set focus to new spots if the editbox is currently in use
-                local cursorPos = self:GetCursorPosition()
-                local text = self:GetText()
-                local textLen = text:len()
-                local newPos
-                if delta > 0 then --scrolling up
-                    local reverseText = text:reverse()
-                    local revCursorPos = textLen - cursorPos
-                    local revPos = reverseText:find("\n", revCursorPos+1)
-                    newPos = revPos and textLen - revPos
-                else --scrolling down
-                    newPos = text:find("\n", cursorPos+1)
-                end
-                if newPos then --if we found a new line, then scroll, otherwise don't
-                    self:SetCursorPosition(newPos)
-                end
-            end
-        end)
-    else
-        control.editbox = wm:CreateControlFromVirtual(nil, bg, "ZO_DefaultEditForBackdrop")
-    end
-    local editbox = control.editbox
-    editbox:SetText(editboxData.getFunc())
-    editbox:SetMaxInputChars(3000)
-    editbox:SetHandler("OnFocusLost", function(self) control:UpdateValue(false, self:GetText()) end)
-    editbox:SetHandler("OnEscape", function(self) self:LoseFocus() control:UpdateValue(false, self:GetText()) end)
-    editbox:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
-    editbox:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
-
-    local MIN_WIDTH = (parent.GetWidth and (parent:GetWidth() / 10)) or (parent.panel.GetWidth and (parent.panel:GetWidth() / 10)) or 0
-
-    control.label:ClearAnchors()
-    container:ClearAnchors()
-
-    control.label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 0)
-    container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, 0, 0)
-
-    if control.isHalfWidth then
-        container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, 0, 0)
-    end
-
-    if editboxData.isExtraWide then
-        container:SetAnchor(BOTTOMLEFT, control, BOTTOMLEFT, 0, 0)
-    else
-        container:SetWidth(MIN_WIDTH * 3.2)
-    end
-
-    if editboxData.isMultiline then
-        container:SetHeight(MIN_HEIGHT * 3)
-    else
-        container:SetHeight(MIN_HEIGHT)
-    end
-
-    if control.isHalfWidth ~= true and editboxData.isExtraWide ~= true then
-        control:SetHeight(container:GetHeight())
-    else
-        control:SetHeight(container:GetHeight() + control.label:GetHeight())
-    end
-
-    editbox:ClearAnchors()
-    editbox:SetAnchor(TOPLEFT, container, TOPLEFT, 2, 2)
-    editbox:SetAnchor(BOTTOMRIGHT, container, BOTTOMRIGHT, -2, -2)
-
-    if editboxData.warning ~= nil or editboxData.requiresReload then
-        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-        if editboxData.isExtraWide then
-            control.warning:SetAnchor(BOTTOMRIGHT, control.bg, TOPRIGHT, 2, 0)
-        else
-            control.warning:SetAnchor(TOPRIGHT, control.bg, TOPLEFT, -5, 0)
-        end
-        control.UpdateWarning = LAM.util.UpdateWarning
-        control:UpdateWarning()
-    end
-
-    control.UpdateValue = UpdateValue
-    control:UpdateValue()
-    if editboxData.disabled ~= nil then
-        control.UpdateDisabled = UpdateDisabled
-        control:UpdateDisabled()
-    end
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-    LAM.util.RegisterForReloadIfNeeded(control)
-
-    return control
-end
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/header.lua b/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/header.lua
deleted file mode 100644
index eadff38..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/header.lua
+++ /dev/null
@@ -1,42 +0,0 @@
---[[headerData = {
-    type = "header",
-    name = "My Header", -- or string id or function returning a string
-    width = "full", --or "half" (optional)
-    reference = "MyAddonHeader" -- unique global reference to control (optional)
-} ]]
-
-
-local widgetVersion = 8
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("header", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local function UpdateValue(control)
-    control.header:SetText(LAM.util.GetStringFromValue(control.data.name))
-end
-
-local MIN_HEIGHT = 30
-function LAMCreateControl.header(parent, headerData, controlName)
-    local control = LAM.util.CreateBaseControl(parent, headerData, controlName)
-    local isHalfWidth = control.isHalfWidth
-    local width = control:GetWidth()
-    control:SetDimensions(isHalfWidth and width / 2 or width, MIN_HEIGHT)
-
-    control.divider = wm:CreateControlFromVirtual(nil, control, "ZO_Options_Divider")
-    local divider = control.divider
-    divider:SetWidth(isHalfWidth and width / 2 or width)
-    divider:SetAnchor(TOPLEFT)
-
-    control.header = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
-    local header = control.header
-    header:SetAnchor(TOPLEFT, divider, BOTTOMLEFT)
-    header:SetAnchor(BOTTOMRIGHT)
-    header:SetText(LAM.util.GetStringFromValue(headerData.name))
-
-    control.UpdateValue = UpdateValue
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-
-    return control
-end
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/iconpicker.lua b/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/iconpicker.lua
deleted file mode 100644
index 65c7782..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/iconpicker.lua
+++ /dev/null
@@ -1,436 +0,0 @@
---[[iconpickerData = {
-    type = "iconpicker",
-    name = "My Icon Picker", -- or string id or function returning a string
-    choices = {"texture path 1", "texture path 2", "texture path 3"},
-    getFunc = function() return db.var end,
-    setFunc = function(var) db.var = var doStuff() end,
-    tooltip = "Color Picker's tooltip text.", -- or string id or function returning a string (optional)
-    choicesTooltips = {"icon tooltip 1", "icon tooltip 2", "icon tooltip 3"}, -- or array of string ids or array of functions returning a string (optional)
-    maxColumns = 5, -- number of icons in one row (optional)
-    visibleRows = 4.5, -- number of visible rows (optional)
-    iconSize = 28, -- size of the icons (optional)
-    defaultColor = ZO_ColorDef:New("FFFFFF"), -- default color of the icons (optional)
-    width = "full", --or "half" (optional)
-    beforeShow = function(control, iconPicker) return preventShow end, --(optional)
-    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
-    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
-    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
-    default = defaults.var, -- default value or function that returns the default value (optional)
-    reference = "MyAddonIconPicker" -- unique global reference to control (optional)
-} ]]
-
-local widgetVersion = 8
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("iconpicker", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local IconPickerMenu = ZO_Object:Subclass()
-local iconPicker
-LAM.util.GetIconPickerMenu = function()
-    if not iconPicker then
-        iconPicker = IconPickerMenu:New("LAMIconPicker")
-        local sceneFragment = LAM:GetAddonSettingsFragment()
-        ZO_PreHook(sceneFragment, "OnHidden", function()
-            if not iconPicker.control:IsHidden() then
-                iconPicker:Clear()
-            end
-        end)
-    end
-    return iconPicker
-end
-
-function IconPickerMenu:New(...)
-    local object = ZO_Object.New(self)
-    object:Initialize(...)
-    return object
-end
-
-function IconPickerMenu:Initialize(name)
-    local control = wm:CreateTopLevelWindow(name)
-    control:SetDrawTier(DT_HIGH)
-    control:SetHidden(true)
-    self.control = control
-
-    local scrollContainer = wm:CreateControlFromVirtual(name .. "ScrollContainer", control, "ZO_ScrollContainer")
-    -- control:SetDimensions(control.container:GetWidth(), height) -- adjust to icon size / col count
-    scrollContainer:SetAnchorFill()
-    ZO_Scroll_SetUseFadeGradient(scrollContainer, false)
-    ZO_Scroll_SetHideScrollbarOnDisable(scrollContainer, false)
-    ZO_VerticalScrollbarBase_OnMouseExit(scrollContainer:GetNamedChild("ScrollBar")) -- scrollbar initialization seems to be broken so we force it to update the correct alpha value
-    local scroll = GetControl(scrollContainer, "ScrollChild")
-    self.scroll = scroll
-    self.scrollContainer = scrollContainer
-
-    local bg = wm:CreateControl(nil, scrollContainer, CT_BACKDROP)
-    bg:SetAnchor(TOPLEFT, scrollContainer, TOPLEFT, 0, -3)
-    bg:SetAnchor(BOTTOMRIGHT, scrollContainer, BOTTOMRIGHT, 2, 5)
-    bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-Border.dds", 128, 16)
-    bg:SetCenterTexture("EsoUI\\Art\\Tooltips\\UI-TooltipCenter.dds")
-    bg:SetInsets(16, 16, -16, -16)
-
-    local mungeOverlay = wm:CreateControl(nil, bg, CT_TEXTURE)
-    mungeOverlay:SetTexture("EsoUI/Art/Tooltips/munge_overlay.dds")
-    mungeOverlay:SetDrawLevel(1)
-    mungeOverlay:SetAddressMode(TEX_MODE_WRAP)
-    mungeOverlay:SetAnchorFill()
-
-    local mouseOver = wm:CreateControl(nil, scrollContainer, CT_TEXTURE)
-    mouseOver:SetDrawLevel(2)
-    mouseOver:SetTexture("EsoUI/Art/Buttons/minmax_mouseover.dds")
-    mouseOver:SetHidden(true)
-
-    local function IconFactory(pool)
-        local icon = wm:CreateControl(name .. "Entry" .. pool:GetNextControlId(), scroll, CT_TEXTURE)
-        icon:SetMouseEnabled(true)
-        icon:SetDrawLevel(3)
-        icon:SetHandler("OnMouseEnter", function()
-            mouseOver:SetAnchor(TOPLEFT, icon, TOPLEFT, 0, 0)
-            mouseOver:SetAnchor(BOTTOMRIGHT, icon, BOTTOMRIGHT, 0, 0)
-            mouseOver:SetHidden(false)
-            if self.customOnMouseEnter then
-                self.customOnMouseEnter(icon)
-            else
-                self:OnMouseEnter(icon)
-            end
-        end)
-        icon:SetHandler("OnMouseExit", function()
-            mouseOver:ClearAnchors()
-            mouseOver:SetHidden(true)
-            if self.customOnMouseExit then
-                self.customOnMouseExit(icon)
-            else
-                self:OnMouseExit(icon)
-            end
-        end)
-        icon:SetHandler("OnMouseUp", function(control, ...)
-            PlaySound("Click")
-            icon.OnSelect(icon, icon.texture)
-            self:Clear()
-        end)
-        return icon
-    end
-
-    local function ResetFunction(icon)
-        icon:ClearAnchors()
-    end
-
-    self.iconPool = ZO_ObjectPool:New(IconFactory, ResetFunction)
-    self:SetMaxColumns(1)
-    self.icons = {}
-    self.color = ZO_DEFAULT_ENABLED_COLOR
-
-    EVENT_MANAGER:RegisterForEvent(name .. "_OnGlobalMouseUp", EVENT_GLOBAL_MOUSE_UP, function()
-        if self.refCount ~= nil then
-            local moc = wm:GetMouseOverControl()
-            if(moc:GetOwningWindow() ~= control) then
-                self.refCount = self.refCount - 1
-                if self.refCount <= 0 then
-                    self:Clear()
-                end
-            end
-        end
-    end)
-end
-
-function IconPickerMenu:OnMouseEnter(icon)
-    InitializeTooltip(InformationTooltip, icon, TOPLEFT, 0, 0, BOTTOMRIGHT)
-    SetTooltipText(InformationTooltip, LAM.util.GetStringFromValue(icon.tooltip))
-    InformationTooltipTopLevel:BringWindowToTop()
-end
-
-function IconPickerMenu:OnMouseExit(icon)
-    ClearTooltip(InformationTooltip)
-end
-
-function IconPickerMenu:SetMaxColumns(value)
-    self.maxCols = value ~= nil and value or 5
-end
-
-local DEFAULT_SIZE = 28
-function IconPickerMenu:SetIconSize(value)
-    local iconSize = DEFAULT_SIZE
-    if value ~= nil then iconSize = math.max(iconSize, value) end
-    self.iconSize = iconSize
-end
-
-function IconPickerMenu:SetVisibleRows(value)
-    self.visibleRows = value ~= nil and value or 4.5
-end
-
-function IconPickerMenu:SetMouseHandlers(onEnter, onExit)
-    self.customOnMouseEnter = onEnter
-    self.customOnMouseExit = onExit
-end
-
-function IconPickerMenu:UpdateDimensions()
-    local iconSize = self.iconSize
-    local width = iconSize * self.maxCols + 20
-    local height = iconSize * self.visibleRows
-    self.control:SetDimensions(width, height)
-
-    local icons = self.icons
-    for i = 1, #icons do
-        local icon = icons[i]
-        icon:SetDimensions(iconSize, iconSize)
-    end
-end
-
-function IconPickerMenu:UpdateAnchors()
-    local iconSize = self.iconSize
-    local col, maxCols = 1, self.maxCols
-    local previousCol, previousRow
-    local scroll = self.scroll
-    local icons = self.icons
-
-    for i = 1, #icons do
-        local icon = icons[i]
-        icon:ClearAnchors()
-        if i == 1 then
-            icon:SetAnchor(TOPLEFT, scroll, TOPLEFT, 0, 0)
-            previousRow = icon
-        elseif col == 1 then
-            icon:SetAnchor(TOPLEFT, previousRow, BOTTOMLEFT, 0, 0)
-            previousRow = icon
-        else
-            icon:SetAnchor(TOPLEFT, previousCol, TOPRIGHT, 0, 0)
-        end
-        previousCol = icon
-        col = col >= maxCols and 1 or col + 1
-    end
-end
-
-function IconPickerMenu:Clear()
-    self.icons = {}
-    self.iconPool:ReleaseAllObjects()
-    self.control:SetHidden(true)
-    self.color = ZO_DEFAULT_ENABLED_COLOR
-    self.refCount = nil
-    self.parent = nil
-    self.customOnMouseEnter = nil
-    self.customOnMouseExit = nil
-end
-
-function IconPickerMenu:AddIcon(texturePath, callback, tooltip)
-    local icon, key = self.iconPool:AcquireObject()
-    icon:SetTexture(texturePath)
-    icon:SetColor(self.color:UnpackRGBA())
-    icon.texture = texturePath
-    icon.tooltip = tooltip
-    icon.OnSelect = callback
-    self.icons[#self.icons + 1] = icon
-end
-
-function IconPickerMenu:Show(parent)
-    if #self.icons == 0 then return false end
-    if not self.control:IsHidden() then self:Clear() return false end
-    self:UpdateDimensions()
-    self:UpdateAnchors()
-
-    local control = self.control
-    control:ClearAnchors()
-    control:SetAnchor(TOPLEFT, parent, BOTTOMLEFT, 0, 8)
-    control:SetHidden(false)
-    control:BringWindowToTop()
-    self.parent = parent
-    self.refCount = 2
-
-    return true
-end
-
-function IconPickerMenu:SetColor(color)
-    local icons = self.icons
-    self.color = color
-    for i = 1, #icons do
-        local icon = icons[i]
-        icon:SetColor(color:UnpackRGBA())
-    end
-end
-
--------------------------------------------------------------
-
-local function UpdateChoices(control, choices, choicesTooltips)
-    local data = control.data
-    if not choices then
-        choices, choicesTooltips = data.choices, data.choicesTooltips or {}
-    end
-    local addedChoices = {}
-
-    local iconPicker = LAM.util.GetIconPickerMenu()
-    iconPicker:Clear()
-    for i = 1, #choices do
-        local texture = choices[i]
-        if not addedChoices[texture] then -- remove duplicates
-            iconPicker:AddIcon(choices[i], function(self, texture)
-                control.icon:SetTexture(texture)
-                data.setFunc(texture)
-                LAM.util.RequestRefreshIfNeeded(control)
-            end, LAM.util.GetStringFromValue(choicesTooltips[i]))
-        addedChoices[texture] = true
-        end
-    end
-end
-
-local function IsDisabled(control)
-    if type(control.data.disabled) == "function" then
-        return control.data.disabled()
-    else
-        return control.data.disabled
-    end
-end
-
-local function SetColor(control, color)
-    local icon = control.icon
-    if IsDisabled(control) then
-        icon:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-    else
-        icon.color = color or control.data.defaultColor or ZO_DEFAULT_ENABLED_COLOR
-        icon:SetColor(icon.color:UnpackRGBA())
-    end
-
-    local iconPicker = LAM.util.GetIconPickerMenu()
-    if iconPicker.parent == control.container and not iconPicker.control:IsHidden() then
-        iconPicker:SetColor(icon.color)
-    end
-end
-
-local function UpdateDisabled(control)
-    local disable = IsDisabled(control)
-
-    control.dropdown:SetMouseEnabled(not disable)
-    control.dropdownButton:SetEnabled(not disable)
-
-    local iconPicker = LAM.util.GetIconPickerMenu()
-    if iconPicker.parent == control.container and not iconPicker.control:IsHidden() then
-        iconPicker:Clear()
-    end
-
-    SetColor(control, control.icon.color)
-    if disable then
-        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-    else
-        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-    end
-end
-
-local function UpdateValue(control, forceDefault, value)
-    if forceDefault then --if we are forcing defaults
-        value = LAM.util.GetDefaultValue(control.data.default)
-        control.data.setFunc(value)
-        control.icon:SetTexture(value)
-    elseif value then
-        control.data.setFunc(value)
-        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-        LAM.util.RequestRefreshIfNeeded(control)
-    else
-        value = control.data.getFunc()
-        control.icon:SetTexture(value)
-    end
-end
-
-local MIN_HEIGHT = 26
-local HALF_WIDTH_LINE_SPACING = 2
-local function SetIconSize(control, size)
-    local icon = control.icon
-    icon.size = size
-    icon:SetDimensions(size, size)
-
-    local height = size + 4
-    control.dropdown:SetDimensions(size + 20, height)
-    height = math.max(height, MIN_HEIGHT)
-    control.container:SetHeight(height)
-    if control.lineControl then
-        control.lineControl:SetHeight(MIN_HEIGHT + size + HALF_WIDTH_LINE_SPACING)
-    else
-        control:SetHeight(height)
-    end
-
-    local iconPicker = LAM.util.GetIconPickerMenu()
-    if iconPicker.parent == control.container and not iconPicker.control:IsHidden() then
-        iconPicker:SetIconSize(size)
-        iconPicker:UpdateDimensions()
-        iconPicker:UpdateAnchors()
-    end
-end
-
-function LAMCreateControl.iconpicker(parent, iconpickerData, controlName)
-    local control = LAM.util.CreateLabelAndContainerControl(parent, iconpickerData, controlName)
-
-    local function ShowIconPicker()
-        local iconPicker = LAM.util.GetIconPickerMenu()
-        if iconPicker.parent == control.container then
-            iconPicker:Clear()
-        else
-            iconPicker:SetMaxColumns(iconpickerData.maxColumns)
-            iconPicker:SetVisibleRows(iconpickerData.visibleRows)
-            iconPicker:SetIconSize(control.icon.size)
-            UpdateChoices(control)
-            iconPicker:SetColor(control.icon.color)
-            if iconpickerData.beforeShow then
-                if iconpickerData.beforeShow(control, iconPicker) then
-                    iconPicker:Clear()
-                    return
-                end
-            end
-            iconPicker:Show(control.container)
-        end
-    end
-
-    local iconSize = iconpickerData.iconSize ~= nil and iconpickerData.iconSize or DEFAULT_SIZE
-    control.dropdown = wm:CreateControl(nil, control.container, CT_CONTROL)
-    local dropdown = control.dropdown
-    dropdown:SetAnchor(LEFT, control.container, LEFT, 0, 0)
-    dropdown:SetMouseEnabled(true)
-    dropdown:SetHandler("OnMouseUp", ShowIconPicker)
-    dropdown:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
-    dropdown:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
-
-    control.icon = wm:CreateControl(nil, dropdown, CT_TEXTURE)
-    local icon = control.icon
-    icon:SetAnchor(LEFT, dropdown, LEFT, 3, 0)
-    icon:SetDrawLevel(2)
-
-    local dropdownButton = wm:CreateControlFromVirtual(nil, dropdown, "ZO_DropdownButton")
-    dropdownButton:SetDimensions(16, 16)
-    dropdownButton:SetHandler("OnClicked", ShowIconPicker)
-    dropdownButton:SetAnchor(RIGHT, dropdown, RIGHT, -3, 0)
-    control.dropdownButton = dropdownButton
-
-    control.bg = wm:CreateControl(nil, dropdown, CT_BACKDROP)
-    local bg = control.bg
-    bg:SetAnchor(TOPLEFT, dropdown, TOPLEFT, 0, -3)
-    bg:SetAnchor(BOTTOMRIGHT, dropdown, BOTTOMRIGHT, 2, 5)
-    bg:SetEdgeTexture("EsoUI/Art/Tooltips/UI-Border.dds", 128, 16)
-    bg:SetCenterTexture("EsoUI/Art/Tooltips/UI-TooltipCenter.dds")
-    bg:SetInsets(16, 16, -16, -16)
-    local mungeOverlay = wm:CreateControl(nil, bg, CT_TEXTURE)
-    mungeOverlay:SetTexture("EsoUI/Art/Tooltips/munge_overlay.dds")
-    mungeOverlay:SetDrawLevel(1)
-    mungeOverlay:SetAddressMode(TEX_MODE_WRAP)
-    mungeOverlay:SetAnchorFill()
-
-    if iconpickerData.warning ~= nil or iconpickerData.requiresReload then
-        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-        control.warning:SetAnchor(RIGHT, control.container, LEFT, -5, 0)
-        control.UpdateWarning = LAM.util.UpdateWarning
-        control:UpdateWarning()
-    end
-
-    control.UpdateChoices = UpdateChoices
-    control.UpdateValue = UpdateValue
-    control:UpdateValue()
-    control.SetColor = SetColor
-    control:SetColor()
-    control.SetIconSize = SetIconSize
-    control:SetIconSize(iconSize)
-
-    if iconpickerData.disabled ~= nil then
-        control.UpdateDisabled = UpdateDisabled
-        control:UpdateDisabled()
-    end
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-    LAM.util.RegisterForReloadIfNeeded(control)
-
-    return control
-end
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/panel.lua b/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/panel.lua
deleted file mode 100644
index 1404686..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/panel.lua
+++ /dev/null
@@ -1,126 +0,0 @@
---[[panelData = {
-    type = "panel",
-    name = "Window Title", -- or string id or function returning a string
-    displayName = "My Longer Window Title",  -- or string id or function returning a string (optional) (can be useful for long addon names or if you want to colorize it)
-    author = "Seerah",  -- or string id or function returning a string (optional)
-    version = "2.0",  -- or string id or function returning a string (optional)
-    website = "http://www.esoui.com/downloads/info7-LibAddonMenu.html", -- URL of website where the addon can be updated (optional)
-    keywords = "settings", -- additional keywords for search filter (it looks for matches in name..keywords..author) (optional)
-    slashCommand = "/myaddon", -- will register a keybind to open to this panel (don't forget to include the slash!) (optional)
-    registerForRefresh = true, --boolean (optional) (will refresh all options controls when a setting is changed and when the panel is shown)
-    registerForDefaults = true, --boolean (optional) (will set all options controls back to default values)
-    resetFunc = function() print("defaults reset") end, --(optional) custom function to run after settings are reset to defaults
-} ]]
-
-
-local widgetVersion = 13
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("panel", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local cm = CALLBACK_MANAGER
-
-local function RefreshPanel(control)
-    local panel = LAM.util.GetTopPanel(control) --callback can be fired by a single control, by the panel showing or by a nested submenu
-    local panelControls = panel.controlsToRefresh
-
-    for i = 1, #panelControls do
-        local updateControl = panelControls[i]
-        if updateControl ~= control and updateControl.UpdateValue then
-            updateControl:UpdateValue()
-        end
-        if updateControl.UpdateDisabled then
-            updateControl:UpdateDisabled()
-        end
-        if updateControl.UpdateWarning then
-            updateControl:UpdateWarning()
-        end
-    end
-end
-
-local function ForceDefaults(panel)
-    local panelControls = panel.controlsToRefresh
-
-    for i = 1, #panelControls do
-        local updateControl = panelControls[i]
-        if updateControl.UpdateValue and updateControl.data.default ~= nil then
-            updateControl:UpdateValue(true)
-        end
-    end
-
-    if panel.data.resetFunc then
-        panel.data.resetFunc()
-    end
-
-    cm:FireCallbacks("LAM-RefreshPanel", panel)
-end
-
-local callbackRegistered = false
-LAMCreateControl.scrollCount = LAMCreateControl.scrollCount or 1
-local SEPARATOR = " - "
-local LINK_COLOR = ZO_ColorDef:New("5959D5")
-local LINK_MOUSE_OVER_COLOR = ZO_ColorDef:New("B8B8D3")
-
-function LAMCreateControl.panel(parent, panelData, controlName)
-    local control = wm:CreateControl(controlName, parent, CT_CONTROL)
-
-    control.label = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
-    local label = control.label
-    label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 4)
-    label:SetText(LAM.util.GetStringFromValue(panelData.displayName or panelData.name))
-
-    if panelData.author or panelData.version then
-        control.info = wm:CreateControl(nil, control, CT_LABEL)
-        local info = control.info
-        info:SetFont(LAM.util.L["PANEL_INFO_FONT"])
-        info:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, -2)
-
-        local output = {}
-        if panelData.author then
-            output[#output + 1] = zo_strformat(LAM.util.L["AUTHOR"], LAM.util.GetStringFromValue(panelData.author))
-        end
-        if panelData.version then
-            output[#output + 1] = zo_strformat(LAM.util.L["VERSION"], LAM.util.GetStringFromValue(panelData.version))
-        end
-        info:SetText(table.concat(output, SEPARATOR))
-    end
-
-    if panelData.website then
-        control.website = wm:CreateControl(nil, control, CT_BUTTON)
-        local website = control.website
-        website:SetClickSound("Click")
-        website:SetFont(LAM.util.L["PANEL_INFO_FONT"])
-        website:SetNormalFontColor(LINK_COLOR:UnpackRGBA())
-        website:SetMouseOverFontColor(LINK_MOUSE_OVER_COLOR:UnpackRGBA())
-        if(control.info) then
-            website:SetAnchor(TOPLEFT, control.info, TOPRIGHT, 0, 0)
-            website:SetText(string.format("|cffffff%s|r%s", SEPARATOR, LAM.util.L["WEBSITE"]))
-        else
-            website:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, -2)
-            website:SetText(LAM.util.L["WEBSITE"])
-        end
-        website:SetDimensions(website:GetLabelControl():GetTextDimensions())
-        website:SetHandler("OnClicked", function()
-            RequestOpenUnsafeURL(panelData.website)
-        end)
-    end
-
-    control.container = wm:CreateControlFromVirtual("LAMAddonPanelContainer"..LAMCreateControl.scrollCount, control, "ZO_ScrollContainer")
-    LAMCreateControl.scrollCount = LAMCreateControl.scrollCount + 1
-    local container = control.container
-    container:SetAnchor(TOPLEFT, control.info or label, BOTTOMLEFT, 0, 20)
-    container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, -3, -3)
-    control.scroll = GetControl(control.container, "ScrollChild")
-    control.scroll:SetResizeToFitPadding(0, 20)
-
-    if panelData.registerForRefresh and not callbackRegistered then --don't want to register our callback more than once
-        cm:RegisterCallback("LAM-RefreshPanel", RefreshPanel)
-        callbackRegistered = true
-    end
-
-    control.ForceDefaults = ForceDefaults
-    control.data = panelData
-    control.controlsToRefresh = {}
-
-    return control
-end
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/slider.lua b/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/slider.lua
deleted file mode 100644
index bd721c5..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/slider.lua
+++ /dev/null
@@ -1,212 +0,0 @@
---[[sliderData = {
-    type = "slider",
-    name = "My Slider", -- or string id or function returning a string
-    getFunc = function() return db.var end,
-    setFunc = function(value) db.var = value doStuff() end,
-    min = 0,
-    max = 20,
-    step = 1, --(optional)
-    clampInput = true, -- boolean, if set to false the input won't clamp to min and max and allow any number instead (optional)
-    decimals = 0, -- when specified the input value is rounded to the specified number of decimals (optional)
-    autoSelect = false, -- boolean, automatically select everything in the text input field when it gains focus (optional)
-    inputLocation = "below", -- or "right", determines where the input field is shown. This should not be used within the addon menu and is for custom sliders (optional)
-    tooltip = "Slider's tooltip text.", -- or string id or function returning a string (optional)
-    width = "full", --or "half" (optional)
-    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
-    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
-    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
-    default = defaults.var, -- default value or function that returns the default value (optional)
-    reference = "MyAddonSlider" -- unique global reference to control (optional)
-} ]]
-
-local widgetVersion = 12
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("slider", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local strformat = string.format
-
-local function RoundDecimalToPlace(d, place)
-    return tonumber(strformat("%." .. tostring(place) .. "f", d))
-end
-
-local function UpdateDisabled(control)
-    local disable
-    if type(control.data.disabled) == "function" then
-        disable = control.data.disabled()
-    else
-        disable = control.data.disabled
-    end
-
-    control.slider:SetEnabled(not disable)
-    control.slidervalue:SetEditEnabled(not disable)
-    if disable then
-        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-        control.minText:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-        control.maxText:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
-        control.slidervalue:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
-    else
-        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-        control.minText:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-        control.maxText:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-        control.slidervalue:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
-    end
-end
-
-local function UpdateValue(control, forceDefault, value)
-    if forceDefault then --if we are forcing defaults
-        value = LAM.util.GetDefaultValue(control.data.default)
-        control.data.setFunc(value)
-    elseif value then
-        if control.data.decimals then
-            value = RoundDecimalToPlace(value, control.data.decimals)
-        end
-        if control.data.clampInput ~= false then
-            value = math.max(math.min(value, control.data.max), control.data.min)
-        end
-        control.data.setFunc(value)
-        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
-        LAM.util.RequestRefreshIfNeeded(control)
-    else
-        value = control.data.getFunc()
-    end
-
-    control.slider:SetValue(value)
-    control.slidervalue:SetText(value)
-end
-
-function LAMCreateControl.slider(parent, sliderData, controlName)
-    local control = LAM.util.CreateLabelAndContainerControl(parent, sliderData, controlName)
-    local isInputOnRight = sliderData.inputLocation == "right"
-
-    --skipping creating the backdrop...  Is this the actual slider texture?
-    control.slider = wm:CreateControl(nil, control.container, CT_SLIDER)
-    local slider = control.slider
-    slider:SetAnchor(TOPLEFT)
-    slider:SetHeight(14)
-    if(isInputOnRight) then
-        slider:SetAnchor(TOPRIGHT, nil, nil, -60)
-    else
-        slider:SetAnchor(TOPRIGHT)
-    end
-    slider:SetMouseEnabled(true)
-    slider:SetOrientation(ORIENTATION_HORIZONTAL)
-    --put nil for highlighted texture file path, and what look to be texture coords
-    slider:SetThumbTexture("EsoUI\\Art\\Miscellaneous\\scrollbox_elevator.dds", "EsoUI\\Art\\Miscellaneous\\scrollbox_elevator_disabled.dds", nil, 8, 16)
-    local minValue = sliderData.min
-    local maxValue = sliderData.max
-    slider:SetMinMax(minValue, maxValue)
-    slider:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
-    slider:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
-
-    slider.bg = wm:CreateControl(nil, slider, CT_BACKDROP)
-    local bg = slider.bg
-    bg:SetCenterColor(0, 0, 0)
-    bg:SetAnchor(TOPLEFT, slider, TOPLEFT, 0, 4)
-    bg:SetAnchor(BOTTOMRIGHT, slider, BOTTOMRIGHT, 0, -4)
-    bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-SliderBackdrop.dds", 32, 4)
-
-    control.minText = wm:CreateControl(nil, slider, CT_LABEL)
-    local minText = control.minText
-    minText:SetFont("ZoFontGameSmall")
-    minText:SetAnchor(TOPLEFT, slider, BOTTOMLEFT)
-    minText:SetText(sliderData.min)
-
-    control.maxText = wm:CreateControl(nil, slider, CT_LABEL)
-    local maxText = control.maxText
-    maxText:SetFont("ZoFontGameSmall")
-    maxText:SetAnchor(TOPRIGHT, slider, BOTTOMRIGHT)
-    maxText:SetText(sliderData.max)
-
-    control.slidervalueBG = wm:CreateControlFromVirtual(nil, slider, "ZO_EditBackdrop")
-    if(isInputOnRight) then
-        control.slidervalueBG:SetDimensions(60, 26)
-        control.slidervalueBG:SetAnchor(LEFT, slider, RIGHT, 5, 0)
-    else
-        control.slidervalueBG:SetDimensions(50, 16)
-        control.slidervalueBG:SetAnchor(TOP, slider, BOTTOM, 0, 0)
-    end
-    control.slidervalue = wm:CreateControlFromVirtual(nil, control.slidervalueBG, "ZO_DefaultEditForBackdrop")
-    local slidervalue = control.slidervalue
-    slidervalue:ClearAnchors()
-    slidervalue:SetAnchor(TOPLEFT, control.slidervalueBG, TOPLEFT, 3, 1)
-    slidervalue:SetAnchor(BOTTOMRIGHT, control.slidervalueBG, BOTTOMRIGHT, -3, -1)
-    slidervalue:SetTextType(TEXT_TYPE_NUMERIC)
-    if(isInputOnRight) then
-        slidervalue:SetFont("ZoFontGameLarge")
-    else
-        slidervalue:SetFont("ZoFontGameSmall")
-    end
-
-    local isHandlingChange = false
-    local function HandleValueChanged(value)
-        if isHandlingChange then return end
-        if sliderData.decimals then
-            value = RoundDecimalToPlace(value, sliderData.decimals)
-        end
-        isHandlingChange = true
-        slider:SetValue(value)
-        slidervalue:SetText(value)
-        isHandlingChange = false
-    end
-
-    slidervalue:SetHandler("OnEscape", function(self)
-        HandleValueChanged(sliderData.getFunc())
-        self:LoseFocus()
-    end)
-    slidervalue:SetHandler("OnEnter", function(self)
-        self:LoseFocus()
-    end)
-    slidervalue:SetHandler("OnFocusLost", function(self)
-        local value = tonumber(self:GetText())
-        control:UpdateValue(false, value)
-    end)
-    slidervalue:SetHandler("OnTextChanged", function(self)
-        local input = self:GetText()
-        if(#input > 1 and not input:sub(-1):match("[0-9]")) then return end
-        local value = tonumber(input)
-        if(value) then
-            HandleValueChanged(value)
-        end
-    end)
-    if(sliderData.autoSelect) then
-        ZO_PreHookHandler(slidervalue, "OnFocusGained", function(self)
-            self:SelectAll()
-        end)
-    end
-
-    local range = maxValue - minValue
-    slider:SetValueStep(sliderData.step or 1)
-    slider:SetHandler("OnValueChanged", function(self, value, eventReason)
-        if eventReason == EVENT_REASON_SOFTWARE then return end
-        HandleValueChanged(value)
-    end)
-    slider:SetHandler("OnSliderReleased", function(self, value)
-        control:UpdateValue(false, value)
-    end)
-    slider:SetHandler("OnMouseWheel", function(self, value)
-        if(not self:GetEnabled()) then return end
-        local new_value = (tonumber(slidervalue:GetText()) or sliderData.min or 0) + ((sliderData.step or 1) * value)
-        control:UpdateValue(false, new_value)
-    end)
-
-    if sliderData.warning ~= nil or sliderData.requiresReload then
-        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
-        control.warning:SetAnchor(RIGHT, slider, LEFT, -5, 0)
-        control.UpdateWarning = LAM.util.UpdateWarning
-        control:UpdateWarning()
-    end
-
-    control.UpdateValue = UpdateValue
-    control:UpdateValue()
-
-    if sliderData.disabled ~= nil then
-        control.UpdateDisabled = UpdateDisabled
-        control:UpdateDisabled()
-    end
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-    LAM.util.RegisterForReloadIfNeeded(control)
-
-    return control
-end
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/submenu.lua b/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/submenu.lua
deleted file mode 100644
index 1766a1f..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/submenu.lua
+++ /dev/null
@@ -1,108 +0,0 @@
---[[submenuData = {
-    type = "submenu",
-    name = "Submenu Title", -- or string id or function returning a string
-    tooltip = "My submenu tooltip", -- -- or string id or function returning a string (optional)
-    controls = {sliderData, buttonData} --(optional) used by LAM
-    reference = "MyAddonSubmenu" --(optional) unique global reference to control
-} ]]
-
-local widgetVersion = 11
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("submenu", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-local am = ANIMATION_MANAGER
-
-local function UpdateValue(control)
-    control.label:SetText(LAM.util.GetStringFromValue(control.data.name))
-    if control.data.tooltip then
-        control.label.data.tooltipText = LAM.util.GetStringFromValue(control.data.tooltip)
-    end
-end
-
-local function AnimateSubmenu(clicked)
-    local control = clicked:GetParent()
-    control.open = not control.open
-
-    if control.open then
-        control.animation:PlayFromStart()
-    else
-        control.animation:PlayFromEnd()
-    end
-end
-
-function LAMCreateControl.submenu(parent, submenuData, controlName)
-    local width = parent:GetWidth() - 45
-    local control = wm:CreateControl(controlName or submenuData.reference, parent.scroll or parent, CT_CONTROL)
-    control.panel = parent
-    control.data = submenuData
-
-    control.label = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
-    local label = control.label
-    label:SetAnchor(TOPLEFT, control, TOPLEFT, 5, 5)
-    label:SetDimensions(width, 30)
-    label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
-    label:SetText(LAM.util.GetStringFromValue(submenuData.name))
-    label:SetMouseEnabled(true)
-    if submenuData.tooltip then
-        label.data = {tooltipText = LAM.util.GetStringFromValue(submenuData.tooltip)}
-        label:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
-        label:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
-    end
-
-    control.scroll = wm:CreateControl(nil, control, CT_SCROLL)
-    local scroll = control.scroll
-    scroll:SetParent(control)
-    scroll:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, 10)
-    scroll:SetDimensionConstraints(width + 5, 0, width + 5, 0)
-
-    control.bg = wm:CreateControl(nil, label, CT_BACKDROP)
-    local bg = control.bg
-    bg:SetAnchor(TOPLEFT, label, TOPLEFT, -5, -5)
-    bg:SetAnchor(BOTTOMRIGHT, scroll, BOTTOMRIGHT, -7, 0)
-    bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-Border.dds", 128, 16)
-    bg:SetCenterTexture("EsoUI\\Art\\Tooltips\\UI-TooltipCenter.dds")
-    bg:SetInsets(16, 16, -16, -16)
-
-    control.arrow = wm:CreateControl(nil, bg, CT_TEXTURE)
-    local arrow = control.arrow
-    arrow:SetDimensions(28, 28)
-    arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortdown.dds") --list_sortup for the other way
-    arrow:SetAnchor(TOPRIGHT, bg, TOPRIGHT, -5, 5)
-
-    --figure out the cool animation later...
-    control.animation = am:CreateTimeline()
-    local animation = control.animation
-    animation:SetPlaybackType(ANIMATION_SIZE, 0) --2nd arg = loop count
-
-    control:SetResizeToFitDescendents(true)
-    control.open = false
-    label:SetHandler("OnMouseUp", AnimateSubmenu)
-    animation:SetHandler("OnStop", function(self, completedPlaying)
-        scroll:SetResizeToFitDescendents(control.open)
-        if control.open then
-            control.arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortup.dds")
-            scroll:SetResizeToFitPadding(5, 20)
-        else
-            control.arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortdown.dds")
-            scroll:SetResizeToFitPadding(5, 0)
-            scroll:SetHeight(0)
-        end
-    end)
-
-    --small strip at the bottom of the submenu that you can click to close it
-    control.btmToggle = wm:CreateControl(nil, control, CT_TEXTURE)
-    local btmToggle = control.btmToggle
-    btmToggle:SetMouseEnabled(true)
-    btmToggle:SetAnchor(BOTTOMLEFT, control.scroll, BOTTOMLEFT)
-    btmToggle:SetAnchor(BOTTOMRIGHT, control.scroll, BOTTOMRIGHT)
-    btmToggle:SetHeight(15)
-    btmToggle:SetAlpha(0)
-    btmToggle:SetHandler("OnMouseUp", AnimateSubmenu)
-
-    control.UpdateValue = UpdateValue
-
-    LAM.util.RegisterForRefreshIfNeeded(control)
-
-    return control
-end
diff --git a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/texture.lua b/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/texture.lua
deleted file mode 100644
index 29dda7c..0000000
--- a/AwesomeEvents/Libs/LibAddonMenu-2.0/controls/texture.lua
+++ /dev/null
@@ -1,45 +0,0 @@
---[[textureData = {
-    type = "texture",
-    image = "file/path.dds",
-    imageWidth = 64, --max of 250 for half width, 510 for full
-    imageHeight = 32, --max of 100
-    tooltip = "Image's tooltip text.", -- or string id or function returning a string (optional)
-    width = "full", --or "half" (optional)
-    reference = "MyAddonTexture" --(optional) unique global reference to control
-} ]]
-
---add texture coords support?
-
-local widgetVersion = 9
-local LAM = LibStub("LibAddonMenu-2.0")
-if not LAM:RegisterWidget("texture", widgetVersion) then return end
-
-local wm = WINDOW_MANAGER
-
-local MIN_HEIGHT = 26
-function LAMCreateControl.texture(parent, textureData, controlName)
-    local control = LAM.util.CreateBaseControl(parent, textureData, controlName)
-    local width = control:GetWidth()
-    control:SetResizeToFitDescendents(true)
-
-    if control.isHalfWidth then --note these restrictions
-        control:SetDimensionConstraints(width / 2, MIN_HEIGHT, width / 2, MIN_HEIGHT * 4)
-    else
-        control:SetDimensionConstraints(width, MIN_HEIGHT, width, MIN_HEIGHT * 4)
-    end
-
-    control.texture = wm:CreateControl(nil, control, CT_TEXTURE)
-    local texture = control.texture
-    texture:SetAnchor(CENTER)
-    texture:SetDimensions(textureData.imageWidth, textureData.imageHeight)
-    texture:SetTexture(textureData.image)
-
-    if textureData.tooltip then
-        texture:SetMouseEnabled(true)
-        texture.data = {tooltipText = LAM.util.GetStringFromValue(textureData.tooltip)}
-        texture:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
-        texture:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
-    end
-
-    return control
-end
diff --git a/AwesomeEvents/Libs/LibAwesomeModule-1.0/LibAwesomeModule-1.0.lua b/AwesomeEvents/Libs/LibAwesomeModule-1.0/LibAwesomeModule-1.0.lua
deleted file mode 100644
index abb8f23..0000000
--- a/AwesomeEvents/Libs/LibAwesomeModule-1.0/LibAwesomeModule-1.0.lua
+++ /dev/null
@@ -1,317 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: LibAwesomeModule-1.0.lua
-  Last Modified: 23.04.18 14:56
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local MAJOR, MINOR = 'LibAwesomeModule-1.0', 9
-local libAM, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
-if not libAM then return end
-
-EVENT_AWESOME_MODULE_TIMER = 1
-ORDER_AWESOME_MODULE_PUSH_NOTIFICATION = 75
-
-COLOR_AWEVS_AVAILABLE = 1
-COLOR_AWEVS_HINT = 2
-COLOR_AWEVS_WARNING = 3
-
-ENABLED_AWEVS_NONE = 0
-ENABLED_AWEVS_ICON_AND_TEXT = 1
-ENABLED_AWEVS_ICON_ONLY = 2
-ENABLED_AWEVS_TEXT_ONLY = 3
-
-local colorDefs = { [COLOR_AWEVS_AVAILABLE]=nil,[COLOR_AWEVS_HINT]=nil,[COLOR_AWEVS_WARNING]=nil}
-
-libAM.version = MINOR
-libAM.modules = {}
-libAM.labelToMod = {}
-libAM.timer = {}
-libAM.debug = false
-libAM.CallbackManager = ZO_CallbackObject:Subclass()
-
-function libAM.d(...)
-    if libAM.debug then
-        libAM.CallbackManager:FireCallbacks('AwesomeEventsDebugMessage',...)
-    end
-end
-
-function libAM.SetColorDef(type,r,g,b)
-    if(colorDefs[type]==nil)then
-        colorDefs[type] = ZO_ColorDef:New(r,g,b)
-    else
-        colorDefs[type]:SetRGB(r,g,b)
-    end
-end
-
-local function __genOrderedIndex( options )
-    local orderToKeyMap,orderedNumbers,orderedIndex = {},{},{}
-    for key,option in pairs(options) do
-        local order = (option.order or 40) * 100
-        while(orderToKeyMap[order]~=nil)do
-            order = order + 1
-        end
-        orderToKeyMap[order] = key
-        table.insert( orderedNumbers, order )
-    end
-    table.sort( orderedNumbers )
-    for i,order in ipairs(orderedNumbers) do
-        table.insert( orderedIndex, orderToKeyMap[order] )
-    end
-    return orderedIndex
-end
-
-local function __getNextElement(t, state)
-    -- Equivalent of the next function, but returns the keys in the alphabetic order
-    local key
-    if state == nil then
-        -- the first time, generate the index
-        key = t.__orderedIndex[1]
-    else
-        -- fetch the next value
-        for i = 1,table.getn(t.__orderedIndex) do
-            if t.__orderedIndex[i] == state then
-                key = t.__orderedIndex[i+1]
-            end
-        end
-    end
-
-    if key then
-        return key, t[key]
-    end
-
-    -- no more value to return, cleanup
-    t.__orderedIndex = nil
-    return
-end
-
--- Mod Constructor
-
-function libAM:New(uniqueId)
-    if(uniqueId==nil or self.modules[uniqueId]~=nil)then
-        d('[AwesomeEvents] Fatal error: Module id empty or already in use (id:'.. uniqueId..')')
-        return {}
-    end
-
-    -- MODULE CLASS
-    local Module = {
-        id = uniqueId,
-        debug = false,
-        title = 'UNTITLED_MODULE',
-        hint = GetString(SI_AWEMOD_SHOW_HINT),
-        options = {
-            enabled = true,
-            fontSize = 1,
-            spacing = 0,
-        },
-        order = 40,
-
-        initialized = false,
-        dataUpdated = true,
-    }
-
-    function Module:d(...)
-        if(self.debug)then
-            libAM.d(self.id,...)
-        end
-    end
-
-    function Module.Colorize(color,text)
-        if(colorDefs[color]~=nil)then
-            return colorDefs[color]:Colorize(text)
-        else
-            return text
-        end
-    end
-
-    function Module.GetColorStr( color )
-        if(colorDefs[color]~=nil)then
-            return '|c' .. colorDefs[color]:ToHex()
-        else
-            return '|r'
-        end
-    end
-
-    function Module:Initialize( options )
-        if(self.initialized)then return end
-        self.initialized = true
-
-        if(options.enabled) then
-            self:Enable(options)
-        end
-    end
-
-    function Module:HasUpdate()
-        return self.dataUpdated
-    end
-
-    function Module:GetEventListeners()
-        return {}
-    end
-
-    function Module.Icon(icon,options)
-        libAM.d('options',options)
-        if (options.enabled == ENABLED_AWEVS_ICON_AND_TEXT or options.enabled == ENABLED_AWEVS_ICON_ONLY)then
-            return '|t64:64:' .. icon .. '|t '
-        else
-            return ''
-        end
-    end
-
-    function Module.Text(text,options)
-        libAM.d('options',options)
-        if (options.enabled == ENABLED_AWEVS_ICON_AND_TEXT or options.enabled == ENABLED_AWEVS_TEXT_ONLY)then
-            return text
-        else
-            return ''
-        end
-    end
-
-    function Module:Enable(options)
-        self:d('Enable (in debug-mode)')
-        if(type(self.label)=='table')then
-            for i,_data in pairs(self.label) do
-                self.label[i]:SetText('')
-            end
-        else
-            self.label:SetText('')
-        end
-        self.dataUpdated = true
-    end
-
-    function Module:Disable()
-        self:d('Disable')
-        if(type(self.label)=='table')then
-            for i,_data in pairs(self.label) do
-                self.label[i]:SetText('')
-            end
-        else
-            self.label:SetText('')
-        end
-    end
-
-    function Module:Set(key,value)
-        self:d('Set['..key..']',value)
-        self.dataUpdated = true
-    end
-
-    function Module:StartTimer(seconds,updateIfFaster)
-        if(libAM.timer[self.id]==nil)then
-            self:d(GetString(SI_AWEVS_DEBUG_MODULE_NO_TIMER))
-            return
-        end
-        if(seconds == nil or seconds < 1)then
-            seconds = 1
-        end
-        local timestamp = GetTimeStamp() + seconds
-        if(libAM.timer[self.id] == 0)then
-            self:d('StartTimer['..seconds..']')
-            libAM.timer[self.id] = timestamp
-        elseif(updateIfFaster==true and self.lib.timer[self.id] > timestamp)then
-            self:d('StartTimer['..seconds..'] (faster)')
-            libAM.timer[self.id] = timestamp
-        else
-            self:d('StartTimer[ignored]')
-        end
-    end
-
-    function Module:SetTimer(seconds)
-        if(libAM.timer[self.id]==nil)then
-            self:d(GetString(SI_AWEVS_DEBUG_MODULE_NO_TIMER))
-            return
-        end
-        if(seconds == nil or seconds < 1)then
-            seconds = 1
-        end
-        self:d('SetTimer['..seconds..']')
-        libAM.timer[self.id] = GetTimeStamp() + seconds
-    end
-
-    function Module:StopTimer()
-        if(self.lib.timer[self.id]==nil)then
-            self:d(GetString(SI_AWEVS_DEBUG_MODULE_NO_TIMER))
-            return
-        end
-        self:d('StopTimer')
-        libAM.timer[self.id] = 0
-    end
-
-    local function __getNextOption(t, state)
-
-        -- Equivalent of the next function, but returns the keys in the alphabetic order
-        local key = nil
-        --d("orderedNext: state = "..tostring(state) )
-        if state == nil then
-            -- the first time, generate the index
-            key = t.__orderedIndex[1]
-        else
-            -- fetch the next value
-            for i = 1,table.getn(t.__orderedIndex) do
-                if t.__orderedIndex[i] == state then
-                    key = t.__orderedIndex[i+1]
-                end
-            end
-        end
-
-        if key then
-            return key, t[key]
-        end
-
-        -- no more value to return, cleanup
-        t.__orderedIndex = nil
-        return
-    end
-
-    function Module:option_pairs()
-        if(self.options == nil)then
-            d("SELF",self)
-            return nil,nil,nil
-        end
-
-        if(self.options.__orderedIndex == nil)then
-            self.options.__orderedIndex = __genOrderedIndex( self.options )
-        end
-        return __getNextElement, self.options, nil
-    end
-
-    self.modules[Module.id] = Module
-
-    libAM.CallbackManager:RegisterCallback('AwesomeEventsModConfig_'..uniqueId,function(options)
-        self.modules[uniqueId]:Initialize(options)
-    end)
-
-    return self.modules[Module.id]
-end
-
-local function __genModulesIndex( modules )
-    local titleToIdMap,orderedTitles,orderedIndex = {},{},{}
-    for mod_id,mod in pairs(modules) do
-        local i,title = 1,mod.title
-        while(titleToIdMap[title]~=nil)do
-            title = mod.title .. i
-            i = i+1
-        end
-        titleToIdMap[title] = mod_id
-        table.insert( orderedTitles, title )
-    end
-    table.sort( orderedTitles )
-    for i,title in ipairs(orderedTitles) do
-        table.insert( orderedIndex, titleToIdMap[title] )
-    end
-    return orderedIndex
-end
-
-function libAM:module_pairs()
-    if(self.modules.__orderedIndex == nil)then
-        self.modules.__orderedIndex = __genOrderedIndex( self.modules )
-    end
-    -- Equivalent of the pairs() function on tables. Allows to iterate
-    -- in order
-    return __getNextElement, self.modules, nil
-end
\ No newline at end of file
diff --git a/AwesomeEvents/Libs/LibAwesomeModule-1.0/README b/AwesomeEvents/Libs/LibAwesomeModule-1.0/README
deleted file mode 100644
index ded7911..0000000
--- a/AwesomeEvents/Libs/LibAwesomeModule-1.0/README
+++ /dev/null
@@ -1,97 +0,0 @@
---------------------------
---    AwesomeEvents     --
---------------------------
-
---[ EN ]--
-
-This AddOn was made by Ze_Mi <zemi@unive.de>.
-Updates at: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
-
-This AddOn is a modularzied, event-based, better configurable reinvention of AwesomeInfo addon from CrazyDutchGuy.
-My goal was to minimize timed refreshs and try to use as many event callbacks as possible, as well as split up the different notifications into seperate module files.
-Besides the look and feel, under the hood, there aren't many codelines left from AwesomeInfo.
-
---[ DE ]--
-
-Dieses AddOn wurde erstellt von Ze_Mi <zemi@unive.de>.
-Updates unter: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
-
-Dieses AddOn ist eine modularizierte, eventbasierte und noch besser prsonalisierbare Neuentwicklung des AwesomeInfo Addons von CrazyDutchGuy.
-Mein Ziel dabei war es, weniger inertval basierte Aktualisierungen auszuführen und stattdessen auf Events zu reagieren. Außerdem wurden die verschiedenen Benachrichtigungen in
-eigene Module ausgelagert, was die Entwicklung von Modulen übersichtlicher und einfacher macht.
-Abgesehen von dem ursprünglichen look and feel hat sich unter der Haube so viel verändert, dass nicht mehr viele Codezeilen aus AwesoneInfo übrig geblieben sind.
-
-
---------------------------
---   LibAwesomeModule   --
---------------------------
-
---[ EN ]--
-
-This Library was made by Ze_Mi <zemi@unive.de>.
-
-Hereby I introduce LibAwesomeModule-1.0, a library that allows you to easily add new modules and notifications to AwesomeEvents.
-If you are interested in writing new modules, please have a look inside the Module folder of this addon.
-You don't have to care about layout and settings stuff, just write the minimal necessary code with maximum useability.
-
---[ DE ]--
-
-Diese Bibliothek wurde erstellt von Ze_Mi <zemi@unive.de>.
-
-Hiermit stelle ich die neue Bibliothek LibAwesomeModule vor, eine Bibliothek mit deren Hilfe man super schnell und ohne viel Aufwand neue Benachrichtigungen in AwesomeEvents hinzufügen kann.
-Wenn du wissen möchtest, wie du neue Module hinzufügst, schau dir die Dateien im Ordner Modules an.
-Du musst dich nicht um lästige Label-Erstellungen/-Positionierung oder Einstellungen kümmern, schreibe einfach den minimal nötigen Code mit maximalem Nutzen.
-
-
---------------------------
---      CREDITS         --
---------------------------
-
---[ EN ]--
-
-Thanks to CrazyDutchGuy, Stormknight and RibbedStoic for their great AwesomeInfo AddOn!
-(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
-
-Thanks to @MissMarsupial for beta testing my AddOn.
-
-Thanks to esoui.com and all authors for maintaining the wiki and doing the job ZeniMax Media Inc is suposed to do ;)
-
---[ DE ]--
-
-Mein Dank geht an CrazyDutchGuy, Stormknight und RibbedStoic für ihr großartiges AwesomeInfo AddOn!
-(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
-
-Danke an @MissMarsupial für das testen der Beta-Versionen meines AddOns.
-
-Danke an esoui.com und allen Authoren die an der Wiki arbeiten und diese aktuell halten und damit einen Dienst übernehmen für den sich ZeniMax Media Inc zu schön ist ;)
-
---------------------------
---      LICENSE         --
---------------------------
-
-This software is under : CreativeCommons CC BY-NC-SA 4.0
-Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-You are free to:
-
-    Share — copy and redistribute the material in any medium or format
-    Adapt — remix, transform, and build upon the material
-    The licensor cannot revoke these freedoms as long as you follow the license terms.
-
-
-Under the following terms:
-
-    Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
-    NonCommercial — You may not use the material for commercial purposes.
-    ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
-    No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
-
-
-Please read full licence at :
-http://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
-
-This Add-on is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates.
-The Elder Scrolls® and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries.
-All rights reserved.
-
-You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
\ No newline at end of file
diff --git a/AwesomeEvents/Libs/LibMsgWin-1.0/LibMsgWin-1.0.lua b/AwesomeEvents/Libs/LibMsgWin-1.0/LibMsgWin-1.0.lua
deleted file mode 100644
index 5c61219..0000000
--- a/AwesomeEvents/Libs/LibMsgWin-1.0/LibMsgWin-1.0.lua
+++ /dev/null
@@ -1,221 +0,0 @@
-
---Register LAM with LibStub
-local MAJOR, MINOR = "LibMsgWin-1.0", 8
-local libmw, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
-if not libmw then return end	--the same or newer version of this lib is already loaded into memory
-
-
-local function AdjustSlider(self)
-	local numHistoryLines = self:GetNamedChild("Buffer"):GetNumHistoryLines()
-	local numVisHistoryLines = self:GetNamedChild("Buffer"):GetNumVisibleLines()
-	local bufferScrollPos = self:GetNamedChild("Buffer"):GetScrollPosition()
-	local sliderMin, sliderMax = self:GetNamedChild("Slider"):GetMinMax()
-	local sliderValue = self:GetNamedChild("Slider"):GetValue()
-
-	self:GetNamedChild("Slider"):SetMinMax(0, numHistoryLines)
-
-	-- If the sliders at the bottom, stay at the bottom to show new text
-	if sliderValue == sliderMax then
-		self:GetNamedChild("Slider"):SetValue(numHistoryLines)
-	-- If the buffer is full start moving the slider up
-	elseif numHistoryLines == self:GetNamedChild("Buffer"):GetMaxHistoryLines() then
-		self:GetNamedChild("Slider"):SetValue(sliderValue-1)
-	end -- Else the slider does not move
-
-	-- If there are more history lines than visible lines show the slider
-	if numHistoryLines > numVisHistoryLines then
-		self:GetNamedChild("Slider"):SetHidden(false)
-	else
-		-- else hide the slider
-		self:GetNamedChild("Slider"):SetHidden(true)
-	end
-end
-
-function libmw:CreateMsgWindow(_UniqueName, _LabelText, _FadeDelay, _FadeTime)
-	-- Dimension Constraits
-	local minWidth = 200
-	local minHeight = 150
-
-	local tlw = WINDOW_MANAGER:CreateTopLevelWindow(_UniqueName)
-	tlw:SetMouseEnabled(true)
-	tlw:SetMovable(true)
-	tlw:SetHidden(false)
-	tlw:SetClampedToScreen(true)
-	tlw:SetDimensions(350, 400)
-	tlw:SetClampedToScreenInsets(-24)
-	tlw:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, 50,50)
-	tlw:SetDimensionConstraints(minWidth, minHeight)
-	tlw:SetResizeHandleSize(16)
-
-	-- Set Fade Delay/Times
-	tlw.fadeDelayWindow		= _FadeDelay or 0
-	tlw.fadeTimeWindow		= _FadeTime or 0
-	tlw.fadeDelayTextLines 	= tlw.fadeDelayWindow/1000
-	tlw.fadeTimeTextLines 	= tlw.fadeTimeWindow/1000
-
-	-- Create window fade timeline/animation
-	tlw.timeline = ANIMATION_MANAGER:CreateTimeline()
-	tlw.animation = tlw.timeline:InsertAnimation(ANIMATION_ALPHA, tlw, tlw.fadeDelayWindow)
-	tlw.animation:SetAlphaValues(1, 0)
-	tlw.animation:SetDuration(tlw.fadeTimeWindow)
-	tlw.timeline:PlayFromStart()
-
-
-	function tlw:AddText(_Message, _Red, _Green, _Blue)
-		local Red 	= _Red or 1
-		local Green = _Green or 1
-		local Blue 	= _Blue or 1
-
-		if not _Message then return end
-		-- Add message first
-		self:GetNamedChild("Buffer"):AddMessage(_Message, Red, Green, Blue)
-		-- Set new slider value & check visibility
-		AdjustSlider(self)
-		-- Reset Fade Timers
-		tlw:SetAlpha(1)
-		tlw.timeline:PlayFromStart()
-	end
-	function tlw:ChangeWinFade(_FadeDelay, _FadeTime)
-		if not (type(_FadeDelay) == "number" and type(_FadeTime) == "number") then return end
-		tlw.fadeDelayWindow		= _FadeDelay
-		tlw.fadeTimeWindow		= _FadeTime
-
-		tlw.timeline:SetAnimationOffset(tlw.animation, _FadeDelay)
-		tlw.animation:SetDuration(_FadeTime)
-	end
-	function tlw:ChangeTextFade(_FadeDelay, _FadeTime)
-		if not (type(_FadeDelay) == "number" and type(_FadeTime) == "number") then return end
-		tlw.fadeDelayTextLines 	= _FadeDelay/1000
-		tlw.fadeTimeTextLines 	= _FadeTime/1000
-		self:GetNamedChild("Buffer"):SetLineFade(_FadeDelay/1000, _FadeTime/1000)
-	end
-	function tlw:ClearText()
-		self:GetNamedChild("Buffer"):Clear()
-	end
-
-	local bg = WINDOW_MANAGER:CreateControl(_UniqueName.."Bg", tlw, CT_BACKDROP)
-	bg:SetAnchor(TOPLEFT, tlw, TOPLEFT, -8, -6)
-	bg:SetAnchor(BOTTOMRIGHT, tlw, BOTTOMRIGHT, 4, 4)
-	bg:SetEdgeTexture("EsoUI/Art/ChatWindow/chat_BG_edge.dds", 256, 256, 32)
-	bg:SetCenterTexture("EsoUI/Art/ChatWindow/chat_BG_center.dds")
-	bg:SetInsets(32, 32, -32, -32)
-	bg:SetDimensionConstraints(minWidth, minHeight)
-
-
-	local divider = WINDOW_MANAGER:CreateControl(_UniqueName.."Divider", tlw, CT_TEXTURE)
-	divider:SetDimensions(4, 8)
-	divider:SetAnchor(TOPLEFT, tlw, TOPLEFT, 20, 40)
-	divider:SetAnchor(TOPRIGHT, tlw, TOPRIGHT, -20, 40)
-	divider:SetTexture("EsoUI/Art/Miscellaneous/horizontalDivider.dds")
-	divider:SetTextureCoords(0.181640625, 0.818359375, 0, 1)
-
-
-	local buffer = WINDOW_MANAGER:CreateControl(_UniqueName.."Buffer", tlw, CT_TEXTBUFFER)
-	buffer:SetFont("ZoFontChat")
-	buffer:SetMaxHistoryLines(200)
-	buffer:SetMouseEnabled(true)
-	buffer:SetLinkEnabled(true)
-	buffer:SetAnchor(TOPLEFT, tlw, TOPLEFT, 20, 42)
-	buffer:SetAnchor(BOTTOMRIGHT, tlw, BOTTOMRIGHT, -35, -20)
-	buffer:SetLineFade(tlw.fadeDelayTextLines, tlw.fadeTimeTextLines)
-	buffer:SetHandler("OnLinkMouseUp", function(self, linkText, link, button)
-              --  ZO_PopupTooltip_SetLink(link)
-		ZO_LinkHandler_OnLinkMouseUp(link, button, self)
-	end)
-	buffer:SetDimensionConstraints(minWidth-55, minHeight-62)
-
-	buffer:SetHandler("OnMouseWheel", function(self, delta, ctrl, alt, shift)
-		local offset = delta
-		local slider = buffer:GetParent():GetNamedChild("Slider")
-		if shift then
-			offset = offset * buffer:GetNumVisibleLines()
-		elseif ctrl then
-			offset = offset * buffer:GetNumHistoryLines()
-		end
-		buffer:SetScrollPosition(buffer:GetScrollPosition() + offset)
-		slider:SetValue(slider:GetValue() - offset)
-	end)
-
-	buffer:SetHandler("OnMouseEnter", function(...)
-		tlw.timeline:Stop()
-		buffer:SetLineFade(0, 0)
-		buffer:ShowFadedLines()
-		tlw:SetAlpha(1)
-	end)
-	buffer:SetHandler("OnMouseExit", function(...)
-		buffer:SetLineFade(tlw.fadeDelayTextLines, tlw.fadeTimeTextLines)
-		tlw.timeline:PlayFromStart()
-	end)
-
-	local slider = WINDOW_MANAGER:CreateControl(_UniqueName.."Slider", tlw, CT_SLIDER)
-	slider:SetDimensions(15, 32)
-	slider:SetAnchor(TOPRIGHT, tlw, TOPRIGHT, -25, 60)
-	slider:SetAnchor(BOTTOMRIGHT, tlw, BOTTOMRIGHT, -15, -80)
-	slider:SetMinMax(1, 1)
-	slider:SetMouseEnabled(true)
-	slider:SetValueStep(1)
-	slider:SetValue(1)
-	slider:SetHidden(true)
-	slider:SetThumbTexture("EsoUI/Art/ChatWindow/chat_thumb.dds", "EsoUI/Art/ChatWindow/chat_thumb_disabled.dds", nil, 8, 22, nil, nil, 0.6875, nil)
-	slider:SetBackgroundMiddleTexture("EsoUI/Art/ChatWindow/chat_scrollbar_track.dds")
-
-	slider:SetHandler("OnValueChanged", function(self,value, eventReason)
-		local numHistoryLines = self:GetParent():GetNamedChild("Buffer"):GetNumHistoryLines()
-		local sliderValue = slider:GetValue()
-
-		if eventReason == EVENT_REASON_HARDWARE then
-			buffer:SetScrollPosition(numHistoryLines-sliderValue)
-		end
-	end)
-
-
-	local scrollUp = WINDOW_MANAGER:CreateControlFromVirtual(_UniqueName.."SliderScrollUp", slider, "ZO_ScrollUpButton")
-	scrollUp:SetAnchor(BOTTOM, slider, TOP, -1, 0)
-	scrollUp:SetNormalTexture("EsoUI/Art/ChatWindow/chat_scrollbar_upArrow_up.dds")
-	scrollUp:SetPressedTexture("EsoUI/Art/ChatWindow/chat_scrollbar_upArrow_down.dds")
-	scrollUp:SetMouseOverTexture("EsoUI/Art/ChatWindow/chat_scrollbar_upArrow_over.dds")
-	scrollUp:SetDisabledTexture("EsoUI/Art/ChatWindow/chat_scrollbar_upArrow_disabled.dds")
-	scrollUp:SetHandler("OnMouseDown", function(...)
-		buffer:SetScrollPosition(buffer:GetScrollPosition()+1)
-		slider:SetValue(slider:GetValue()-1)
-	end)
-
-
-	local scrollDown = WINDOW_MANAGER:CreateControlFromVirtual(_UniqueName.."SliderScrollDown", slider, "ZO_ScrollDownButton")
-	scrollDown:SetAnchor(TOP, slider, BOTTOM, -1, 0)
-	scrollDown:SetNormalTexture("EsoUI/Art/ChatWindow/chat_scrollbar_downArrow_up.dds")
-	scrollDown:SetPressedTexture("EsoUI/Art/ChatWindow/chat_scrollbar_downArrow_down.dds")
-	scrollDown:SetMouseOverTexture("EsoUI/Art/ChatWindow/chat_scrollbar_downArrow_over.dds")
-	scrollDown:SetDisabledTexture("EsoUI/Art/ChatWindow/chat_scrollbar_downArrow_disabled.dds")
-	scrollDown:SetHandler("OnMouseDown", function(...)
-		buffer:SetScrollPosition(buffer:GetScrollPosition()-1)
-		slider:SetValue(slider:GetValue()+1)
-	end)
-
-
-	local scrollEnd = WINDOW_MANAGER:CreateControlFromVirtual(_UniqueName.."SliderScrollEnd", slider, "ZO_ScrollEndButton")
-	scrollEnd:SetDimensions(16, 16)
-	scrollEnd:SetAnchor(TOP, scrollDown, BOTTOM, 0, 0)
-	scrollEnd:SetHandler("OnMouseDown", function(...)
-		buffer:SetScrollPosition(0)
-		slider:SetValue(buffer:GetNumHistoryLines())
-	end)
-
-	if _LabelText and _LabelText ~= "" then
-		local label = WINDOW_MANAGER:CreateControl(_UniqueName.."Label", tlw, CT_LABEL)
-		label:SetText(_LabelText)
-		label:SetFont("$(ANTIQUE_FONT)|24")
-		label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
-		local textHeight = label:GetTextHeight()
-		label:SetDimensionConstraints(minWidth-60, textHeight, nil, textHeight)
-		label:ClearAnchors()
-		label:SetAnchor(TOPLEFT, tlw, TOPLEFT, 30, (40-textHeight)/2+5)
-		label:SetAnchor(TOPRIGHT, tlw, TOPRIGHT, -30, (40-textHeight)/2+5)
-	end
-	return tlw
-end
-
-
-
-
-
diff --git a/AwesomeEvents/Libs/LibMsgWin-1.0/LibMsgWin-1.0.txt b/AwesomeEvents/Libs/LibMsgWin-1.0/LibMsgWin-1.0.txt
deleted file mode 100644
index 84a7c33..0000000
--- a/AwesomeEvents/Libs/LibMsgWin-1.0/LibMsgWin-1.0.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-## APIVersion: 100010
-## Title: LibMsgWin-1.0
-## Version: 1.0 r3
-## Author: Circonian
-## Description: A library used to aid in creating message windows
-
-
-LibStub\LibStub.lua
-
-LibMsgWin-1.0.lua
diff --git a/AwesomeEvents/Libs/LibStub/LibStub.lua b/AwesomeEvents/Libs/LibStub/LibStub.lua
deleted file mode 100644
index 0e6bf67..0000000
--- a/AwesomeEvents/Libs/LibStub/LibStub.lua
+++ /dev/null
@@ -1,38 +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
--- LibStub developed for World of Warcraft by above members of the WowAce community.
--- Ported to Elder Scrolls Online by Seerah
-
-local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 4
-local LibStub = _G[LIBSTUB_MAJOR]
-
-local strformat = string.format
-if not LibStub or LibStub.minor < LIBSTUB_MINOR then
-	LibStub = LibStub or {libs = {}, minors = {} }
-	_G[LIBSTUB_MAJOR] = LibStub
-	LibStub.minor = LIBSTUB_MINOR
-
-	function LibStub:NewLibrary(major, minor)
-		assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
-		if type(minor) ~= "number" then
-			minor = assert(tonumber(zo_strmatch(minor, "%d+%.?%d*")), "Minor version must either be a number or contain a number.")
-		end
-
-		local oldminor = self.minors[major]
-		if oldminor and oldminor >= minor then return nil end
-		self.minors[major], self.libs[major] = minor, self.libs[major] or {}
-		return self.libs[major], oldminor
-	end
-
-	function LibStub:GetLibrary(major, silent)
-		if not self.libs[major] and not silent then
-			error(strformat("Cannot find a library instance of %q.", tostring(major)), 2)
-		end
-		return self.libs[major], self.minors[major]
-	end
-
-	function LibStub:IterateLibraries() return pairs(self.libs) end
-	setmetatable(LibStub, { __call = LibStub.GetLibrary })
-end
-
-LibStub.SILENT = true
\ No newline at end of file
diff --git a/AwesomeEvents/Modules/BuffFood.lua b/AwesomeEvents/Modules/BuffFood.lua
deleted file mode 100644
index c3e2bc8..0000000
--- a/AwesomeEvents/Modules/BuffFood.lua
+++ /dev/null
@@ -1,248 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: BuffFood.lua
-  Last Modified: 02.11.17 16:36
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-local MOD = libAM:New('bufffood')
-
-MOD.title = GetString(SI_AWEMOD_BUFFFOOD)
-MOD.hint = GetString(SI_AWEMOD_BUFFFOOD_HINT)
-MOD.order = 30
-MOD.debug = true
-
-local HIDE_TIMEOUT_SECONDS = 300
-local ICON = 'EsoUI/Art/treeicons/provisioner_indexicon_stew_down.dds'
-
--- USER SETTINGS
-
-function MOD.GetOptions()
-    return {
-        minutesLeftInfo = {
-            type = "slider",
-            name = GetString(SI_AWEMOD_BUFFFOOD_TIMER),
-            tooltip = GetString(SI_AWEMOD_BUFFFOOD_TIMER_HINT),
-            min  = 1,
-            max = 480,
-            default = 60,
-            order = 1,
-        },
-        blinkInCombat = {
-            type = "checkbox",
-            name = GetString(SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT),
-            tooltip = GetString(SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT_HINT),
-            default = true,
-            order = 2,
-        },
-        hideNoBuffNoCombat = {
-            type = "checkbox",
-            name = GetString(SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT),
-            tooltip = GetString(SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT_HINT),
-            default = false,
-            order = 2,
-        }
-    }
-end
-
-MOD.defaults.fontSize = 3
-
--- OVERRIDES
-
-function MOD:Enable(options)
-    self:d('Enable (in debug-mode)')
-    self.data = {
-        availableAt = 1, --OnTimer event lazy call to OnEffectChanged
-        minutesLeft = 0,
-        buffName = 'Unknown',
-        inCombat = false,
-        blinkInCombat = options.blinkInCombat,
-        blinkColor = COLOR_AWEVS_WARNING,
-        hideAt = GetTimeStamp() + HIDE_TIMEOUT_SECONDS,
-    }
-    self.dataUpdated = true
-end
-
-function MOD:Set(key,value)
-    self:d('Set['..key..']',value)
-
-    if(key=='blinkInCombat')then
-        self.data.blinkInCombat = value
-    end
-    self.dataUpdated = true
-end
-
--- EVENT LISTENER
-
-local function __isFoodBuff(abilityId)
-    local foodAbilityIds = {
-        [17407]=1,[17577]=1,[17581]=1,[17608]=1,[17614]=1,[61218]=1,[61255]=1,[61257]=1,[61259]=1,[61260]=1,
-        [61261]=1,[61294]=1,[61322]=1,[61325]=1,[61328]=1,[61335]=1,[61340]=1,[61345]=1,[61350]=1,[66125]=1,
-        [66128]=1,[66130]=1,[66132]=1,[66137]=1,[66141]=1,[66551]=1,[66568]=1,[66576]=1,[66586]=1,[66590]=1,
-        [66594]=1,[68411]=1,[68416]=1,[72816]=1,[72819]=1,[72822]=1,[72824]=1,[72956]=1,[72959]=1,[72961]=1,
-        [72965]=1,[72968]=1,[72971]=1,[84678]=1,[84681]=1,[84700]=1,[84704]=1,[84709]=1,[84720]=1,[84725]=1,
-        [84731]=1,[84735]=1,[85484]=1,[85497]=1,[86559]=1,[86673]=1,[86677]=1,[86746]=1,[86749]=1,[86787]=1,
-        [86789]=1,[86791]=1,[89955]=1,[89957]=1,[89971]=1,[92433]=1,[92435]=1,[92474]=1,[92476]=1
-    }
-    return foodAbilityIds[abilityId]~=nil
-end -- __isFoodBuff
-
--- EVENT LISTENER
-
--- EVENT_EFFECT_CHANGED (integer eventCode, integer changeType, integer effectSlot, string effectName, string unitTag, number beginTime, number endTime, integer stackCount, string iconName, string buffType, integer effectType, integer abilityType, integer statusEffectType, string unitName, integer unitId, integer abilityId, integer sourceUnitType)
-
-function MOD:GetEventListeners()
-    return {
-        {
-            eventCode = EVENT_AWESOME_MODULE_TIMER,
-            callback = function(eventCode, timestamp) return MOD:OnTimer(timestamp) end,
-        },
-        {
-            eventCode = EVENT_EFFECT_CHANGED,
-            callback = function(eventCode, changeType, effectSlot, effectName, unitTag, beginTime, endTime, stackCount, iconName, buffType, effectType, abilityType, statusEffectType, unitName, unitId, abilityId, sourceUnitType)
-                if(sourceUnitType == COMBAT_UNIT_TYPE_PLAYER and effectType == BUFF_EFFECT_TYPE_BUFF and statusEffectType == STATUS_EFFECT_TYPE_NONE and __isFoodBuff(abilityId))then
-                    MOD:OnEffectChanged(abilityId,changeType,effectName,endTime)
-                end
-            end,
-        },
-        {
-            eventCode = EVENT_PLAYER_COMBAT_STATE,
-            callback = function(eventCode, inCombat)
-                MOD:OnCombatStateChanged(inCombat)
-            end,
-        }
-    }
-end
-
--- EVENT HANDLER
-
-function MOD:OnTimer(timestamp)
-    self:d('OnTimer')
-    -- has effect
-    if(self.data.availableAt > 0)then
-        if(timestamp >  self.data.availableAt)then
-            self:OnEffectChanged()
-        else
-            self:d(self.data.availableAt, timestamp)
-            self.data.minutesLeft = math.floor( GetDiffBetweenTimeStamps(self.data.availableAt, timestamp) / 60)
-            self.dataUpdated = true
-            self:d(' => dataUpdated')
-        end
-        return
-    end
-
-    -- has no effect, but in combat
-    if(self.data.inCombat)then
-        if(self.data.blinkInCombat)then
-            self.data.blinkColor = (self.data.blinkColor==COLOR_AWEVS_WARNING) and COLOR_AWEVS_HINT or COLOR_AWEVS_WARNING
-            self.dataUpdated = true
-            self:d(' => dataUpdated (combat)')
-            return 1
-        end
-    -- has no effect and not in combat
-    else
-        self.dataUpdated = true
-        self:d(' => dataUpdated (no-combat)')
-        if (timestamp < self.data.hideAt)then
-            return (self.data.hideAt-timestamp)
-        else
-            self.data.hideAt = 0
-            return 0
-        end
-    end
-    return 0
-end -- MOD:OnTimer
-
-function MOD:OnEffectChanged(abilityId,changeType,effectName,endTime)
-    self:d('OnEffectChanged')
-
-    -- single effect update
-    if(abilityId~=nil)then
-        if(__isFoodBuff(abilityId))then
-            if(changeType==EFFECT_RESULT_FADED)then
-                self.data.buffName = ''
-                self.data.availableAt = 0
-                self.data.minutesLeft = 0
-                self.dataUpdated = true
-                self:d(' => dataUpdated (faded)')
-                return
-            end
-            if(changeType==EFFECT_RESULT_GAINED)then
-                local secondsLeft =  math.ceil(endTime-GetFrameTimeSeconds())
-                self.data.buffName = effectName
-                self.data.availableAt = GetTimeStamp() + secondsLeft
-                self.data.minutesLeft = math.floor(secondsLeft/60)
-                self:StartTimer(1,true)
-                self.dataUpdated = true
-                self:d(' => dataUpdated (gained)')
-                return
-            end
-        end
-
-    -- scan all buffs for food-buffs
-    else
-        local numBuffs = GetNumBuffs('player')
-        self:d('numBuffs: '.. numBuffs);
-        for i=1,numBuffs do
-            --local buffName, timeStarted, timeEnding, buffSlot, stackCount, iconFilename, buffType, effectType, abilityType, statusEffectType, abilityId, canClickOff, castByPlayer
-            local buffName, _, timeEnding, _, _, _, _, _, _, _, abilityId, _, _ = GetUnitBuffInfo('player', i)
-            self:d(buffName .. (__isFoodBuff(abilityId) and ' is a foodbuff' or ' is not a foodbuff'))
-            if(__isFoodBuff(abilityId))then
-                local secondsLeft =  math.ceil(timeEnding-GetFrameTimeSeconds())
-                self.data.buffName = buffName
-                self.data.availableAt = GetTimeStamp() + secondsLeft
-                self.data.minutesLeft = math.floor(secondsLeft/60)
-                self:StartTimer(1,true)
-                self.dataUpdated = true
-				self:d(' => dataUpdated (found a buff)')
-				return
-            end
-        end
-
-        if(self.data.minutesLeft > 0 or self.data.buffName ~= '')then
-            self.dataUpdated = true
-            self:d(' => dataUpdated (no buff)')
-        end
-        self.data.availableAt = 0
-        self.data.buffName = ''
-        self.data.minutesLeft = 0
-    end
-end -- MOD:OnEffectChanged
-
-function MOD:OnCombatStateChanged(inCombat)
-    self:d('OnCombatStateChanged',inCombat)
-    self.data.inCombat = inCombat
-    if(self.data.minutesLeft==0)then
-        self.data.blinkColor = COLOR_AWEVS_WARNING
-        if(not inCombat)then
-            self.data.hideAt = GetTimeStamp() + HIDE_TIMEOUT_SECONDS
-        end
-        self:StartTimer(1,true)
-    end
-end -- MOD:OnCombatStateChanged
-
--- LABEL HANDLER
-
-function MOD:Update(options)
-    self:d('Update')
-    local labelText = ''
-    if(self.data.minutesLeft > 0) then
-        if(self.data.minutesLeft <= options.minutesLeftInfo) then
-            labelText = MOD.Icon(ICON, options) .. MOD.Text( MOD.Colorize(COLOR_AWEVS_HINT, zo_strformat(SI_AWEMOD_BUFFFOOD_TIMER_LABEL,self.data.buffName)) .. ': ' .. FormatTimeSeconds(60 * self.data.minutesLeft, TIME_FORMAT_STYLE_DESCRIPTIVE_SHORT , TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR , TIME_FORMAT_DIRECTION_NONE), options)
-        else
-            labelText = ''
-        end
-    elseif(options.blinkInCombat and self.data.inCombat)then
-        labelText = MOD.Icon(ICON, options) .. MOD.Text( MOD.Colorize(self.data.blinkColor, GetString(SI_AWEMOD_BUFFFOOD_READY_LABEL)), options)
-    elseif(not options.hideNoBuffNoCombat or self.data.hideAt>0)then
-        labelText = MOD.Icon(ICON, options) .. MOD.Text( MOD.Colorize(COLOR_AWEVS_WARNING, GetString(SI_AWEMOD_BUFFFOOD_READY_LABEL)), options)
-    end
-    self.label:SetText(labelText)
-end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents/Modules/Clock.lua b/AwesomeEvents/Modules/Clock.lua
deleted file mode 100644
index 97eea0d..0000000
--- a/AwesomeEvents/Modules/Clock.lua
+++ /dev/null
@@ -1,115 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: Clock.lua
-  Last Modified: 02.11.17 16:36
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-local MOD = libAM:New('clock')
-
-local CLOCK_TYPE_TIME = 0
-local CLOCK_TYPE_DATE = 1
-
-MOD.title = GetString(SI_AWEMOD_CLOCK)
-MOD.hint = GetString(SI_AWEMOD_CLOCK_HINT)
-MOD.order = 10
-MOD.debug = false
-
-MOD.label = {}
-MOD.label[CLOCK_TYPE_TIME] = {}
-MOD.label[CLOCK_TYPE_DATE] = {}
-
--- USER SETTINGS
-
-MOD.options = {
-    hoursFormat24 = {
-        type = "checkbox",
-        name = GetString(SI_AWEMOD_CLOCK_FORMAT),
-        tooltip = GetString(SI_AWEMOD_CLOCK_FORMAT_HINT),
-        default = true,
-        order = 1,
-    },
-    style = {
-        type = 'dropdown',
-        name = GetString(SI_AWEMOD_CLOCK_STYLE),
-        tooltip = GetString(SI_AWEMOD_CLOCK_STYLE_HINT),
-        choices = {GetString(SI_AWEMOD_CLOCK_STYLE_TIME),GetString(SI_AWEMOD_CLOCK_STYLE_DATETIME_SHORT),GetString(SI_AWEMOD_CLOCK_STYLE_DATETIME_LONG)},
-        default = GetString(SI_AWEMOD_CLOCK_STYLE_TIME),
-        order = 2,
-    },
-}
-MOD.fontSize = 5
-
--- OVERRIDES
-
-function MOD:Enable(options)
-    self:d('Enable (in debug-mode)')
-    self.dataUpdated = true
-end -- MOD:Enable
-
-function MOD:Set(key,value)
-    self:d('Set['..key..']',value)
-
-    if(key=='style')then
-        if(value~=GetString(SI_AWEMOD_CLOCK_STYLE_DATETIME_LONG))then
-            self.label[CLOCK_TYPE_DATE]:SetText('')
-        end
-    end
-    self.dataUpdated = true
-end -- MOD:Set
-
--- EVENT LISTENER
-
-function MOD:GetEventListeners()
-    return {
-        {
-            eventCode = EVENT_AWESOME_MODULE_TIMER,
-            callback = function(eventCode, timestamp) return MOD:OnTimer(timestamp) end,
-        },
-    }
-end -- MOD:GetEventListeners
-
--- EVENT HANDLER
-
-function MOD:OnTimer(timestamp)
-    self:d('OnTimer')
-    self.dataUpdated = true
-    self:d(' => dataUpdated')
-end -- MOD:OnTimer
-
--- LABEL HANDLER
-
-local function GetDateString(short)
-    local date = GetDate()
-    local year,month,day = string.sub(date,1,4), string.sub(date,5,6), string.sub(date,7,8)
-    local dateString = short and GetString(SI_AWEMOD_CLOCK_DATEFORMAT_SHORT) or GetString(SI_AWEMOD_CLOCK_DATEFORMAT_LONG)
-    dateString = string.gsub(dateString,"year",year,1)
-    dateString = string.gsub(dateString,"day",day,1)
-    dateString = string.gsub(dateString,"month",month,1)
-    return dateString
-end -- GetDateString
-
-function MOD:Update(options)
-    self:d('Update',options)
-    local labelText = ''
-
-    if(options.style == GetString(SI_AWEMOD_CLOCK_STYLE_DATETIME_LONG)) then
-        self.label[CLOCK_TYPE_DATE]:SetText(GetDateString(false))
-    elseif(options.style == GetString(SI_AWEMOD_CLOCK_STYLE_DATETIME_SHORT)) then
-        labelText = GetDateString(true) .. ' - '
-    end
-
-    local timeFormat = TIME_FORMAT_PRECISION_TWELVE_HOUR
-    if (options.hoursFormat24) then
-        timeFormat = TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR
-    end
-    labelText = labelText .. FormatTimeSeconds(GetSecondsSinceMidnight(), TIME_FORMAT_STYLE_CLOCK_TIME, timeFormat, TIME_FORMAT_DIRECTION_NONE)
-    self.label[CLOCK_TYPE_TIME]:SetText(labelText)
-end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents/Modules/Crafting.lua b/AwesomeEvents/Modules/Crafting.lua
deleted file mode 100644
index 66b106d..0000000
--- a/AwesomeEvents/Modules/Crafting.lua
+++ /dev/null
@@ -1,209 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: Crafting.lua
-  Last Modified: 02.11.17 16:36
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-local MOD = libAM:New('crafting')
-
-MOD.title = GetString(SI_AWEMOD_CRAFTING)
-MOD.hint = GetString(SI_AWEMOD_CRAFTING_HINT)
-MOD.order = 35
-MOD.debug = false
-
-MOD.label = {
-    [CRAFTING_TYPE_BLACKSMITHING] = {},
-    [CRAFTING_TYPE_CLOTHIER] = {},
-    [CRAFTING_TYPE_WOODWORKING] = {}
-}
-
--- USER SETTINGS
-
-MOD.options = {
-    showBlacksmithing = {
-        type = 'checkbox',
-        name = GetString(SI_AWEMOD_CRAFTING_BLACKSMITHING),
-        tooltip = GetString(SI_AWEMOD_CRAFTING_BLACKSMITHING_HINT),
-        default = true,
-        order = 1,
-    },
-    showClothier = {
-        type = 'checkbox',
-        name = GetString(SI_AWEMOD_CRAFTING_CLOTHING),
-        tooltip = GetString(SI_AWEMOD_CRAFTING_CLOTHING_HINT),
-        default = true,
-        order = 2,
-    },
-    showWoodworking = {
-        type = 'checkbox',
-        name = GetString(SI_AWEMOD_CRAFTING_WOODWORKING),
-        tooltip = GetString(SI_AWEMOD_CRAFTING_WOODWORKING_HINT),
-        default = true,
-        order = 3,
-    },
-    minutesLeftInfo = {
-        type = 'slider',
-        name = GetString(SI_AWEMOD_CRAFTING_TIMER),
-        tooltip = GetString(SI_AWEMOD_CRAFTING_TIMER_HINT),
-        min  = 1,
-        max = 960,
-        default = 480,
-        order = 4,
-    },
-}
-
--- OVERRIDES
-
-function MOD:Enable(options)
-    self:d('Enable (in debug-mode)')
-    self.data[CRAFTING_TYPE_BLACKSMITHING] = { unusedSlots = 0, availableAt = 0, minutesLeft = 9999, name = GetString(SI_ITEMFILTERTYPE13)}
-    self.data[CRAFTING_TYPE_CLOTHIER] = { unusedSlots = 0, availableAt = 0, minutesLeft = 9999, name = GetString(SI_ITEMFILTERTYPE14)}
-    self.data[CRAFTING_TYPE_WOODWORKING] = { unusedSlots = 0, availableAt = 0, minutesLeft = 9999, name = GetString(SI_ITEMFILTERTYPE15) }
-
-    if(options.showBlacksmithing)then
-        self:OnSmithingTraitResearch(CRAFTING_TYPE_BLACKSMITHING)
-    end
-    if(options.showClothier)then
-        self:OnSmithingTraitResearch(CRAFTING_TYPE_CLOTHIER)
-    end
-    if(options.showWoodworking)then
-        self:OnSmithingTraitResearch(CRAFTING_TYPE_WOODWORKING)
-    end
-    self.dataUpdated = true
-end -- MOD:Enable
-
-function MOD:Set(key,value)
-    self:d('Set['..key..']',value)
-
-    if(key=='showBlacksmithing')then
-        if(value)then
-            self:OnSmithingTraitResearch(CRAFTING_TYPE_BLACKSMITHING)
-        else
-            self.label[CRAFTING_TYPE_BLACKSMITHING]:SetText('')
-            self.dataUpdated = true
-        end
-    elseif(key=='showClothier')then
-        if(value)then
-            self:OnSmithingTraitResearch(CRAFTING_TYPE_CLOTHIER)
-        else
-            self.label[CRAFTING_TYPE_CLOTHIER]:SetText('')
-            self.dataUpdated = true
-        end
-    elseif(key=='showWoodworking')then
-        if(value)then
-            self:OnSmithingTraitResearch(CRAFTING_TYPE_WOODWORKING)
-        else
-            self.label[CRAFTING_TYPE_WOODWORKING]:SetText('')
-            self.dataUpdated = true
-        end
-    elseif(key=='minutesLeftInfo')then
-        self:OnTimer(GetTimeStamp())
-    end
-end -- MOD:Set
-
--- EVENT LISTENER
--- EVENT_SMITHING_TRAIT_RESEARCH_TIMES_UPDATED(eventCode)
-function MOD:GetEventListeners()
-    return {
-        {
-            eventCode = EVENT_AWESOME_MODULE_TIMER,
-            callback = function(eventCode, timestamp) return MOD:OnTimer(timestamp) end,
-        },
-        {
-            eventCode = EVENT_SMITHING_TRAIT_RESEARCH_STARTED,
-            callback = function(eventCode, craftingSkillType, researchLineIndex, traitIndex) MOD:OnSmithingTraitResearch(craftingSkillType) end,
-        },
-        {
-            eventCode = EVENT_SMITHING_TRAIT_RESEARCH_COMPLETED,
-            callback = function(eventCode, craftingSkillType, researchLineIndex, traitIndex) MOD:OnSmithingTraitResearch(craftingSkillType) end,
-        },
-    }
-end
-
--- EVENT HANDLER
-
-function MOD:OnTimer(timestamp)
-    self:d('OnTimer')
-    local i
-    for i,_data in pairs(self.data) do
-        if(_data.availableAt > 0)then
-            self.data[i].minutesLeft = math.ceil( GetDiffBetweenTimeStamps(_data.availableAt, timestamp) / 60)
-            self.dataUpdated = true
-            self:d(' => dataUpdated')
-        end
-    end
-
-    if(self.data[CRAFTING_TYPE_BLACKSMITHING].availableAt == 0 and self.data[CRAFTING_TYPE_CLOTHIER].availableAt == 0 and self.data[CRAFTING_TYPE_WOODWORKING].availableAt == 0)then
-        self:StopTimer()
-    end
-end
-
-function MOD:OnSmithingTraitResearch(craftingSkillType)
-    self:d('OnSmithingResearchTrait '.. craftingSkillType)
-    local maxTimer = 2000000
-    local maxResearch = GetMaxSimultaneousSmithingResearch(craftingSkillType)   -- This is the number of research slots
-    local maxLines = GetNumSmithingResearchLines(craftingSkillType)     -- This is the number of different items craftable by this profession
-    for i = 1, maxLines, 1 do       -- loop through the different craftable items, looking to see if there is research on that item
-        local name, icon, numTraits, timeRequiredForNextResearchSecs = GetSmithingResearchLineInfo(craftingSkillType, i)  -- Get info on that specific item
-        for j = 1, numTraits, 1 do      -- loop through the traits, looking for one that is being researched
-            local duration, timeRemaining = GetSmithingResearchLineTraitTimes(craftingSkillType, i, j)
-            if (duration ~= nil and timeRemaining ~= nil) then
-                maxResearch = maxResearch - 1
-                maxTimer = math.min(maxTimer,timeRemaining)
-            end
-        end
-    end
-    if (maxResearch > 0) then   -- There is an unused research slots
-        self.data[craftingSkillType].availableAt = 0
-        self.data[craftingSkillType].minutesLeft = 0
-    else
-        local timestamp = GetTimeStamp()
-        self.data[craftingSkillType].availableAt = timestamp + maxTimer
-        self.data[craftingSkillType].minutesLeft = math.ceil(maxTimer / 60)
-        self:StartTimer()
-    end
-    self.data[craftingSkillType].unusedSlots = maxResearch
-
-    self.dataUpdated = true
-    self:d(' => dataUpdated')
-end
-
--- LABEL HANDLER
-
-function MOD:Update(options)
-    self:d('Update')
-    if(options.showBlacksmithing) then
-        self.label[CRAFTING_TYPE_BLACKSMITHING]:SetText(self.FormatLabelText(self.data[CRAFTING_TYPE_BLACKSMITHING], options.minutesLeftInfo))
-    end
-    if(options.showClothier) then
-        self.label[CRAFTING_TYPE_CLOTHIER]:SetText(self.FormatLabelText(self.data[CRAFTING_TYPE_CLOTHIER], options.minutesLeftInfo))
-    end
-    if(options.showWoodworking) then
-        self.label[CRAFTING_TYPE_WOODWORKING]:SetText(self.FormatLabelText(self.data[CRAFTING_TYPE_WOODWORKING], options.minutesLeftInfo))
-    end
-end
-
-function MOD.FormatLabelText(data, minutesLeftInfo)
-    local text = ''
-    if (data.minutesLeft <= minutesLeftInfo) then
-        if (data.minutesLeft == 0) then
-            text = MOD.Colorize(COLOR_AWEVS_AVAILABLE,data.name) .. ': ' .. data.unusedSlots .. ' ' .. GetString(SI_AWEMOD_CRAFTING_AVAILABLE_LABEL)
-        else
-            text = MOD.Colorize(COLOR_AWEVS_HINT,data.name) .. ': ' .. FormatTimeSeconds(60 * data.minutesLeft, TIME_FORMAT_STYLE_DESCRIPTIVE_SHORT , TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR , TIME_FORMAT_DIRECTION_NONE)
-        end
-    end
-    return text
-end
-
--- |c82D482 GREEN
--- |cD4CD82 YELLOW
--- |cD49682 RED
--- |r WHITE
\ No newline at end of file
diff --git a/AwesomeEvents/Modules/Durability.lua b/AwesomeEvents/Modules/Durability.lua
deleted file mode 100644
index 474532b..0000000
--- a/AwesomeEvents/Modules/Durability.lua
+++ /dev/null
@@ -1,141 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: Durability.lua
-  Last Modified: 02.11.17 16:36
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-local MOD = libAM:New('durability')
-
-MOD.title = GetString(SI_AWEMOD_DURABILITY)
-MOD.hint = GetString(SI_AWEMOD_DURABILITY_HINT)
-MOD.order = 50
-MOD.debug = false
-
--- OVERRIDES
-
--- USER SETTINGS
-
-MOD.options = {
-    valueLowInfo = {
-        type = 'slider',
-        name = GetString(SI_AWEMOD_DURABILITY_INFO),
-        tooltip = GetString(SI_AWEMOD_DURABILITY_INFO_HINT),
-        min  = 1,
-        max = 60,
-        default = 50,
-        order = 1,
-    },
-    valueLowWarning = {
-        type = 'slider',
-        name = GetString(SI_AWEMOD_DURABILITY_WARNING),
-        tooltip = GetString(SI_AWEMOD_DURABILITY_WARNING_HINT),
-        min  = 1,
-        max = 40,
-        default = 25,
-        order = 2,
-    },
-}
-MOD.fontSize = 4
-
--- OVERRIDES
-
-function MOD:Enable(options)
-    self:d('Enable (in debug-mode)')
-    self.data = {
-        minimumValue = 9999,
-        repairCost = 0,
-    }
-    self:OnInventorySingleSlotUpdate(0)
-    self.dataUpdated = true
-end
-
--- EVENT LISTENER
-
-function MOD:GetEventListeners()
-    return {
-        {
-            eventCode = EVENT_INVENTORY_SINGLE_SLOT_UPDATE,
-            callback = function(eventCode, bagId, slotId, isNewItem, itemSoundCategory, inventoryUpdateReason, stackCountChange)
-                if(bagId == BAG_WORN and inventoryUpdateReason == INVENTORY_UPDATE_REASON_DURABILITY_CHANGE) then
-                    MOD:OnInventorySingleSlotUpdate(slotId)
-                end
-            end,
-        }
-    }
-end
-
--- EVENT HANDLER
-
-function MOD:OnInventorySingleSlotUpdate(slotId)
-    self:d('OnInventorySingleSlotUpdate ' .. slotId)
-    -- use slotId if not nil
-    --[[
-    EQUIP_SLOT_HEAD = 0
-    EQUIP_SLOT_NECK = 1
-    EQUIP_SLOT_CHEST = 2
-    EQUIP_SLOT_SHOULDERS = 3
-    EQUIP_SLOT_MAIN_HAND = 4
-    EQUIP_SLOT_OFF_HAND = 5
-    EQUIP_SLOT_WAIST = 6
-    EQUIP_SLOT_WRIST = 7
-    EQUIP_SLOT_LEGS = 8
-    EQUIP_SLOT_FEET = 9
-    EQUIP_SLOT_COSTUME = 10
-    EQUIP_SLOT_RING1 = 11
-    EQUIP_SLOT_RING2 = 12
-    EQUIP_SLOT_POISON = 13
-    EQUIP_SLOT_BACKUP_POISON = 14
-    EQUIP_SLOT_RANGED = 15
-    EQUIP_SLOT_HAND = 16
-    EQUIP_SLOT_CLASS1 = 17
-    EQUIP_SLOT_CLASS2 = 18
-    EQUIP_SLOT_CLASS3 = 19
-    EQUIP_SLOT_BACKUP_MAIN = 20
-    EQUIP_SLOT_BACKUP_OFF = 21
-    EQUIP_SLOT_MAX_VALUE = 21
-    EQUIP_SLOT_MIN_VALUE = -1
-
-    EQUIP_SLOT_NONE = -1
-    EQUIP_SLOT_TRINKET1 = 222
-    EQUIP_SLOT_TRINKET2 = 222
-    ]]--
-
-    local repairAllCost = GetRepairAllCost()
-    if( repairAllCost ~= self.data.repairCost ) then
-        self.data.repairCost = repairAllCost
-
-        local minDura = 100
-        for i=0,16,1 do
-            if (DoesItemHaveDurability(BAG_WORN,i)) then
-                minDura = math.min(minDura,GetItemCondition(BAG_WORN,i))
-            end
-        end
-        self.data.minimumValue = minDura
-        self.dataUpdated = true
-        self:d(' => dataUpdated')
-    end
-end
-
--- LABEL HANDLER
-
-function MOD:Update(options)
-    self:d('Update')
-    local labelText = ''
-    if (self.data.minimumValue <= options.valueLowInfo) then
-        if (self.data.minimumValue <= options.valueLowWarning) then
-            labelText = MOD.Colorize(COLOR_AWEVS_WARNING, GetString(SI_AWEMOD_DURABILITY_LABEL)) .. ': ' .. self.data.minimumValue .. '%'
-        else
-            labelText = MOD.Colorize(COLOR_AWEVS_HINT, GetString(SI_AWEMOD_DURABILITY_LABEL)) .. ': ' .. self.data.minimumValue .. '%'
-        end
-        labelText = labelText .. ' (' .. self.data.repairCost .. 'g)'
-    end
-    self.label:SetText(labelText)
-end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents/Modules/Fencing.lua b/AwesomeEvents/Modules/Fencing.lua
deleted file mode 100644
index f136270..0000000
--- a/AwesomeEvents/Modules/Fencing.lua
+++ /dev/null
@@ -1,205 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: Fencing.lua
-  Last Modified: 02.11.17 16:36
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-local MOD = libAM:New('fencing')
-
-MOD.title = GetString(SI_AWEMOD_FENCING)
-MOD.hint = GetString(SI_AWEMOD_FENCING_HINT)
-MOD.order = 45
-MOD.debug = false
-
--- USER SETTINGS
-
-MOD.options = {
-    showSellsLeft = {
-        type = 'checkbox',
-        name = GetString(SI_AWEMOD_FENCING_SELLS),
-        tooltip = GetString(SI_AWEMOD_FENCING_SELLS_HINT),
-        default = true,
-        order = 1,
-    },
-    sellsLeftInfo = {
-        type = 'slider',
-        name = GetString(SI_AWEMOD_FENCING_SELLS_INFO),
-        tooltip = GetString(SI_AWEMOD_FENCING_SELLS_INFO_HINT),
-        min  = 0,
-        max = 50,
-        default = 30,
-        order = 2,
-    },
-    sellsLeftWarning = {
-        type = 'slider',
-        name = GetString(SI_AWEMOD_FENCING_SELLS_WARNING),
-        tooltip = GetString(SI_AWEMOD_FENCING_SELLS_WARNING_HINT),
-        min  = 0,
-        max = 50,
-        default = 10,
-        order = 3,
-    },
-    showLaundersLeft = {
-        type = 'checkbox',
-        name = GetString(SI_AWEMOD_FENCING_LAUNDERS),
-        tooltip = GetString(SI_AWEMOD_FENCING_LAUNDERS_HINT),
-        default = true,
-        order = 4,
-    },
-    laundersLeftInfo = {
-        type = 'slider',
-        name = GetString(SI_AWEMOD_FENCING_LAUNDERS_INFO),
-        tooltip = GetString(SI_AWEMOD_FENCING_LAUNDERS_INFO_HINT),
-        min  = 0,
-        max = 50,
-        default = 30,
-        order = 5,
-    },
-    laundersLeftWarning = {
-        type = 'slider',
-        name = GetString(SI_AWEMOD_FENCING_LAUNDERS_WARNING),
-        tooltip = GetString(SI_AWEMOD_FENCING_LAUNDERS_WARNING_HINT),
-        min  = 0,
-        max = 50,
-        default = 10,
-        order = 6,
-    },
-}
-
--- OVERRIDES
-
-function MOD:Enable(options)
-    self:d('Enable (in debug-mode)')
-    self.data.fenceOpened = false
-    self.data.sells = { total = 0, left = 0, resetAt = 1, minutesLeft = 0, name = GetString(SI_AWEMOD_FENCING_SELLS_LABEL)}
-    self.data.launders = { total = 0, left = 0, resetAt = 1, minutesLeft = 0, name = GetString(SI_AWEMOD_FENCING_LAUNDERS_LABEL)}
-    self.dataUpdated = true
-end
-
--- EVENT LISTENER
-
-function MOD:GetEventListeners()
-    return {
-        {
-            eventCode = EVENT_AWESOME_MODULE_TIMER,
-            callback = function(eventCode, timestamp) return MOD:OnTimer(timestamp) end,
-        },
-        {
-            eventCode = EVENT_OPEN_FENCE,
-            callback = function(eventCode,allowSell,allowLaunder) MOD.data.fenceOpened = true end,
-        },
-        {
-            eventCode = EVENT_CLOSE_STORE,
-            callback = function(eventCode) if(MOD.data.fenceOpened)then MOD:OnCloseStore(GetTimeStamp()) end end,
-        },
-    }
-end
-
--- EVENT HANDLER
-
-function MOD:OnTimer(timestamp)
-    self:d('OnTimer')
-    if(self.data.sells.left == 0 and self.data.sells.resetAt > 0)then
-        if(timestamp >  self.data.sells.resetAt)then
-            self:OnCloseStore(timestamp)
-            return
-        else
-            self.data.sells.minutesLeft = math.ceil( GetDiffBetweenTimeStamps(self.data.sells.resetAt, timestamp) / 60)
-            self.dataUpdated = true
-            self:d(' => dataUpdated')
-        end
-    end
-
-    if(self.data.launders.left == 0 and self.data.launders.resetAt > 0)then
-        if(timestamp >  self.data.launders.resetAt)then
-            self:OnCloseStore(timestamp)
-            return
-        else
-            self.data.launders.minutesLeft = math.ceil( GetDiffBetweenTimeStamps(self.data.launders.resetAt, timestamp) / 60)
-            self.dataUpdated = true
-            self:d(' => dataUpdated')
-        end
-    end
-
-    if(self.data.sells.left > 0 and self.data.launders.left > 0)then
-        return 0
-    end
-end
-
-
-function MOD:OnCloseStore(timestamp)
-    self:d('OnCloseStore')
-    self.data.fenceOpened = false
-    local used, resetSeconds
-
-    self.data.sells.total, used, resetSeconds = GetFenceSellTransactionInfo()
-    self.data.sells.left = self.data.sells.total - used
-    if(self.data.sells.left == 0)then
-        self.data.sells.resetAt = timestamp + resetSeconds
-        self.data.sells.minutesLeft = math.ceil(resetSeconds / 60)
-        self:StartTimer()
-    else
-        self.data.sells.resetAt = 0
-        self.data.sells.minutesLeft = 0
-    end
-
-
-    self.data.launders.total, used, resetSeconds = GetFenceLaunderTransactionInfo()
-    self.data.launders.left = self.data.launders.total - used
-    if(self.data.launders.left == 0)then
-        self.data.launders.resetAt = timestamp + resetSeconds
-        self.data.launders.minutesLeft = math.ceil(resetSeconds / 60)
-        self:StartTimer()
-    else
-        self.data.launders.resetAt = 0
-        self.data.launders.minutesLeft = 0
-    end
-
-    self.dataUpdated = true
-    self:d(' => dataUpdated')
-end -- MOD:OnFenceUpdate
-
--- LABEL HANDLER
-
-function MOD:Update(options)
-    self:d('Update',options,self.data.sells)
-    local labelText = ''
-
-    -- show only one timer if both would show up
-    if(options.showSellsLeft and self.data.sells.left == 0 and options.showLaundersLeft and self.data.launders.left == 0)then
-        self.label:SetText(
-            MOD.Colorize(COLOR_AWEVS_HINT, GetString(SI_AWEMOD_FENCING_SELLS_LABEL) .. ' & ' .. GetString(SI_AWEMOD_FENCING_LAUNDERS_LABEL)) .. ': ' .. FormatTimeSeconds(60 * self.data.sells.minutesLeft, TIME_FORMAT_STYLE_DESCRIPTIVE_SHORT , TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR , TIME_FORMAT_DIRECTION_NONE)
-        )
-        return
-    end
-
-    -- show sells
-    if (options.showSellsLeft and self.data.sells.left <= options.sellsLeftInfo) then
-        if(self.data.sells.left == 0)then
-            labelText = MOD.Colorize(COLOR_AWEVS_HINT, GetString(SI_AWEMOD_FENCING_SELLS_LABEL)) .. ': ' .. FormatTimeSeconds(60 * self.data.sells.minutesLeft, TIME_FORMAT_STYLE_DESCRIPTIVE_SHORT , TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR , TIME_FORMAT_DIRECTION_NONE)
-        else
-            local color = (self.data.sells.left <= options.sellsLeftWarning) and COLOR_AWEVS_WARNING or COLOR_AWEVS_HINT
-            labelText = MOD.Colorize(color, GetString(SI_AWEMOD_FENCING_SELLS_LABEL)) .. ': ' .. self.data.sells.left
-        end
-    end
-
-    -- show launders
-    if (options.showLaundersLeft and self.data.launders.left <= options.laundersLeftInfo) then
-        if (labelText ~= '') then labelText = labelText .. MOD.Colorize(COLOR_AWEVS_HINT, ' || ') end
-        if(self.data.launders.left == 0)then
-            labelText = labelText .. MOD.Colorize(COLOR_AWEVS_HINT, GetString(SI_AWEMOD_FENCING_LAUNDERS_LABEL)) .. ': ' .. FormatTimeSeconds(60 * self.data.launders.minutesLeft, TIME_FORMAT_STYLE_DESCRIPTIVE_SHORT , TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR , TIME_FORMAT_DIRECTION_NONE)
-        else
-            local color = (self.data.launders.left <= options.laundersLeftWarning) and COLOR_AWEVS_WARNING or COLOR_AWEVS_HINT
-            labelText = labelText .. MOD.Colorize(color, GetString(SI_AWEMOD_FENCING_LAUNDERS_LABEL)) .. ': ' .. self.data.launders.left
-        end
-    end
-    self.label:SetText(labelText)
-end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents/Modules/Inventory.lua b/AwesomeEvents/Modules/Inventory.lua
deleted file mode 100644
index b4e0629..0000000
--- a/AwesomeEvents/Modules/Inventory.lua
+++ /dev/null
@@ -1,227 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: Inventory.lua
-  Last Modified: 02.11.17 16:36
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-local MOD = libAM:New('inventory')
-
-MOD.title = GetString(SI_AWEMOD_INVENTORY)
-MOD.hint = GetString(SI_AWEMOD_INVENTORY_HINT)
-MOD.order = 60
-MOD.debug = false
-
-local LABEL_LOW = 1
-local LABEL_DETAILS = 2
-local LABEL_MONEY = 3
-
-MOD.label = {
-    [LABEL_LOW] = {},
-    [LABEL_DETAILS] = {},
-    [LABEL_MONEY] = {}
-}
-
--- USER SETTINGS
-
-MOD.options = {
-    showLow = {
-        type = 'checkbox',
-        name = GetString(SI_AWEMOD_INVENTORY_LOW),
-        tooltip = GetString(SI_AWEMOD_INVENTORY_LOW_HINT),
-        default = true,
-        order = 1,
-    },
-    valueLowInfo = {
-        type = 'slider',
-        name = GetString(SI_AWEMOD_INVENTORY_LOW_INFO),
-        tooltip = GetString(SI_AWEMOD_INVENTORY_LOW_INFO_HINT),
-        min  = 1,
-        max = 60,
-        default = 20,
-        order = 2,
-    },
-    valueLowWarning = {
-        type = 'slider',
-        name = GetString(SI_AWEMOD_INVENTORY_LOW_WARNING),
-        tooltip = GetString(SI_AWEMOD_INVENTORY_LOW_WARNING_HINT),
-        min  = 1,
-        max = 40,
-        default = 10,
-        order = 3,
-    },
-    showDetails = {
-        type = 'checkbox',
-        name = GetString(SI_AWEMOD_INVENTORY_DETAILS),
-        tooltip = GetString(SI_AWEMOD_INVENTORY_DETAILS_HINT),
-        default = true,
-        order = 4,
-    },
-    showMoney = {
-        type = 'checkbox',
-        name = GetString(SI_AWEMOD_INVENTORY_MONEY),
-        tooltip = GetString(SI_AWEMOD_INVENTORY_MONEY_HINT),
-        default = true,
-        order = 5,
-    },
-}
-
--- OVERRIDES
-
-function MOD:Enable(options)
-    self:d('Enable (in debug-mode)')
-    self.data = {
-        [BAG_BACKPACK] = {
-            numUsedSlots = 0,
-            numFreeSlots = 0,
-            numSlots = 0,
-            money = GetCurrentMoney(),
-        },
-        [BAG_BANK] = {
-            numUsedSlots = 0,
-            numFreeSlots = 0,
-            numSlots = 0,
-            money = GetBankedMoney(),
-        },
-    }
-    self:OnUpdateBag(BAG_BACKPACK,0)
-    self:OnUpdateBag(BAG_BANK,0)
-    self.dataUpdated = true
-end -- MOD:Enable
-
-function MOD:Set(key,value)
-    self:d('Set['..key..']',value)
-
-    if(key=='showLow')then
-        if(value)then
-            self:OnUpdateBag(BAG_BACKPACK,0)
-        else
-            self.label[LABEL_LOW]:SetText('')
-        end
-    elseif(key=='showDetails')then
-        if(value)then
-            self:OnUpdateBag(BAG_BACKPACK,0)
-            self:OnUpdateBag(BAG_BANK,0)
-        else
-            self.label[LABEL_DETAILS]:SetText('')
-        end
-    elseif(key=='showMoney')then
-        if(value)then
-            self.data[BAG_BACKPACK].money = GetCurrentMoney()
-            self.data[BAG_BANK].money = GetBankedMoney()
-        else
-            self.label[LABEL_MONEY]:SetText('')
-        end
-    else
-        self:OnUpdateBag(BAG_BACKPACK,0)
-        self:OnUpdateBag(BAG_BANK,0)
-    end
-    self.dataUpdated = true
-end -- MOD:Set
-
--- EVENT LISTENER
-function MOD:GetEventListeners()
-    return {
-        {
-            eventCode = EVENT_INVENTORY_SINGLE_SLOT_UPDATE,
-            callback = function(eventCode, bagId, slotId, isNewItem, itemSoundCategory, inventoryUpdateReason, stackCountChange)
-                if(bagId == BAG_BACKPACK or bagId == BAG_BANK) then
-                    self:OnUpdateBag(bagId,stackCountChange)
-                end
-            end
-        },
-        {
-            eventCode = EVENT_INVENTORY_BAG_CAPACITY_CHANGED,
-            callback = function(eventCode, previousCapacity, currentCapacity, previousUpgrade, currentUpgrade)
-                self:d("EVENT_INVENTORY_BAG_CAPACITY_CHANGED: ", previousCapacity .. '=>' .. currentCapacity, previousUpgrade .. '=>' .. currentUpgrade)
-                self:OnUpdateBag(BAG_BACKPACK,previousCapacity-currentCapacity)
-            end
-        },
-        {
-            eventCode = EVENT_INVENTORY_BANK_CAPACITY_CHANGED,
-            callback = function(eventCode, previousCapacity, currentCapacity, previousUpgrade, currentUpgrade)
-                self:d("EVENT_INVENTORY_BANK_CAPACITY_CHANGED: ", previousCapacity .. '=>' .. currentCapacity, previousUpgrade .. '=>' .. currentUpgrade)
-                self:OnUpdateBag(BAG_BANK,previousCapacity-currentCapacity)
-            end
-        },
-        {
-            eventCode = EVENT_MONEY_UPDATE,
-            callback = function(eventCode, newMoney, oldMoney, reason)
-                self:d("EVENT_MONEY_UPDATE: ", oldMoney .. '=>' .. newMoney .. ' Reason: ' .. reason)
-                self.data[BAG_BACKPACK].money = newMoney
-                self.dataUpdated = true
-            end
-        },
-        {
-            eventCode = EVENT_BANKED_MONEY_UPDATE,
-            callback = function(eventCode, newBankedMoney, oldBankedMoney)
-                self:d("EVENT_BANKED_MONEY_UPDATE: ", oldBankedMoney .. '=>' .. newBankedMoney)
-                self.data[BAG_BANK].money = newBankedMoney
-                self.dataUpdated = true
-            end
-        }
-    }
-end -- MOD:GetEventListeners
-
--- EVENT HANDLER
-
-function MOD:OnUpdateBag(bagId,stackCountChange)
-    local predicted = self.data[bagId].numFreeSlots - stackCountChange
-    local numFreeSlots, numUsedSlots, numSlots = GetNumBagFreeSlots(bagId),GetNumBagUsedSlots(bagId),GetBagSize(bagId)
-    -- eso+ bank fix
-    if(bagId==BAG_BANK and IsESOPlusSubscriber())then
-        numFreeSlots = numFreeSlots + GetNumBagFreeSlots(BAG_SUBSCRIBER_BANK)
-        numUsedSlots = numUsedSlots + GetNumBagUsedSlots(BAG_SUBSCRIBER_BANK)
-        numSlots = numSlots + GetBagSize(BAG_SUBSCRIBER_BANK)
-    end
-
-    if( numFreeSlots ~= self.data[bagId].numFreeSlots or numSlots ~= self.data[bagId].numSlots) then
-        self.data[bagId].numSlots = numSlots
-        self.data[bagId].numUsedSlots = numUsedSlots
-        self.data[bagId].numFreeSlots = numFreeSlots
-        self.dataUpdated = true
-        if(predicted ~= self.data[bagId].numFreeSlots)then
-            self:d(' => dataUpdated('..bagId..') Pred.: ' .. predicted .. ' / Act.:' .. self.data[bagId].numFreeSlots)
-        else
-            self:d(' => dataUpdated('..bagId..')')
-        end
-    end
-end -- MOD:OnUpdateBag
-
--- LABEL HANDLER
-
-local function __MoneyInK(money)
-    return math.floor(money/100) / 10
-end
-
-function MOD:Update(options)
-    self:d('Update')
-
-    if(options.showLow)then
-        local labelText = ''
-        if (self.data[BAG_BACKPACK].numFreeSlots <= options.valueLowInfo) then
-            if (self.data[BAG_BACKPACK].numFreeSlots <= options.valueLowWarning) then
-                labelText = MOD.Colorize(COLOR_AWEVS_WARNING, zo_strformat(SI_AWEMOD_INVENTORY_LOW_LABEL, self.data[BAG_BACKPACK].numFreeSlots))
-            else
-                labelText = MOD.Colorize(COLOR_AWEVS_HINT, zo_strformat(SI_AWEMOD_INVENTORY_LOW_LABEL, self.data[BAG_BACKPACK].numFreeSlots))
-            end
-        end
-        self.label[LABEL_LOW]:SetText(labelText)
-    end
-
-    if(options.showDetails)then
-        self.label[LABEL_DETAILS]:SetText(zo_strformat(SI_AWEMOD_INVENTORY_DETAILS_LABEL,MOD.GetColorStr(COLOR_AWEVS_HINT),self.data[BAG_BACKPACK].numUsedSlots,self.data[BAG_BACKPACK].numSlots,self.data[BAG_BANK].numUsedSlots,self.data[BAG_BANK].numSlots))
-    end
-
-
-    if(options.showMoney)then
-        self.label[LABEL_MONEY]:SetText(MOD.Colorize(COLOR_AWEVS_AVAILABLE, zo_strformat(SI_AWEMOD_INVENTORY_MONEY_LABEL,__MoneyInK(self.data[BAG_BACKPACK].money),__MoneyInK(self.data[BAG_BANK].money))))
-    end
-end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents/Modules/Mails.lua b/AwesomeEvents/Modules/Mails.lua
deleted file mode 100644
index 0ecead8..0000000
--- a/AwesomeEvents/Modules/Mails.lua
+++ /dev/null
@@ -1,68 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: Mails.lua
-  Last Modified: 02.11.17 16:36
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-local MOD = libAM:New('mails')
-
-MOD.title = GetString(SI_AWEMOD_MAILS)
-MOD.hint = GetString(SI_AWEMOD_MAILS_HINT)
-MOD.order = 15
-MOD.debug = false
-
--- OVERRIDES
-
--- USER SETTINGS
-
--- OVERRIDES
-
-function MOD:Enable(options)
-    self:d('Enable (in debug-mode)')
-    self.data = {
-        numUnread = 0,
-    }
-    self:OnMailNumUnreadChanged(GetNumUnreadMail())
-    self.dataUpdated = true
-end
-
--- EVENT LISTENER
-
-function MOD:GetEventListeners()
-    return {
-        {
-            eventCode = EVENT_MAIL_NUM_UNREAD_CHANGED,
-            callback = function(eventCode,numUnread) MOD:OnMailNumUnreadChanged(numUnread) end
-        }
-    }
-end
-
--- EVENT HANDLER
-
-function MOD:OnMailNumUnreadChanged(numUnread)
-    self:d('OnMailNumUnreadChanged ' .. numUnread)
-    if( numUnread ~= self.data.numUnread ) then
-        self.data.numUnread = numUnread
-        self.dataUpdated = true
-        self:d(' => dataUpdated')
-    end
-end
-
--- LABEL HANDLER
-
-function MOD:Update(options)
-    self:d('Update')
-    local labelText = ''
-    if (self.data.numUnread > 0) then
-        labelText = MOD.Colorize(COLOR_AWEVS_AVAILABLE, GetString(SI_AWEMOD_MAILS_LABEL)) .. ': ' .. self.data.numUnread
-    end
-    self.label:SetText(labelText)
-end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents/Modules/Mount.lua b/AwesomeEvents/Modules/Mount.lua
deleted file mode 100644
index b733530..0000000
--- a/AwesomeEvents/Modules/Mount.lua
+++ /dev/null
@@ -1,124 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: Mount.lua
-  Last Modified: 02.11.17 16:36
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-local MOD = libAM:New('mount')
-
-MOD.title = GetString(SI_AWEMOD_MOUNT)
-MOD.hint = GetString(SI_AWEMOD_MOUNT_HINT)
-MOD.order = 30
-MOD.debug = false
-
--- USER SETTINGS
-
-MOD.options = {
-    minutesLeftInfo = {
-        type = "slider",
-        name = GetString(SI_AWEMOD_MOUNT_TIMER),
-        tooltip = GetString(SI_AWEMOD_MOUNT_TIMER_HINT),
-        min  = 1,
-        max = 960,
-        default = 480,
-        order = 1,
-    },
-}
-
--- OVERRIDES
-
-function MOD:Enable(options)
-    self:d('Enable (in debug-mode)')
-    self.data = {
-        hasTrainableMount = false,
-        availableAt = 1,
-        minutesLeft = 0
-    }
-    self.dataUpdated = true
-end
-
--- EVENT LISTENER
-
--- EVENT_ACTIVE_MOUNT_CHANGED (number eventCode)
--- EVENT_RIDING_SKILL_IMPROVEMENT (integer eventCode,number ridingSkillType, number previous, number current, number source)
--- EVENT_STABLE_INTERACT_END (number eventCode)
--- EVENT_MOUNT_INFO_UPDATED (number eventCode)
-function MOD:GetEventListeners()
-    return {
-        {
-            eventCode = EVENT_AWESOME_MODULE_TIMER,
-            callback = function(eventCode, timestamp) return MOD:OnTimer(timestamp) end,
-        },
-        {
-            eventCode = EVENT_RIDING_SKILL_IMPROVEMENT,
-            callback = function(eventCode, ridingSkillType, previous, current, source) MOD:OnRidingSkillImprovement() end,
-        },
-    }
-end
-
--- EVENT HANDLER
-
-function MOD:OnTimer(timestamp)
-    self:d('OnTimer')
-    if(self.data.availableAt > 0)then
-        if(timestamp >  self.data.availableAt)then
-            self:OnRidingSkillImprovement()
-            return
-        else
-            self.data.minutesLeft = math.ceil( GetDiffBetweenTimeStamps(self.data.availableAt, timestamp) / 60)
-            self.dataUpdated = true
-            self:d(' => dataUpdated')
-        end
-    else
-        self:StopTimer()
-    end
-end
-
-
-function MOD:OnRidingSkillImprovement()
-    self:d('OnRidingSkillImprovement')
-    self.data.availableAt = 0
-    self.data.minutesLeft = 0
-    local availableAt = GetTimeUntilCanBeTrained()
-    -- char has no mount
-    if(availableAt == nil) then
-        self.data.hasTrainableMount = false
-    else
-        local inventoryBonus, maxInventoryBonus, staminaBonus, maxStaminaBonus, speedBonus, maxSpeedBonus = GetRidingStats()
-        self.data.hasTrainableMount = not((inventoryBonus == maxInventoryBonus) and (staminaBonus == maxStaminaBonus) and (speedBonus == maxSpeedBonus))
-
-        if(self.data.hasTrainableMount and availableAt>0) then
-            self.data.availableAt = GetTimeStamp() + (availableAt / 1000)
-            self.data.minutesLeft = math.ceil( (availableAt / 1000) / 60)
-            self:StartTimer()
-        end
-    end
-
-    self.dataUpdated = true
-    self:d(' => dataUpdated')
-end -- MOD:OnFenceUpdate
-
--- LABEL HANDLER
-
-function MOD:Update(options)
-    self:d('Update')
-    local labelText = ''
-    if (self.data.hasTrainableMount) then
-        if(self.data.availableAt > 0) then
-            if(self.data.minutesLeft <= options.minutesLeftInfo) then
-                labelText =MOD.Colorize(COLOR_AWEVS_HINT, GetString(SI_AWEMOD_MOUNT_TIMER_LABEL)) .. ': ' .. FormatTimeSeconds(60 * self.data.minutesLeft, TIME_FORMAT_STYLE_DESCRIPTIVE_SHORT , TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR , TIME_FORMAT_DIRECTION_NONE)
-            end
-        else
-            labelText = MOD.Colorize(COLOR_AWEVS_AVAILABLE, GetString(SI_AWEMOD_MOUNT_READY_LABEL))
-        end
-    end
-    self.label:SetText(labelText)
-end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents/Modules/RepairKits.lua b/AwesomeEvents/Modules/RepairKits.lua
deleted file mode 100644
index 00ba43b..0000000
--- a/AwesomeEvents/Modules/RepairKits.lua
+++ /dev/null
@@ -1,70 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: RepairKits.lua
-  Last Modified: 02.11.17 16:36
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-local MOD = libAM:New('repairkits')
-
-MOD.title = GetString(SI_AWEMOD_REPAIRKITS)
-MOD.hint = GetString(SI_AWEMOD_REPAIRKITS_HINT)
-MOD.order = 65
-MOD.debug = false
-
--- MOD FUNCTIONS
-
-function MOD:ScanBag(bagId)
-    for slotId=1,GetBagSize(bagId) do
-        if IsItemRepairKit(bagId,slotId) then
-            local _,stackCount = GetItemInfo(bagId,slotId)
-            local tier = GetRepairKitTier(bagId,slotId)
-            self.data.details[tier] = (self.data.details[tier]==nil) and stackCount or self.data.details[tier] + stackCount
-            self.data.count = self.data.count + stackCount
-        end
-    end
-end
-
--- OVERRIDES
-
-function MOD:Enable(options)
-    self:d('Enable (in debug-mode)')
-    self.data = { count = 0, details = {} }
-    self:ScanBag(BAG_BACKPACK)
-    self:ScanBag(BAG_VIRTUAL)
-    self.dataUpdated = true
-end -- MOD:Enable
-
--- EVENT LISTENER
-
-function MOD:GetEventListeners()
-    return {
-        {
-            eventCode = EVENT_INVENTORY_SINGLE_SLOT_UPDATE,
-            callback = function(eventCode, bagId, slotId, isNewItem, itemSoundCategory, inventoryUpdateReason, stackCountChange)
-                if( (bagId == BAG_BACKPACK or bagId == BAG_VIRTUAL) and IsItemRepairKit(bagId,slotId))then
-                    self:d('EVENT_INVENTORY_SINGLE_SLOT_UPDATE',self.data.count,stackCountChange)
-                    self.data.count = self.data.count + stackCountChange
-                    self.dataUpdated = true
-                end
-            end
-        },
-    }
-end -- MOD:GetEventListeners
-
--- EVENT HANDLER
-
--- LABEL HANDLER
-
-
-function MOD:Update(options)
-    self:d('Update')
-    self.label:SetText(MOD.Colorize(COLOR_AWEVS_AVAILABLE, zo_strformat(SI_AWEMOD_REPAIRKITS_LABEL, self.data.count)))
-end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents/Modules/Skills.lua b/AwesomeEvents/Modules/Skills.lua
deleted file mode 100644
index 3c9a45f..0000000
--- a/AwesomeEvents/Modules/Skills.lua
+++ /dev/null
@@ -1,113 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: Skills.lua
-  Last Modified: 02.11.17 16:36
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-local MOD = libAM:New('skills')
-
-MOD.title = GetString(SI_AWEMOD_SKILLS)
-MOD.hint = GetString(SI_AWEMOD_SKILLS_HINT)
-MOD.order = 20
-MOD.debug = false
-
-local CHAMPION_ATTRIBUTES = { ATTRIBUTE_HEALTH, ATTRIBUTE_STAMINA, ATTRIBUTE_MAGICKA }
-
--- USER SETTINGS
-
--- OVERRIDES
-
-function MOD:Enable(options)
-    self:d('Enable (in debug-mode)')
-    self.data = {
-        attributes = 0,
-        championPoints = 0,
-        skills = 0,
-        hasUnspentPoints = false,
-    }
-    self:OnPointsChanged(0)
-    self.dataUpdated = true
-end
-
--- EVENT LISTENER
--- points (attribute- and skillpoints)
--- EVENT_SKILL_POINTS_CHANGED (integer eventCode,number pointsBefore, number pointsNow, number partialPointsBefore, number partialPointsNow)
--- EVENT_ATTRIBUTE_UPGRADE_UPDATED (number eventCode)
--- EVENT_LEVEL_UPDATE (integer eventCode,string unitTag, number level)
-function MOD:GetEventListeners()
-    return {
-        {
-            eventCode = EVENT_SKILL_POINTS_CHANGED,
-            callback = function(eventCode, pointsBefore, pointsNow, partialPointsBefore, partialPointsNow)
-                self:d("EVENT_SKILL_POINTS_CHANGED: ", pointsBefore .. '=>' .. pointsNow, partialPointsBefore .. '=>' .. partialPointsNow)
-                MOD:OnPointsChanged(pointsNow-pointsBefore)
-            end
-        },
-        {
-            eventCode = EVENT_ATTRIBUTE_UPGRADE_UPDATED,
-            callback = function(eventCode)
-                self:d("EVENT_ATTRIBUTE_UPGRADE_UPDATED")
-                MOD:OnPointsChanged(0)
-            end
-        },
-        {
-            eventCode = EVENT_UNSPENT_CHAMPION_POINTS_CHANGED,
-            callback = function(eventCode)
-                self:d("EVENT_UNSPENT_CHAMPION_POINTS_CHANGED")
-                MOD:OnPointsChanged(0)
-            end
-        }
-}
-end -- MOD:GetEventListeners
-
--- EVENT HANDLER
-
-function MOD:OnPointsChanged(numChanged)
-    self:d('OnSkillPointsChanged ' .. numChanged)
-    local attributes,skills,championPoints = GetAttributeUnspentPoints(),GetAvailableSkillPoints(),GetPlayerChampionPointsEarned()
-
-    for i=1,GetNumChampionDisciplines() do
-        championPoints = championPoints - GetNumPointsSpentInChampionDiscipline(i)
-    end
-    self:d(attributes,skills,championPoints)
-    if(championPoints<0) then championPoints = 0 end
-
-    if( attributes ~= self.data.attributes or championPoints ~= self.data.championPoints or skills ~= self.data.skills ) then
-        self.data.attributes = attributes
-        self.data.championPoints = championPoints
-        self.data.skills = skills
-        self.data.hasUnspentPoints = ( attributes + championPoints + skills ) > 0
-
-        self.dataUpdated = true
-        self:d(' => dataUpdated')
-    end
-end -- MOD:OnPointsChanged
-
--- LABEL HANDLER
-
-function MOD:Update(options)
-    self:d('Update')
-    local labelText = ''
-    if (self.data.hasUnspentPoints) then
-        if (self.data.attributes > 0) then
-            labelText = MOD.Colorize(COLOR_AWEVS_AVAILABLE, GetString(SI_AWEMOD_SKILLS_ATTRIBUTES_LABEL)) .. ': ' .. self.data.attributes
-        end
-        if (self.data.skills > 0) then
-            if(labelText~='')then labelText = labelText .. MOD.Colorize(COLOR_AWEVS_AVAILABLE, ' || ') end
-            labelText = labelText .. MOD.Colorize(COLOR_AWEVS_AVAILABLE, GetString(SI_AWEMOD_SKILLS_SKILLS_LABEL)) .. ': ' .. self.data.skills
-        end
-        if (self.data.championPoints > 0) then
-            if(labelText~='')then labelText = labelText .. MOD.Colorize(COLOR_AWEVS_AVAILABLE, ' || ') end
-            labelText = labelText .. MOD.Colorize(COLOR_AWEVS_AVAILABLE, GetString(SI_AWEMOD_SKILLS_CHAMPIONPOINTS_LABEL)) .. ': ' .. self.data.championPoints
-        end
-    end
-    self.label:SetText(labelText)
-end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents/Modules/SkyShards.lua b/AwesomeEvents/Modules/SkyShards.lua
deleted file mode 100644
index 6a05904..0000000
--- a/AwesomeEvents/Modules/SkyShards.lua
+++ /dev/null
@@ -1,82 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: SkyShards.lua
-  Last Modified: 02.11.17 16:36
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-local MOD = libAM:New('skyshards')
-
-MOD.title = GetString(SI_AWEMOD_SKYSHARDS)
-MOD.hint = GetString(SI_AWEMOD_SKYSHARDS_HINT)
-MOD.order = 25
-MOD.debug = false
-
--- OVERRIDES
-
--- USER SETTINGS
-
-MOD.options = {
-    shardsLeftInfo = {
-        type = 'slider',
-        name = GetString(SI_AWEMOD_SKYSHARDS_REMAINING),
-        tooltip = GetString(SI_AWEMOD_SKYSHARDS_REMAINING_HINT),
-        min  = 1,
-        max = 3,
-        default = 1,
-        order = 1,
-    },
-}
-
--- OVERRIDES
-
-function MOD:Enable(options)
-    self:d('Enable (in debug-mode)')
-    self.data = {
-        shardsLeft = 0,
-    }
-    self:OnAchievementUpdate(0)
-    self.dataUpdated = true
-end
-
--- EVENT LISTENER
-
-function MOD:GetEventListeners()
-    return {
-        {
-            eventCode = EVENT_ACHIEVEMENT_UPDATED,
-            callback = function(eventCode,id) MOD:OnAchievementUpdate(id) end
-        }
-    }
-end
-
--- EVENT HANDLER
-
-function MOD:OnAchievementUpdate(id)
-    self:d('OnAchievementUpdate ' .. id)
-    local shardsLeft = 3-GetNumSkyShards()
-    if( shardsLeft ~= self.data.shardsLeft ) then
-        self.data.shardsLeft = shardsLeft
-        self.dataUpdated = true
-        self:d(' => dataUpdated')
-    end
-end
-
--- LABEL HANDLER
-
-function MOD:Update(options)
-    self:d('Update')
-    local labelText = ''
-    if (self.data.shardsLeft <= options.shardsLeftInfo) then
-        local color = (self.data.shardsLeft == 1) and COLOR_AWEVS_AVAILABLE or COLOR_AWEVS_HINT
-        labelText = MOD.Colorize(color, GetString(SI_AWEMOD_SKYSHARDS_REMAINING_LABEL)) .. ': ' .. self.data.shardsLeft
-    end
-    self.label:SetText(labelText)
-end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents/Modules/SoulGems.lua b/AwesomeEvents/Modules/SoulGems.lua
deleted file mode 100644
index fc97b22..0000000
--- a/AwesomeEvents/Modules/SoulGems.lua
+++ /dev/null
@@ -1,89 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: SoulGems.lua
-  Last Modified: 02.11.17 16:36
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-local MOD = libAM:New('soulgems')
-
-MOD.title = GetString(SI_AWEMOD_SOULGEMS)
-MOD.hint = GetString(SI_AWEMOD_SOULGEMS_HINT)
-MOD.order = 65
-MOD.debug = false
-
--- MOD FUNCTIONS
-
-local function __ScanBag(bagId)
-    local empty,filled = 0,0
-    for slotId=1,GetBagSize(bagId) do
-        if(IsItemSoulGem(SOUL_GEM_TYPE_EMPTY,bagId,slotId)) then
-            local _,stackCount = GetItemInfo(bagId,slotId)
-            empty = empty + stackCount
-        elseif(IsItemSoulGem(SOUL_GEM_TYPE_FILLED,bagId,slotId)) then
-            local _,stackCount = GetItemInfo(bagId,slotId)
-            filled = filled + stackCount
-        end
-    end
-    return empty,filled
-end
-
--- OVERRIDES
-
-function MOD:Enable(options)
-    self:d('Enable (in debug-mode)')
-    self.data = {
-        numFilled = 0,
-        numEmpty = 0,
-    }
-    self:OnChangeSoulGemCount()
-    self.dataUpdated = true
-end -- MOD:Enable
-
--- EVENT LISTENER
-function MOD:GetEventListeners()
-    return {
-        {
-            eventCode = EVENT_INVENTORY_SINGLE_SLOT_UPDATE,
-            callback = function(eventCode, bagId, slotId, isNewItem, itemSoundCategory, inventoryUpdateReason, stackCountChange)
-                if(bagId == BAG_BACKPACK and ( IsItemSoulGem(SOUL_GEM_TYPE_FILLED,bagId,slotId) or IsItemSoulGem(SOUL_GEM_TYPE_EMPTY,bagId,slotId)))then
-                    self:OnChangeSoulGemCount()
-                end
-            end
-        },
-    }
-end -- MOD:GetEventListeners
-
--- EVENT HANDLER
-
-function MOD:OnChangeSoulGemCount()
-    self:d('OnChangeSoulGemCount')
-    local empty,filled = __ScanBag(BAG_BACKPACK)
-    local emptyV,filledV = __ScanBag(BAG_VIRTUAL)
-
-    filled = filled + filledV
-    empty = empty + emptyV
-
-    if(self.data.numFilled ~= filled or self.data.numEmpty ~= empty)then
-        self.data.numFilled = filled
-        self.data.numEmpty = empty
-        self.dataUpdated = true
-        self:d(' => dataUpdated')
-    end
-
-end -- MOD:OnChangeSoulGemCount
-
--- LABEL HANDLER
-
-
-function MOD:Update(options)
-    self:d('Update')
-    self.label:SetText(MOD.Colorize(COLOR_AWEVS_AVAILABLE, zo_strformat(SI_AWEMOD_SOULGEMS_LABEL, self.data.numFilled, self.data.numEmpty)))
-end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents/Modules/WeaponCharge.lua b/AwesomeEvents/Modules/WeaponCharge.lua
deleted file mode 100644
index 96bdfb1..0000000
--- a/AwesomeEvents/Modules/WeaponCharge.lua
+++ /dev/null
@@ -1,152 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: WeaponCharge.lua
-  Last Modified: 02.11.17 16:36
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-local MOD = libAM:New('weaponcharge')
-
-MOD.title = GetString(SI_AWEMOD_WEAPONCHARGE)
-MOD.hint = GetString(SI_AWEMOD_WEAPONCHARGE_HINT)
-MOD.order = 55
-MOD.debug = false
-
--- OVERRIDES
-
--- USER SETTINGS
-
-MOD.options = {
-    valueLowInfo = {
-        type = 'slider',
-        name = GetString(SI_AWEMOD_WEAPONCHARGE_INFO),
-        tooltip = GetString(SI_AWEMOD_WEAPONCHARGE_INFO_HINT),
-        min  = 1,
-        max = 60,
-        default = 50,
-        order = 1,
-    },
-    valueLowWarning = {
-        type = 'slider',
-        name = GetString(SI_AWEMOD_WEAPONCHARGE_WARNING),
-        tooltip = GetString(SI_AWEMOD_WEAPONCHARGE_WARNING_HINT),
-        min  = 1,
-        max = 40,
-        default = 25,
-        order = 2,
-    },
-}
-MOD.fontSize = 4
-
--- OVERRIDES
-
-function MOD:Enable(options)
-    self:d('Enable (in debug-mode)')
-    self.data = {
-        minimumValue = 100,
-        slotId = 0,
-    }
-    self:OnInventorySingleSlotUpdate(0)
-    self.dataUpdated = true
-end
-
--- EVENT LISTENER
-
--- test if slotId is a weapon slot
-local function isWeaponSlot(slotId)
-	if(slotId == nil or slotId == 0)then
-		return false
-	end
-	local weaponSlots = { 4, 5, 20, 21 }
-	for i,_slotId in ipairs(weaponSlots) do
-		if(slotId == _slotId)then
-			return true
-		end
-	end
-	return false
-end -- isWeaponSlot
-
-function MOD:GetEventListeners()
-    return {
-        {
-            eventCode = EVENT_INVENTORY_SINGLE_SLOT_UPDATE,
-            callback = function(eventCode, bagId, slotId, isNewItem, itemSoundCategory, inventoryUpdateReason, stackCountChange)
-				if(bagId == BAG_WORN and isWeaponSlot(slotId))then
-					if(inventoryUpdateReason == INVENTORY_UPDATE_REASON_DEFAULT or inventoryUpdateReason == INVENTORY_UPDATE_REASON_ITEM_CHARGE) then
-						MOD:OnInventorySingleSlotUpdate(slotId)
-					end
-				end
-            end,
-        }
-    }
-end -- MOD:GetEventListeners
-
-
--- EVENT HANDLER
--- Weapon charge alerts
--- Item IDs are 4 & 5 for main weapon set, 20 & 21 for alternate set.
-function MOD:OnInventorySingleSlotUpdate(slotId)
-    self:d('OnInventorySingleSlotUpdate: '..slotId)
-
-    -- use slotId if not nil for single slot update
-	if(isWeaponSlot(slotId) and IsItemChargeable(BAG_WORN, slotId))then
-		local charges, maxCharges = GetChargeInfoForItem(BAG_WORN, slotId)
-		local relativeCharge = math.floor(100 * charges / maxCharges)
-		if(relativeCharge <= self.data.minimumValue) then
-			self.data.slotId = slotId
-			self.data.minimumValue = relativeCharge
-			self.dataUpdated = true
-			self:d(' => dataUpdated (single)')
-			return
-		else
-			slotId = 0
-		end
-	end
-
-	-- recheck all slots
-    local lowestChargeSlotId = 0
-    local lowestRelativeCharge = 100
-	if(slotId == nil or slotId == 0)then
-		local weaponSlotTable = { 4, 5, 20, 21 }
-		local i,v
-		for i,_slotId in ipairs(weaponSlotTable) do
-			if(IsItemChargeable(BAG_WORN, _slotId))then
-				local charges, maxCharges = GetChargeInfoForItem(BAG_WORN, _slotId)
-				local relativeCharge = math.floor(100 * charges / maxCharges)
-				if (relativeCharge < lowestRelativeCharge) then
-					lowestRelativeCharge = relativeCharge
-					lowestChargeSlotId = _slotId
-				end
-			end
-		end
-	end
-    self:d(' => old: '..self.data.minimumValue .. '% (Item:'..self.data.slotId..')')
-    self:d(' => new: '..lowestRelativeCharge .. '% (Item:'..lowestChargeSlotId..')')
-
-    if(lowestChargeSlotId ~= self.data.slotId or lowestRelativeCharge ~= self.data.minimumValue)then
-        self.data.minimumValue = lowestRelativeCharge
-        self.data.slotId = lowestChargeSlotId
-        self.dataUpdated = true
-        self:d(' => dataUpdated')
-    end
-end -- MOD:OnInventorySingleSlotUpdate
-
--- LABEL HANDLER
-
-function MOD:Update(options)
-    self:d('Update')
-    local labelText = ''
-    if (self.data.minimumValue <= options.valueLowInfo) then
-		local weaponSet = (self.data.slotId<6) and '1' or '2'
-		local color = (self.data.minimumValue <= options.valueLowWarning) and COLOR_AWEVS_WARNING or COLOR_AWEVS_HINT
-        labelText = MOD.Colorize(color, zo_strformat(SI_TOOLTIP_ITEM_NAME, GetItemName(BAG_WORN, self.data.slotId))) .. ': ' .. self.data.minimumValue .. '%' .. ' (' .. weaponSet .. '. ' .. GetString(SI_AWEMOD_WEAPONCHARGE_SET_LABEL) .. ')'
-    end
-    self.label:SetText(labelText)
-end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents/README b/AwesomeEvents/README
deleted file mode 100644
index ded7911..0000000
--- a/AwesomeEvents/README
+++ /dev/null
@@ -1,97 +0,0 @@
---------------------------
---    AwesomeEvents     --
---------------------------
-
---[ EN ]--
-
-This AddOn was made by Ze_Mi <zemi@unive.de>.
-Updates at: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
-
-This AddOn is a modularzied, event-based, better configurable reinvention of AwesomeInfo addon from CrazyDutchGuy.
-My goal was to minimize timed refreshs and try to use as many event callbacks as possible, as well as split up the different notifications into seperate module files.
-Besides the look and feel, under the hood, there aren't many codelines left from AwesomeInfo.
-
---[ DE ]--
-
-Dieses AddOn wurde erstellt von Ze_Mi <zemi@unive.de>.
-Updates unter: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
-
-Dieses AddOn ist eine modularizierte, eventbasierte und noch besser prsonalisierbare Neuentwicklung des AwesomeInfo Addons von CrazyDutchGuy.
-Mein Ziel dabei war es, weniger inertval basierte Aktualisierungen auszuführen und stattdessen auf Events zu reagieren. Außerdem wurden die verschiedenen Benachrichtigungen in
-eigene Module ausgelagert, was die Entwicklung von Modulen übersichtlicher und einfacher macht.
-Abgesehen von dem ursprünglichen look and feel hat sich unter der Haube so viel verändert, dass nicht mehr viele Codezeilen aus AwesoneInfo übrig geblieben sind.
-
-
---------------------------
---   LibAwesomeModule   --
---------------------------
-
---[ EN ]--
-
-This Library was made by Ze_Mi <zemi@unive.de>.
-
-Hereby I introduce LibAwesomeModule-1.0, a library that allows you to easily add new modules and notifications to AwesomeEvents.
-If you are interested in writing new modules, please have a look inside the Module folder of this addon.
-You don't have to care about layout and settings stuff, just write the minimal necessary code with maximum useability.
-
---[ DE ]--
-
-Diese Bibliothek wurde erstellt von Ze_Mi <zemi@unive.de>.
-
-Hiermit stelle ich die neue Bibliothek LibAwesomeModule vor, eine Bibliothek mit deren Hilfe man super schnell und ohne viel Aufwand neue Benachrichtigungen in AwesomeEvents hinzufügen kann.
-Wenn du wissen möchtest, wie du neue Module hinzufügst, schau dir die Dateien im Ordner Modules an.
-Du musst dich nicht um lästige Label-Erstellungen/-Positionierung oder Einstellungen kümmern, schreibe einfach den minimal nötigen Code mit maximalem Nutzen.
-
-
---------------------------
---      CREDITS         --
---------------------------
-
---[ EN ]--
-
-Thanks to CrazyDutchGuy, Stormknight and RibbedStoic for their great AwesomeInfo AddOn!
-(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
-
-Thanks to @MissMarsupial for beta testing my AddOn.
-
-Thanks to esoui.com and all authors for maintaining the wiki and doing the job ZeniMax Media Inc is suposed to do ;)
-
---[ DE ]--
-
-Mein Dank geht an CrazyDutchGuy, Stormknight und RibbedStoic für ihr großartiges AwesomeInfo AddOn!
-(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
-
-Danke an @MissMarsupial für das testen der Beta-Versionen meines AddOns.
-
-Danke an esoui.com und allen Authoren die an der Wiki arbeiten und diese aktuell halten und damit einen Dienst übernehmen für den sich ZeniMax Media Inc zu schön ist ;)
-
---------------------------
---      LICENSE         --
---------------------------
-
-This software is under : CreativeCommons CC BY-NC-SA 4.0
-Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-You are free to:
-
-    Share — copy and redistribute the material in any medium or format
-    Adapt — remix, transform, and build upon the material
-    The licensor cannot revoke these freedoms as long as you follow the license terms.
-
-
-Under the following terms:
-
-    Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
-    NonCommercial — You may not use the material for commercial purposes.
-    ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
-    No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
-
-
-Please read full licence at :
-http://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
-
-This Add-on is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates.
-The Elder Scrolls® and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries.
-All rights reserved.
-
-You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
\ No newline at end of file
diff --git a/AwesomeEvents2/AE_DebugWindow.lua b/AwesomeEvents2/AE_DebugWindow.lua
new file mode 100644
index 0000000..410fabb
--- /dev/null
+++ b/AwesomeEvents2/AE_DebugWindow.lua
@@ -0,0 +1,171 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: AE_DEBUG.lua
+  Last Modified: 23.04.18 20:59
+
+  Copyright (c) 2018 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+local debugWindow
+
+
+
+local function __boolToStr(value)
+    if(value)then
+        return 'true'
+    else
+        return 'false'
+    end
+end
+
+local function __tostring(object,level)
+    local lvlPrefix = ''
+    if(level~=nil)then
+        lvlPrefix = string.rep('--',level)
+    end
+    local str=''
+    if(type(object) == 'table')then
+        if(level==nil)then
+            for i in ipairs(object)do
+                if(i==1)then
+                    str = str .. __tostring(object[i],1)
+                else
+                    str = str .. '> ' .. __tostring(object[i],1)
+                end
+            end
+        else
+            str = 'Table\n'
+            for key,value in pairs(object)do
+                str = str .. lvlPrefix .. '> .' .. key .. ' = ' .. __tostring(value,level+1)
+            end
+        end
+    elseif(type(object) == 'number')then
+        str = tostring(object)
+    elseif(type(object) == 'boolean')then
+        str = __boolToStr(object)
+    elseif(type(object) == 'string')then
+        str = object
+    else
+        str = type(object)
+    end
+    return str..'\n'
+end
+
+local function WriteDebugMessage(...)
+    if(debugWindow == nil)then return end
+
+    local args = {... }
+
+    local str = ''
+    if(args[1] ~= nil and type(args[1])=="string")then
+        args[1] = '|cD4CD82[|c82D482' .. args[1] .. '|cD4CD82]|cFFFFFF '
+        if(type(args[2])=="string")then
+            args[1] = args[1] .. ' ' .. args[2]
+            table.remove(args,2)
+        end
+        if(#args==1)then
+            str = args[1]
+        end
+    end
+    if(str=='')then
+        str=__tostring(args)
+    end
+
+    debugWindow:AddText(value)
+end
+
+-- Create Debug Window
+local function ToggleDebugWindow(show)
+    -- show debug window
+    if(show)then
+
+        if(debugWindow==nil)then
+            local libMW = LibStub:GetLibrary("LibMsgWin-1.0")
+            debugWindow = libMW:CreateMsgWindow("AwesomeEventsDebugWindow", "Awesome Events Debug Log", 0, 0)
+        else
+            debugWindow:SetHidden(false)
+        end
+
+        if(not libAM.debug)then
+            debugWindow:AddText('Debug-Log: '..GetString(SI_AWEVS_DEBUG_DISABLED))
+            debugWindow:AddText('Usage: /aedebug mod_id (on\off)')
+        end
+
+        libAM.CallbackManager:RegisterCallback('DEBUG_MESSAGE',WriteDebugMessage)
+
+    -- hide debug window
+    else
+        if(debugWindow~=nil)then
+            debugWindow:SetHidden(true)
+        end
+        libAM.CallbackManager:UnregisterCallback('DEBUG_MESSAGE',WriteDebugMessage)
+    end
+end -- ToggleDebugWindow
+
+
+--------------------
+-- SLASH COMMANDS --
+--------------------
+
+-- Typing /aedump as a command will activate this function. Primarily used for testing.
+local function __SlashAEDebug(command)
+    local args = {}
+    for word in command:gmatch("%w+") do table.insert(args, word) end
+
+    local task = args[1] or 'unknown';
+
+    if(task=='show')then
+        return ToggleDebugWindow(true)
+    end
+    if(task=='hide')then
+        return ToggleDebugWindow(false)
+    end
+
+    local mod_id = task
+    local value = args[2] or nil
+
+    if(mod_id ~= nil and libAM.modules[mod_id] ~= nil)then
+        local mod = libAM.modules[mod_id]
+        if(value ~= nil)then
+            if(value=='on' or value=='On' or value=='ON'or value=='oN')then
+                mod.debug = true
+                libAM.debug = true
+                ToggleDebugWindow(true)
+            else
+                mod.debug = false
+
+                -- any other module in debug mode ?
+                libAM.debug = false
+                for mod_id,mod in libAM:module_pairs() do
+                    if(mod.debug)then
+                        libAM.debug = true
+                    end
+                end
+
+                -- clear old logs
+                if(not libAM.debug)then
+                    if(debugWindow ~= nil)then
+                        debugWindow:SetHidden(true)
+                        debugWindow:ClearText()
+                    end
+                end
+            end
+        end
+        local enabled = GetString(SI_AWEVS_DEBUG_DISABLED)
+        if(mod.debug)then enabled =  GetString(SI_AWEVS_DEBUG_ENABLED) end
+        d('[AwesomeEvents] Debug [' .. mod_id .. ']: ' .. enabled)
+        libAM.d('Debug-Log: ' .. enabled)
+    else
+        d('[AwesomeEvents] Debug [' .. mod_id .. ']: '..GetString(SI_AWEVS_DEBUG_MODULE_NOT_FOUND),'Usage: /aedebug mod_id (on||off)')
+    end
+end -- __SlashAEDebug
+
+SLASH_COMMANDS['/aedebug'] = __SlashAEDebug
+
+libAM.CallbackManager:RegisterCallback("DEBUG_TOGGLE", ToggleDebugWindow);
\ No newline at end of file
diff --git a/AwesomeEvents2/AE_HUD.lua b/AwesomeEvents2/AE_HUD.lua
new file mode 100644
index 0000000..f5bc361
--- /dev/null
+++ b/AwesomeEvents2/AE_HUD.lua
@@ -0,0 +1,224 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: AE_HUD.lua
+  Last Modified: 23.04.18 20:19
+
+  Copyright (c) 2018 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+
+local ENTRY_TEMPLATE = "AWEVS_ListEntry"
+local LIST_ENTRY_LIMIT = 20
+local FADE_MS = 200
+
+local EntryList = {}
+
+function EntryList:Initialize(control)
+    self.control = control
+
+    self.freeList = {}
+    self.activeList = {}
+    self.nextControlId = 1
+end
+
+function EntryList:AddLine(iconPath, text, color)
+    --Initialize control
+    local newEntry = next(self.freeList)
+    if not newEntry then
+        newEntry = GetWindowManager():CreateControlFromVirtual(self.nextControlId, self.control, ENTRY_TEMPLATE)
+        self.nextControlId = self.nextControlId + 1
+    end
+    newEntry:SetHidden(false)
+    self.freeList[newEntry] = nil
+    self.activeList[newEntry] = true
+
+    --Set text
+    local textControl = newEntry:GetNamedChild("Text")
+    textControl:SetText(text)
+    textControl:SetColor(color)
+
+    --Set anchor
+    if(self.lastEntry) then
+        newEntry:SetAnchor(BOTTOMRIGHT, self.lastEntry, TOPRIGHT)
+    else
+        newEntry:SetAnchor(BOTTOMRIGHT, nil, BOTTOMRIGHT)
+    end
+    self.lastEntry = newEntry
+
+    --Set icon
+    local icon = newEntry:GetNamedChild("Icon")
+    icon:SetTexture(iconPath)
+    --"EsoUI/Art/VOIP/voip-group.dds"
+    icon:SetColor(color)
+    --VOICE_CHAT_COLORS_GROUP
+end
+
+function EntryList:Clear()
+    self.lastEntry = nil
+
+    for entry in pairs(self.activeList) do
+        self.activeList[entry] = nil
+        self.freeList[entry] = true
+        entry:SetHidden(true)
+    end
+end
+
+
+
+
+local AwesomeEventsHUD = {}
+
+function AwesomeEventsHUD:Initialize(control)
+    self.control = control
+
+    self.listData = {} --list of currently speaking users, including users who have stopped talking but their HUD entry is waiting to clear
+    self.delayedClears = {} --table that maps users who have stopped talking to the time that their HUD entry should clear
+
+    self.entryList = control:GetNamedChild("List")
+    zo_mixin(self.entryList, EntryList)
+    self.entryList:Initialize(self.entryList)
+
+    self.listFade = ZO_AlphaAnimation:New(control.entryList)
+
+    self:RegisterForEvents()
+end
+
+function AwesomeEventsHUD.GetUniqueId(modId, entryId)
+    if( modId ~= nil and entryId ~= nil)then
+        return modId .. '_' .. entryId
+    end
+
+    return ''
+end
+
+function AwesomeEventsHUD:Update()
+    --Clear entries for users who haven't spoken recently
+    local currentTime = GetFrameTimeMilliseconds()
+    for uniqueId, clearTime in pairs(self.delayedClears) do
+        if currentTime >= clearTime then
+            self:Remove(uniqueId)
+            self.delayedClears[uniqueId] = nil
+        end
+    end
+
+    --Create the list
+    self.entryList:Clear()
+    for i = 1, #self.listData do
+        local listData = self.listData[i]
+        self.entryList:AddLine(listData.icon, listData.text, listData.color)
+    end
+end
+
+function AwesomeEventsHUD:Insert(uniqueId, icon, text, color)
+    --The list is a stack with the users who spoke most recently on the bottom. The local player is an
+    --exception to this and always shows at the bottom.
+
+    local listDataEntry = {
+        uniqueId = uniqueId,
+        modId = modId,
+        icon = icon,
+        text = text,
+        color = color
+    }
+
+    --Remove any existing entry so it can be reinserted at the bottom
+    self:Remove(uniqueId)
+
+    table.insert(self.listData, 1, listDataEntry)
+
+    --Remove the oldest entry if we're over the limit
+    if #self.listData > LIST_ENTRY_LIMIT then
+        table.remove(self.listData)
+    end
+
+    self:Update()
+end
+
+function AwesomeEventsHUD:Remove(uniqueId)
+    for i = 1, #self.listData do
+        if self.listData[i].uniqueId == uniqueId then
+            table.remove(self.listData, i)
+            self:Update()
+            break
+        end
+    end
+end
+
+function AwesomeEventsHUD:RemoveEventsForModule(modId)
+    local newList = {}
+    for i = 1, #self.listData do
+        local data = self.listData[i]
+        if modId ~= data.modId then
+            table.insert(newList, data)
+        end
+    end
+
+    self.listData = newList
+    self:Update()
+end
+
+--Events
+function AwesomeEventsHUD:RegisterForEvents()
+
+    local function OnShow()
+        self.listFade:FadeIn(0, FADE_MS)
+    end
+    local function OnHide()
+        self.listFade:FadeOut(0, 0)
+    end
+
+    libAM.CallbackManager:RegisterCallback("AwesomeEventsShow", OnShow())
+    libAM.CallbackManager:RegisterCallback("AwesomeEventsHide", OnHide())
+    libAM.CallbackManager:RegisterCallback("AwesomeEventsNewEntry", function(eventCode, ...) self:OnNewEntry(...) end)
+    libAM.CallbackManager:RegisterCallback("AwesomeEventsOutdatedEntry", function(eventCode, ...) self:OnOutdatedEntry(...) end)
+    libAM.CallbackManager:RegisterCallback("AwesomeEventsModuleDisabled", function(eventCode, ...) self:OnRemoveModule(...) end)
+end
+
+function AwesomeEventsHUD:OnNewEvent(modId, entryId, icon, text, color, duration_ms)
+    local uniqueId = self.GetUniqueId(modId, entryId)
+    if duration_ms == 0 then
+        self.delayedClears[uniqueId] = nil
+        self:Insert(uniqueId, icon, text, color)
+    else
+        self.delayedClears[uniqueId] = GetFrameTimeMilliseconds() + duration_ms
+    end
+end
+
+function AwesomeEventsHUD:OnOutdatedEvent(modId, entryId)
+    self:Remove(self.GetUniqueId(modId, entryId))
+end
+
+function AwesomeEventsHUD:OnRemoveModule(modId)
+    self:RemoveEventsForModule(modId)
+end
+
+
+function AwesomeEventsHUD_OnInitialize(control)
+    AwesomeEventsHUD:Initialize(control)
+end
+
+
+local LAST_FRAME_TIME = 0
+
+function AwesomeEventsHUD_OnUpdate(frameTime)
+    AwesomeEventsHUD:Update()
+
+    if(frameTime == nil)then frameTime = GetFrameTimeSeconds() end
+    frameTime = math.floor(frameTime)
+    -- Only run this update if a full second has elapsed since last time we did so.
+    --local timestamp = GetTimeStamp()
+    if ( frameTime ~= LAST_FRAME_TIME ) then
+        LAST_FRAME_TIME = frameTime
+        libAM.CallbackManager:FireCallbacks('AwesomeEventsUpdate',GetTimeStamp())
+    end
+end
+
+function AwesomeEventsHUD_OnMoveStop(control)
+    libAM.CallbackManager:FireCallbacks('AwesomeEventsPositionChanged',control:GetRight(),control:GetBottom())
+end
\ No newline at end of file
diff --git a/AwesomeEvents2/AE_Settings.lua b/AwesomeEvents2/AE_Settings.lua
new file mode 100644
index 0000000..7d91a20
--- /dev/null
+++ b/AwesomeEvents2/AE_Settings.lua
@@ -0,0 +1,391 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: AE_AddonMenu.lua
+  Last Modified: 23.04.18 21:08
+
+  Copyright (c) 2018 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+local addon = {
+    name = 'AwesomeEvents',
+    panelName = 'AwesomeEventsOptions',
+    title = 'Awesome Events',
+    version = '2.0-Alpha1',
+}
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+
+local vars = {}
+local defaults = {
+    isDefault = true,
+    window = {
+        left = GuiRoot:GetWidth()/2,
+        top = 100,
+        movable = true,
+        scaling = 1.0,
+        textAlign = TEXT_ALIGN_CENTER,
+        textColor = {
+            [COLOR_AWEVS_AVAILABLE] = {r=0.5,g=0.83,b=0.5},
+            [COLOR_AWEVS_HINT] = {r=0.83,g=0.8,b=0.5},
+            [COLOR_AWEVS_WARNING] = {r=0.83,g=0.59,b=0.5},
+        }
+    },
+}
+
+
+
+
+local function GetEnabledValue(enabledText)
+    if(enabledText == GetString(SI_AWEMOD_SHOW_ICON))then return 2 end
+    if(enabledText == GetString(SI_AWEMOD_SHOW_TEXT))then return 3 end
+    if(enabledText == GetString(SI_AWEMOD_SHOW_NONE))then return 0 end
+    return 1
+end
+
+local function GetEnabledString(enabled)
+    if(enabled == ENABLED_AWEVS_NONE)then return GetString(SI_AWEMOD_SHOW_NONE) end
+    if(enabled == ENABLED_AWEVS_ICON_AND_TEXT)then return GetString(SI_AWEMOD_SHOW_ICON_AND_TEXT) end
+    if(enabled == ENABLED_AWEVS_ICON_ONLY)then return GetString(SI_AWEMOD_SHOW_ICON) end
+    if(enabled == ENABLED_AWEVS_TEXT_ONLY)then return GetString(SI_AWEMOD_SHOW_TEXT) end
+    return nil
+end
+
+--- return a spacingPosition property as localized string
+local function GetSpacingPositionValue(spacingPositionText)
+    if(spacingPositionText == GetString(SI_AWEMOD_SPACING_BOTTOM)) then return TEXT_ALIGN_BOTTOM end
+    if(spacingPositionText == GetString(SI_AWEMOD_SPACING_BOTH)) then return TEXT_ALIGN_CENTER end
+    return TEXT_ALIGN_TOP
+end
+
+local function GetSpacingPositionString(spacingPosition)
+    if(spacingPosition == TEXT_ALIGN_TOP) then return GetString(SI_AWEMOD_SPACING_TOP) end
+    if(spacingPosition == TEXT_ALIGN_BOTTOM) then return GetString(SI_AWEMOD_SPACING_BOTTOM) end
+    if(spacingPosition == TEXT_ALIGN_CENTER) then return GetString(SI_AWEMOD_SPACING_BOTH) end
+    return nil
+end -- GetSpacingPositionString
+
+--- return a textAlign property as localized string
+local function GetTextAlignString(textAlign)
+    if(textAlign == TEXT_ALIGN_LEFT) then return GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_LEFT) end
+    if(textAlign == TEXT_ALIGN_CENTER) then return GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_CENTER) end
+    if(textAlign == TEXT_ALIGN_RIGHT) then return GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_RIGHT) end
+    return nil
+end -- GetTextAlignString
+
+
+
+
+
+local function __recursive_copy(orig)
+    local orig_type = type(orig)
+    local copy
+    if orig_type == 'table' then
+        copy = {}
+        for orig_key, orig_value in next, orig, nil do
+            copy[__recursive_copy(orig_key)] = __recursive_copy(orig_value)
+        end
+    else -- number, string, boolean, etc
+        copy = orig
+    end
+    return copy
+end -- __recursive_copy
+
+local function ImportConfigFromCharacter(characterName)
+    libAM.d('settings','ImportConfigFromCharacter',characterName)
+    if(characterName == nil or characterName == GetString(SI_AWEVS_IMPORT_CHARACTER_SELECT))then
+        return
+    end
+
+    local characterId
+    if(characterName ~= GetUnitName('player'))then
+        for i = 1, GetNumCharacters() do
+            local name, _, _, _, _, _, id = GetCharacterInfo(i)
+            if(characterName == zo_strformat("<<1>>", name))then
+                characterId = id
+            end
+        end
+    end
+
+    if(characterId ~= nil)then
+        local tempVars = ZO_SavedVars:New('AwesomeEvents', 2, nil, defaults, "Default", GetDisplayName(), characterName, characterId, ZO_SAVED_VARS_CHARACTER_NAME_KEY)
+        if(not tempVars.isDefault)then
+            for key in pairs(defaults) do
+                vars[key] = __recursive_copy(tempVars[key])
+            end
+            libAM.d('settings','Imported successfully!')
+            -- restore module user config
+            for mod_id,mod in libAM:module_pairs() do
+
+                libAM.CallbackManager:FireCallbacks('AwesomeEventsModConfig_'..mod_id, vars[mod_id])
+                mod:Disable()
+                if(vars[mod_id].enabled>0)then
+                    mod:Enable(vars[mod_id])
+                end
+            end
+            -- restore gui user config
+            for key,color in pairs(vars.window.textColor) do
+                libAM.SetColorDef(key,color.r,color.g,color.b)
+            end
+
+            libAM.CallbackManager:FireCallbacks("AwesomeEventsViewConfig",vars.window);
+        end
+    end
+end -- ImportConfigFromCharacter
+
+--- create a getFcn function callback for LAM panelOptions
+local function __CreateSettingsGetter(mod_id,property,dataTransformer)
+    if(libAM.modules[mod_id] == nil) then return end
+    if(dataTransformer ~= nil)then
+        return function() return dataTransformer(vars[mod_id][property]) end
+    else
+        return function() return vars[mod_id][property] end
+    end
+end -- __CreateSettingsGetter
+
+--- create a setFcn function callback for LAM panelOptions
+local function __CreateSettingsSetter(mod_id,key)
+    if(libAM.modules[mod_id] == nil) then return end
+    local mod = libAM.modules[mod_id]
+    if(key=='enabled')then
+        return function(value)
+            value = GetEnabledValue(value)
+            vars[mod.id][key] = value
+            libAM.d('SetEnabled',value)
+            if(value>0)then
+                libAM.d('main','Enable['..mod_id..']')
+                mod:Enable(vars[mod_id])
+            else
+                libAM.d('main','Disable['..mod_id..']')
+                mod:Disable()
+            end
+            SetEventListeners()
+            View_SetSize()
+        end
+    elseif(key=='spacingPosition')then
+        return function(value)
+            View_SetSpacingPosition(mod_id,value)
+        end
+    elseif(key=='spacing')then
+        return function(value)
+            vars[mod_id][key] = value
+            View_SetSize()
+        end
+    elseif(key=='fontSize')then
+        return function(value)
+            vars[mod_id][key] = value
+            View_SetTextSize()
+            View_SetSize()
+        end
+    end
+    return function(value)
+        vars[mod_id][key] = value
+        libAM.d('settings','Set['..mod_id..']: '..key,value)
+        mod:Set(key,value)
+    end
+end -- __CreateSettingsSetter
+
+--- create a disabled function callback for LAM panelOptions
+local function __CreateSettingsDisabler(mod_id)
+    return function() return vars[mod_id].enabled > 0 end
+end -- __CreateSettingsDisabler
+
+--- create the addon menu with libaddonmenu
+local function CreateSettingsMenu(panelOptions)
+    local LAM2 = LibStub('LibAddonMenu-2.0')
+    local panelData = {
+        type = 'panel',
+        name = addon.name,
+        author = 'Ze_Mi',
+        version = '|c60FF60' .. addon.version .. '|r',
+        displayName = '|c8080FF' .. addon.title .. '|r',
+        registerForRefresh  = true,
+        registerForDefaults = true,
+    }
+
+    LAM2:RegisterAddonPanel(addon.panelName, panelData)
+    LAM2:RegisterOptionControls(addon.panelName, panelOptions)
+end -- CreateSettingsMenu
+
+--- load module configuration and inject getter/setter, build default configuration
+local function LoadModulesConfiguration()
+    -- load characters for copy button
+    local importOptions = {GetString(SI_AWEVS_IMPORT_CHARACTER_SELECT)}
+    for i = 1, GetNumCharacters() do
+        local name, _, _, _, _, _, characterId = GetCharacterInfo(i)
+        if(characterId ~= GetCurrentCharacterId())then
+            table.insert(importOptions,zo_strformat("<<1>>", name))
+        end
+    end
+
+    local panelOptions = {
+        {
+            type = 'description',
+            text = GetString(SI_AWEVS_DESCRIPTION),
+        },
+        {
+            type = 'header',
+            name = '|c45D7F7' .. GetString(SI_AWEVS_APPEARANCE) .. '|r',
+        },
+        {
+            type = 'checkbox',
+            name = GetString(SI_AWEVS_APPEARANCE_MOVABLE),
+            tooltip = GetString(SI_AWEVS_APPEARANCE_MOVABLE_HINT),
+            getFunc = function() return vars.window.movable end,
+            setFunc = function(newValue) View_SetMovable(newValue) end,
+            default = defaults.window.movable,
+        },
+        {
+            type = 'dropdown',
+            name = GetString(SI_AWEVS_APPEARANCE_TEXTALIGN),
+            tooltip = GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_HINT),
+            choices = {GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_LEFT),GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_CENTER),GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_RIGHT)},
+            getFunc = function() return GetTextAlignString(vars.window.textAlign) end,
+            setFunc = function(newValue) View_SetTextAlign(newValue) end,
+            default = function() return GetTextAlignString(defaults.window.textAlign) end,
+        },
+        {
+            type = 'slider',
+            name = GetString(SI_AWEVS_APPEARANCE_UISCALE),
+            tooltip = GetString(SI_AWEVS_APPEARANCE_UISCALE_HINT),
+            min  = 5,
+            max = 15,
+            getFunc = function() return 10 * vars.window.scaling end,
+            setFunc = function(newValue) View_SetScale(newValue) end,
+            default = 10 * defaults.window.scaling,
+        },
+        {
+            type = 'colorpicker',
+            name = GetString(SI_AWEVS_APPEARANCE_COLOR_AVAILABLE),
+            tooltip = GetString(SI_AWEVS_APPEARANCE_COLOR_AVAILABLE_HINT),
+            getFunc = function() local c=vars.window.textColor[COLOR_AWEVS_AVAILABLE]; return c.r,c.g,c.b,1 end,
+            setFunc = function(r, g, b, a) View_SetTextColor(COLOR_AWEVS_AVAILABLE,r,g,b) end,
+            default = defaults.window.textColor[COLOR_AWEVS_AVAILABLE],
+        },
+        {
+            type = 'colorpicker',
+            name = GetString(SI_AWEVS_APPEARANCE_COLOR_HINT),
+            tooltip = GetString(SI_AWEVS_APPEARANCE_COLOR_HINT_HINT),
+            getFunc = function() local c=vars.window.textColor[COLOR_AWEVS_HINT]; return c.r,c.g,c.b,1 end,
+            setFunc = function(r, g, b, a) View_SetTextColor(COLOR_AWEVS_HINT,r,g,b) end,
+            default = defaults.window.textColor[COLOR_AWEVS_HINT],
+        },
+        {
+            type = 'colorpicker',
+            name = GetString(SI_AWEVS_APPEARANCE_COLOR_WARNING),
+            tooltip = GetString(SI_AWEVS_APPEARANCE_COLOR_WARNING_HINT),
+            getFunc = function() local c=vars.window.textColor[COLOR_AWEVS_WARNING]; return c.r,c.g,c.b,1 end,
+            setFunc = function(r, g, b, a) View_SetTextColor(COLOR_AWEVS_WARNING,r,g,b) end,
+            default = defaults.window.textColor[COLOR_AWEVS_WARNING],
+        },
+        {
+            type = 'header',
+            name = '|c45D7F7' .. GetString(SI_AWEVS_IMPORT) .. '|r',
+        },
+        {
+            type = 'description',
+            text = GetString(SI_AWEVS_IMPORT_DESCRIPTION),
+        },
+        {
+            type = 'dropdown',
+            name = GetString(SI_AWEVS_IMPORT_CHARACTER_LABEL),
+            choices = importOptions,
+            getFunc = function() return GetString(SI_AWEVS_IMPORT_CHARACTER_SELECT) end,
+            setFunc = function(newValue) state.importFromCharacter = newValue end,
+            default = GetString(SI_AWEVS_IMPORT_CHARACTER_SELECT),
+        },
+        {
+            type = 'button',
+            name = GetString(SI_AWEVS_IMPORT_BUTTON),
+            func = function() ImportConfigFromCharacter(state.importFromCharacter) end,
+        },
+    }
+    -- foreach module
+    for mod_id,mod in libAM:module_pairs() do
+        libAM.d('main','LoadModule['..mod_id..']')
+        -- create defaults
+        defaults[mod_id] = defaults[mod_id] or {}
+        defaults[mod_id].enabled = 1
+        defaults[mod_id].spacingPosition = mod.spacingPosition or TEXT_ALIGN_BOTTOM
+        defaults[mod_id].spacing = mod.spacing or 5
+        defaults[mod_id].fontSize = mod.fontSize or 1
+        table.insert( panelOptions,{
+            type = 'header',
+            name = '|c45D7F7' .. mod.title .. '|r',
+        })
+        table.insert( panelOptions, {
+            type = 'dropdown',
+            name = GetString(SI_AWEMOD_SHOW),
+            tooltip = mod.hint .. '\n' .. GetString(SI_AWEMOD_SHOW_HINT),
+            choices = {GetString(SI_AWEMOD_SHOW_ICON_AND_TEXT),GetString(SI_AWEMOD_SHOW_ICON),GetString(SI_AWEMOD_SHOW_TEXT),GetString(SI_AWEMOD_SHOW_NONE)},
+            getFunc = __CreateSettingsGetter(mod_id,'enabled',GetEnabledString),
+            setFunc = __CreateSettingsSetter(mod_id,'enabled',GetEnabledValue),
+            default = GetEnabledString(defaults[mod_id].enabled),
+        })
+        table.insert( panelOptions, {
+            type = 'dropdown',
+            name = GetString(SI_AWEMOD_SPACING_POSITION),
+            tooltip = GetString(SI_AWEMOD_SPACING_POSITION_HINT),
+            choices = {GetString(SI_AWEMOD_SPACING_TOP),GetString(SI_AWEMOD_SPACING_BOTTOM),GetString(SI_AWEMOD_SPACING_BOTH)},
+            getFunc = __CreateSettingsGetter(mod_id,'spacingPosition',GetSpacingPositionString),
+            setFunc = __CreateSettingsSetter(mod_id,'spacingPosition',GetSpacingPositionValue),
+            disabled = __CreateSettingsDisabler(mod_id),
+            default = GetSpacingPositionString(defaults[mod_id].spacingPosition),
+        })
+        table.insert( panelOptions,{
+            type = 'slider',
+            name = GetString(SI_AWEMOD_SPACING),
+            tooltip = GetString(SI_AWEMOD_SPACING_HINT),
+            min  = 0,
+            max = 30,
+            getFunc = __CreateSettingsGetter(mod_id,'spacing'),
+            setFunc = __CreateSettingsSetter(mod_id,'spacing'),
+            disabled = __CreateSettingsDisabler(mod_id),
+            default = defaults[mod_id].spacing,
+        })
+        table.insert( panelOptions,{
+            type = 'slider',
+            name = GetString(SI_AWEMOD_FONTSIZE),
+            tooltip = GetString(SI_AWEMOD_FONTSIZE_HINT),
+            min  = 1,
+            max = 5,
+            getFunc = __CreateSettingsGetter(mod_id,'fontSize'),
+            setFunc = __CreateSettingsSetter(mod_id,'fontSize'),
+            disabled = __CreateSettingsDisabler(mod_id),
+            default = defaults[mod_id].fontSize,
+        })
+        -- foreach options
+        for key,option in mod:option_pairs() do
+            if(option.type~=nil and option.name ~= nil and option.tooltip ~= nil and option.default ~= nil)then
+                defaults[mod_id][key] = option.default
+                option.getFunc = __CreateSettingsGetter(mod_id,key)
+                option.setFunc = __CreateSettingsSetter(mod_id,key)
+                option.disabled = __CreateSettingsDisabler(mod_id)
+                table.insert( panelOptions, option )
+            else
+                libAM.d('main','LoadModule['..mod_id..']',GetString(SI_AWEVS_DEBUG_MODULE_OPTION_INVALID),option)
+            end
+        end
+    end
+    return panelOptions
+end -- LoadModulesConfiguration
+
+local function LAM_OnChangeActivePanel(panel)
+    if(panel==nil or panel:GetName() == '')then
+        panel = WINDOW_MANAGER:GetControlByName(addon.panelName)
+        if not panel:IsHidden() then
+            View_SetHidden(false)
+        end
+    elseif(panel:GetName()==addon.panelName)then
+        View_SetHidden(false)
+    else
+        View_SetHidden(true)
+    end
+end -- LAM_OnChangeActivePanel
+
+libAM.RegisterCallback('AwesomeEventsPositionChanged',function(right,bottom)
+        vars.window.
+    end)
\ No newline at end of file
diff --git a/AwesomeEvents2/AwesomeEvents.xml b/AwesomeEvents2/AwesomeEvents.xml
new file mode 100644
index 0000000..95f552e
--- /dev/null
+++ b/AwesomeEvents2/AwesomeEvents.xml
@@ -0,0 +1,69 @@
+<GuiXml>
+    <Controls>
+        <Control name="AWEVS_ListEntry" virtual="true" inheritAlpha="true">
+            <Dimensions x="315" y="52" />
+            <Controls>
+                <Texture name="$(parent)Bg" textureFile="EsoUI/Art/Miscellaneous/listItem_backdrop.dds">
+                    <TextureCoords left="1" right="0.2" top="0" bottom=".8" />
+                    <AnchorFill/>
+                </Texture>
+
+                <Texture name="$(parent)Icon">
+                    <Dimensions x="32" y="32" />
+                    <Anchor point="BOTTOMRIGHT" offsetX="-15" offsetY="-11" />
+                </Texture>
+
+                <Label name="$(parent)Text" font="ZoFontWinH1" verticalAlignment="CENTER" color="FFFFFF" >
+                    <Anchor point="RIGHT" relativeTo="$(parent)Icon" relativePoint="LEFT" offsetX="-8" />
+                </Label>
+
+            </Controls>
+        </Control>
+
+        <TopLevelControl name="AwesomeEventsView" mouseEnabled="true" movable="true" clampedToScreen="true" hidden="true" allowBringToTop="true" resizeToFitDescendents="true">
+            <OnInitialize>
+                AwesomeEventsHUD_OnInitialize(self)
+            </OnInitialize>
+
+            <OnMouseEnter>
+                self:SetAlpha(1)
+            </OnMouseEnter>
+
+            <OnUpdate>
+                AwesomeEventsHUD_OnUpdate(time)
+            </OnUpdate>
+
+            <OnMoveStop>
+                AwesomeEventsHUD_OnMoveStop(self)
+            </OnMoveStop>
+
+            <Anchor point="BOTTOMRIGHT" offsetY="-10" />
+
+            <Controls>
+                <Control name="$(parent)List" resizeToFitDescendents="true" >
+                    <Anchor point="CENTER" />
+                    <Control name="AE_ModuleEntry0" virtual="true" inheritAlpha="true">
+                        <Dimensions x="315" y="52" />
+                        <Controls>
+                            <Texture name="$(parent)Bg" textureFile="EsoUI/Art/Miscellaneous/listItem_backdrop.dds">
+                                <TextureCoords left="1" right="0.2" top="0" bottom=".8" />
+                                <AnchorFill/>
+                            </Texture>
+
+                            <Texture name="$(parent)Icon">
+                                <Dimensions x="32" y="32" />
+                                <Anchor point="BOTTOMRIGHT" offsetX="-15" offsetY="-11" />
+                            </Texture>
+
+                            <Label name="$(parent)Text" font="ZoFontWinH5" verticalAlignment="CENTER" color="FFFFFF" text="SI_AWEVS_NO_ACTIVE_MOD" >
+                                <Anchor point="RIGHT" relativeTo="$(parent)Icon" relativePoint="LEFT" offsetX="-8" />
+                            </Label>
+
+                        </Controls>
+                    </Control>
+                </Control>
+            </Controls>
+
+        </TopLevelControl>
+    </Controls>
+</GuiXml>
\ No newline at end of file
diff --git a/AwesomeEvents2/AwesomeEvents2.lua b/AwesomeEvents2/AwesomeEvents2.lua
new file mode 100644
index 0000000..29023cd
--- /dev/null
+++ b/AwesomeEvents2/AwesomeEvents2.lua
@@ -0,0 +1,548 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: AwesomeEvents.lua
+  Last Modified: 23.04.18 08:43
+
+  Copyright (c) 2018 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local state = {
+    initialized = false,
+    dragging = false,
+    lastUpdate = 0,
+    lastWidth = 0,
+    updateFrequency = 10,
+
+    inSettingsPanel = false,
+    position = {left=1000,top=30},
+
+    importFromCharacter = nil
+}
+
+local defaults = {
+    isDefault = true,
+    window = {
+        left = GuiRoot:GetWidth()/2,
+        top = 100,
+        movable = true,
+        scaling = 1.0,
+        textAlign = TEXT_ALIGN_CENTER,
+        textColor = {
+            [COLOR_AWEVS_AVAILABLE] = {r=0.5,g=0.83,b=0.5},
+            [COLOR_AWEVS_HINT] = {r=0.83,g=0.8,b=0.5},
+            [COLOR_AWEVS_WARNING] = {r=0.83,g=0.59,b=0.5},
+        }
+    },
+}
+local vars = {}
+local events = {}
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+
+---
+--- VIEW FUNCTIONS
+---
+
+--- after resizing the window or at first load, the anchors have to be resetted
+local function View_SetAnchors()
+    --[[
+    AwesomeEventsView:ClearAnchors()
+    if (vars.window.textAlign == TEXT_ALIGN_LEFT) then
+        AwesomeEventsView:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, state.position.left, state.position.top)
+    elseif (vars.window.textAlign == TEXT_ALIGN_RIGHT) then
+        AwesomeEventsView:SetAnchor(TOPRIGHT, GuiRoot, TOPLEFT, state.position.left, state.position.top)
+    else
+        AwesomeEventsView:SetAnchor(TOP, GuiRoot, TOPLEFT, state.position.left, state.position.top)
+    end
+    ]]
+end -- View_SetAnchors
+
+--- resize the window to show all visible labels
+local function View_SetSize()
+    --[[
+    if state.dragging then return end
+
+    local maxWidth,totalHeight,lastModId,lastLabel,lastModLabelCount = 0,0,nil,nil,0
+    local lazyAddSpacing = 0
+
+    -- starting at 1, but 1 = backgorund, 2 = title
+    for i = 3, AwesomeEventsView:GetNumChildren() do
+        local child = AwesomeEventsView:GetChild(i)
+        local text = child:GetText()
+
+        -- hide if text is empty
+        if(text == '')then
+            -- not hidden yet?
+            if(child:GetHeight() > 0)then
+                child:SetHeight(0)
+            end
+
+            -- show label with text
+        else
+            child:SetWidth(0)
+            local mod_id,spacing = libAM.labelToMod[i],0
+            -- last mod ended ?
+            if(lastModId~=mod_id)then
+                -- add bottom spacing to previous label (if mod has multiple label for)
+                if(lazyAddSpacing>0)then
+                    lastLabel:SetHeight(lastLabel:GetHeight() + lazyAddSpacing);
+                    totalHeight = totalHeight + lazyAddSpacing
+                    if(lastModLabelCount>1 or vars[lastModId].spacingPosition==TEXT_ALIGN_TOP)then
+                        lastLabel:SetVerticalAlignment(TEXT_ALIGN_TOP);
+                    else
+                        lastLabel:SetVerticalAlignment(TEXT_ALIGN_CENTER);
+                    end
+                    lazyAddSpacing = 0
+                end
+                lastModLabelCount = 0
+
+                -- add top spacing
+                if(vars[mod_id].spacingPosition==TEXT_ALIGN_BOTTOM)then
+                    spacing = vars[mod_id].spacing
+                    child:SetVerticalAlignment(TEXT_ALIGN_BOTTOM);
+                elseif(vars[mod_id].spacingPosition==TEXT_ALIGN_CENTER)then
+                    spacing = vars[mod_id].spacing
+                    child:SetVerticalAlignment(TEXT_ALIGN_BOTTOM);
+                    lazyAddSpacing = spacing
+                elseif(vars[mod_id].spacingPosition==TEXT_ALIGN_TOP)then
+                    child:SetVerticalAlignment(TEXT_ALIGN_TOP);
+                    lazyAddSpacing = vars[mod_id].spacing
+                end
+            end
+
+            local newHeight = child:GetTextHeight() + spacing
+            -- not yet visible or wrong spacing ?
+            if(newHeight ~= child:GetHeight())then
+                child:SetHeight(newHeight)
+            end
+            totalHeight = totalHeight + newHeight
+            maxWidth = math.max(maxWidth,child:GetTextWidth())
+
+            lastModLabelCount = lastModLabelCount+1
+            lastModId = mod_id
+            lastLabel = child
+        end
+    end
+
+    if(lazyAddSpacing>0)then
+        lastLabel:SetHeight(lastLabel:GetHeight() + lazyAddSpacing);
+        totalHeight = totalHeight + lazyAddSpacing
+        if(lastModLabelCount>1)then
+            lastLabel:SetVerticalAlignment(TEXT_ALIGN_TOP);
+        else
+            lastLabel:SetVerticalAlignment(TEXT_ALIGN_CENTER);
+        end
+    end
+
+    -- show awesome events label if no other label active
+    local child = AwesomeEventsView:GetChild(2)
+    local text = child:GetText()
+    if(totalHeight>0 and text~='')then
+        child:SetText('')
+        child:SetHeight(0)
+    elseif(totalHeight==0)then
+        text = GetString(SI_AWEVS_NO_ACTIVE_MOD)
+        for mod_id in libAM:module_pairs() do
+            if(vars[mod_id].enabled>0)then
+                text = addon.title
+            end
+        end
+        child:SetText(text)
+        child:SetWidth(0)
+        totalHeight = child:GetTextHeight()
+        child:SetHeight(totalHeight)
+        maxWidth = child:GetTextWidth()
+    end
+
+    maxWidth = (maxWidth+20)
+    totalHeight = totalHeight+10
+
+    for i = 2, AwesomeEventsView:GetNumChildren() do
+        local child = AwesomeEventsView:GetChild(i)
+        child:SetWidth(maxWidth)
+    end
+
+    AwesomeEventsView:SetWidth(maxWidth)
+    AwesomeEventsView:SetHeight(totalHeight)
+
+    if(state.lastWidth ~= maxWidth)then
+        state.lastWidth = maxWidth
+        View_SetAnchors();
+    end
+    ]]
+end -- View_SetSize
+
+--- change view movability
+local function View_SetMovable(movable)
+    vars.window.movable = movable
+    AwesomeEventsView:SetMovable(movable)
+end -- View_SetMovable
+
+--- change view scale
+local function View_SetScale(scaling)
+    vars.window.scaling = scaling / 10;
+    AwesomeEventsView:SetScale(vars.window.scaling)
+    View_SetSize()
+end -- View_SetScale
+
+--- change vertical alignment of a label, adjust view size
+local function View_SetSpacingPosition(mod_id,newSpacingPosition)
+    --[[ translate value to key
+    if(newSpacingPosition == GetString(SI_AWEMOD_SPACING_TOP)) then
+        newSpacingPosition = TEXT_ALIGN_TOP
+    elseif(newSpacingPosition == GetString(SI_AWEMOD_SPACING_BOTTOM)) then
+        newSpacingPosition = TEXT_ALIGN_BOTTOM
+    elseif(newSpacingPosition == GetString(SI_AWEMOD_SPACING_BOTH)) then
+        newSpacingPosition = TEXT_ALIGN_CENTER
+    end
+    vars[mod_id].spacingPosition = newSpacingPosition
+    View_SetSize()
+    ]]
+end -- View_SetSpacingPosition
+
+--- change horizontal alignment of all labels, adjust view position
+local function View_SetTextAlign(newTextAlign)
+    --[[ translate value to key
+    if(newTextAlign == GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_LEFT)) then
+        newTextAlign = TEXT_ALIGN_LEFT
+    elseif(newTextAlign == GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_RIGHT)) then
+        newTextAlign = TEXT_ALIGN_RIGHT
+    elseif(newTextAlign == GetString(SI_AWEVS_APPEARANCE_TEXTALIGN_CENTER)) then
+        newTextAlign = TEXT_ALIGN_CENTER
+    end
+    -- keep the position even if the anchor changes
+    if(state.initialized)then
+        local halfWindowWidth,leftShift = math.floor(AwesomeEventsView:GetWidth()/2),0
+        if(vars.window.textAlign == TEXT_ALIGN_LEFT)then
+            leftShift = halfWindowWidth
+        elseif(vars.window.textAlign == TEXT_ALIGN_RIGHT)then
+            leftShift = 0 - halfWindowWidth
+        end
+        if(newTextAlign == TEXT_ALIGN_LEFT)then
+            leftShift = leftShift - halfWindowWidth
+        elseif(newTextAlign == TEXT_ALIGN_RIGHT)then
+            leftShift = leftShift + halfWindowWidth
+        end
+        state.position.left = state.position.left + leftShift
+        vars.window.left = vars.window.left + leftShift
+    end
+    vars.window.textAlign = newTextAlign
+
+    View_SetAnchors()
+    for i = 2, AwesomeEventsView:GetNumChildren() do
+        local child = AwesomeEventsView:GetChild(i)
+        child:SetHorizontalAlignment(newTextAlign)
+    end
+    ]]
+end -- View_SetTextAlign
+
+local function View_SetTextColor(type,rValue,gValue,bValue)
+    rValue = math.floor(rValue*100)/100
+    gValue = math.floor(gValue*100)/100
+    bValue = math.floor(bValue*100)/100
+    libAM.SetColorDef(type,rValue,gValue,bValue)
+    vars.window.textColor[type] = {r=rValue,g=gValue,b=bValue}
+    for mod_id,mod in libAM:module_pairs() do
+        if(vars[mod_id].enabled>0)then
+            mod.dataUpdated = true
+        end
+    end
+end -- View_SetTextColor
+
+--- update the font size of all labels
+local function View_SetTextSize()
+    --[[ starting at 1, but 1 = background, 2 = title
+    for i = 3, AwesomeEventsView:GetNumChildren() do
+        local child = AwesomeEventsView:GetChild(i)
+        local mod_id = libAM.labelToMod[i]
+        local fontSize = 6-vars[mod_id].fontSize
+        if(fontSize<1)then fontSize = 1 end
+        if(fontSize>5)then fontSize = 5 end
+        child:SetFont('ZoFontWinH'..fontSize)
+    end
+    ]]
+end -- View_SetTextSize
+
+local function View_SetHidden(hidden)
+   --[[ if(hidden == null)then
+        hidden = false
+    end
+    if (not hidden and AwesomeEventsView:IsHidden()) then
+        if (state.inSettingsPanel) then
+            local sub = {
+                [TEXT_ALIGN_LEFT] = AwesomeEventsView:GetWidth(),
+                [TEXT_ALIGN_CENTER] = AwesomeEventsView:GetWidth()/2,
+                [TEXT_ALIGN_RIGHT] = 0,
+            }
+            state.position.left = math.floor(GuiRoot:GetWidth()*0.96) - sub[vars.window.textAlign]
+            state.position.top = 200
+
+            AwesomeEventsView:SetDrawLayer(DL_OVERLAY)
+            AwesomeEventsView:SetMovable(true)
+            AwesomeEventsViewBg:SetAlpha(1)
+        else
+            state.position.left = vars.window.left
+            state.position.top = vars.window.top
+
+            AwesomeEventsView:SetDrawLayer(DL_BACKGROUND)
+            AwesomeEventsView:SetMovable(vars.window.movable)
+            AwesomeEventsViewBg:SetAlpha(0)
+        end
+        View_SetAnchors()
+    end
+    AwesomeEventsView:SetHidden(false)
+    ]]
+    if(hidden == true)then
+        libAM.CallbackManager:FireCallbacks("AwesomeEventsShow")
+    else
+        libAM.CallbackManager:FireCallbacks("AwesomeEventsHide")
+    end
+end -- View_SetHidden
+
+
+---
+-- EVENT MANAGER
+---
+
+local function OnEvent(...)
+    local args = {... }
+    local eventCode = args[1] or 'unknown'
+    if(events[eventCode] ~= nil)then
+        for mod_id,callback in pairs(events[eventCode]) do
+            -- slibAM.d('main','OnEvent['..mod_id..']: '..eventCode)
+            callback(unpack(args))
+        end
+    else
+        libAM.d('main','OnEvent: '..eventCode..' - ' .. GetString(SI_AWEVS_DEBUG_NO_EVENT_CALLBACKS),events)
+        EVENT_MANAGER:UnregisterForEvent('Awesome_Events', eventCode)
+    end
+end -- OnEvent
+
+local function SetEventListeners()
+    libAM.d('main','SetEventListeners')
+    -- remove old listeners
+    for eventCode,event in pairs(events) do
+        EVENT_MANAGER:UnregisterForEvent('Awesome_Events', eventCode)
+    end
+
+    events = {}
+    events[EVENT_AWESOME_MODULE_TIMER] = {}
+    -- foreach module
+    for mod_id,mod in libAM:module_pairs() do
+        if(vars[mod.id].enabled>0)then
+            local mod_events = mod:GetEventListeners()
+            for i,event in pairs(mod_events) do
+                if(event.eventCode ~= nil and event.callback ~= nil)then
+                    if(events[event.eventCode] == nil)then
+                        events[event.eventCode] = {}
+                        EVENT_MANAGER:RegisterForEvent('Awesome_Events', event.eventCode, function(...) OnEvent(unpack({...})) end)
+                    end
+                    events[event.eventCode][mod.id] = event.callback
+                else
+                    libAM.d('main','SetEventListeners['..mod_id..']',GetString(SI_AWEVS_DEBUG_MODULE_EVENT_INVALID),event)
+                end
+            end
+        end
+    end
+    libAM.timer = {}
+    if(events[EVENT_AWESOME_MODULE_TIMER] ~= nil)then
+        -- foreache awesome events timer
+        for mod_id,callback in pairs(events[EVENT_AWESOME_MODULE_TIMER]) do
+            libAM.timer[mod_id] = 1
+        end
+    end
+end -- SetEventListeners
+
+
+--- Initialize modules, config menu, views and user configuration
+local function Initialize()
+    -- Only initialize the addon (after all addons are loaded)
+    EVENT_MANAGER:UnregisterForEvent('Awesome_Events', EVENT_PLAYER_ACTIVATED)
+
+    -- test if any mod is in debug mode
+    for mod_id,mod in libAM:module_pairs() do
+        if(mod.debug)then
+            libAM.debug = true
+        end
+    end
+    if(libAM.debug)then
+        libAM.CallbackManager:FireCallbacks("DEBUG_TOGGLE",true)
+    end
+
+    libAM.RegisterCallback("AwesomeEventsConfigReloaded", function(_vars)
+        AwesomeEventsView:SetScale(_vars.window.scaling)
+        AwesomeEventsView:SetMovable(_vars.window.movable)
+        View_SetTextAlign(_vars.window.textAlign)
+        View_SetTextSize()
+        View_SetSize()
+    end);
+
+    -- load module- and user configuration
+    local panelOptions = LoadModulesConfiguration()
+    vars = ZO_SavedVars:New('AwesomeEvents', 2, nil, defaults)
+    vars.isDefault = false
+
+    -- init modules: create labels and preload data
+    for mod_id,mod in libAM:module_pairs() do
+        mod:Initialize( vars[mod_id] )
+    end
+    libAM.d('main','Complete!')
+
+    -- restore gui user config
+    for key,color in pairs(vars.window.textColor) do
+        libAM.SetColorDef(key,color.r,color.g,color.b)
+    end
+    AwesomeEventsView:SetScale(vars.window.scaling)
+    AwesomeEventsView:SetMovable(vars.window.movable)
+    View_SetTextAlign(vars.window.textAlign)
+    View_SetTextSize()
+    View_SetSize()
+
+    -- create addon menu (LAM)
+    CreateSettingsMenu(panelOptions)
+
+    -- register LAM/optionsPanel events
+    local lamControl = WINDOW_MANAGER:GetControlByName('LAMAddonSettingsWindow')
+    local lamOnShowHandler = lamControl:GetHandler('OnShow')
+    if(lamOnShowHandler ~= nil) then
+        lamControl:SetHandler('OnShow',function(self,hidden)
+            LAM_OnChangeActivePanel()
+            lamOnShowHandler(self,hidden)
+        end)
+    else
+        lamControl:SetHandler('OnShow',function(self,hidden)
+            LAM_OnChangeActivePanel()
+        end)
+    end
+    CALLBACK_MANAGER:RegisterCallback("LAM-RefreshPanel",LAM_OnChangeActivePanel)
+
+    -- register SCENE events
+    SCENE_MANAGER:RegisterCallback("SceneStateChanged", function(scene,oldState,newState)
+        if(scene.name == 'hud' or scene.name == 'hudui')then
+            if(newState == SCENE_HIDING)then
+                View_SetHidden(true)
+            elseif(newState == SCENE_SHOWN)then
+                View_SetHidden(false)
+            end
+        elseif(scene.name == 'gameMenuInGame')then
+            if(newState == SCENE_HIDING)then
+                state.inSettingsPanel = false
+                View_SetHidden(true)
+            elseif(newState == SCENE_SHOWN)then
+                state.inSettingsPanel = true
+            end
+        end
+    end)
+
+    -- register MODULE events
+    SetEventListeners()
+
+    state.initialized = true
+
+    View_SetHidden(false)
+end -- Initialize
+
+
+---
+-- MAIN FRAME UPDATE
+---
+
+-- main update: firering timer, call mod update functions, update the viewsize
+local function Update(timestamp)
+    -- trigger EVENT_AWESOME_MODULE_TIMER
+    if(events[EVENT_AWESOME_MODULE_TIMER] ~= nil)then
+        local secondsToNextMinute = 60 - timestamp%60
+        if(secondsToNextMinute<10)then
+            secondsToNextMinute = secondsToNextMinute + 60
+        end
+        for mod_id,callback in pairs(events[EVENT_AWESOME_MODULE_TIMER]) do
+            if(vars[mod_id].enabled > 0 and libAM.timer[mod_id] > 0 and libAM.timer[mod_id] <= timestamp)then
+                libAM.d('main','OnTimer['..mod_id..']')
+                local seconds = callback(EVENT_AWESOME_MODULE_TIMER,timestamp)
+                -- no return value => execute every minute
+                if(type(seconds)~= 'number') then
+                    seconds = secondsToNextMinute
+                elseif(seconds>0) then
+                    libAM.d('main','Next timer event ['..mod_id..'] in ' .. tostring(seconds) .. ' seconds')
+                end
+                -- timer still enabled ?
+                if(libAM.timer[mod_id]>0)then
+                    if(seconds<1)then
+                        libAM.d('main','Timer event autopaused ['..mod_id..']')
+                        libAM.timer[mod_id] = 0
+                    else
+                        libAM.timer[mod_id] = timestamp + seconds
+                    end
+                end
+            end
+        end
+    end
+    local resizeView = false
+    -- update each module
+    for mod_id,mod in libAM:module_pairs() do
+        if(vars[mod.id].enabled > 0 and mod:HasUpdate())then
+            mod.dataUpdated = false
+            mod:Update(vars[mod.id])
+            resizeView = true
+        end
+    end
+    if(resizeView)then
+        View_SetSize();
+    end
+end -- Update
+
+
+-------------------------
+-- VIEW EVENT LISTENER --
+-------------------------
+
+function AWESOME_EVENTS_OnMoveStart()
+    if (not state.initialized) then return end
+
+    -- start dragging mode
+    state.dragging = true
+
+    -- do not change alpha in LAMSettingsPanel
+    if(not state.inSettingsPanel)then
+        AwesomeEventsViewBg:SetAlpha(0.5)
+    end
+end -- AWESOME_EVENTS_OnMoveStart
+
+function AWESOME_EVENTS_OnMoveStop()
+    --[[
+    if (not state.initialized) then return end
+
+    if (vars.window.textAlign == TEXT_ALIGN_LEFT) then
+        state.position.left = AwesomeEventsView:GetLeft()
+        state.position.top = AwesomeEventsView:GetTop()
+    elseif (vars.window.textAlign == TEXT_ALIGN_RIGHT) then
+        state.position.left = AwesomeEventsView:GetRight()
+        state.position.top = AwesomeEventsView:GetTop()
+    else
+        state.position.left = AwesomeEventsView:GetCenter()
+        state.position.top = AwesomeEventsView:GetTop()
+    end
+
+    -- do not store movement or change alpha in LAMSettingsPanel
+    if(not state.inSettingsPanel)then
+        AwesomeEventsViewBg:SetAlpha(0)
+        vars.window.left = math.floor(state.position.left*100)/100;
+        vars.window.top = math.floor(state.position.top*100)/100;
+    end
+    state.dragging = false
+    ]]
+end -- AWESOME_EVENTS_OnMoveStop
+
+
+
+
+----------------
+-- INIT EVENT --
+----------------
+
+EVENT_MANAGER:RegisterForEvent('Awesome_Events', EVENT_PLAYER_ACTIVATED, Initialize)
\ No newline at end of file
diff --git a/AwesomeEvents2/AwesomeEvents2.txt b/AwesomeEvents2/AwesomeEvents2.txt
new file mode 100644
index 0000000..a116b68
--- /dev/null
+++ b/AwesomeEvents2/AwesomeEvents2.txt
@@ -0,0 +1,49 @@
+## APIVersion: 100022
+## Version: 1.4-Alpha9
+## Title: |cFFFFB0Awesome Events|r
+## Description: This addon adds many customizable notifications and information to your UI. (Version: 1.4-Alpha9)
+## Author: Ze_Mi
+## OptionalDependsOn: LibStub, LibAddonMenu-2.0, LibAwesomeModule-2.0
+## SavedVariables: AwesomeEvents
+##
+## This Add-on is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates.
+## The Elder Scrolls® and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries.
+## All rights reserved
+##
+## You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
+
+Libs/LibStub/LibStub.lua
+Libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
+Libs/LibAddonMenu-2.0/controls/panel.lua
+Libs/LibAddonMenu-2.0/controls/submenu.lua
+Libs/LibAddonMenu-2.0/controls/button.lua
+Libs/LibAddonMenu-2.0/controls/checkbox.lua
+Libs/LibAddonMenu-2.0/controls/colorpicker.lua
+Libs/LibAddonMenu-2.0/controls/custom.lua
+Libs/LibAddonMenu-2.0/controls/description.lua
+Libs/LibAddonMenu-2.0/controls/dropdown.lua
+Libs/LibAddonMenu-2.0/controls/header.lua
+Libs/LibAddonMenu-2.0/controls/slider.lua
+Libs/LibAddonMenu-2.0/controls/texture.lua
+Libs/LibAwesomeModule-2.0/LibAwesomeModule-2.0.lua
+Libs/LibMsgWin-1.0/LibMsgWin-1.0.lua
+
+Language/strings.lua
+Language/$(language).lua
+
+Modules/BuffFood.lua
+Modules/Clock.lua
+Modules/Crafting.lua
+Modules/Durability.lua
+Modules/Fencing.lua
+Modules/Inventory.lua
+Modules/Mails.lua
+Modules/Mount.lua
+Modules/RepairKits.lua
+Modules/Skills.lua
+Modules/SkyShards.lua
+Modules/SoulGems.lua
+Modules/WeaponCharge.lua
+AwesomeEvents.lua
+AwesomeEvents.xml
+AwesomeModuleLabel.xml
\ No newline at end of file
diff --git a/AwesomeEvents2/Language/de.lua b/AwesomeEvents2/Language/de.lua
new file mode 100644
index 0000000..ef22b33
--- /dev/null
+++ b/AwesomeEvents2/Language/de.lua
@@ -0,0 +1,197 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: de.lua
+  Last Modified: 17.07.17 12:56
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  Für weitere Informationen lies bitte die README Datei.
+  ]]
+
+--main
+SafeAddString(SI_AWEVS_NO_ACTIVE_MOD, "Aktiviere ein AwesomeEvents Modul", 1)
+SafeAddString(SI_AWEVS_DESCRIPTION, "Mit AwesomeEvents kannst du während dem Spielen über viele interessante Ergeignisse informiert werden.\nDa es viele Module und Anpassungsmöglichkeiten gibt,\nsolltest du dir kurz Zeit nehmen und einmal alle Optionen bis unten durch stöbern.\nBei Verbesserungsvorschlägen, Wünschen, neuen Übersetzungen oder Fehlern, wende dich einfach an <zemi@unive.de> oder über das Spiel EU\PC @Ze_Mi :)", 1)
+
+--debug
+SafeAddString(SI_AWEVS_DEBUG_NO_EVENT_CALLBACKS, "Keine Callbacks, EventListener entfernt!", 1)
+SafeAddString(SI_AWEVS_DEBUG_ENABLED, "|c82D482AKTIVIERT", 1)
+SafeAddString(SI_AWEVS_DEBUG_DISABLED, "|cD49682DEAKTIVIERT", 1)
+SafeAddString(SI_AWEVS_DEBUG_MODULE_EVENT_INVALID, "Ungültiges event Objekt!\nErwartet: event={eventCode=EVENT_...,callback=function() ... end}!\nBeide Schlüssel werden benötigt!\nIst:", 1)
+SafeAddString(SI_AWEVS_DEBUG_MODULE_OPTION_INVALID, "Ungültiges options Objekt!\nErwartet: option={type='',name='',tooltip='',default=...}!\nDiese Schlüssel werden mindestens benötigt!\nIst:", 1)
+SafeAddString(SI_AWEVS_DEBUG_MODULE_NOT_FOUND, "Modul nicht gefunden!", 1)
+SafeAddString(SI_AWEVS_DEBUG_MODULE_NO_TIMER, "Diese modul reagiert nicht auf das Event EVENT_AWESOME_MODULE_TIMER oder du versuchst eine Timer Funktion innerhalb der Enable Funktion aufzurufen, sorry das geht leider nicht. Der timer kann nicht genutzt werden.", 1)
+SafeAddString(SI_AWEVS_DEBUG_COMMAND_USAGE, "Befehl: /aedebug mod_id (on\off)", 1)
+
+--appearance
+SafeAddString(SI_AWEVS_APPEARANCE, "Darstellung", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_MOVABLE, "Fenster verschiebbar", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_MOVABLE_HINT, "Entsperrt das Fenster, sodass es frei mit der Maus verschoben werden kann.", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN, "Text-Ausrichtung", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_HINT, "Verändere die Ausrichtung aller Benachrichtigungen.", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_LEFT, "Linksbündig", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_CENTER,"Zentriert", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_RIGHT, "Rechtsbündig", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_UISCALE, "Fenster Größe / Skalierung", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_UISCALE_HINT, "Vergrößere oder verkleinere die Darstellung des Fensters.", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_COLOR_AVAILABLE,"Farbe von Verfügbarkeiten", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_COLOR_AVAILABLE_HINT, "Ändere die Textfarbe von Verfügbarkeits-Meldungen.", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_COLOR_HINT,"Farbe von Hinweisen", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_COLOR_HINT_HINT, "Ändere die Textfarbe von Hinweis-Meldungen.", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_COLOR_WARNING,"Farbe von Warnungen", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_COLOR_WARNING_HINT, "Ändere die Textfarbe von Warnungen.", 1)
+
+--import
+SafeAddString(SI_AWEVS_IMPORT,"Einstellungen Importieren", 1)
+SafeAddString(SI_AWEVS_IMPORT_DESCRIPTION,"Übernehme die Einstellungen von einem anderen Charakter", 1)
+SafeAddString(SI_AWEVS_IMPORT_CHARACTER_LABEL,"Importiere von", 1)
+SafeAddString(SI_AWEVS_IMPORT_CHARACTER_SELECT," - Wähle einen Charakter -", 1)
+SafeAddString(SI_AWEVS_IMPORT_BUTTON,"Importieren", 1)
+
+--module-all
+SafeAddString(SI_AWEMOD_SHOW, "Anzeigen", 1)
+SafeAddString(SI_AWEMOD_SHOW_HINT, "Aktiviere oder deaktiviere alle Benachrichtigungen dieses Moduls", 1)
+SafeAddString(SI_AWEMOD_SHOW_ICON, "Icon", 1)
+SafeAddString(SI_AWEMOD_SHOW_ICON_AND_TEXT, "Icon und Text", 1)
+SafeAddString(SI_AWEMOD_SHOW_TEXT, "Text", 1)
+SafeAddString(SI_AWEMOD_SHOW_NONE, "Nichts (Deaktiviert)", 1)
+SafeAddString(SI_AWEMOD_SPACING_POSITION, "Abstand (Positionierung)", 1)
+SafeAddString(SI_AWEMOD_SPACING_POSITION_HINT, "Wähle die Positionierung des Abstands zwischen Nachrichten dieses Moduls und anderen Benachrichtigungen.", 1)
+SafeAddString(SI_AWEMOD_SPACING_BOTTOM, "Oben", 1)
+SafeAddString(SI_AWEMOD_SPACING_BOTH, "Oben und unten", 1)
+SafeAddString(SI_AWEMOD_SPACING_TOP, "Unten", 1)
+SafeAddString(SI_AWEMOD_SPACING, "Abstand (Größe)", 1)
+SafeAddString(SI_AWEMOD_SPACING_HINT, "Wähle den Abstand zwischen Nachrichten dieses Moduls und anderen Benachrichtigungen.", 1)
+SafeAddString(SI_AWEMOD_FONTSIZE, "Schriftgröße", 1)
+SafeAddString(SI_AWEMOD_FONTSIZE_HINT, "Wähle die Schriftgrößer aller Benachrichtigungen diese Moduls.", 1)
+
+--module-bufffood
+SafeAddString(SI_AWEMOD_BUFFFOOD, "Versorgungs-Wirkzeit (Buff-Food)", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_HINT, "Erhalte eine Benachrichtigung mit verbleibender Zeit, wenn der Effekt deiner Nahrung kurz vor dem Ablauf steht oder du bereits neue Buff-Nahrung zu dir nehmen kannst.", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_TIMER_LABEL, "Effekt <<C:1>> endet in", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_READY_LABEL, "Keine Buff-Food Effekte aktiv!", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_TIMER, "Restzeit-Hinweis ab (Minuten)", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_TIMER_HINT, "Zeigt den Versorgungs-Hinweis mit Countdown an, sobald der Effekt der genommenen Nahrung in weniger als der hier festgelegten Minutenzahl auslaufen wird.", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT, "Blinken (im Kampf)", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT_HINT, "Die Warnung fängt an zu blinken, wenn du dich im Kampf befindest und keinen Buff-Food Effekt aktiv hast.", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT, "Ausblenden (Ohne Kampf)", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT_HINT, "Wenn du keinen Versorgungs-Effekt aktiv hast und 5 minuten lang an keinem Kampf teilnimmst, wird die Warnung bis zum nächsten Kampf oder bis zur nächsten Mahlzeit ausgeblendet.", 1)
+
+--module-clock
+SafeAddString(SI_AWEMOD_CLOCK, "Uhrzeit und Datum", 1)
+SafeAddString(SI_AWEMOD_CLOCK_HINT, "Zeige die aktuelle Uhrzeit und das Datum auf dem Bildschirm an.", 1)
+SafeAddString(SI_AWEMOD_CLOCK_DATEFORMAT_SHORT, "day.month", 1)
+SafeAddString(SI_AWEMOD_CLOCK_DATEFORMAT_LONG, "day.month.year", 1)
+SafeAddString(SI_AWEMOD_CLOCK_STYLE, "Darstellung", 1)
+SafeAddString(SI_AWEMOD_CLOCK_STYLE_HINT, "Wähle deine bevorzugte Darstellung.", 1)
+SafeAddString(SI_AWEMOD_CLOCK_STYLE_TIME, "Nur Uhrzeit", 1)
+SafeAddString(SI_AWEMOD_CLOCK_STYLE_DATETIME_SHORT, "Datum & Uhrzeit (Einzeilig)", 1)
+SafeAddString(SI_AWEMOD_CLOCK_STYLE_DATETIME_LONG, "Datum & Uhrzeit (Zweizeilig)", 1)
+SafeAddString(SI_AWEMOD_CLOCK_FORMAT, "Format 24-Stunden", 1)
+SafeAddString(SI_AWEMOD_CLOCK_FORMAT_HINT, "Schalte auf das 24-Stunden Format statt 12-Stunden (+AM/PM) Format um.", 1)
+
+--module-crafting
+SafeAddString(SI_AWEMOD_CRAFTING, "Handwerk", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_HINT, "Erhalte eine Benachrichtigung mit verbleinder Zeit, wenn deine laufende Analyse eines Handwerksberufs kurz vor dem Abschluss steht, oder ob du bereits eine neue Analyse starten kannst.", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_AVAILABLE_LABEL, "Analyse", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_BLACKSMITHING, "Schmiedekunst anzeigen", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_BLACKSMITHING_HINT, "Aktiviere die Anzeige in wie viel Minuten ein neuer Gegenstand in der Schmiede analysiert werden kann.", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_CLOTHING, "Schneiderei anzeigen", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_CLOTHING_HINT, "Aktiviere die Anzeige in wie viel Minuten ein neuer Gegenstand in der Schneiderbank analysiert werden kann.", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_WOODWORKING, "Schreinerei anzeigen", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_WOODWORKING_HINT, "Aktiviere die Anzeige in wie viel Minuten ein neuer Gegenstand in der Schreinerbank analysiert werden kann.", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_TIMER, "Analyse-Hinweis ab (Minuten)", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_TIMER_HINT, "Zeigt die oben gewählten Analyse-Hinweis mit Countdown an, sobald die Analyse in weniger als der hier festgelegten Minutenzahl abgeschlossen wird.", 1)
+
+--module-durability
+SafeAddString(SI_AWEMOD_DURABILITY, "Haltbarkeit getragener Rüstung", 1)
+SafeAddString(SI_AWEMOD_DURABILITY_LABEL, "Rüstungszustand", 1)
+SafeAddString(SI_AWEMOD_DURABILITY_HINT, "Erhalte eine Benarichtigung über die Haltbarkeit deiner getragenen Rüstung, bevor diese zu schwach wird.", 1)
+SafeAddString(SI_AWEMOD_DURABILITY_INFO, "Haltbarkeit (|cFFFF60Hinweis|r) %", 1)
+SafeAddString(SI_AWEMOD_DURABILITY_INFO_HINT, "Wenn die Haltbarkeit eines deiner Rüstungsteile höchstens den hier eingestellte Wert hat, wird ein Hinweis angezeigt.", 1)
+SafeAddString(SI_AWEMOD_DURABILITY_WARNING, "Haltbarkeit (|cFF6060Warnung|r) %", 1)
+SafeAddString(SI_AWEMOD_DURABILITY_WARNING_HINT, "Wenn die Haltbarkeit eines deiner Rüstungsteile höchstens den hier eingestellte Wert hat, wird eine Warnung angezeigt.", 1)
+
+--module-fencing
+SafeAddString(SI_AWEMOD_FENCING, "Diebesgilde", 1)
+SafeAddString(SI_AWEMOD_FENCING_HINT, "Erhalte eine Benarichtigung über die verbleibenden Transaktionen bei deinem Hehler, sobald diese unter die unten eingestellten Werte sinken, oder erhalte einen Countdown, wann du neue Transaktionen tätigen kannst.", 1)
+SafeAddString(SI_AWEMOD_FENCING_SELLS_LABEL, "Hehlerei", 1)
+SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_LABEL, "Schieben", 1)
+SafeAddString(SI_AWEMOD_FENCING_SELLS, "Verbleibende Verkäufe anzeigen", 1)
+SafeAddString(SI_AWEMOD_FENCING_SELLS_HINT, "Aktiviere Hinweise über die verbleibenden Verkäufe von Diebesgut, sobald diese unter die folgenden Werte fallen.", 1)
+SafeAddString(SI_AWEMOD_FENCING_SELLS_INFO, "Verkäufe (|cFFFF60Hinweis|r)", 1)
+SafeAddString(SI_AWEMOD_FENCING_SELLS_INFO_HINT,"Wenn du nur noch die hier eingestellte Anzahl an Diebesgut an den Hehler verkaufen kannst, wird ein Hinweis angezeigt.", 1)
+SafeAddString(SI_AWEMOD_FENCING_SELLS_WARNING, "Verkäufe (|cFF6060Warnung|r)", 1)
+SafeAddString(SI_AWEMOD_FENCING_SELLS_WARNING_HINT,"Wenn du nur noch die hier eingestellte Anzahl an Diebesgut an den Hehler verkaufen kannst, wird eine Warnung angezeigt.", 1)
+SafeAddString(SI_AWEMOD_FENCING_LAUNDERS, "Verbleibendes Schieben anzeigen", 1)
+SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_HINT, "Aktiviere Hinweise über die verbleibenden Schiebe-Vorgänge von Diebesgut, sobald diese unter die folgenden Werte fallen.", 1)
+SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_INFO,"Schieben/Reinwaschen (|cFFFF60Hinweis|r)", 1)
+SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_INFO_HINT,"Wenn du nur noch die hier eingestellte Anzahl an Diebesgut rein waschen kannst, wird ein Hinweis angezeigt.", 1)
+SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_WARNING,"Schieben/Reinwaschen (|cFF6060Warnung|r)", 1)
+SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_WARNING_HINT,"Wenn du nur noch die hier eingestellte Anzahl an Diebesgut rein waschen kannst, wird eine Warnung angezeigt.", 1)
+
+--module-inventory
+SafeAddString(SI_AWEMOD_INVENTORY, "Inventar (Platz & Geld)", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_HINT, "Lass dir deine Inventarauslatung anzeigen, dein aktuelles Vermögen und/oder erhalte eine Benachrichtigung, bevor dir der Inventarplatz ausgeht.", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_LOW, "Verbleibende freie Plätze anzeigen", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_LOW_HINT, "Erhalte eine Benachrichtigung, bevor dir der Platz im Rucksack ausgeht.", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_LOW_INFO, "Freie Plätze (|cFFFF60Hinweis|r)", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_LOW_INFO_HINT, "Wenn nur noch die hier eingestellte Anzahl an Plätzen in deinem Rucksack unbelegt ist, wird ein Hinweis angezeigt.", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_LOW_WARNING, "Freie Plätze (|cFF6060Warnung|r)", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_LOW_WARNING_HINT,"Wenn nur noch die hier eingestellte Anzahl an Plätzen in deinem Rucksack unbelegt ist, wird eine Warnung angezeigt.", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_LOW_LABEL, "Rucksackplatz|r: <<1>>", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_DETAILS, "Inventarauslastung anzeigen", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_DETAILS_HINT, "Lasse dir die aktuelle Bank- und Rucksackauslastung anzeigen.", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_DETAILS_LABEL, "<<1>>Rucksack|r: <<2>>/<<3>> <<1>>|| Bank|r: <<4>>/<<5>>", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_MONEY, "Vermögen (Gold) anzeigen", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_MONEY_HINT, "Lasse dir dein eingelagertes und verfügbares Vermögen anzeigen.", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_MONEY_LABEL, "Gold|r: <<1>>k |t16:16:EsoUI/Art/currency/currency_gold.dds|t<<2[/ (+1k eingelagert)/ (+$dk eingelagert)]>>", 1)
+
+--module-mails
+SafeAddString(SI_AWEMOD_MAILS, "Nachrichten", 1)
+SafeAddString(SI_AWEMOD_MAILS_HINT, "Erhalte eine Benachrichtigung, sobald du ungelesene Nachrichten im Posteingang hast.", 1)
+SafeAddString(SI_AWEMOD_MAILS_LABEL, "Neue Nachrichten", 1)
+
+--module-mount
+SafeAddString(SI_AWEMOD_MOUNT, "Reittier Training", 1)
+SafeAddString(SI_AWEMOD_MOUNT_HINT, "Erhalte eine Benachrichtigung mit verbleibender Zeit, wenn das Training von deinem Reittier kurz vor dem Abschluss steht, oder du bereits ein neues Training starten kannst.", 1)
+SafeAddString(SI_AWEMOD_MOUNT_TIMER_LABEL, "Reittier trainiert", 1)
+SafeAddString(SI_AWEMOD_MOUNT_READY_LABEL, "Reittier kann trainieren", 1)
+SafeAddString(SI_AWEMOD_MOUNT_TIMER, "Trainigs-Hinweis ab (Minuten)", 1)
+SafeAddString(SI_AWEMOD_MOUNT_TIMER_HINT, "Zeigt den Trainings-Hinweis mit Countdown an, sobald das laufende Training in weniger als der hier festgelegten Minutenzahl abgeschlossen wird.", 1)
+
+--module-repairkits
+SafeAddString(SI_AWEMOD_REPAIRKITS, "Reparatur-Kits", 1)
+SafeAddString(SI_AWEMOD_REPAIRKITS_HINT, "Lass dir anzeigen, wie viele Reparatur-Kisten du im Rucksack hast.", 1)
+SafeAddString(SI_AWEMOD_REPAIRKITS_LABEL, "Reparatur-Kits|r: |t16:16:EsoUI/Art/icons/store_repairkit_002.dds|t <<1[Keine/1 Kiste/$d Kisten]>>", 1)
+
+--module-skills
+SafeAddString(SI_AWEMOD_SKILLS, "Attribute- und Fertigkeiten", 1)
+SafeAddString(SI_AWEMOD_SKILLS_HINT, "Erhalte eine Benachrichtigung, sobald du über nicht gesetzte Attributs- und Fertigkeitspunkte verfügst.", 1)
+SafeAddString(SI_AWEMOD_SKILLS_ATTRIBUTES_LABEL, "Attribute", 1)
+SafeAddString(SI_AWEMOD_SKILLS_CHAMPIONPOINTS_LABEL, "CP", 1)
+SafeAddString(SI_AWEMOD_SKILLS_SKILLS_LABEL, "Skills", 1)
+
+--module-skyshards
+SafeAddString(SI_AWEMOD_SKYSHARDS, "Himmelsscherben", 1)
+SafeAddString(SI_AWEMOD_SKYSHARDS_HINT, "Er halte eine Benarichtigung darüber, wie viele Himmelsscherben dir noch zum nächsten Fertigkeitspunkt fehlen.", 1)
+SafeAddString(SI_AWEMOD_SKYSHARDS_REMAINING_LABEL, "Scherben", 1)
+SafeAddString(SI_AWEMOD_SKYSHARDS_REMAINING, "Scherben-Hinweis ab (fehlend)", 1)
+SafeAddString(SI_AWEMOD_SKYSHARDS_REMAINING_HINT, "Wenn du nur noch die hier eingestellte Anzahl an Himmelsscherben für einen Fertigkeitspunkt benötigst, wird ein Hinweis angezeigt.", 1)
+
+--module-soulgems
+SafeAddString(SI_AWEMOD_SOULGEMS, "Seelensteine (Wiederbelebung)", 1)
+SafeAddString(SI_AWEMOD_SOULGEMS_HINT, "Lass dir anzeigen, wie viele leere oder gefüllte Seelensteine du für deine eigene Wiederbelebung hast.", 1)
+SafeAddString(SI_AWEMOD_SOULGEMS_LABEL, "Seelensteine|r: <<1>> |t16:16:EsoUI/Art/icons/soulgem_006_filled.dds|t <<2[/(1 leerer)/($d leere)]>>", 1)
+
+--module-weaponchrage
+SafeAddString(SI_AWEMOD_WEAPONCHARGE, "Aufladung ausgerüsteter Waffen", 1)
+SafeAddString(SI_AWEMOD_WEAPONCHARGE_HINT, "Erhalte eine Benarichtigung über die verbleinden Aufladungen deiner ausgerüsteten Waffen, bevor diese leer geht.", 1)
+SafeAddString(SI_AWEMOD_WEAPONCHARGE_INFO, "Aufladung (|cFFFF60Hinweis|r) %", 1)
+SafeAddString(SI_AWEMOD_WEAPONCHARGE_INFO_HINT, "Wenn die Aufladung deiner Waffen-Verzauberung höchstens den hier eingestellte Wert hat, wird ein Hinweis angezeigt.", 1)
+SafeAddString(SI_AWEMOD_WEAPONCHARGE_WARNING, "Aufladung (|cFF6060Warnung|r) %", 1)
+SafeAddString(SI_AWEMOD_WEAPONCHARGE_WARNING_HINT, "Wenn die Aufladung deiner Waffen-Verzauberung höchstens den hier eingestellte Wert hat, wird eine Warnung angezeigt.", 1)
+SafeAddString(SI_AWEMOD_WEAPONCHARGE_SET_LABEL, "Set", 1)
\ No newline at end of file
diff --git a/AwesomeEvents2/Language/ru.lua b/AwesomeEvents2/Language/ru.lua
new file mode 100644
index 0000000..c5fbc84
--- /dev/null
+++ b/AwesomeEvents2/Language/ru.lua
@@ -0,0 +1,192 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: Memoraike
+  Filename: ru.lua
+  Last Modified: 05.07.17 18:24
+
+  Copyright (c) 2017 by Memoraike
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  Пожалуйста, прочтите README файл для дополнительной информации.
+  ]]
+
+---
+--- Translated by: Memoraike <http://www.esoui.com/forums/member.php?u=32546>
+---
+
+--main
+SafeAddString(SI_AWEVS_NO_ACTIVE_MOD, "Нет активных модулей", 1)
+SafeAddString(SI_AWEVS_DESCRIPTION, "С AwesomeEvents Вы можете получить уведомления о множестве интересных событий во время игры,\nтак как здесь множество модулей и путей для настройки под Ваш стиль игры, не забудьте просмотреть все настройки.\nЕсли у Вас есть какие-либо пожелания, улучшения, переводы или же заметили ошибку, то не стесняйтесь и пишите автору <zemi@unive.de> или же в игре EU\PC @Ze_Mi :)", 1)
+
+--debug
+SafeAddString(SI_AWEVS_DEBUG_NO_EVENT_CALLBACKS, "Нет обратных вызовов, прослушиватель событий удален!", 1)
+SafeAddString(SI_AWEVS_DEBUG_ENABLED, "|c82D482Включено", 1)
+SafeAddString(SI_AWEVS_DEBUG_DISABLED, "|cD49682Отключено", 1)
+SafeAddString(SI_AWEVS_DEBUG_MODULE_EVENT_INVALID, "Ошибочный объект события!\nОжидалось: event={eventCode=EVENT_...,callback=function() ... end}!\nЭти ключи обязательны!\nКлючи:", 1)
+SafeAddString(SI_AWEVS_DEBUG_MODULE_OPTION_INVALID, "Ошибочный объект опций!\nОжидалось: option={type='',name='',tooltip='',default=...}!\nЭти ключи обязательны!\nКлючи:", 1)
+SafeAddString(SI_AWEVS_DEBUG_MODULE_NOT_FOUND, "Модуль не найден!", 1)
+SafeAddString(SI_AWEVS_DEBUG_MODULE_NO_TIMER, "Этот модуль не прослушивает событие EVENT_AWESOME_MODULE_TIMER или Вы пытаетесь вызвать функцию таймера в Enable функции, извините, это не возможно. Таймер не может быть использован.", 1)
+SafeAddString(SI_AWEVS_DEBUG_COMMAND_USAGE, "Используйте: /aedebug mod_id (on\off)", 1)
+
+--appearance
+SafeAddString(SI_AWEVS_APPEARANCE, "Внешний вид", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_MOVABLE, "Динамическое окно", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_MOVABLE_HINT, "Позволяет перетаскивать окно.", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN, "Выравнивание текста", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_HINT, "Расположение всего текста в окне аддона.", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_LEFT, "По левому краю", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_CENTER,"По центру", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_TEXTALIGN_RIGHT, "По правому краю", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_UISCALE, "Масштаб окна", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_UISCALE_HINT, "Масшатабирует окно и его содержимое.", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_COLOR_AVAILABLE,"Цвет доступности", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_COLOR_AVAILABLE_HINT, "Изменить цвет текста сообщений о доступности(?).", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_COLOR_HINT,"Цвет уведомлений", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_COLOR_HINT_HINT, "Изменить цвет текста уведомлений.", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_COLOR_WARNING,"Цвет предупреждений", 1)
+SafeAddString(SI_AWEVS_APPEARANCE_COLOR_WARNING_HINT, "Изменить цвет текста предупреждений.", 1)
+
+--import
+SafeAddString(SI_AWEVS_IMPORT, "Импорт настроек", 1)
+SafeAddString(SI_AWEVS_IMPORT_DESCRIPTION, "Заменить Ваши настройки настройками другого персонажа.", 1)
+SafeAddString(SI_AWEVS_IMPORT_CHARACTER_LABEL, "Импорт из", 1)
+SafeAddString(SI_AWEVS_IMPORT_CHARACTER_SELECT, " - Выбрать персонажа -", 1)
+SafeAddString(SI_AWEVS_IMPORT_BUTTON, "Импорт", 1)
+
+--module-all
+SafeAddString(SI_AWEMOD_SHOW, "Отображать", 1)
+SafeAddString(SI_AWEMOD_SHOW_HINT, "Показывать или скрывать все уведомления этого молуля", 1)
+SafeAddString(SI_AWEMOD_SPACING_POSITION, "Расположение отступа", 1)
+SafeAddString(SI_AWEMOD_SPACING_POSITION_HINT, "Установить расположение отступа между уведомлением модуля и другими уведомлениями.", 1)
+SafeAddString(SI_AWEMOD_SPACING_BOTTOM, "Сверху", 1)
+SafeAddString(SI_AWEMOD_SPACING_BOTH, "Сверху и снизу", 1)
+SafeAddString(SI_AWEMOD_SPACING_TOP, "Снизу", 1)
+SafeAddString(SI_AWEMOD_SPACING, "Отступ", 1)
+SafeAddString(SI_AWEMOD_SPACING_HINT, "Установить отступ между уведомлением модуля и другими уведомлениями.", 1)
+SafeAddString(SI_AWEMOD_FONTSIZE, "Размер шрифта", 1)
+SafeAddString(SI_AWEMOD_FONTSIZE_HINT, "Установить размер шрифта для уведомления.", 1)
+
+--module-bufffood
+SafeAddString(SI_AWEMOD_BUFFFOOD, "Бафф еды", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_HINT, "Получение обратного отчета окончания баффа или предупреждение о его отсутствии.", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_TIMER_LABEL, "Эффект <<C:1>> закончится через ", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_READY_LABEL, "Бафф от еды отсутствует!", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_TIMER, "Запустить тамер баффа еды (минуты)", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_TIMER_HINT, "Показать обратный отчет, если бафф от еды заканчивается через установленное время.", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT, "Бафф еды (варн)", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT_HINT, "Если в бою у вас не будет баффа от еды, появится мигающее предупреждение.", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT, "Скрыть вне боя", 1)
+SafeAddString(SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT_HINT, "Если у Вас не активного баффа от еды и Вы не вне боя более 5 минут, то предупреждение (Бафф от еды отсутствует!) будет скрыто пока Вы снова не окажетесь в бою или не поедите.", 1)
+
+--module-clock
+SafeAddString(SI_AWEMOD_CLOCK, "Время и дата", 1)
+SafeAddString(SI_AWEMOD_CLOCK_HINT, "Отображать текущее системное время.", 1)
+SafeAddString(SI_AWEMOD_CLOCK_DATEFORMAT_SHORT, "day.month", 1) -- do not translate the words, just change the order or the seperator chars between
+SafeAddString(SI_AWEMOD_CLOCK_DATEFORMAT_LONG, "day.month.year", 1) -- do not translate the words, just change the order or the seperator chars between
+SafeAddString(SI_AWEMOD_CLOCK_STYLE, "Appearance", 1)
+SafeAddString(SI_AWEMOD_CLOCK_STYLE_HINT, "Choose your preferred appearance.", 1)
+SafeAddString(SI_AWEMOD_CLOCK_STYLE_TIME, "Time only", 1)
+SafeAddString(SI_AWEMOD_CLOCK_STYLE_DATETIME_SHORT, "Date & Time (1-line)", 1)
+SafeAddString(SI_AWEMOD_CLOCK_STYLE_DATETIME_LONG, "Date & Time (2-lines)", 1)
+SafeAddString(SI_AWEMOD_CLOCK_FORMAT, "24 формат времени", 1)
+SafeAddString(SI_AWEMOD_CLOCK_FORMAT_HINT, "Отображать время в 24 формате или в 12 формате.", 1)
+
+--module-crafting
+SafeAddString(SI_AWEMOD_CRAFTING, "Исследования", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_HINT, "Отображать таймер исследования или же уведомление о кол-ве возможных исследований.", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_AVAILABLE_LABEL, "возможно исследовать", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_BLACKSMITHING, "Таймер для кузнечного дела", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_BLACKSMITHING_HINT, "Отображать таймер, когда исследования кузнечного дела почти завершены или есть возможность исследовать, отрегулируйте значение ниже.", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_CLOTHING, "Таймер для портняжного дела", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_CLOTHING_HINT, "Отображать таймер, когда исследования портняжного дела почти завершены или есть возможность исследовать, отрегулируйте значение ниже.", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_WOODWORKING, "Таймер для столярного дела", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_WOODWORKING_HINT, "Отображать таймер, когда исследования столярного дела почти завершены или есть возможность исследовать, отрегулируйте значение ниже.", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_TIMER, "Предупреждающий таймер исследования", 1)
+SafeAddString(SI_AWEMOD_CRAFTING_TIMER_HINT, "Отображать таймер, предупреждающий о скором окончании исследования.", 1)
+
+--module-durability
+SafeAddString(SI_AWEMOD_DURABILITY, "Прочность доспехов", 1)
+SafeAddString(SI_AWEMOD_DURABILITY_LABEL, "Прочность доспехов", 1)
+SafeAddString(SI_AWEMOD_DURABILITY_HINT, "Отображать уведомление, прежде чем доспехи будут сломаны.", 1)
+SafeAddString(SI_AWEMOD_DURABILITY_INFO, "Прочность доспехов(|cFFFF60Инфо|r) %", 1)
+SafeAddString(SI_AWEMOD_DURABILITY_INFO_HINT, "Когда прочность доспехов будет меньше или равна указаному значению, то появится уведомление.", 1)
+SafeAddString(SI_AWEMOD_DURABILITY_WARNING, "Прочность доспехов(|cFF6060Внимание|r) %", 1)
+SafeAddString(SI_AWEMOD_DURABILITY_WARNING_HINT, "Когда прочность доспехов будет меньше или равна указаному значению, то появится предупреждение.", 1)
+
+--module-fencing
+SafeAddString(SI_AWEMOD_FENCING, "Воровство", 1)
+SafeAddString(SI_AWEMOD_FENCING_HINT, "Отображать уведомление, если количество продаж у скупщика превысит указанные значения или же отображать время до перезарядки скупщика.", 1)
+SafeAddString(SI_AWEMOD_FENCING_SELLS_LABEL, "Еще можно продать", 1)
+SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_LABEL, "Еще можно отмыть", 1)
+SafeAddString(SI_AWEMOD_FENCING_SELLS, "Продано вещей", 1)
+SafeAddString(SI_AWEMOD_FENCING_SELLS_HINT, "Отображать уведомление, когда количество доступных продаж будет ниже установленного значения.", 1)
+SafeAddString(SI_AWEMOD_FENCING_SELLS_INFO, "Продано вещей(|cFFFF60Инфо|r)", 1)
+SafeAddString(SI_AWEMOD_FENCING_SELLS_INFO_HINT,"Когда доступное кол-во проданных товаров станет меньше или равно указаному значению, то появится уведомление.", 1)
+SafeAddString(SI_AWEMOD_FENCING_SELLS_WARNING, "Продано вещей(|cFF6060Внимание|r)", 1)
+SafeAddString(SI_AWEMOD_FENCING_SELLS_WARNING_HINT,"Когда доступное кол-во проданных товаров станет меньше или равно указаному значению, то появится предупреждение.", 1)
+SafeAddString(SI_AWEMOD_FENCING_LAUNDERS, "Отмыто вещей", 1)
+SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_HINT, "Отображать уведомление, когда доступное количество отмытых вещей окажется ниже установленных значений.", 1)
+SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_INFO,"Отмыто вещей(|cFFFF60Инфо|r)", 1)
+SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_INFO_HINT,"Когда доступное кол-во отмытых вещей станет меньше или равно указаному значению, то появится уведомление.", 1)
+SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_WARNING,"Отмыто вещей(|cFF6060Внимание|r)", 1)
+SafeAddString(SI_AWEMOD_FENCING_LAUNDERS_WARNING_HINT,"Когда доступное кол-во отмытых вещей станет меньше или равно указаному значению, то появится предупреждение.", 1)
+
+--module-inventory
+SafeAddString(SI_AWEMOD_INVENTORY, "Инвентарь", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_HINT, "Показывать информацию о текущей заполненности инвентаря, количестве Вашего золота и/или получение уведомления об отсутствии места в инвентаре.", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_LOW, "Показать предупреждение о нехватке места", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_LOW_HINT, "Получить уведомление прежде, чем место в инвентаре кончится.", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_LOW_INFO, "Доступно места в инвентаре(|cFFFF60Инфо|r)", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_LOW_INFO_HINT, "Если в инвентаре доступно места меньше или равное указанному значению, появится уведомление.", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_LOW_WARNING, "Доступно места в инвентаре(|cFF6060Внимание|r)", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_LOW_WARNING_HINT,"Если в инвентаре доступно места меньше или равное указанному значению, появится предупреждение.", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_LOW_LABEL, "Инвентарь (доступно)", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_DETAILS, "Доп. инфо об инвентаре", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_DETAILS_HINT, "Показать информацию о текущей заполненности инвентаря и банка.", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_DETAILS_LABEL, "<<1>>Инвентарь|r: <<2>>/<<3>> <<1>>|| Банк|r: <<4>>/<<5>>", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_MONEY, "Показать золото", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_MONEY_HINT, "Отобразить Ваше золото (банк и инвентарь).", 1)
+SafeAddString(SI_AWEMOD_INVENTORY_MONEY_LABEL, "Золото|r: <<1>>k |t16:16:EsoUI/Art/currency/currency_gold.dds|t<<2[/ (+1k в банке)/ (+$dk в банке)]>>", 1)
+
+--module-mails
+SafeAddString(SI_AWEMOD_MAILS, "Почта", 1)
+SafeAddString(SI_AWEMOD_MAILS_HINT, "Отображать уведомление, если есть непрочитанные письма.", 1)
+SafeAddString(SI_AWEMOD_MAILS_LABEL, "Непрочитанные письма", 1)
+
+--module-mount
+SafeAddString(SI_AWEMOD_MOUNT, "Ездовой питомец", 1)
+SafeAddString(SI_AWEMOD_MOUNT_HINT, "Отображение таймера с обратным отчетом тренировки ездового питомца или отображение о возможности его тренировки.", 1)
+SafeAddString(SI_AWEMOD_MOUNT_TIMER_LABEL, "Тренировка окончится через", 1)
+SafeAddString(SI_AWEMOD_MOUNT_READY_LABEL, "Ездовой питомец готов к тренировке", 1)
+SafeAddString(SI_AWEMOD_MOUNT_TIMER, "Запустить таймер тренировки (минуты)", 1)
+SafeAddString(SI_AWEMOD_MOUNT_TIMER_HINT, "Отображение таймера обратного отчета, если ездовой питомец может быть тренирован в течение указаного времени.", 1)
+
+--module-skills
+SafeAddString(SI_AWEMOD_SKILLS, "Атрибуты и очки умений", 1)
+SafeAddString(SI_AWEMOD_SKILLS_HINT, "Отображение уведомления, когда у Вас есть неиспользованные атрибуты или очки умений.", 1)
+SafeAddString(SI_AWEMOD_SKILLS_ATTRIBUTES_LABEL, "Атрибуты", 1)
+SafeAddString(SI_AWEMOD_SKILLS_CHAMPIONPOINTS_LABEL, "Очки чемпиона", 1)
+SafeAddString(SI_AWEMOD_SKILLS_SKILLS_LABEL, "Умения", 1)
+
+--module-skyshards
+SafeAddString(SI_AWEMOD_SKYSHARDS, "Небесные осколки", 1)
+SafeAddString(SI_AWEMOD_SKYSHARDS_HINT, "Отображать уведомление о том, как много осколков Вам нужно собрать для получения очка умения.", 1)
+SafeAddString(SI_AWEMOD_SKYSHARDS_REMAINING_LABEL, "Осталось осколков", 1)
+SafeAddString(SI_AWEMOD_SKYSHARDS_REMAINING, "Кол-во нехватающих осколков", 1)
+SafeAddString(SI_AWEMOD_SKYSHARDS_REMAINING_HINT, "Отображать уведомление, если указанное значение равно кол-ву нехватающих осколков.", 1)
+
+--module-soulgems
+SafeAddString(SI_AWEMOD_SOULGEMS, "Камни душ", 1)
+SafeAddString(SI_AWEMOD_SOULGEMS_HINT, "Показывает, как много камней душ, заполненных и пустых, есть у Вас.", 1)
+SafeAddString(SI_AWEMOD_SOULGEMS_LABEL, "Камни душ|r: <<1>> |t16:16:EsoUI/Art/icons/soulgem_006_filled.dds|t <<2[/(1 не заполнено)/($d не заполнено)]>>", 1)
+
+--module-weaponchrage
+SafeAddString(SI_AWEMOD_WEAPONCHARGE, "Заряд оружия", 1)
+SafeAddString(SI_AWEMOD_WEAPONCHARGE_HINT, "Отображать уведомление, прежде чем заряд оружия будет исчерпан", 1)
+SafeAddString(SI_AWEMOD_WEAPONCHARGE_INFO, "Заряд оружия (|cFFFF60Инфо|r) %", 1)
+SafeAddString(SI_AWEMOD_WEAPONCHARGE_INFO_HINT, "Если заряд экипированного оружия меньше или равен этому значению, то появится уведомление.", 1)
+SafeAddString(SI_AWEMOD_WEAPONCHARGE_WARNING, "Заряд оружия (|cFF6060Внимание|r) %", 1)
+SafeAddString(SI_AWEMOD_WEAPONCHARGE_WARNING_HINT, "Если заряд экипированного оружия меньше или равен этому значению, то появится предупреждение.", 1)
+SafeAddString(SI_AWEMOD_WEAPONCHARGE_SET_LABEL, "Панель навыков", 1)
\ No newline at end of file
diff --git a/AwesomeEvents2/Language/strings.lua b/AwesomeEvents2/Language/strings.lua
new file mode 100644
index 0000000..40b05e2
--- /dev/null
+++ b/AwesomeEvents2/Language/strings.lua
@@ -0,0 +1,203 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: strings.lua
+  Last Modified: 17.07.17 12:56
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local strings = {
+	--main
+	SI_AWEVS_NO_ACTIVE_MOD="Enable an AwesomeEvents module",
+	SI_AWEVS_DESCRIPTION="With AwesomeEvents you can get notified about many interesting events while playing.\nSince there are many modules and ways you can customise your experience,\ndon't forget to scroll down the options page.\nIf you have any wishes, improvements, new translations or found a bug, don't hesitate to write me at <zemi@unive.de> or Ingame EU\PC @Ze_Mi :)",
+
+	--debug
+	SI_AWEVS_DEBUG_NO_EVENT_CALLBACKS="No callbacks, event listener removed!",
+	SI_AWEVS_DEBUG_ENABLED="|c82D482ENABLED",
+	SI_AWEVS_DEBUG_DISABLED="|cD49682DISABLED",
+	SI_AWEVS_DEBUG_MODULE_EVENT_INVALID="Invalid event object!\nExpected: event={eventCode=EVENT_...,callback=function() ... end}!\nBoth keys are mandatory!\nIs:",
+	SI_AWEVS_DEBUG_MODULE_OPTION_INVALID="Invalid options object!\nExpected: option={type='',name='',tooltip='',default=...}!\nAt least those keys are mandatory!\nIs:",
+	SI_AWEVS_DEBUG_MODULE_NOT_FOUND="Module not found!",
+	SI_AWEVS_DEBUG_MODULE_NO_TIMER="This module doesn't listen to the EVENT_AWESOME_MODULE_TIMER event or you are trying to call a Timer Function inside the Enable Function, sorry thats not possible. The timer cannot be used.",
+	SI_AWEVS_DEBUG_COMMAND_USAGE="Usage: /aedebug mod_id (on\off)",
+
+	--appearance
+	SI_AWEVS_APPEARANCE="Appearance",
+	SI_AWEVS_APPEARANCE_MOVABLE="Movable Window",
+	SI_AWEVS_APPEARANCE_MOVABLE_HINT="UnLocks the window so it can be moved.",
+	SI_AWEVS_APPEARANCE_TEXTALIGN="Text alignment",
+	SI_AWEVS_APPEARANCE_TEXTALIGN_HINT="The alignment of all text within the add-on.",
+	SI_AWEVS_APPEARANCE_TEXTALIGN_LEFT="Left",
+	SI_AWEVS_APPEARANCE_TEXTALIGN_CENTER="Center",
+	SI_AWEVS_APPEARANCE_TEXTALIGN_RIGHT="Right",
+	SI_AWEVS_APPEARANCE_UISCALE="UI scale",
+	SI_AWEVS_APPEARANCE_UISCALE_HINT="Set the scale of the UI.",
+	SI_AWEVS_APPEARANCE_COLOR_AVAILABLE="Color (availability)",
+	SI_AWEVS_APPEARANCE_COLOR_AVAILABLE_HINT="Change the text color of availability messages.",
+	SI_AWEVS_APPEARANCE_COLOR_HINT="Color (hint)",
+	SI_AWEVS_APPEARANCE_COLOR_HINT_HINT="Change the text color of hints.",
+	SI_AWEVS_APPEARANCE_COLOR_WARNING="Color (warning)",
+	SI_AWEVS_APPEARANCE_COLOR_WARNING_HINT="Change the text color of warnings.",
+
+	--import
+	SI_AWEVS_IMPORT="Import Settings",
+	SI_AWEVS_IMPORT_DESCRIPTION="Overwrite your settings with those from another character",
+	SI_AWEVS_IMPORT_CHARACTER_LABEL="Import from",
+	SI_AWEVS_IMPORT_CHARACTER_SELECT=" - Select a charakter -",
+	SI_AWEVS_IMPORT_BUTTON="Import",
+
+	--module-all
+	SI_AWEMOD_SHOW="Show",
+	SI_AWEMOD_SHOW_HINT="Show or hide all notifications from this module",
+	SI_AWEMOD_SHOW_ICON="Icon",
+	SI_AWEMOD_SHOW_ICON_AND_TEXT="Icon and Text",
+	SI_AWEMOD_SHOW_TEXT="Text",
+	SI_AWEMOD_SHOW_NONE="None (Disabled)",
+	SI_AWEMOD_SPACING_POSITION="Spacing (Position)",
+	SI_AWEMOD_SPACING_POSITION_HINT="Set the gap position between notifications of this module and the following notifications.",
+	SI_AWEMOD_SPACING_BOTTOM="at bottom",
+	SI_AWEMOD_SPACING_BOTH="at top and at bottom",
+	SI_AWEMOD_SPACING_TOP="at top",
+	SI_AWEMOD_SPACING="Spacing (Size)",
+	SI_AWEMOD_SPACING_HINT="Set the gap between notifications of this module and the following notifications.",
+	SI_AWEMOD_FONTSIZE="Fontsize",
+	SI_AWEMOD_FONTSIZE_HINT="Set the fontsize of all notifications from this module.",
+
+	--module-bufffood
+	SI_AWEMOD_BUFFFOOD="Buff-Food",
+	SI_AWEMOD_BUFFFOOD_HINT="Get a countdown when your bufffoods effect is nearly complete, or a notification if you don't have any food effect.",
+	SI_AWEMOD_BUFFFOOD_TIMER_LABEL="Effect <<C:1>> ends in",
+	SI_AWEMOD_BUFFFOOD_READY_LABEL="Take your buff-food!",
+	SI_AWEMOD_BUFFFOOD_TIMER="Start buff-food timer (minutes)",
+	SI_AWEMOD_BUFFFOOD_TIMER_HINT="Will show the countdown timer if your buff-food's effect ends within the number of minutes below.",
+	SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT="Blink in combat",
+	SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT_HINT="The warning will start blinking while you don't have any bufffood effect in combat.",
+	SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT="Hide out of combat",
+	SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT_HINT="If you don't have any active bufffood effect and you are not in combat for 5 minutes, the (Take your buff-food!) warning will be hidden till the next combat or your next lunch.",
+
+	--module-clock
+	SI_AWEMOD_CLOCK="Time and Date",
+	SI_AWEMOD_CLOCK_HINT="Get a clock on your screen, optionally with the current date.",
+	SI_AWEMOD_CLOCK_DATEFORMAT_SHORT="month/day",
+	SI_AWEMOD_CLOCK_DATEFORMAT_LONG="month/day/year",
+	SI_AWEMOD_CLOCK_STYLE="Appearance",
+	SI_AWEMOD_CLOCK_STYLE_HINT="Choose your preferred appearance.",
+	SI_AWEMOD_CLOCK_STYLE_TIME="Time only",
+	SI_AWEMOD_CLOCK_STYLE_DATETIME_SHORT="Date & Time (single-spaced)",
+	SI_AWEMOD_CLOCK_STYLE_DATETIME_LONG="Date & Time (double-spaced)",
+	SI_AWEMOD_CLOCK_FORMAT="Clock format - 24 hour",
+	SI_AWEMOD_CLOCK_FORMAT_HINT="Display the clock in 24-hour/military format or in 12-hour with AM/PM.",
+
+	--module-crafting
+	SI_AWEMOD_CRAFTING="Crafting Research",
+	SI_AWEMOD_CRAFTING_HINT="Get a countdown when your next research is nearly complete, or a notification if a research slot is available.",
+	SI_AWEMOD_CRAFTING_AVAILABLE_LABEL="can research",
+	SI_AWEMOD_CRAFTING_BLACKSMITHING="Show timer for Blacksmithing",
+	SI_AWEMOD_CRAFTING_BLACKSMITHING_HINT="Display a countdown timer when your Blacksmithing research is nearly complete. Adjust the threshold below.",
+	SI_AWEMOD_CRAFTING_CLOTHING="Show timer for Clothing",
+	SI_AWEMOD_CRAFTING_CLOTHING_HINT="Display a countdown timer when your Clothing research is nearly complete. Adjust the threshold below.",
+	SI_AWEMOD_CRAFTING_WOODWORKING="Show timer for Woodworking",
+	SI_AWEMOD_CRAFTING_WOODWORKING_HINT="Display a countdown timer when your Woodworking research is nearly complete. Adjust the threshold below.",
+	SI_AWEMOD_CRAFTING_TIMER="Research warning timer (minutes)",
+	SI_AWEMOD_CRAFTING_TIMER_HINT="Will show the countdown warning timer if any research completes within this many minutes.",
+
+	--module-durability
+	SI_AWEMOD_DURABILITY="Durability of equipped Armor",
+	SI_AWEMOD_DURABILITY_LABEL="Durability",
+	SI_AWEMOD_DURABILITY_HINT="Get a notification before the durability of your equipped armor gets to weak.",
+	SI_AWEMOD_DURABILITY_INFO="Durability (|cFFFF60info|r) %",
+	SI_AWEMOD_DURABILITY_INFO_HINT="If durability of one of your equipped items is this many or less, you will see a notification.",
+	SI_AWEMOD_DURABILITY_WARNING="Durability (|cFF6060warning|r) %",
+	SI_AWEMOD_DURABILITY_WARNING_HINT="If durability of one of your equipped items is this many or less, you will see a warning.",
+
+	--module-fencing
+	SI_AWEMOD_FENCING="Thieves Guild",
+	SI_AWEMOD_FENCING_HINT="Get a notification if the number of available transactions at your thieves guild is lower then the following values, or a countdown timer until you get new transactions.",
+	SI_AWEMOD_FENCING_SELLS_LABEL="Sells left",
+	SI_AWEMOD_FENCING_LAUNDERS_LABEL="Launders left",
+	SI_AWEMOD_FENCING_SELLS="Show warning for low sells",
+	SI_AWEMOD_FENCING_SELLS_HINT="Display a notification when the number of sells remaining falls below the info and warning values set below.",
+	SI_AWEMOD_FENCING_SELLS_INFO="Sells remaining (|cFFFF60info|r)",
+	SI_AWEMOD_FENCING_SELLS_INFO_HINT="If the number of sells left is this many or less, you will see a notification.",
+	SI_AWEMOD_FENCING_SELLS_WARNING="Sells remaining (|cFF6060warning|r)",
+	SI_AWEMOD_FENCING_SELLS_WARNING_HINT="If the number of sells remaining is this many or less, you will see a warning.",
+	SI_AWEMOD_FENCING_LAUNDERS="Show warning for low launders",
+	SI_AWEMOD_FENCING_LAUNDERS_HINT="Display a notification when the number of launders remaining falls below the info and warning values set below.",
+	SI_AWEMOD_FENCING_LAUNDERS_INFO="Launders remaining (|cFFFF60info|r)",
+	SI_AWEMOD_FENCING_LAUNDERS_INFO_HINT="If the number of launders left is this many or less, you will see a notification.",
+	SI_AWEMOD_FENCING_LAUNDERS_WARNING="Launders remaining (|cFF6060warning|r)",
+	SI_AWEMOD_FENCING_LAUNDERS_WARNING_HINT="If the number of launders remaining is this many or less, you will see a warning.",
+
+	--module-inventory
+	SI_AWEMOD_INVENTORY="Inventory (Space & Money)",
+	SI_AWEMOD_INVENTORY_HINT="Show details about your current inventor usage, the money you own and/or get a notification before you go out of backpack space.",
+	SI_AWEMOD_INVENTORY_LOW="Show low space warning",
+	SI_AWEMOD_INVENTORY_LOW_HINT="Get a notification before you go out of backpack space.",
+	SI_AWEMOD_INVENTORY_LOW_INFO="Backpack space low (|cFFFF60info|r)",
+	SI_AWEMOD_INVENTORY_LOW_INFO_HINT="If remaining backpack space is this many or less, you will see a notification",
+	SI_AWEMOD_INVENTORY_LOW_WARNING="Backpack space low (|cFF6060warning|r)",
+	SI_AWEMOD_INVENTORY_LOW_WARNING_HINT="If remaining backpack space is this many or less, you will see a warning.",
+	SI_AWEMOD_INVENTORY_LOW_LABEL="Bag space|r: <<1>>",
+	SI_AWEMOD_INVENTORY_DETAILS="Show inventory details",
+	SI_AWEMOD_INVENTORY_DETAILS_HINT="Show details about your current bank und backpack usage.",
+	SI_AWEMOD_INVENTORY_DETAILS_LABEL="<<1>>Backpack|r: <<2>>/<<3>> <<1>>|| Bank|r: <<4>>/<<5>>",
+	SI_AWEMOD_INVENTORY_MONEY="Show money",
+	SI_AWEMOD_INVENTORY_MONEY_HINT="Show the money you own (bank and backpack).",
+	SI_AWEMOD_INVENTORY_MONEY_LABEL="Money|r: <<1>>k |t16:16:EsoUI/Art/currency/currency_gold.dds|t<<2[/ (+1k banked)/ (+$dk banked)]>>",
+
+	--module-mails
+	SI_AWEMOD_MAILS="Mails",
+	SI_AWEMOD_MAILS_HINT="Get a notification if you have unread mails.",
+	SI_AWEMOD_MAILS_LABEL="Unread Mails",
+
+	--module-mount
+	SI_AWEMOD_MOUNT="Mount Training",
+	SI_AWEMOD_MOUNT_HINT="Get a countdown when your mount's training is nearly complete, or a notification if the mount can be trained.",
+	SI_AWEMOD_MOUNT_TIMER_LABEL="Train mount in",
+	SI_AWEMOD_MOUNT_READY_LABEL="Mount can be trained",
+	SI_AWEMOD_MOUNT_TIMER="Start training timer (minutes)",
+	SI_AWEMOD_MOUNT_TIMER_HINT="Will show the countdown timer if mount can be trained within the number of minutes below.",
+
+	--module-repairkits
+	SI_AWEMOD_REPAIRKITS="Repair Kits",
+	SI_AWEMOD_REPAIRKITS_HINT="See how many repair kits you have in your inventory.",
+	SI_AWEMOD_REPAIRKITS_LABEL="Repair Kits|r: |t16:16:EsoUI/Art/icons/store_repairkit_002.dds|t <<1[None/1 kit/$d kits]>>",
+
+	--module-skills
+	SI_AWEMOD_SKILLS="Attribute- & Skillpoints",
+	SI_AWEMOD_SKILLS_HINT="Get a notification if you have unspent attribute- or skillpoints.",
+	SI_AWEMOD_SKILLS_ATTRIBUTES_LABEL="Attributes",
+	SI_AWEMOD_SKILLS_CHAMPIONPOINTS_LABEL="CP",
+	SI_AWEMOD_SKILLS_SKILLS_LABEL="Skills",
+
+	--module-skyshards
+	SI_AWEMOD_SKYSHARDS="Skyshards",
+	SI_AWEMOD_SKYSHARDS_HINT="Get a notification about how many shards you have to collect to get a new skillpoint.",
+	SI_AWEMOD_SKYSHARDS_REMAINING_LABEL="Shards missing",
+	SI_AWEMOD_SKYSHARDS_REMAINING="Shards missing",
+	SI_AWEMOD_SKYSHARDS_REMAINING_HINT="Display a notification when you miss less shards.",
+
+	--module-soulgems
+	SI_AWEMOD_SOULGEMS="Soul Gems",
+	SI_AWEMOD_SOULGEMS_HINT="See how many empty or filled soul gems you have for your revival.",
+	SI_AWEMOD_SOULGEMS_LABEL="Soul gems|r: <<1>> |t16:16:EsoUI/Art/icons/soulgem_006_filled.dds|t <<2[/(1 empty)/($d empty)]>>",
+
+	--module-weaponcharge
+	SI_AWEMOD_WEAPONCHARGE="Charge of equipped Weapons",
+	SI_AWEMOD_WEAPONCHARGE_HINT="Get a notification before the charge of your equipped weapons goes to low.",
+	SI_AWEMOD_WEAPONCHARGE_INFO="Weapon Charge (|cFFFF60info|r) %",
+	SI_AWEMOD_WEAPONCHARGE_INFO_HINT="If the charge of your equipped weapon is less or equal to this value, you will see a notification.",
+	SI_AWEMOD_WEAPONCHARGE_WARNING="Weapon Charge (|cFF6060warning|r) %",
+	SI_AWEMOD_WEAPONCHARGE_WARNING_HINT="If the charge of your equipped weapon is less or equal to this value, you will see a warning.",
+	SI_AWEMOD_WEAPONCHARGE_SET_LABEL="Set",
+}
+
+for stringId, stringValue in pairs(strings) do
+   ZO_CreateStringId(stringId, stringValue)
+   SafeAddVersion(stringId, 1)
+end
diff --git a/AwesomeEvents2/LibAddonMenu-2.0-exampleoptions.lua b/AwesomeEvents2/LibAddonMenu-2.0-exampleoptions.lua
new file mode 100644
index 0000000..3b02d44
--- /dev/null
+++ b/AwesomeEvents2/LibAddonMenu-2.0-exampleoptions.lua
@@ -0,0 +1,119 @@
+local panelData = {
+    type = "panel",
+    name = "Window Title",
+    displayName = "Longer Window Title",
+    author = "Seerah",
+    version = "1.3",
+    slashCommand = "/myaddon",	--(optional) will register a keybind to open to this panel
+    registerForRefresh = true,	--boolean (optional) (will refresh all options controls when a setting is changed and when the panel is shown)
+    registerForDefaults = true,	--boolean (optional) (will set all options controls back to default values)
+}
+
+local optionsTable = {
+    [1] = {
+        type = "header",
+        name = "My Header",
+        width = "full",	--or "half" (optional)
+    },
+    [2] = {
+        type = "description",
+        --title = "My Title",	--(optional)
+        title = nil,	--(optional)
+        text = "My description text to display. blah blah blah blah blah blah blah - even more sample text!!",
+        width = "full",	--or "half" (optional)
+    },
+    [3] = {
+        type = "dropdown",
+        name = "My Dropdown",
+        tooltip = "Dropdown's tooltip text.",
+        choices = {"table", "of", "choices"},
+        getFunc = function() return "of" end,
+        setFunc = function(var) print(var) end,
+        width = "half",	--or "half" (optional)
+        warning = "Will need to reload the UI.",	--(optional)
+    },
+    [4] = {
+        type = "dropdown",
+        name = "My Dropdown",
+        tooltip = "Dropdown's tooltip text.",
+        choices = {"table", "of", "choices"},
+        getFunc = function() return "of" end,
+        setFunc = function(var) print(var) end,
+        width = "half",	--or "half" (optional)
+        warning = "Will need to reload the UI.",	--(optional)
+    },
+    [5] = {
+        type = "slider",
+        name = "My Slider",
+        tooltip = "Slider's tooltip text.",
+        min = 0,
+        max = 20,
+        step = 1,	--(optional)
+        getFunc = function() return 3 end,
+        setFunc = function(value) d(value) end,
+        width = "half",	--or "half" (optional)
+        default = 5,	--(optional)
+    },
+    [6] = {
+        type = "button",
+        name = "My Button",
+        tooltip = "Button's tooltip text.",
+        func = function() d("button pressed!") end,
+        width = "half",	--or "half" (optional)
+        warning = "Will need to reload the UI.",	--(optional)
+    },
+    [7] = {
+        type = "submenu",
+        name = "Submenu Title",
+        tooltip = "My submenu tooltip",	--(optional)
+        controls = {
+            [1] = {
+                type = "checkbox",
+                name = "My Checkbox",
+                tooltip = "Checkbox's tooltip text.",
+                getFunc = function() return true end,
+                setFunc = function(value) d(value) end,
+                width = "half",	--or "half" (optional)
+                warning = "Will need to reload the UI.",	--(optional)
+            },
+            [2] = {
+                type = "colorpicker",
+                name = "My Color Picker",
+                tooltip = "Color Picker's tooltip text.",
+                getFunc = function() return 1, 0, 0, 1 end,	--(alpha is optional)
+                setFunc = function(r,g,b,a) print(r, g, b, a) end,	--(alpha is optional)
+                width = "half",	--or "half" (optional)
+                warning = "warning text",
+            },
+            [3] = {
+                type = "editbox",
+                name = "My Editbox",
+                tooltip = "Editbox's tooltip text.",
+                getFunc = function() return "this is some text" end,
+                setFunc = function(text) print(text) end,
+                isMultiline = false,	--boolean
+                width = "half",	--or "half" (optional)
+                warning = "Will need to reload the UI.",	--(optional)
+                default = "",	--(optional)
+            },
+        },
+    },
+    [8] = {
+        type = "custom",
+        reference = "MyAddonCustomControl",	--unique name for your control to use as reference
+        refreshFunc = function(customControl) end,	--(optional) function to call when panel/controls refresh
+        width = "half",	--or "half" (optional)
+    },
+    [9] = {
+        type = "texture",
+        image = "EsoUI\\Art\\ActionBar\\abilityframe64_up.dds",
+        imageWidth = 64,	--max of 250 for half width, 510 for full
+        imageHeight = 64,	--max of 100
+        tooltip = "Image's tooltip text.",	--(optional)
+        width = "half",	--or "half" (optional)
+    },
+}
+
+local LAM = LibStub("LibAddonMenu-2.0")
+LAM:RegisterAddonPanel("MyAddon", panelData)
+LAM:RegisterOptionControls("MyAddon", optionsTable)
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/LICENSE b/AwesomeEvents2/Libs/LibAddonMenu-2.0/LICENSE
new file mode 100644
index 0000000..f69cbd4
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/LICENSE
@@ -0,0 +1,201 @@
+               The Artistic License 2.0
+
+           Copyright (c) 2016 Ryan Lakanen (Seerah)
+
+     Everyone is permitted to copy and distribute verbatim copies
+      of this license document, but changing it is not allowed.
+
+Preamble
+
+This license establishes the terms under which a given free software
+Package may be copied, modified, distributed, and/or redistributed.
+The intent is that the Copyright Holder maintains some artistic
+control over the development of that Package while still keeping the
+Package available as open source and free software.
+
+You are always permitted to make arrangements wholly outside of this
+license directly with the Copyright Holder of a given Package.  If the
+terms of this license do not permit the full use that you propose to
+make of the Package, you should contact the Copyright Holder and seek
+a different licensing arrangement.
+
+Definitions
+
+    "Copyright Holder" means the individual(s) or organization(s)
+    named in the copyright notice for the entire Package.
+
+    "Contributor" means any party that has contributed code or other
+    material to the Package, in accordance with the Copyright Holder's
+    procedures.
+
+    "You" and "your" means any person who would like to copy,
+    distribute, or modify the Package.
+
+    "Package" means the collection of files distributed by the
+    Copyright Holder, and derivatives of that collection and/or of
+    those files. A given Package may consist of either the Standard
+    Version, or a Modified Version.
+
+    "Distribute" means providing a copy of the Package or making it
+    accessible to anyone else, or in the case of a company or
+    organization, to others outside of your company or organization.
+
+    "Distributor Fee" means any fee that you charge for Distributing
+    this Package or providing support for this Package to another
+    party.  It does not mean licensing fees.
+
+    "Standard Version" refers to the Package if it has not been
+    modified, or has been modified only in ways explicitly requested
+    by the Copyright Holder.
+
+    "Modified Version" means the Package, if it has been changed, and
+    such changes were not explicitly requested by the Copyright
+    Holder.
+
+    "Original License" means this Artistic License as Distributed with
+    the Standard Version of the Package, in its current version or as
+    it may be modified by The Perl Foundation in the future.
+
+    "Source" form means the source code, documentation source, and
+    configuration files for the Package.
+
+    "Compiled" form means the compiled bytecode, object code, binary,
+    or any other form resulting from mechanical transformation or
+    translation of the Source form.
+
+
+Permission for Use and Modification Without Distribution
+
+(1)  You are permitted to use the Standard Version and create and use
+Modified Versions for any purpose without restriction, provided that
+you do not Distribute the Modified Version.
+
+
+Permissions for Redistribution of the Standard Version
+
+(2)  You may Distribute verbatim copies of the Source form of the
+Standard Version of this Package in any medium without restriction,
+either gratis or for a Distributor Fee, provided that you duplicate
+all of the original copyright notices and associated disclaimers.  At
+your discretion, such verbatim copies may or may not include a
+Compiled form of the Package.
+
+(3)  You may apply any bug fixes, portability changes, and other
+modifications made available from the Copyright Holder.  The resulting
+Package will still be considered the Standard Version, and as such
+will be subject to the Original License.
+
+
+Distribution of Modified Versions of the Package as Source
+
+(4)  You may Distribute your Modified Version as Source (either gratis
+or for a Distributor Fee, and with or without a Compiled form of the
+Modified Version) provided that you clearly document how it differs
+from the Standard Version, including, but not limited to, documenting
+any non-standard features, executables, or modules, and provided that
+you do at least ONE of the following:
+
+    (a)  make the Modified Version available to the Copyright Holder
+    of the Standard Version, under the Original License, so that the
+    Copyright Holder may include your modifications in the Standard
+    Version.
+
+    (b)  ensure that installation of your Modified Version does not
+    prevent the user installing or running the Standard Version. In
+    addition, the Modified Version must bear a name that is different
+    from the name of the Standard Version.
+
+    (c)  allow anyone who receives a copy of the Modified Version to
+    make the Source form of the Modified Version available to others
+    under
+
+    (i)  the Original License or
+
+    (ii)  a license that permits the licensee to freely copy,
+    modify and redistribute the Modified Version using the same
+    licensing terms that apply to the copy that the licensee
+    received, and requires that the Source form of the Modified
+    Version, and of any works derived from it, be made freely
+    available in that license fees are prohibited but Distributor
+    Fees are allowed.
+
+
+Distribution of Compiled Forms of the Standard Version
+or Modified Versions without the Source
+
+(5)  You may Distribute Compiled forms of the Standard Version without
+the Source, provided that you include complete instructions on how to
+get the Source of the Standard Version.  Such instructions must be
+valid at the time of your distribution.  If these instructions, at any
+time while you are carrying out such distribution, become invalid, you
+must provide new instructions on demand or cease further distribution.
+If you provide valid instructions or cease distribution within thirty
+days after you become aware that the instructions are invalid, then
+you do not forfeit any of your rights under this license.
+
+(6)  You may Distribute a Modified Version in Compiled form without
+the Source, provided that you comply with Section 4 with respect to
+the Source of the Modified Version.
+
+
+Aggregating or Linking the Package
+
+(7)  You may aggregate the Package (either the Standard Version or
+Modified Version) with other packages and Distribute the resulting
+aggregation provided that you do not charge a licensing fee for the
+Package.  Distributor Fees are permitted, and licensing fees for other
+components in the aggregation are permitted. The terms of this license
+apply to the use and Distribution of the Standard or Modified Versions
+as included in the aggregation.
+
+(8) You are permitted to link Modified and Standard Versions with
+other works, to embed the Package in a larger work of your own, or to
+build stand-alone binary or bytecode versions of applications that
+include the Package, and Distribute the result without restriction,
+provided the result does not expose a direct interface to the Package.
+
+
+Items That are Not Considered Part of a Modified Version
+
+(9) Works (including, but not limited to, modules and scripts) that
+merely extend or make use of the Package, do not, by themselves, cause
+the Package to be a Modified Version.  In addition, such works are not
+considered parts of the Package itself, and are not subject to the
+terms of this license.
+
+
+General Provisions
+
+(10)  Any use, modification, and distribution of the Standard or
+Modified Versions is governed by this Artistic License. By using,
+modifying or distributing the Package, you accept this license. Do not
+use, modify, or distribute the Package, if you do not accept this
+license.
+
+(11)  If your Modified Version has been derived from a Modified
+Version made by someone other than you, you are nevertheless required
+to ensure that your Modified Version complies with the requirements of
+this license.
+
+(12)  This license does not grant you the right to use any trademark,
+service mark, tradename, or logo of the Copyright Holder.
+
+(13)  This license includes the non-exclusive, worldwide,
+free-of-charge patent license to make, have made, use, offer to sell,
+sell, import and otherwise transfer the Package with respect to any
+patent claims licensable by the Copyright Holder that are necessarily
+infringed by the Package. If you institute patent litigation
+(including a cross-claim or counterclaim) against any party alleging
+that the Package constitutes direct or contributory patent
+infringement, then this Artistic License to you shall terminate on the
+date that such litigation is filed.
+
+(14)  Disclaimer of Warranty:
+THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS
+IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
+NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY YOUR LOCAL
+LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR CONTRIBUTOR WILL
+BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, EVEN IF
+ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua b/AwesomeEvents2/Libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
new file mode 100644
index 0000000..b1070ca
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/LibAddonMenu-2.0.lua
@@ -0,0 +1,1218 @@
+-- LibAddonMenu-2.0 & its files © Ryan Lakanen (Seerah)         --
+-- Distributed under The Artistic License 2.0 (see LICENSE)     --
+------------------------------------------------------------------
+
+
+--Register LAM with LibStub
+local MAJOR, MINOR = "LibAddonMenu-2.0", 24
+local lam, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+if not lam then return end --the same or newer version of this lib is already loaded into memory
+
+local messages = {}
+local MESSAGE_PREFIX = "[LAM2] "
+local function PrintLater(msg)
+    if CHAT_SYSTEM.primaryContainer then
+        d(MESSAGE_PREFIX .. msg)
+    else
+        messages[#messages + 1] = msg
+    end
+end
+
+local function FlushMessages()
+    for i = 1, #messages do
+        d(MESSAGE_PREFIX .. messages[i])
+    end
+    messages = {}
+end
+
+if LAMSettingsPanelCreated and not LAMCompatibilityWarning then
+    PrintLater("An old version of LibAddonMenu with compatibility issues was detected. For more information on how to proceed search for LibAddonMenu on esoui.com")
+    LAMCompatibilityWarning = true
+end
+
+--UPVALUES--
+local wm = WINDOW_MANAGER
+local em = EVENT_MANAGER
+local sm = SCENE_MANAGER
+local cm = CALLBACK_MANAGER
+local tconcat = table.concat
+local tinsert = table.insert
+
+local MIN_HEIGHT = 26
+local HALF_WIDTH_LINE_SPACING = 2
+local OPTIONS_CREATION_RUNNING = 1
+local OPTIONS_CREATED = 2
+local LAM_CONFIRM_DIALOG = "LAM_CONFIRM_DIALOG"
+local LAM_DEFAULTS_DIALOG = "LAM_DEFAULTS"
+local LAM_RELOAD_DIALOG = "LAM_RELOAD_DIALOG"
+
+local addonsForList = {}
+local addonToOptionsMap = {}
+local optionsState = {}
+lam.widgets = lam.widgets or {}
+local widgets = lam.widgets
+lam.util = lam.util or {}
+local util = lam.util
+lam.controlsForReload = lam.controlsForReload or {}
+local controlsForReload = lam.controlsForReload
+
+local function GetDefaultValue(default)
+    if type(default) == "function" then
+        return default()
+    end
+    return default
+end
+
+local function GetStringFromValue(value)
+    if type(value) == "function" then
+        return value()
+    elseif type(value) == "number" then
+        return GetString(value)
+    end
+    return value
+end
+
+local function CreateBaseControl(parent, controlData, controlName)
+    local control = wm:CreateControl(controlName or controlData.reference, parent.scroll or parent, CT_CONTROL)
+    control.panel = parent.panel or parent -- if this is in a submenu, panel is the submenu's parent
+    control.data = controlData
+
+    control.isHalfWidth = controlData.width == "half"
+    local width = 510 -- set default width in case a custom parent object is passed
+    if control.panel.GetWidth ~= nil then width = control.panel:GetWidth() - 60 end
+    control:SetWidth(width)
+    return control
+end
+
+local function CreateLabelAndContainerControl(parent, controlData, controlName)
+    local control = CreateBaseControl(parent, controlData, controlName)
+    local width = control:GetWidth()
+
+    local container = wm:CreateControl(nil, control, CT_CONTROL)
+    container:SetDimensions(width / 3, MIN_HEIGHT)
+    control.container = container
+
+    local label = wm:CreateControl(nil, control, CT_LABEL)
+    label:SetFont("ZoFontWinH4")
+    label:SetHeight(MIN_HEIGHT)
+    label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
+    label:SetText(GetStringFromValue(controlData.name))
+    control.label = label
+
+    if control.isHalfWidth then
+        control:SetDimensions(width / 2, MIN_HEIGHT * 2 + HALF_WIDTH_LINE_SPACING)
+        label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 0)
+        label:SetAnchor(TOPRIGHT, control, TOPRIGHT, 0, 0)
+        container:SetAnchor(TOPRIGHT, control.label, BOTTOMRIGHT, 0, HALF_WIDTH_LINE_SPACING)
+    else
+        control:SetDimensions(width, MIN_HEIGHT)
+        container:SetAnchor(TOPRIGHT, control, TOPRIGHT, 0, 0)
+        label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 0)
+        label:SetAnchor(TOPRIGHT, container, TOPLEFT, 5, 0)
+    end
+
+    control.data.tooltipText = GetStringFromValue(control.data.tooltip)
+    control:SetMouseEnabled(true)
+    control:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
+    control:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
+    return control
+end
+
+local function GetTopPanel(panel)
+    while panel.panel and panel.panel ~= panel do
+        panel = panel.panel
+    end
+    return panel
+end
+
+local function IsSame(objA, objB)
+    if #objA ~= #objB then return false end
+    for i = 1, #objA do
+        if objA[i] ~= objB[i] then return false end
+    end
+    return true
+end
+
+local function RefreshReloadUIButton()
+    lam.requiresReload = false
+
+    for i = 1, #controlsForReload do
+        local reloadControl = controlsForReload[i]
+        if not IsSame(reloadControl.startValue, {reloadControl.data.getFunc()}) then
+            lam.requiresReload = true
+            break
+        end
+    end
+
+    lam.applyButton:SetHidden(not lam.requiresReload)
+end
+
+local function RequestRefreshIfNeeded(control)
+    -- if our parent window wants to refresh controls, then fire the callback
+    local panel = GetTopPanel(control.panel)
+    local panelData = panel.data
+    if panelData.registerForRefresh then
+        cm:FireCallbacks("LAM-RefreshPanel", control)
+    end
+    RefreshReloadUIButton()
+end
+
+local function RegisterForRefreshIfNeeded(control)
+    -- if our parent window wants to refresh controls, then add this to the list
+    local panel = GetTopPanel(control.panel)
+    local panelData = panel.data
+    if panelData.registerForRefresh or panelData.registerForDefaults then
+        tinsert(panel.controlsToRefresh or {}, control) -- prevent errors on custom panels
+    end
+end
+
+local function RegisterForReloadIfNeeded(control)
+    if control.data.requiresReload then
+        tinsert(controlsForReload, control)
+        control.startValue = {control.data.getFunc()}
+    end
+end
+
+local function GetConfirmDialog()
+    if(not ESO_Dialogs[LAM_CONFIRM_DIALOG]) then
+        ESO_Dialogs[LAM_CONFIRM_DIALOG] = {
+            canQueue = true,
+            title = {
+                text = "",
+            },
+            mainText = {
+                text = "",
+            },
+            buttons = {
+                [1] = {
+                    text = SI_DIALOG_CONFIRM,
+                    callback = function(dialog) end,
+                },
+                [2] = {
+                    text = SI_DIALOG_CANCEL,
+                }
+            }
+        }
+    end
+    return ESO_Dialogs[LAM_CONFIRM_DIALOG]
+end
+
+local function ShowConfirmationDialog(title, body, callback)
+    local dialog = GetConfirmDialog()
+    dialog.title.text = title
+    dialog.mainText.text = body
+    dialog.buttons[1].callback = callback
+    ZO_Dialogs_ShowDialog(LAM_CONFIRM_DIALOG)
+end
+
+local function GetDefaultsDialog()
+    if(not ESO_Dialogs[LAM_DEFAULTS_DIALOG]) then
+        ESO_Dialogs[LAM_DEFAULTS_DIALOG] = {
+            canQueue = true,
+            title = {
+                text = SI_INTERFACE_OPTIONS_RESET_TO_DEFAULT_TOOLTIP,
+            },
+            mainText = {
+                text = SI_OPTIONS_RESET_PROMPT,
+            },
+            buttons = {
+                [1] = {
+                    text = SI_OPTIONS_RESET,
+                    callback = function(dialog) end,
+                },
+                [2] = {
+                    text = SI_DIALOG_CANCEL,
+                }
+            }
+        }
+    end
+    return ESO_Dialogs[LAM_DEFAULTS_DIALOG]
+end
+
+local function ShowDefaultsDialog(panel)
+    local dialog = GetDefaultsDialog()
+    dialog.buttons[1].callback = function()
+        panel:ForceDefaults()
+        RefreshReloadUIButton()
+    end
+    ZO_Dialogs_ShowDialog(LAM_DEFAULTS_DIALOG)
+end
+
+local function DiscardChangesOnReloadControls()
+    for i = 1, #controlsForReload do
+        local reloadControl = controlsForReload[i]
+        if not IsSame(reloadControl.startValue, {reloadControl.data.getFunc()}) then
+            reloadControl:UpdateValue(false, unpack(reloadControl.startValue))
+        end
+    end
+    lam.requiresReload = false
+    lam.applyButton:SetHidden(true)
+end
+
+local function StorePanelForReopening()
+    local saveData = ZO_Ingame_SavedVariables["LAM"] or {}
+    saveData.reopenPanel = lam.currentAddonPanel:GetName()
+    ZO_Ingame_SavedVariables["LAM"] = saveData
+end
+
+local function RetrievePanelForReopening()
+    local saveData = ZO_Ingame_SavedVariables["LAM"]
+    if(saveData) then
+        ZO_Ingame_SavedVariables["LAM"] = nil
+        return _G[saveData.reopenPanel]
+    end
+end
+
+local function HandleReloadUIPressed()
+    StorePanelForReopening()
+    ReloadUI()
+end
+
+local function HandleLoadDefaultsPressed()
+    ShowDefaultsDialog(lam.currentAddonPanel)
+end
+
+local function GetReloadDialog()
+    if(not ESO_Dialogs[LAM_RELOAD_DIALOG]) then
+        ESO_Dialogs[LAM_RELOAD_DIALOG] = {
+            canQueue = true,
+            title = {
+                text = util.L["RELOAD_DIALOG_TITLE"],
+            },
+            mainText = {
+                text = util.L["RELOAD_DIALOG_TEXT"],
+            },
+            buttons = {
+                [1] = {
+                    text = util.L["RELOAD_DIALOG_RELOAD_BUTTON"],
+                    callback = function() ReloadUI() end,
+                },
+                [2] = {
+                    text = util.L["RELOAD_DIALOG_DISCARD_BUTTON"],
+                    callback = DiscardChangesOnReloadControls,
+                }
+            },
+            noChoiceCallback = DiscardChangesOnReloadControls,
+        }
+    end
+    return ESO_Dialogs[LAM_CONFIRM_DIALOG]
+end
+
+local function ShowReloadDialogIfNeeded()
+    if lam.requiresReload then
+        local dialog = GetReloadDialog()
+        ZO_Dialogs_ShowDialog(LAM_RELOAD_DIALOG)
+    end
+end
+
+local function UpdateWarning(control)
+    local warning
+    if control.data.warning ~= nil then
+        warning = util.GetStringFromValue(control.data.warning)
+    end
+
+    if control.data.requiresReload then
+        if not warning then
+            warning = string.format("|cff0000%s", util.L["RELOAD_UI_WARNING"])
+        else
+            warning = string.format("%s\n\n|cff0000%s", warning, util.L["RELOAD_UI_WARNING"])
+        end
+    end
+
+    if not warning then
+        control.warning:SetHidden(true)
+    else
+        control.warning.data = {tooltipText = warning}
+        control.warning:SetHidden(false)
+    end
+end
+
+local localization = {
+    en = {
+        PANEL_NAME = "Addons",
+        AUTHOR = string.format("%s: <<X:1>>", GetString(SI_ADDON_MANAGER_AUTHOR)), -- "Author: <<X:1>>"
+        VERSION = "Version: <<X:1>>",
+        WEBSITE = "Visit Website",
+        PANEL_INFO_FONT = "$(CHAT_FONT)|14|soft-shadow-thin",
+        RELOAD_UI_WARNING = "Changes to this setting require an UI reload in order to take effect.",
+        RELOAD_DIALOG_TITLE = "UI Reload required",
+        RELOAD_DIALOG_TEXT = "Some changes require an UI reload in order to take effect. Do you want to reload now or discard the changes?",
+        RELOAD_DIALOG_RELOAD_BUTTON = "Reload",
+        RELOAD_DIALOG_DISCARD_BUTTON = "Discard",
+    },
+    it = { -- provided by JohnnyKing
+        PANEL_NAME = "Addon",
+        VERSION = "Versione: <<X:1>>",
+        WEBSITE = "Visita il Sitoweb",
+        RELOAD_UI_WARNING = "Cambiare questa impostazione richiede un Ricarica UI al fine che faccia effetto.",
+        RELOAD_DIALOG_TITLE = "Ricarica UI richiesto",
+        RELOAD_DIALOG_TEXT = "Alcune modifiche richiedono un Ricarica UI al fine che facciano effetto. Sei sicuro di voler ricaricare ora o di voler annullare le modifiche?",
+        RELOAD_DIALOG_RELOAD_BUTTON = "Ricarica",
+        RELOAD_DIALOG_DISCARD_BUTTON = "Annulla",
+    },
+    fr = { -- provided by Ayantir
+        PANEL_NAME = "Extensions",
+        WEBSITE = "Visiter le site Web",
+        RELOAD_UI_WARNING = "La modification de ce paramètre requiert un rechargement de l'UI pour qu'il soit pris en compte.",
+        RELOAD_DIALOG_TITLE = "Reload UI requis",
+        RELOAD_DIALOG_TEXT = "Certaines modifications requièrent un rechargement de l'UI pour qu'ils soient pris en compte. Souhaitez-vous recharger l'interface maintenant ou annuler les modifications ?",
+        RELOAD_DIALOG_RELOAD_BUTTON = "Recharger",
+        RELOAD_DIALOG_DISCARD_BUTTON = "Annuler",
+    },
+    de = { -- provided by sirinsidiator
+        PANEL_NAME = "Erweiterungen",
+        WEBSITE = "Webseite besuchen",
+        RELOAD_UI_WARNING = "Änderungen an dieser Option werden erst übernommen nachdem die Benutzeroberfläche neu geladen wird.",
+        RELOAD_DIALOG_TITLE = "Neuladen benötigt",
+        RELOAD_DIALOG_TEXT = "Einige Änderungen werden erst übernommen nachdem die Benutzeroberfläche neu geladen wird. Wollt Ihr sie jetzt neu laden oder die Änderungen verwerfen?",
+        RELOAD_DIALOG_RELOAD_BUTTON = "Neu laden",
+        RELOAD_DIALOG_DISCARD_BUTTON = "Verwerfen",
+    },
+    ru = { -- provided by TERAB1T
+        PANEL_NAME = "Дополнения",
+        VERSION = "Версия: <<X:1>>",
+        WEBSITE = "Посетить сайт",
+        PANEL_INFO_FONT = "RuESO/fonts/Univers57.otf|14|soft-shadow-thin",
+        RELOAD_UI_WARNING = "Для применения этой настройки необходима перезагрузка интерфейса.",
+        RELOAD_DIALOG_TITLE = "Необходима перезагрузка интерфейса",
+        RELOAD_DIALOG_TEXT = "Для применения некоторых изменений необходима перезагрузка интерфейса. Перезагрузить интерфейс сейчас или отменить изменения?",
+        RELOAD_DIALOG_RELOAD_BUTTON = "Перезагрузить",
+        RELOAD_DIALOG_DISCARD_BUTTON = "Отменить изменения",
+    },
+    es = { -- provided by Morganlefai, checked by Kwisatz
+        PANEL_NAME = "Configuración",
+        VERSION = "Versión: <<X:1>>",
+        WEBSITE = "Visita la página web",
+        RELOAD_UI_WARNING = "Cambiar este ajuste recargará la interfaz del usuario.",
+        RELOAD_DIALOG_TITLE = "Requiere recargar la interfaz",
+        RELOAD_DIALOG_TEXT = "Algunos cambios requieren recargar la interfaz para poder aplicarse. Quieres aplicar los cambios y recargar la interfaz?",
+        RELOAD_DIALOG_RELOAD_BUTTON = "Recargar",
+        RELOAD_DIALOG_DISCARD_BUTTON = "Cancelar",
+    },
+    jp = { -- provided by k0ta0uchi
+        PANEL_NAME = "アドオン設定",
+        WEBSITE = "ウェブサイトを見る",
+    },
+    zh = { -- provided by bssthu
+        PANEL_NAME = "插件",
+        VERSION = "版本: <<X:1>>",
+        WEBSITE = "访问网站",
+        PANEL_INFO_FONT = "EsoZh/fonts/univers57.otf|14|soft-shadow-thin",
+    },
+    pl = { -- provided by EmiruTegryfon
+        PANEL_NAME = "Dodatki",
+        VERSION = "Wersja: <<X:1>>",
+        WEBSITE = "Odwiedź stronę",
+        RELOAD_UI_WARNING = "Zmiany będą widoczne po ponownym załadowaniu UI.",
+        RELOAD_DIALOG_TITLE = "Wymagane przeładowanie UI",
+        RELOAD_DIALOG_TEXT = "Niektóre zmiany wymagają ponownego załadowania UI. Czy chcesz teraz ponownie załadować, czy porzucić zmiany?",
+        RELOAD_DIALOG_RELOAD_BUTTON = "Przeładuj",
+        RELOAD_DIALOG_DISCARD_BUTTON = "Porzuć",
+    },
+}
+
+util.L = ZO_ShallowTableCopy(localization[GetCVar("Language.2")], localization["en"])
+util.GetTooltipText = GetStringFromValue -- deprecated, use util.GetStringFromValue instead
+util.GetStringFromValue = GetStringFromValue
+util.GetDefaultValue = GetDefaultValue
+util.CreateBaseControl = CreateBaseControl
+util.CreateLabelAndContainerControl = CreateLabelAndContainerControl
+util.RequestRefreshIfNeeded = RequestRefreshIfNeeded
+util.RegisterForRefreshIfNeeded = RegisterForRefreshIfNeeded
+util.RegisterForReloadIfNeeded = RegisterForReloadIfNeeded
+util.GetTopPanel = GetTopPanel
+util.ShowConfirmationDialog = ShowConfirmationDialog
+util.UpdateWarning = UpdateWarning
+
+local ADDON_DATA_TYPE = 1
+local RESELECTING_DURING_REBUILD = true
+local USER_REQUESTED_OPEN = true
+
+
+--INTERNAL FUNCTION
+--scrolls ZO_ScrollList `list` to move the row corresponding to `data`
+-- into view (does nothing if there is no such row in the list)
+--unlike ZO_ScrollList_ScrollDataIntoView, this function accounts for
+-- fading near the list's edges - it avoids the fading area by scrolling
+-- a little further than the ZO function
+local function ScrollDataIntoView(list, data)
+    local targetIndex = data.sortIndex
+    if not targetIndex then return end
+
+    local scrollMin, scrollMax = list.scrollbar:GetMinMax()
+    local scrollTop = list.scrollbar:GetValue()
+    local controlHeight = list.controlHeight
+    local targetMin = controlHeight * (targetIndex - 1) - 64
+    -- subtracting 64 ain't arbitrary, it's the maximum fading height
+    -- (libraries/zo_templates/scrolltemplates.lua/UpdateScrollFade)
+
+    if targetMin < scrollTop then
+        ZO_ScrollList_ScrollAbsolute(list, zo_max(targetMin, scrollMin))
+    else
+        local listHeight = ZO_ScrollList_GetHeight(list)
+        local targetMax = controlHeight * targetIndex + 64 - listHeight
+
+        if targetMax > scrollTop then
+            ZO_ScrollList_ScrollAbsolute(list, zo_min(targetMax, scrollMax))
+        end
+    end
+end
+
+
+--INTERNAL FUNCTION
+--constructs a string pattern from the text in `searchEdit` control
+-- * metacharacters are escaped, losing their special meaning
+-- * whitespace matches anything (including empty substring)
+--if there is nothing but whitespace, returns nil
+--otherwise returns a filter function, which takes a `data` table argument
+-- and returns true iff `data.filterText` matches the pattern
+local function GetSearchFilterFunc(searchEdit)
+    local text = searchEdit:GetText():lower()
+    local pattern = text:match("(%S+.-)%s*$")
+
+    if not pattern then -- nothing but whitespace
+        return nil
+    end
+
+    -- escape metacharacters, e.g. "ESO-Datenbank.de" => "ESO%-Datenbank%.de"
+    pattern = pattern:gsub("[-*+?^$().[%]%%]", "%%%0")
+
+    -- replace whitespace with "match shortest anything"
+    pattern = pattern:gsub("%s+", ".-")
+
+    return function(data)
+        return data.filterText:lower():find(pattern) ~= nil
+    end
+end
+
+
+--INTERNAL FUNCTION
+--populates `addonList` with entries from `addonsForList`
+-- addonList = ZO_ScrollList control
+-- filter = [optional] function(data)
+local function PopulateAddonList(addonList, filter)
+    local entryList = ZO_ScrollList_GetDataList(addonList)
+    local numEntries = 0
+    local selectedData = nil
+
+    ZO_ScrollList_Clear(addonList)
+
+    for i, data in ipairs(addonsForList) do
+        if not filter or filter(data) then
+            local dataEntry = ZO_ScrollList_CreateDataEntry(ADDON_DATA_TYPE, data)
+            numEntries = numEntries + 1
+            data.sortIndex = numEntries
+            entryList[numEntries] = dataEntry
+            -- select the first panel passing the filter, or the currently
+            -- shown panel, but only if it passes the filter as well
+            if selectedData == nil or data.panel == lam.currentAddonPanel then
+                selectedData = data
+            end
+        else
+            data.sortIndex = nil
+        end
+    end
+
+    ZO_ScrollList_Commit(addonList)
+
+    if selectedData then
+        if selectedData.panel == lam.currentAddonPanel then
+            ZO_ScrollList_SelectData(addonList, selectedData, nil, RESELECTING_DURING_REBUILD)
+        else
+            ZO_ScrollList_SelectData(addonList, selectedData, nil)
+        end
+        ScrollDataIntoView(addonList, selectedData)
+    end
+end
+
+
+--METHOD: REGISTER WIDGET--
+--each widget has its version checked before loading,
+--so we only have the most recent one in memory
+--Usage:
+-- widgetType = "string"; the type of widget being registered
+-- widgetVersion = integer; the widget's version number
+LAMCreateControl = LAMCreateControl or {}
+local lamcc = LAMCreateControl
+
+function lam:RegisterWidget(widgetType, widgetVersion)
+    if widgets[widgetType] and widgets[widgetType] >= widgetVersion then
+        return false
+    else
+        widgets[widgetType] = widgetVersion
+        return true
+    end
+end
+
+-- INTERNAL METHOD: hijacks the handlers for the actions in the OptionsWindow layer if not already done
+local function InitKeybindActions()
+    if not lam.keybindsInitialized then
+        lam.keybindsInitialized = true
+        ZO_PreHook(KEYBOARD_OPTIONS, "ApplySettings", function()
+            if lam.currentPanelOpened then
+                if not lam.applyButton:IsHidden() then
+                    HandleReloadUIPressed()
+                end
+                return true
+            end
+        end)
+        ZO_PreHook("ZO_Dialogs_ShowDialog", function(dialogName)
+            if lam.currentPanelOpened and dialogName == "OPTIONS_RESET_TO_DEFAULTS" then
+                if not lam.defaultButton:IsHidden() then
+                    HandleLoadDefaultsPressed()
+                end
+                return true
+            end
+        end)
+    end
+end
+
+-- INTERNAL METHOD: fires the LAM-PanelOpened callback if not already done
+local function OpenCurrentPanel()
+    if lam.currentAddonPanel and not lam.currentPanelOpened then
+        lam.currentPanelOpened = true
+        lam.defaultButton:SetHidden(not lam.currentAddonPanel.data.registerForDefaults)
+        cm:FireCallbacks("LAM-PanelOpened", lam.currentAddonPanel)
+    end
+end
+
+-- INTERNAL METHOD: fires the LAM-PanelClosed callback if not already done
+local function CloseCurrentPanel()
+    if lam.currentAddonPanel and lam.currentPanelOpened then
+        lam.currentPanelOpened = false
+        cm:FireCallbacks("LAM-PanelClosed", lam.currentAddonPanel)
+    end
+end
+
+--METHOD: OPEN TO ADDON PANEL--
+--opens to a specific addon's option panel
+--Usage:
+-- panel = userdata; the panel returned by the :RegisterOptionsPanel method
+local locSettings = GetString(SI_GAME_MENU_SETTINGS)
+function lam:OpenToPanel(panel)
+
+    -- find and select the panel's row in addon list
+
+    local addonList = lam.addonList
+    local selectedData = nil
+
+    for _, addonData in ipairs(addonsForList) do
+        if addonData.panel == panel then
+            selectedData = addonData
+            ScrollDataIntoView(addonList, selectedData)
+            break
+        end
+    end
+
+    ZO_ScrollList_SelectData(addonList, selectedData)
+    ZO_ScrollList_RefreshVisible(addonList, selectedData)
+
+    local srchEdit = LAMAddonSettingsWindow:GetNamedChild("SearchFilterEdit")
+    srchEdit:Clear()
+
+    -- note that ZO_ScrollList doesn't require `selectedData` to be actually
+    -- present in the list, and that the list will only be populated once LAM
+    -- "Addon Settings" menu entry is selected for the first time
+
+    local function openAddonSettingsMenu()
+        local gameMenu = ZO_GameMenu_InGame.gameMenu
+        local settingsMenu = gameMenu.headerControls[locSettings]
+
+        if settingsMenu then -- an instance of ZO_TreeNode
+            local children = settingsMenu:GetChildren()
+            for i = 1, (children and #children or 0) do
+                local childNode = children[i]
+                local data = childNode:GetData()
+                if data and data.id == lam.panelId then
+                    -- found LAM "Addon Settings" node, yay!
+                    childNode:GetTree():SelectNode(childNode)
+                    break
+                end
+            end
+        end
+    end
+
+    if sm:GetScene("gameMenuInGame"):GetState() == SCENE_SHOWN then
+        openAddonSettingsMenu()
+    else
+        sm:CallWhen("gameMenuInGame", SCENE_SHOWN, openAddonSettingsMenu)
+        sm:Show("gameMenuInGame")
+    end
+end
+
+local TwinOptionsContainer_Index = 0
+local function TwinOptionsContainer(parent, leftWidget, rightWidget)
+    TwinOptionsContainer_Index = TwinOptionsContainer_Index + 1
+    local cParent = parent.scroll or parent
+    local panel = parent.panel or cParent
+    local container = wm:CreateControl("$(parent)TwinContainer" .. tostring(TwinOptionsContainer_Index),
+        cParent, CT_CONTROL)
+    container:SetResizeToFitDescendents(true)
+    container:SetAnchor(select(2, leftWidget:GetAnchor(0) ))
+
+    leftWidget:ClearAnchors()
+    leftWidget:SetAnchor(TOPLEFT, container, TOPLEFT)
+    rightWidget:SetAnchor(TOPLEFT, leftWidget, TOPRIGHT, 5, 0)
+
+    leftWidget:SetWidth( leftWidget:GetWidth() - 2.5 ) -- fixes bad alignment with 'full' controls
+    rightWidget:SetWidth( rightWidget:GetWidth() - 2.5 )
+
+    leftWidget:SetParent(container)
+    rightWidget:SetParent(container)
+
+    container.data = {type = "container"}
+    container.panel = panel
+    return container
+end
+
+--INTERNAL FUNCTION
+--creates controls when options panel is first shown
+--controls anchoring of these controls in the panel
+local function CreateOptionsControls(panel)
+    local addonID = panel:GetName()
+    if(optionsState[addonID] == OPTIONS_CREATED) then
+        return false
+    elseif(optionsState[addonID] == OPTIONS_CREATION_RUNNING) then
+        return true
+    end
+    optionsState[addonID] = OPTIONS_CREATION_RUNNING
+
+    local function CreationFinished()
+        optionsState[addonID] = OPTIONS_CREATED
+        cm:FireCallbacks("LAM-PanelControlsCreated", panel)
+        OpenCurrentPanel()
+    end
+
+    local optionsTable = addonToOptionsMap[addonID]
+    if optionsTable then
+        local function CreateAndAnchorWidget(parent, widgetData, offsetX, offsetY, anchorTarget, wasHalf)
+            local widget
+            local status, err = pcall(function() widget = LAMCreateControl[widgetData.type](parent, widgetData) end)
+            if not status then
+                return err or true, offsetY, anchorTarget, wasHalf
+            else
+                local isHalf = (widgetData.width == "half")
+                if not anchorTarget then -- the first widget in a panel is just placed in the top left corner
+                    widget:SetAnchor(TOPLEFT)
+                    anchorTarget = widget
+                elseif wasHalf and isHalf then -- when the previous widget was only half width and this one is too, we place it on the right side
+                    widget.lineControl = anchorTarget
+                    isHalf = false
+                    offsetY = 0
+                    anchorTarget = TwinOptionsContainer(parent, anchorTarget, widget)
+                else -- otherwise we just put it below the previous one normally
+                    widget:SetAnchor(TOPLEFT, anchorTarget, BOTTOMLEFT, 0, 15)
+                    offsetY = 0
+                    anchorTarget = widget
+                end
+                return false, offsetY, anchorTarget, isHalf
+            end
+        end
+
+        local THROTTLE_TIMEOUT, THROTTLE_COUNT = 10, 20
+        local fifo = {}
+        local anchorOffset, lastAddedControl, wasHalf
+        local CreateWidgetsInPanel, err
+
+        local function PrepareForNextPanel()
+            anchorOffset, lastAddedControl, wasHalf = 0, nil, false
+        end
+
+        local function SetupCreationCalls(parent, widgetDataTable)
+            fifo[#fifo + 1] = PrepareForNextPanel
+            local count = #widgetDataTable
+            for i = 1, count, THROTTLE_COUNT do
+                fifo[#fifo + 1] = function()
+                    CreateWidgetsInPanel(parent, widgetDataTable, i, zo_min(i + THROTTLE_COUNT - 1, count))
+                end
+            end
+            return count ~= NonContiguousCount(widgetDataTable)
+        end
+
+        CreateWidgetsInPanel = function(parent, widgetDataTable, startIndex, endIndex)
+            for i=startIndex,endIndex do
+                local widgetData = widgetDataTable[i]
+                if not widgetData then
+                    PrintLater("Skipped creation of missing entry in the settings menu of " .. addonID .. ".")
+                else
+                    local widgetType = widgetData.type
+                    local offsetX = 0
+                    local isSubmenu = (widgetType == "submenu")
+                    if isSubmenu then
+                        wasHalf = false
+                        offsetX = 5
+                    end
+
+                    err, anchorOffset, lastAddedControl, wasHalf = CreateAndAnchorWidget(parent, widgetData, offsetX, anchorOffset, lastAddedControl, wasHalf)
+                    if err then
+                        PrintLater(("Could not create %s '%s' of %s."):format(widgetData.type, GetStringFromValue(widgetData.name or "unnamed"), addonID))
+                    end
+
+                    if isSubmenu then
+                        if SetupCreationCalls(lastAddedControl, widgetData.controls) then
+                            PrintLater(("The sub menu '%s' of %s is missing some entries."):format(GetStringFromValue(widgetData.name or "unnamed"), addonID))
+                        end
+                    end
+                end
+            end
+        end
+
+        local function DoCreateSettings()
+            if #fifo > 0 then
+                local nextCall = table.remove(fifo, 1)
+                nextCall()
+                if(nextCall == PrepareForNextPanel) then
+                    DoCreateSettings()
+                else
+                    zo_callLater(DoCreateSettings, THROTTLE_TIMEOUT)
+                end
+            else
+                CreationFinished()
+            end
+        end
+
+        if SetupCreationCalls(panel, optionsTable) then
+            PrintLater(("The settings menu of %s is missing some entries."):format(addonID))
+        end
+        DoCreateSettings()
+    else
+        CreationFinished()
+    end
+
+    return true
+end
+
+--INTERNAL FUNCTION
+--handles switching between panels
+local function ToggleAddonPanels(panel) --called in OnShow of newly shown panel
+    local currentlySelected = lam.currentAddonPanel
+    if currentlySelected and currentlySelected ~= panel then
+        currentlySelected:SetHidden(true)
+        CloseCurrentPanel()
+    end
+    lam.currentAddonPanel = panel
+
+    -- refresh visible rows to reflect panel IsHidden status
+    ZO_ScrollList_RefreshVisible(lam.addonList)
+
+    if not CreateOptionsControls(panel) then
+        OpenCurrentPanel()
+    end
+
+    cm:FireCallbacks("LAM-RefreshPanel", panel)
+end
+
+local CheckSafetyAndInitialize
+
+--METHOD: REGISTER ADDON PANEL
+--registers your addon with LibAddonMenu and creates a panel
+--Usage:
+-- addonID = "string"; unique ID which will be the global name of your panel
+-- panelData = table; data object for your panel - see controls\panel.lua
+function lam:RegisterAddonPanel(addonID, panelData)
+    CheckSafetyAndInitialize(addonID)
+    local container = lam:GetAddonPanelContainer()
+    local panel = lamcc.panel(container, panelData, addonID) --addonID==global name of panel
+    panel:SetHidden(true)
+    panel:SetAnchorFill(container)
+    panel:SetHandler("OnShow", ToggleAddonPanels)
+
+    local function stripMarkup(str)
+        return str:gsub("|[Cc]%x%x%x%x%x%x", ""):gsub("|[Rr]", "")
+    end
+
+    local filterParts = {panelData.name, nil, nil}
+    -- append keywords and author separately, the may be nil
+    filterParts[#filterParts + 1] = panelData.keywords
+    filterParts[#filterParts + 1] = panelData.author
+
+    local addonData = {
+        panel = panel,
+        name = stripMarkup(panelData.name),
+        filterText = stripMarkup(tconcat(filterParts, "\t")):lower(),
+    }
+
+    tinsert(addonsForList, addonData)
+
+    if panelData.slashCommand then
+        SLASH_COMMANDS[panelData.slashCommand] = function()
+            lam:OpenToPanel(panel)
+        end
+    end
+
+    return panel --return for authors creating options manually
+end
+
+
+--METHOD: REGISTER OPTION CONTROLS
+--registers the options you want shown for your addon
+--these are stored in a table where each key-value pair is the order
+--of the options in the panel and the data for that control, respectively
+--see exampleoptions.lua for an example
+--see controls\<widget>.lua for each widget type
+--Usage:
+-- addonID = "string"; the same string passed to :RegisterAddonPanel
+-- optionsTable = table; the table containing all of the options controls and their data
+function lam:RegisterOptionControls(addonID, optionsTable) --optionsTable = {sliderData, buttonData, etc}
+    addonToOptionsMap[addonID] = optionsTable
+end
+
+--INTERNAL FUNCTION
+--creates LAM's Addon Settings entry in ZO_GameMenu
+local function CreateAddonSettingsMenuEntry()
+    local panelData = {
+        id = KEYBOARD_OPTIONS.currentPanelId,
+        name = util.L["PANEL_NAME"],
+    }
+
+    KEYBOARD_OPTIONS.currentPanelId = panelData.id + 1
+    KEYBOARD_OPTIONS.panelNames[panelData.id] = panelData.name
+
+    lam.panelId = panelData.id
+
+    local addonListSorted = false
+
+    function panelData.callback()
+        sm:AddFragment(lam:GetAddonSettingsFragment())
+        KEYBOARD_OPTIONS:ChangePanels(lam.panelId)
+
+        local title = LAMAddonSettingsWindow:GetNamedChild("Title")
+        title:SetText(panelData.name)
+
+        if not addonListSorted and #addonsForList > 0 then
+            local searchEdit = LAMAddonSettingsWindow:GetNamedChild("SearchFilterEdit")
+            --we're about to show our list for the first time - let's sort it
+            table.sort(addonsForList, function(a, b) return a.name < b.name end)
+            PopulateAddonList(lam.addonList, GetSearchFilterFunc(searchEdit))
+            addonListSorted = true
+        end
+    end
+
+    function panelData.unselectedCallback()
+        sm:RemoveFragment(lam:GetAddonSettingsFragment())
+        if SetCameraOptionsPreviewModeEnabled then -- available since API version 100011
+            SetCameraOptionsPreviewModeEnabled(false)
+        end
+    end
+
+    ZO_GameMenu_AddSettingPanel(panelData)
+end
+
+
+--INTERNAL FUNCTION
+--creates the left-hand menu in LAM's window
+local function CreateAddonList(name, parent)
+    local addonList = wm:CreateControlFromVirtual(name, parent, "ZO_ScrollList")
+
+    local function addonListRow_OnMouseDown(control, button)
+        if button == 1 then
+            local data = ZO_ScrollList_GetData(control)
+            ZO_ScrollList_SelectData(addonList, data, control)
+        end
+    end
+
+    local function addonListRow_OnMouseEnter(control)
+        ZO_ScrollList_MouseEnter(addonList, control)
+    end
+
+    local function addonListRow_OnMouseExit(control)
+        ZO_ScrollList_MouseExit(addonList, control)
+    end
+
+    local function addonListRow_Select(previouslySelectedData, selectedData, reselectingDuringRebuild)
+        if not reselectingDuringRebuild then
+            if previouslySelectedData then
+                previouslySelectedData.panel:SetHidden(true)
+            end
+            if selectedData then
+                selectedData.panel:SetHidden(false)
+                PlaySound(SOUNDS.MENU_SUBCATEGORY_SELECTION)
+            end
+        end
+    end
+
+    local function addonListRow_Setup(control, data)
+        control:SetText(data.name)
+        control:SetSelected(not data.panel:IsHidden())
+    end
+
+    ZO_ScrollList_AddDataType(addonList, ADDON_DATA_TYPE, "ZO_SelectableLabel", 28, addonListRow_Setup)
+    -- I don't know how to make highlights clear properly; they often
+    -- get stuck and after a while the list is full of highlighted rows
+    --ZO_ScrollList_EnableHighlight(addonList, "ZO_ThinListHighlight")
+    ZO_ScrollList_EnableSelection(addonList, "ZO_ThinListHighlight", addonListRow_Select)
+
+    local addonDataType = ZO_ScrollList_GetDataTypeTable(addonList, ADDON_DATA_TYPE)
+    local addonListRow_CreateRaw = addonDataType.pool.m_Factory
+
+    local function addonListRow_Create(pool)
+        local control = addonListRow_CreateRaw(pool)
+        control:SetHandler("OnMouseDown", addonListRow_OnMouseDown)
+        --control:SetHandler("OnMouseEnter", addonListRow_OnMouseEnter)
+        --control:SetHandler("OnMouseExit", addonListRow_OnMouseExit)
+        control:SetHeight(28)
+        control:SetFont("ZoFontHeader")
+        control:SetHorizontalAlignment(TEXT_ALIGN_LEFT)
+        control:SetVerticalAlignment(TEXT_ALIGN_CENTER)
+        control:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
+        return control
+    end
+
+    addonDataType.pool.m_Factory = addonListRow_Create
+
+    return addonList
+end
+
+
+--INTERNAL FUNCTION
+local function CreateSearchFilterBox(name, parent)
+    local boxControl = wm:CreateControl(name, parent, CT_CONTROL)
+
+    local srchButton =  wm:CreateControl("$(parent)Button", boxControl, CT_BUTTON)
+    srchButton:SetDimensions(32, 32)
+    srchButton:SetAnchor(LEFT, nil, LEFT, 2, 0)
+    srchButton:SetNormalTexture("EsoUI/Art/LFG/LFG_tabIcon_groupTools_up.dds")
+    srchButton:SetPressedTexture("EsoUI/Art/LFG/LFG_tabIcon_groupTools_down.dds")
+    srchButton:SetMouseOverTexture("EsoUI/Art/LFG/LFG_tabIcon_groupTools_over.dds")
+
+    local srchEdit = wm:CreateControlFromVirtual("$(parent)Edit", boxControl, "ZO_DefaultEdit")
+    srchEdit:SetAnchor(LEFT, srchButton, RIGHT, 4, 1)
+    srchEdit:SetAnchor(RIGHT, nil, RIGHT, -4, 1)
+    srchEdit:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
+
+    local srchBg = wm:CreateControl("$(parent)Bg", boxControl, CT_BACKDROP)
+    srchBg:SetAnchorFill()
+    srchBg:SetAlpha(0)
+    srchBg:SetCenterColor(0, 0, 0, 0.5)
+    srchBg:SetEdgeColor(ZO_DISABLED_TEXT:UnpackRGBA())
+    srchBg:SetEdgeTexture("", 1, 1, 0, 0)
+
+    -- search backdrop should appear whenever you hover over either
+    -- the magnifying glass button or the edit field (which is only
+    -- visible when it contains some text), and also while the edit
+    -- field has keyboard focus
+
+    local srchActive = false
+    local srchHover = false
+
+    local function srchBgUpdateAlpha()
+        if srchActive or srchEdit:HasFocus() then
+            srchBg:SetAlpha(srchHover and 0.8 or 0.6)
+        else
+            srchBg:SetAlpha(srchHover and 0.6 or 0.0)
+        end
+    end
+
+    local function srchMouseEnter(control)
+        srchHover = true
+        srchBgUpdateAlpha()
+    end
+
+    local function srchMouseExit(control)
+        srchHover = false
+        srchBgUpdateAlpha()
+    end
+
+    boxControl:SetMouseEnabled(true)
+    boxControl:SetHitInsets(1, 1, -1, -1)
+    boxControl:SetHandler("OnMouseEnter", srchMouseEnter)
+    boxControl:SetHandler("OnMouseExit", srchMouseExit)
+
+    srchButton:SetHandler("OnMouseEnter", srchMouseEnter)
+    srchButton:SetHandler("OnMouseExit", srchMouseExit)
+
+    local focusLostTime = 0
+
+    srchButton:SetHandler("OnClicked", function(self)
+        srchEdit:Clear()
+        if GetFrameTimeMilliseconds() - focusLostTime < 100 then
+            -- re-focus the edit box if it lost focus due to this
+            -- button click (note that this handler may run a few
+            -- frames later)
+            srchEdit:TakeFocus()
+        end
+    end)
+
+    srchEdit:SetHandler("OnMouseEnter", srchMouseEnter)
+    srchEdit:SetHandler("OnMouseExit", srchMouseExit)
+    srchEdit:SetHandler("OnFocusGained", srchBgUpdateAlpha)
+
+    srchEdit:SetHandler("OnFocusLost", function()
+        focusLostTime = GetFrameTimeMilliseconds()
+        srchBgUpdateAlpha()
+    end)
+
+    srchEdit:SetHandler("OnEscape", function(self)
+        self:Clear()
+        self:LoseFocus()
+    end)
+
+    srchEdit:SetHandler("OnTextChanged", function(self)
+        local filterFunc = GetSearchFilterFunc(self)
+        if filterFunc then
+            srchActive = true
+            srchBg:SetEdgeColor(ZO_SECOND_CONTRAST_TEXT:UnpackRGBA())
+            srchButton:SetState(BSTATE_PRESSED)
+        else
+            srchActive = false
+            srchBg:SetEdgeColor(ZO_DISABLED_TEXT:UnpackRGBA())
+            srchButton:SetState(BSTATE_NORMAL)
+        end
+        srchBgUpdateAlpha()
+        PopulateAddonList(lam.addonList, filterFunc)
+        PlaySound(SOUNDS.SPINNER_DOWN)
+    end)
+
+    return boxControl
+end
+
+
+--INTERNAL FUNCTION
+--creates LAM's Addon Settings top-level window
+local function CreateAddonSettingsWindow()
+    local tlw = wm:CreateTopLevelWindow("LAMAddonSettingsWindow")
+    tlw:SetHidden(true)
+    tlw:SetDimensions(1010, 914) -- same height as ZO_OptionsWindow
+
+    ZO_ReanchorControlForLeftSidePanel(tlw)
+
+    -- create black background for the window (mimic ZO_RightFootPrintBackground)
+
+    local bgLeft = wm:CreateControl("$(parent)BackgroundLeft", tlw, CT_TEXTURE)
+    bgLeft:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_left.dds")
+    bgLeft:SetDimensions(1024, 1024)
+    bgLeft:SetAnchor(TOPLEFT, nil, TOPLEFT)
+    bgLeft:SetDrawLayer(DL_BACKGROUND)
+    bgLeft:SetExcludeFromResizeToFitExtents(true)
+
+    local bgRight = wm:CreateControl("$(parent)BackgroundRight", tlw, CT_TEXTURE)
+    bgRight:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_right.dds")
+    bgRight:SetDimensions(64, 1024)
+    bgRight:SetAnchor(TOPLEFT, bgLeft, TOPRIGHT)
+    bgRight:SetDrawLayer(DL_BACKGROUND)
+    bgRight:SetExcludeFromResizeToFitExtents(true)
+
+    -- create gray background for addon list (mimic ZO_TreeUnderlay)
+
+    local underlayLeft = wm:CreateControl("$(parent)UnderlayLeft", tlw, CT_TEXTURE)
+    underlayLeft:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_indexArea_left.dds")
+    underlayLeft:SetDimensions(256, 1024)
+    underlayLeft:SetAnchor(TOPLEFT, bgLeft, TOPLEFT)
+    underlayLeft:SetDrawLayer(DL_BACKGROUND)
+    underlayLeft:SetExcludeFromResizeToFitExtents(true)
+
+    local underlayRight = wm:CreateControl("$(parent)UnderlayRight", tlw, CT_TEXTURE)
+    underlayRight:SetTexture("EsoUI/Art/Miscellaneous/centerscreen_indexArea_right.dds")
+    underlayRight:SetDimensions(128, 1024)
+    underlayRight:SetAnchor(TOPLEFT, underlayLeft, TOPRIGHT)
+    underlayRight:SetDrawLayer(DL_BACKGROUND)
+    underlayRight:SetExcludeFromResizeToFitExtents(true)
+
+    -- create title bar (mimic ZO_OptionsWindow)
+
+    local title = wm:CreateControl("$(parent)Title", tlw, CT_LABEL)
+    title:SetAnchor(TOPLEFT, nil, TOPLEFT, 65, 70)
+    title:SetFont("ZoFontWinH1")
+    title:SetModifyTextType(MODIFY_TEXT_TYPE_UPPERCASE)
+
+    local divider = wm:CreateControlFromVirtual("$(parent)Divider", tlw, "ZO_Options_Divider")
+    divider:SetAnchor(TOPLEFT, nil, TOPLEFT, 65, 108)
+
+    -- create search filter box
+
+    local srchBox = CreateSearchFilterBox("$(parent)SearchFilter", tlw)
+    srchBox:SetAnchor(TOPLEFT, nil, TOPLEFT, 63, 120)
+    srchBox:SetDimensions(260, 30)
+
+    -- create scrollable addon list
+
+    local addonList = CreateAddonList("$(parent)AddonList", tlw)
+    addonList:SetAnchor(TOPLEFT, nil, TOPLEFT, 65, 160)
+    addonList:SetDimensions(285, 665)
+
+    lam.addonList = addonList -- for easy access from elsewhere
+
+    -- create container for option panels
+
+    local panelContainer = wm:CreateControl("$(parent)PanelContainer", tlw, CT_CONTROL)
+    panelContainer:SetAnchor(TOPLEFT, nil, TOPLEFT, 365, 120)
+    panelContainer:SetDimensions(645, 675)
+
+    local defaultButton = wm:CreateControlFromVirtual("$(parent)ResetToDefaultButton", tlw, "ZO_DialogButton")
+    ZO_KeybindButtonTemplate_Setup(defaultButton, "OPTIONS_LOAD_DEFAULTS", HandleLoadDefaultsPressed, GetString(SI_OPTIONS_DEFAULTS))
+    defaultButton:SetAnchor(TOPLEFT, panelContainer, BOTTOMLEFT, 0, 2)
+    lam.defaultButton = defaultButton
+
+    local applyButton = wm:CreateControlFromVirtual("$(parent)ApplyButton", tlw, "ZO_DialogButton")
+    ZO_KeybindButtonTemplate_Setup(applyButton, "OPTIONS_APPLY_CHANGES", HandleReloadUIPressed, GetString(SI_ADDON_MANAGER_RELOAD))
+    applyButton:SetAnchor(TOPRIGHT, panelContainer, BOTTOMRIGHT, 0, 2)
+    applyButton:SetHidden(true)
+    lam.applyButton = applyButton
+
+    return tlw
+end
+
+
+--INITIALIZING
+local safeToInitialize = false
+local hasInitialized = false
+
+local eventHandle = table.concat({MAJOR, MINOR}, "r")
+local function OnLoad(_, addonName)
+    -- wait for the first loaded event
+    em:UnregisterForEvent(eventHandle, EVENT_ADD_ON_LOADED)
+    safeToInitialize = true
+end
+em:RegisterForEvent(eventHandle, EVENT_ADD_ON_LOADED, OnLoad)
+
+local function OnActivated(_, initial)
+    em:UnregisterForEvent(eventHandle, EVENT_PLAYER_ACTIVATED)
+    FlushMessages()
+
+    local reopenPanel = RetrievePanelForReopening()
+    if not initial and reopenPanel then
+        lam:OpenToPanel(reopenPanel)
+    end
+end
+em:RegisterForEvent(eventHandle, EVENT_PLAYER_ACTIVATED, OnActivated)
+
+function CheckSafetyAndInitialize(addonID)
+    if not safeToInitialize then
+        local msg = string.format("The panel with id '%s' was registered before addon loading has completed. This might break the AddOn Settings menu.", addonID)
+        PrintLater(msg)
+    end
+    if not hasInitialized then
+        hasInitialized = true
+    end
+end
+
+
+--TODO documentation
+function lam:GetAddonPanelContainer()
+    local fragment = lam:GetAddonSettingsFragment()
+    local window = fragment:GetControl()
+    return window:GetNamedChild("PanelContainer")
+end
+
+
+--TODO documentation
+function lam:GetAddonSettingsFragment()
+    assert(hasInitialized or safeToInitialize)
+    if not LAMAddonSettingsFragment then
+        local window = CreateAddonSettingsWindow()
+        LAMAddonSettingsFragment = ZO_FadeSceneFragment:New(window, true, 100)
+        LAMAddonSettingsFragment:RegisterCallback("StateChange", function(oldState, newState)
+            if(newState == SCENE_FRAGMENT_SHOWN) then
+                InitKeybindActions()
+                PushActionLayerByName("OptionsWindow")
+                OpenCurrentPanel()
+            elseif(newState == SCENE_FRAGMENT_HIDDEN) then
+                CloseCurrentPanel()
+                RemoveActionLayerByName("OptionsWindow")
+                ShowReloadDialogIfNeeded()
+            end
+        end)
+        CreateAddonSettingsMenuEntry()
+    end
+    return LAMAddonSettingsFragment
+end
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/button.lua b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/button.lua
new file mode 100644
index 0000000..82b5032
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/button.lua
@@ -0,0 +1,91 @@
+--[[buttonData = {
+    type = "button",
+    name = "My Button", -- string id or function returning a string
+    func = function() end,
+    tooltip = "Button's tooltip text.", -- string id or function returning a string (optional)
+    width = "full", --or "half" (optional)
+    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
+    icon = "icon\\path.dds", --(optional)
+    isDangerous = false, -- boolean, if set to true, the button text will be red and a confirmation dialog with the button label and warning text will show on click before the callback is executed (optional)
+    warning = "Will need to reload the UI.", --(optional)
+    reference = "MyAddonButton", -- unique global reference to control (optional)
+} ]]
+
+local widgetVersion = 11
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("button", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local function UpdateDisabled(control)
+    local disable = control.data.disabled
+    if type(disable) == "function" then
+        disable = disable()
+    end
+    control.button:SetEnabled(not disable)
+end
+
+--controlName is optional
+local MIN_HEIGHT = 28 -- default_button height
+local HALF_WIDTH_LINE_SPACING = 2
+function LAMCreateControl.button(parent, buttonData, controlName)
+    local control = LAM.util.CreateBaseControl(parent, buttonData, controlName)
+    control:SetMouseEnabled(true)
+
+    local width = control:GetWidth()
+    if control.isHalfWidth then
+        control:SetDimensions(width / 2, MIN_HEIGHT * 2 + HALF_WIDTH_LINE_SPACING)
+    else
+        control:SetDimensions(width, MIN_HEIGHT)
+    end
+
+    if buttonData.icon then
+        control.button = wm:CreateControl(nil, control, CT_BUTTON)
+        control.button:SetDimensions(26, 26)
+        control.button:SetNormalTexture(buttonData.icon)
+        control.button:SetPressedOffset(2, 2)
+    else
+        --control.button = wm:CreateControlFromVirtual(controlName.."Button", control, "ZO_DefaultButton")
+        control.button = wm:CreateControlFromVirtual(nil, control, "ZO_DefaultButton")
+        control.button:SetWidth(width / 3)
+        control.button:SetText(LAM.util.GetStringFromValue(buttonData.name))
+        if buttonData.isDangerous then control.button:SetNormalFontColor(ZO_ERROR_COLOR:UnpackRGBA()) end
+    end
+    local button = control.button
+    button:SetAnchor(control.isHalfWidth and CENTER or RIGHT)
+    button:SetClickSound("Click")
+    button.data = {tooltipText = LAM.util.GetStringFromValue(buttonData.tooltip)}
+    button:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
+    button:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
+    button:SetHandler("OnClicked", function(...)
+        local args = {...}
+        local function callback()
+            buttonData.func(unpack(args))
+            LAM.util.RequestRefreshIfNeeded(control)
+        end
+
+        if(buttonData.isDangerous) then
+            local title = LAM.util.GetStringFromValue(buttonData.name)
+            local body = LAM.util.GetStringFromValue(buttonData.warning)
+            LAM.util.ShowConfirmationDialog(title, body, callback)
+        else
+            callback()
+        end
+    end)
+
+    if buttonData.warning ~= nil then
+        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+        control.warning:SetAnchor(RIGHT, button, LEFT, -5, 0)
+        control.UpdateWarning = LAM.util.UpdateWarning
+        control:UpdateWarning()
+    end
+
+    if buttonData.disabled ~= nil then
+        control.UpdateDisabled = UpdateDisabled
+        control:UpdateDisabled()
+    end
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+
+    return control
+end
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/checkbox.lua b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/checkbox.lua
new file mode 100644
index 0000000..6696dd7
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/checkbox.lua
@@ -0,0 +1,142 @@
+--[[checkboxData = {
+    type = "checkbox",
+    name = "My Checkbox", -- or string id or function returning a string
+    getFunc = function() return db.var end,
+    setFunc = function(value) db.var = value doStuff() end,
+    tooltip = "Checkbox's tooltip text.", -- or string id or function returning a string (optional)
+    width = "full", -- or "half" (optional)
+    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
+    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
+    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
+    default = defaults.var, -- a boolean or function that returns a boolean (optional)
+    reference = "MyAddonCheckbox", -- unique global reference to control (optional)
+} ]]
+
+
+local widgetVersion = 14
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("checkbox", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+--label
+local enabledColor = ZO_DEFAULT_ENABLED_COLOR
+local enabledHLcolor = ZO_HIGHLIGHT_TEXT
+local disabledColor = ZO_DEFAULT_DISABLED_COLOR
+local disabledHLcolor = ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR
+--checkbox
+local checkboxColor = ZO_NORMAL_TEXT
+local checkboxHLcolor = ZO_HIGHLIGHT_TEXT
+
+
+local function UpdateDisabled(control)
+    local disable
+    if type(control.data.disabled) == "function" then
+        disable = control.data.disabled()
+    else
+        disable = control.data.disabled
+    end
+
+    control.label:SetColor((disable and ZO_DEFAULT_DISABLED_COLOR or control.value and ZO_DEFAULT_ENABLED_COLOR or ZO_DEFAULT_DISABLED_COLOR):UnpackRGBA())
+    control.checkbox:SetColor((disable and ZO_DEFAULT_DISABLED_COLOR or ZO_NORMAL_TEXT):UnpackRGBA())
+    --control:SetMouseEnabled(not disable)
+    --control:SetMouseEnabled(true)
+
+    control.isDisabled = disable
+end
+
+local function ToggleCheckbox(control)
+    if control.value then
+        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+        control.checkbox:SetText(control.checkedText)
+    else
+        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+        control.checkbox:SetText(control.uncheckedText)
+    end
+end
+
+local function UpdateValue(control, forceDefault, value)
+    if forceDefault then --if we are forcing defaults
+        value = LAM.util.GetDefaultValue(control.data.default)
+        control.data.setFunc(value)
+    elseif value ~= nil then --our value could be false
+        control.data.setFunc(value)
+        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+        LAM.util.RequestRefreshIfNeeded(control)
+    else
+        value = control.data.getFunc()
+    end
+    control.value = value
+
+    ToggleCheckbox(control)
+end
+
+local function OnMouseEnter(control)
+    ZO_Options_OnMouseEnter(control)
+
+    if control.isDisabled then return end
+
+    local label = control.label
+    if control.value then
+        label:SetColor(ZO_HIGHLIGHT_TEXT:UnpackRGBA())
+    else
+        label:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
+    end
+    control.checkbox:SetColor(ZO_HIGHLIGHT_TEXT:UnpackRGBA())
+end
+
+local function OnMouseExit(control)
+    ZO_Options_OnMouseExit(control)
+
+    if control.isDisabled then return end
+
+    local label = control.label
+    if control.value then
+        label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+    else
+        label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+    end
+    control.checkbox:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
+end
+
+--controlName is optional
+function LAMCreateControl.checkbox(parent, checkboxData, controlName)
+    local control = LAM.util.CreateLabelAndContainerControl(parent, checkboxData, controlName)
+    control:SetHandler("OnMouseEnter", OnMouseEnter)
+    control:SetHandler("OnMouseExit", OnMouseExit)
+    control:SetHandler("OnMouseUp", function(control)
+        if control.isDisabled then return end
+        PlaySound(SOUNDS.DEFAULT_CLICK)
+        control.value = not control.value
+        control:UpdateValue(false, control.value)
+    end)
+
+    control.checkbox = wm:CreateControl(nil, control.container, CT_LABEL)
+    local checkbox = control.checkbox
+    checkbox:SetAnchor(LEFT, control.container, LEFT, 0, 0)
+    checkbox:SetFont("ZoFontGameBold")
+    checkbox:SetColor(ZO_NORMAL_TEXT:UnpackRGBA())
+    control.checkedText = GetString(SI_CHECK_BUTTON_ON):upper()
+    control.uncheckedText = GetString(SI_CHECK_BUTTON_OFF):upper()
+
+    if checkboxData.warning ~= nil or checkboxData.requiresReload then
+        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+        control.warning:SetAnchor(RIGHT, checkbox, LEFT, -5, 0)
+        control.UpdateWarning = LAM.util.UpdateWarning
+        control:UpdateWarning()
+    end
+
+    control.data.tooltipText = LAM.util.GetStringFromValue(checkboxData.tooltip)
+
+    control.UpdateValue = UpdateValue
+    control:UpdateValue()
+    if checkboxData.disabled ~= nil then
+        control.UpdateDisabled = UpdateDisabled
+        control:UpdateDisabled()
+    end
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+    LAM.util.RegisterForReloadIfNeeded(control)
+
+    return control
+end
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/colorpicker.lua b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/colorpicker.lua
new file mode 100644
index 0000000..a57aab0
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/colorpicker.lua
@@ -0,0 +1,106 @@
+--[[colorpickerData = {
+    type = "colorpicker",
+    name = "My Color Picker", -- or string id or function returning a string
+    getFunc = function() return db.r, db.g, db.b, db.a end, --(alpha is optional)
+    setFunc = function(r,g,b,a) db.r=r, db.g=g, db.b=b, db.a=a end, --(alpha is optional)
+    tooltip = "Color Picker's tooltip text.", -- or string id or function returning a string (optional)
+    width = "full", --or "half" (optional)
+    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
+    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
+    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
+    default = {r = defaults.r, g = defaults.g, b = defaults.b, a = defaults.a}, --(optional) table of default color values (or default = defaultColor, where defaultColor is a table with keys of r, g, b[, a]) or a function that returns the color
+    reference = "MyAddonColorpicker" -- unique global reference to control (optional)
+} ]]
+
+
+local widgetVersion = 13
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("colorpicker", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local function UpdateDisabled(control)
+    local disable
+    if type(control.data.disabled) == "function" then
+        disable = control.data.disabled()
+    else
+        disable = control.data.disabled
+    end
+
+    if disable then
+        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+    else
+        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+    end
+
+    control.isDisabled = disable
+end
+
+local function UpdateValue(control, forceDefault, valueR, valueG, valueB, valueA)
+    if forceDefault then --if we are forcing defaults
+        local color = LAM.util.GetDefaultValue(control.data.default)
+        valueR, valueG, valueB, valueA = color.r, color.g, color.b, color.a
+        control.data.setFunc(valueR, valueG, valueB, valueA)
+    elseif valueR and valueG and valueB then
+        control.data.setFunc(valueR, valueG, valueB, valueA or 1)
+        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+        LAM.util.RequestRefreshIfNeeded(control)
+    else
+        valueR, valueG, valueB, valueA = control.data.getFunc()
+    end
+
+    control.thumb:SetColor(valueR, valueG, valueB, valueA or 1)
+end
+
+function LAMCreateControl.colorpicker(parent, colorpickerData, controlName)
+    local control = LAM.util.CreateLabelAndContainerControl(parent, colorpickerData, controlName)
+
+    control.color = control.container
+    local color = control.color
+
+    control.thumb = wm:CreateControl(nil, color, CT_TEXTURE)
+    local thumb = control.thumb
+    thumb:SetDimensions(36, 18)
+    thumb:SetAnchor(LEFT, color, LEFT, 4, 0)
+
+    color.border = wm:CreateControl(nil, color, CT_TEXTURE)
+    local border = color.border
+    border:SetTexture("EsoUI\\Art\\ChatWindow\\chatOptions_bgColSwatch_frame.dds")
+    border:SetTextureCoords(0, .625, 0, .8125)
+    border:SetDimensions(40, 22)
+    border:SetAnchor(CENTER, thumb, CENTER, 0, 0)
+
+    local function ColorPickerCallback(r, g, b, a)
+        control:UpdateValue(false, r, g, b, a)
+    end
+
+    control:SetHandler("OnMouseUp", function(self, btn, upInside)
+        if self.isDisabled then return end
+
+        if upInside then
+            local r, g, b, a = colorpickerData.getFunc()
+            COLOR_PICKER:Show(ColorPickerCallback, r, g, b, a, LAM.util.GetStringFromValue(colorpickerData.name))
+        end
+    end)
+
+    if colorpickerData.warning ~= nil or colorpickerData.requiresReload then
+        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+        control.warning:SetAnchor(RIGHT, control.color, LEFT, -5, 0)
+        control.UpdateWarning = LAM.util.UpdateWarning
+        control:UpdateWarning()
+    end
+
+    control.data.tooltipText = LAM.util.GetStringFromValue(colorpickerData.tooltip)
+
+    control.UpdateValue = UpdateValue
+    control:UpdateValue()
+    if colorpickerData.disabled ~= nil then
+        control.UpdateDisabled = UpdateDisabled
+        control:UpdateDisabled()
+    end
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+    LAM.util.RegisterForReloadIfNeeded(control)
+
+    return control
+end
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/custom.lua b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/custom.lua
new file mode 100644
index 0000000..40a7c42
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/custom.lua
@@ -0,0 +1,35 @@
+--[[customData = {
+    type = "custom",
+    reference = "MyAddonCustomControl", --(optional) unique name for your control to use as reference
+    refreshFunc = function(customControl) end, --(optional) function to call when panel/controls refresh
+    width = "full", --or "half" (optional)
+} ]]
+
+local widgetVersion = 7
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("custom", widgetVersion) then return end
+
+local function UpdateValue(control)
+    if control.data.refreshFunc then
+        control.data.refreshFunc(control)
+    end
+end
+
+local MIN_HEIGHT = 26
+function LAMCreateControl.custom(parent, customData, controlName)
+    local control = LAM.util.CreateBaseControl(parent, customData, controlName)
+    local width = control:GetWidth()
+    control:SetResizeToFitDescendents(true)
+
+    if control.isHalfWidth then --note these restrictions
+        control:SetDimensionConstraints(width / 2, MIN_HEIGHT, width / 2, MIN_HEIGHT * 4)
+    else
+        control:SetDimensionConstraints(width, MIN_HEIGHT, width, MIN_HEIGHT * 4)
+    end
+
+    control.UpdateValue = UpdateValue
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+
+    return control
+end
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/description.lua b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/description.lua
new file mode 100644
index 0000000..da207a0
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/description.lua
@@ -0,0 +1,60 @@
+--[[descriptionData = {
+    type = "description",
+    text = "My description text to display.", -- or string id or function returning a string
+    title = "My Title", -- or string id or function returning a string (optional)
+    width = "full", --or "half" (optional)
+    reference = "MyAddonDescription" -- unique global reference to control (optional)
+} ]]
+
+
+local widgetVersion = 8
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("description", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local function UpdateValue(control)
+    if control.title then
+        control.title:SetText(LAM.util.GetStringFromValue(control.data.title))
+    end
+    control.desc:SetText(LAM.util.GetStringFromValue(control.data.text))
+end
+
+function LAMCreateControl.description(parent, descriptionData, controlName)
+    local control = LAM.util.CreateBaseControl(parent, descriptionData, controlName)
+    local isHalfWidth = control.isHalfWidth
+    local width = control:GetWidth()
+    control:SetResizeToFitDescendents(true)
+
+    if isHalfWidth then
+        control:SetDimensionConstraints(width / 2, 0, width / 2, 0)
+    else
+        control:SetDimensionConstraints(width, 0, width, 0)
+    end
+
+    control.desc = wm:CreateControl(nil, control, CT_LABEL)
+    local desc = control.desc
+    desc:SetVerticalAlignment(TEXT_ALIGN_TOP)
+    desc:SetFont("ZoFontGame")
+    desc:SetText(LAM.util.GetStringFromValue(descriptionData.text))
+    desc:SetWidth(isHalfWidth and width / 2 or width)
+
+    if descriptionData.title then
+        control.title = wm:CreateControl(nil, control, CT_LABEL)
+        local title = control.title
+        title:SetWidth(isHalfWidth and width / 2 or width)
+        title:SetAnchor(TOPLEFT, control, TOPLEFT)
+        title:SetFont("ZoFontWinH4")
+        title:SetText(LAM.util.GetStringFromValue(descriptionData.title))
+        desc:SetAnchor(TOPLEFT, title, BOTTOMLEFT)
+    else
+        desc:SetAnchor(TOPLEFT)
+    end
+
+    control.UpdateValue = UpdateValue
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+
+    return control
+
+end
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/divider.lua b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/divider.lua
new file mode 100644
index 0000000..8089539
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/divider.lua
@@ -0,0 +1,45 @@
+--[[dividerData = {
+    type = "divider",
+    width = "full", --or "half" (optional)
+    height = 10, (optional)
+    alpha = 0.25, (optional)
+    reference = "MyAddonDivider" -- unique global reference to control (optional)
+} ]]
+
+
+local widgetVersion = 2
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("divider", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local MIN_HEIGHT = 10
+local MAX_HEIGHT = 50
+local MIN_ALPHA = 0
+local MAX_ALPHA = 1
+local DEFAULT_ALPHA = 0.25
+
+local function GetValueInRange(value, min, max, default)
+    if not value or type(value) ~= "number" then
+        return default
+    end
+    return math.min(math.max(min, value), max)
+end
+
+function LAMCreateControl.divider(parent, dividerData, controlName)
+    local control = LAM.util.CreateBaseControl(parent, dividerData, controlName)
+    local isHalfWidth = control.isHalfWidth
+    local width = control:GetWidth()
+    local height = GetValueInRange(dividerData.height, MIN_HEIGHT, MAX_HEIGHT, MIN_HEIGHT)
+    local alpha = GetValueInRange(dividerData.alpha, MIN_ALPHA, MAX_ALPHA, DEFAULT_ALPHA)
+
+    control:SetDimensions(isHalfWidth and width / 2 or width, height)
+
+    control.divider = wm:CreateControlFromVirtual(nil, control, "ZO_Options_Divider")
+    local divider = control.divider
+    divider:SetWidth(isHalfWidth and width / 2 or width)
+    divider:SetAnchor(TOPLEFT)
+    divider:SetAlpha(alpha)
+
+    return control
+end
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/dropdown.lua b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/dropdown.lua
new file mode 100644
index 0000000..f8ea731
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/dropdown.lua
@@ -0,0 +1,349 @@
+--[[dropdownData = {
+    type = "dropdown",
+    name = "My Dropdown", -- or string id or function returning a string
+    choices = {"table", "of", "choices"},
+    choicesValues = {"foo", 2, "three"}, -- if specified, these values will get passed to setFunc instead (optional)
+    getFunc = function() return db.var end,
+    setFunc = function(var) db.var = var doStuff() end,
+    tooltip = "Dropdown's tooltip text.", -- or string id or function returning a string (optional)
+    choicesTooltips = {"tooltip 1", "tooltip 2", "tooltip 3"}, -- or array of string ids or array of functions returning a string (optional)
+    sort = "name-up", --or "name-down", "numeric-up", "numeric-down", "value-up", "value-down", "numericvalue-up", "numericvalue-down" (optional) - if not provided, list will not be sorted
+    width = "full", --or "half" (optional)
+    scrollable = true, -- boolean or number, if set the dropdown will feature a scroll bar if there are a large amount of choices and limit the visible lines to the specified number or 10 if true is used (optional)
+    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
+    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
+    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
+    default = defaults.var, -- default value or function that returns the default value (optional)
+    reference = "MyAddonDropdown" -- unique global reference to control (optional)
+} ]]
+
+
+local widgetVersion = 17
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("dropdown", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local SORT_BY_VALUE         = { ["value"] = {} }
+local SORT_BY_VALUE_NUMERIC = { ["value"] = { isNumeric = true } }
+local SORT_TYPES = {
+    name = ZO_SORT_BY_NAME,
+    numeric = ZO_SORT_BY_NAME_NUMERIC,
+    value = SORT_BY_VALUE,
+    numericvalue = SORT_BY_VALUE_NUMERIC,
+}
+local SORT_ORDERS = {
+    up = ZO_SORT_ORDER_UP,
+    down = ZO_SORT_ORDER_DOWN,
+}
+
+local function UpdateDisabled(control)
+    local disable
+    if type(control.data.disabled) == "function" then
+        disable = control.data.disabled()
+    else
+        disable = control.data.disabled
+    end
+
+    control.dropdown:SetEnabled(not disable)
+    if disable then
+        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+    else
+        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+    end
+end
+
+local function UpdateValue(control, forceDefault, value)
+    if forceDefault then --if we are forcing defaults
+        value = LAM.util.GetDefaultValue(control.data.default)
+        control.data.setFunc(value)
+        control.dropdown:SetSelectedItem(control.choices[value])
+    elseif value then
+        control.data.setFunc(value)
+        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+        LAM.util.RequestRefreshIfNeeded(control)
+    else
+        value = control.data.getFunc()
+        control.dropdown:SetSelectedItem(control.choices[value])
+    end
+end
+
+local function DropdownCallback(control, choiceText, choice)
+    choice.control:UpdateValue(false, choice.value or choiceText)
+end
+
+local function SetupTooltips(comboBox, choicesTooltips)
+    local function ShowTooltip(control)
+        InitializeTooltip(InformationTooltip, control, TOPLEFT, 0, 0, BOTTOMRIGHT)
+        SetTooltipText(InformationTooltip, LAM.util.GetStringFromValue(control.tooltip))
+        InformationTooltipTopLevel:BringWindowToTop()
+    end
+    local function HideTooltip(control)
+        ClearTooltip(InformationTooltip)
+    end
+
+    -- allow for tooltips on the drop down entries
+    local originalShow = comboBox.ShowDropdownInternal
+    comboBox.ShowDropdownInternal = function(comboBox)
+        originalShow(comboBox)
+        local entries = ZO_Menu.items
+        for i = 1, #entries do
+            local entry = entries[i]
+            local control = entries[i].item
+            control.tooltip = choicesTooltips[i]
+            entry.onMouseEnter = control:GetHandler("OnMouseEnter")
+            entry.onMouseExit = control:GetHandler("OnMouseExit")
+            ZO_PreHookHandler(control, "OnMouseEnter", ShowTooltip)
+            ZO_PreHookHandler(control, "OnMouseExit", HideTooltip)
+        end
+    end
+
+    local originalHide = comboBox.HideDropdownInternal
+    comboBox.HideDropdownInternal = function(self)
+        local entries = ZO_Menu.items
+        for i = 1, #entries do
+            local entry = entries[i]
+            local control = entries[i].item
+            control:SetHandler("OnMouseEnter", entry.onMouseEnter)
+            control:SetHandler("OnMouseExit", entry.onMouseExit)
+            control.tooltip = nil
+        end
+        originalHide(self)
+    end
+end
+
+local function UpdateChoices(control, choices, choicesValues, choicesTooltips)
+    control.dropdown:ClearItems() --remove previous choices --(need to call :SetSelectedItem()?)
+    ZO_ClearTable(control.choices)
+
+    --build new list of choices
+    local choices = choices or control.data.choices
+    local choicesValues = choicesValues or control.data.choicesValues
+    local choicesTooltips = choicesTooltips or control.data.choicesTooltips
+
+    if choicesValues then
+        assert(#choices == #choicesValues, "choices and choicesValues need to have the same size")
+    end
+
+    if choicesTooltips then
+        assert(#choices == #choicesTooltips, "choices and choicesTooltips need to have the same size")
+        SetupTooltips(control.dropdown, choicesTooltips)
+    end
+
+    for i = 1, #choices do
+        local entry = control.dropdown:CreateItemEntry(choices[i], DropdownCallback)
+        entry.control = control
+        if choicesValues then
+            entry.value = choicesValues[i]
+        end
+        control.choices[entry.value or entry.name] = entry.name
+        control.dropdown:AddItem(entry, not control.data.sort and ZO_COMBOBOX_SUPRESS_UPDATE) --if sort type/order isn't specified, then don't sort
+    end
+end
+
+local function GrabSortingInfo(sortInfo)
+    local t, i = {}, 1
+    for info in string.gmatch(sortInfo, "([^%-]+)") do
+        t[i] = info
+        i = i + 1
+    end
+
+    return t
+end
+
+local DEFAULT_VISIBLE_ROWS = 10
+local SCROLLABLE_ENTRY_TEMPLATE_HEIGHT = 25 -- same as in zo_combobox.lua
+local CONTENT_PADDING = 24
+local SCROLLBAR_PADDING = 16
+local PADDING = GetMenuPadding() / 2 -- half the amount looks closer to the regular dropdown
+local ScrollableDropdownHelper = ZO_Object:Subclass()
+
+function ScrollableDropdownHelper:New(...)
+    local object = ZO_Object.New(self)
+    object:Initialize(...)
+    return object
+end
+
+function ScrollableDropdownHelper:Initialize(parent, control, visibleRows)
+    local combobox = control.combobox
+    local dropdown = control.dropdown
+    self.parent = parent
+    self.control = control
+    self.combobox = combobox
+    self.dropdown = dropdown
+    self.visibleRows = visibleRows
+
+    -- clear anchors so we can adjust the width dynamically
+    dropdown.m_dropdown:ClearAnchors()
+    dropdown.m_dropdown:SetAnchor(TOPLEFT, combobox, BOTTOMLEFT)
+
+    -- handle dropdown or settingsmenu opening/closing
+    local function onShow() self:OnShow() end
+    local function onHide() self:OnHide() end
+    local function doHide() self:DoHide() end
+
+    ZO_PreHook(dropdown, "ShowDropdownOnMouseUp", onShow)
+    ZO_PreHook(dropdown, "HideDropdownInternal", onHide)
+    combobox:SetHandler("OnEffectivelyHidden", onHide)
+    parent:SetHandler("OnEffectivelyHidden", doHide)
+
+    -- dont fade entries near the edges
+    local scrollList = dropdown.m_scroll
+    scrollList.selectionTemplate = nil
+    scrollList.highlightTemplate = nil
+    ZO_ScrollList_EnableSelection(scrollList, "ZO_SelectionHighlight")
+    ZO_ScrollList_EnableHighlight(scrollList, "ZO_SelectionHighlight")
+    ZO_Scroll_SetUseFadeGradient(scrollList, false)
+
+    -- adjust scroll content anchor to mimic menu padding
+    local scroll = dropdown.m_dropdown:GetNamedChild("Scroll")
+    local anchor1 = {scroll:GetAnchor(0)}
+    local anchor2 = {scroll:GetAnchor(1)}
+    scroll:ClearAnchors()
+    scroll:SetAnchor(anchor1[2], anchor1[3], anchor1[4], anchor1[5] + PADDING, anchor1[6] + PADDING)
+    scroll:SetAnchor(anchor2[2], anchor2[3], anchor2[4], anchor2[5] - PADDING, anchor2[6] - PADDING)
+    ZO_ScrollList_Commit(scrollList)
+
+    -- adjust row setup to mimic the highlight padding
+    local dataType1 = ZO_ScrollList_GetDataTypeTable(dropdown.m_scroll, 1)
+    local dataType2 = ZO_ScrollList_GetDataTypeTable(dropdown.m_scroll, 2)
+    local oSetup = dataType1.setupCallback -- both types have the same setup function
+    local function SetupEntry(control, data, list)
+        oSetup(control, data, list)
+        control.m_label:SetAnchor(LEFT, nil, nil, 2)
+    end
+    dataType1.setupCallback = SetupEntry
+    dataType2.setupCallback = SetupEntry
+
+    -- adjust dimensions based on entries
+    local scrollContent = scroll:GetNamedChild("Contents")
+    ZO_PreHook(dropdown, "AddMenuItems", function()
+        local width = PADDING * 2 + zo_max(self:GetMaxWidth(), combobox:GetWidth())
+        local numItems = #dropdown.m_sortedItems
+        local anchorOffset = 0
+        if(numItems > self.visibleRows) then
+            width = width + CONTENT_PADDING + SCROLLBAR_PADDING
+            anchorOffset = -SCROLLBAR_PADDING
+            numItems = self.visibleRows
+        end
+        scrollContent:SetAnchor(BOTTOMRIGHT, nil, nil, anchorOffset)
+        local height = PADDING * 2 + numItems * (SCROLLABLE_ENTRY_TEMPLATE_HEIGHT + dropdown.m_spacing) - dropdown.m_spacing
+        dropdown.m_dropdown:SetWidth(width)
+        dropdown.m_dropdown:SetHeight(height)
+    end)
+end
+
+function ScrollableDropdownHelper:OnShow()
+    local dropdown = self.dropdown
+    if dropdown.m_lastParent ~= ZO_Menus then
+        dropdown.m_lastParent = dropdown.m_dropdown:GetParent()
+        dropdown.m_dropdown:SetParent(ZO_Menus)
+        ZO_Menus:BringWindowToTop()
+    end
+end
+
+function ScrollableDropdownHelper:OnHide()
+    local dropdown = self.dropdown
+    if dropdown.m_lastParent then
+        dropdown.m_dropdown:SetParent(dropdown.m_lastParent)
+        dropdown.m_lastParent = nil
+    end
+end
+
+function ScrollableDropdownHelper:DoHide()
+    local dropdown = self.dropdown
+    if dropdown:IsDropdownVisible() then
+        dropdown:HideDropdown()
+    end
+end
+
+function ScrollableDropdownHelper:GetMaxWidth()
+    local dropdown = self.dropdown
+    local dataType = ZO_ScrollList_GetDataTypeTable(dropdown.m_scroll, 1)
+
+    local dummy = dataType.pool:AcquireObject()
+    dataType.setupCallback(dummy, {
+        m_owner = dropdown,
+        name = "Dummy"
+    }, dropdown)
+
+    local maxWidth = 0
+    local label = dummy.m_label
+    local entries = dropdown.m_sortedItems
+    local numItems = #entries
+    for index = 1, numItems do
+        label:SetText(entries[index].name)
+        local width = label:GetTextWidth()
+        if (width > maxWidth) then
+            maxWidth = width
+        end
+    end
+
+    dataType.pool:ReleaseObject(dummy.key)
+    return maxWidth
+end
+
+function LAMCreateControl.dropdown(parent, dropdownData, controlName)
+    local control = LAM.util.CreateLabelAndContainerControl(parent, dropdownData, controlName)
+    control.choices = {}
+
+    local countControl = parent
+    local name = parent:GetName()
+    if not name or #name == 0 then
+        countControl = LAMCreateControl
+        name = "LAM"
+    end
+    local comboboxCount = (countControl.comboboxCount or 0) + 1
+    countControl.comboboxCount = comboboxCount
+    control.combobox = wm:CreateControlFromVirtual(zo_strjoin(nil, name, "Combobox", comboboxCount), control.container, dropdownData.scrollable and "ZO_ScrollableComboBox" or "ZO_ComboBox")
+
+    local combobox = control.combobox
+    combobox:SetAnchor(TOPLEFT)
+    combobox:SetDimensions(control.container:GetDimensions())
+    combobox:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
+    combobox:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
+    control.dropdown = ZO_ComboBox_ObjectFromContainer(combobox)
+    local dropdown = control.dropdown
+    dropdown:SetSortsItems(false) -- need to sort ourselves in order to be able to sort by value
+
+    if dropdownData.scrollable then
+        local visibleRows = type(dropdownData.scrollable) == "number" and dropdownData.scrollable or DEFAULT_VISIBLE_ROWS
+        control.scrollHelper = ScrollableDropdownHelper:New(parent, control, visibleRows)
+    end
+
+    ZO_PreHook(dropdown, "UpdateItems", function(self)
+        assert(not self.m_sortsItems, "built-in dropdown sorting was reactivated, sorting is handled by LAM")
+        if control.m_sortOrder ~= nil and control.m_sortType then
+            local sortKey = next(control.m_sortType)
+            local sortFunc = function(item1, item2) return ZO_TableOrderingFunction(item1, item2, sortKey, control.m_sortType, control.m_sortOrder) end
+            table.sort(self.m_sortedItems, sortFunc)
+        end
+    end)
+
+    if dropdownData.sort then
+        local sortInfo = GrabSortingInfo(dropdownData.sort)
+        control.m_sortType, control.m_sortOrder = SORT_TYPES[sortInfo[1]], SORT_ORDERS[sortInfo[2]]
+    elseif dropdownData.choicesValues then
+        control.m_sortType, control.m_sortOrder = ZO_SORT_ORDER_UP, SORT_BY_VALUE
+    end
+
+    if dropdownData.warning ~= nil or dropdownData.requiresReload then
+        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+        control.warning:SetAnchor(RIGHT, combobox, LEFT, -5, 0)
+        control.UpdateWarning = LAM.util.UpdateWarning
+        control:UpdateWarning()
+    end
+
+    control.UpdateChoices = UpdateChoices
+    control:UpdateChoices(dropdownData.choices, dropdownData.choicesValues)
+    control.UpdateValue = UpdateValue
+    control:UpdateValue()
+    if dropdownData.disabled ~= nil then
+        control.UpdateDisabled = UpdateDisabled
+        control:UpdateDisabled()
+    end
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+    LAM.util.RegisterForReloadIfNeeded(control)
+
+    return control
+end
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/editbox.lua b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/editbox.lua
new file mode 100644
index 0000000..d6baf11
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/editbox.lua
@@ -0,0 +1,156 @@
+--[[editboxData = {
+    type = "editbox",
+    name = "My Editbox", -- or string id or function returning a string
+    getFunc = function() return db.text end,
+    setFunc = function(text) db.text = text doStuff() end,
+    tooltip = "Editbox's tooltip text.", -- or string id or function returning a string (optional)
+    isMultiline = true, --boolean (optional)
+    isExtraWide = true, --boolean (optional)
+    width = "full", --or "half" (optional)
+    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
+    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
+    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
+    default = defaults.text, -- default value or function that returns the default value (optional)
+    reference = "MyAddonEditbox" -- unique global reference to control (optional)
+} ]]
+
+
+local widgetVersion = 14
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("editbox", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local function UpdateDisabled(control)
+    local disable
+    if type(control.data.disabled) == "function" then
+        disable = control.data.disabled()
+    else
+        disable = control.data.disabled
+    end
+
+    if disable then
+        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+        control.editbox:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
+    else
+        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+        control.editbox:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+    end
+    --control.editbox:SetEditEnabled(not disable)
+    control.editbox:SetMouseEnabled(not disable)
+end
+
+local function UpdateValue(control, forceDefault, value)
+    if forceDefault then --if we are forcing defaults
+        value = LAM.util.GetDefaultValue(control.data.default)
+        control.data.setFunc(value)
+        control.editbox:SetText(value)
+    elseif value then
+        control.data.setFunc(value)
+        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+        LAM.util.RequestRefreshIfNeeded(control)
+    else
+        value = control.data.getFunc()
+        control.editbox:SetText(value)
+    end
+end
+
+local MIN_HEIGHT = 24
+local HALF_WIDTH_LINE_SPACING = 2
+function LAMCreateControl.editbox(parent, editboxData, controlName)
+    local control = LAM.util.CreateLabelAndContainerControl(parent, editboxData, controlName)
+
+    local container = control.container
+    control.bg = wm:CreateControlFromVirtual(nil, container, "ZO_EditBackdrop")
+    local bg = control.bg
+    bg:SetAnchorFill()
+
+    if editboxData.isMultiline then
+        control.editbox = wm:CreateControlFromVirtual(nil, bg, "ZO_DefaultEditMultiLineForBackdrop")
+        control.editbox:SetHandler("OnMouseWheel", function(self, delta)
+            if self:HasFocus() then --only set focus to new spots if the editbox is currently in use
+                local cursorPos = self:GetCursorPosition()
+                local text = self:GetText()
+                local textLen = text:len()
+                local newPos
+                if delta > 0 then --scrolling up
+                    local reverseText = text:reverse()
+                    local revCursorPos = textLen - cursorPos
+                    local revPos = reverseText:find("\n", revCursorPos+1)
+                    newPos = revPos and textLen - revPos
+                else --scrolling down
+                    newPos = text:find("\n", cursorPos+1)
+                end
+                if newPos then --if we found a new line, then scroll, otherwise don't
+                    self:SetCursorPosition(newPos)
+                end
+            end
+        end)
+    else
+        control.editbox = wm:CreateControlFromVirtual(nil, bg, "ZO_DefaultEditForBackdrop")
+    end
+    local editbox = control.editbox
+    editbox:SetText(editboxData.getFunc())
+    editbox:SetMaxInputChars(3000)
+    editbox:SetHandler("OnFocusLost", function(self) control:UpdateValue(false, self:GetText()) end)
+    editbox:SetHandler("OnEscape", function(self) self:LoseFocus() control:UpdateValue(false, self:GetText()) end)
+    editbox:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
+    editbox:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
+
+    local MIN_WIDTH = (parent.GetWidth and (parent:GetWidth() / 10)) or (parent.panel.GetWidth and (parent.panel:GetWidth() / 10)) or 0
+
+    control.label:ClearAnchors()
+    container:ClearAnchors()
+
+    control.label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 0)
+    container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, 0, 0)
+
+    if control.isHalfWidth then
+        container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, 0, 0)
+    end
+
+    if editboxData.isExtraWide then
+        container:SetAnchor(BOTTOMLEFT, control, BOTTOMLEFT, 0, 0)
+    else
+        container:SetWidth(MIN_WIDTH * 3.2)
+    end
+
+    if editboxData.isMultiline then
+        container:SetHeight(MIN_HEIGHT * 3)
+    else
+        container:SetHeight(MIN_HEIGHT)
+    end
+
+    if control.isHalfWidth ~= true and editboxData.isExtraWide ~= true then
+        control:SetHeight(container:GetHeight())
+    else
+        control:SetHeight(container:GetHeight() + control.label:GetHeight())
+    end
+
+    editbox:ClearAnchors()
+    editbox:SetAnchor(TOPLEFT, container, TOPLEFT, 2, 2)
+    editbox:SetAnchor(BOTTOMRIGHT, container, BOTTOMRIGHT, -2, -2)
+
+    if editboxData.warning ~= nil or editboxData.requiresReload then
+        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+        if editboxData.isExtraWide then
+            control.warning:SetAnchor(BOTTOMRIGHT, control.bg, TOPRIGHT, 2, 0)
+        else
+            control.warning:SetAnchor(TOPRIGHT, control.bg, TOPLEFT, -5, 0)
+        end
+        control.UpdateWarning = LAM.util.UpdateWarning
+        control:UpdateWarning()
+    end
+
+    control.UpdateValue = UpdateValue
+    control:UpdateValue()
+    if editboxData.disabled ~= nil then
+        control.UpdateDisabled = UpdateDisabled
+        control:UpdateDisabled()
+    end
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+    LAM.util.RegisterForReloadIfNeeded(control)
+
+    return control
+end
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/header.lua b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/header.lua
new file mode 100644
index 0000000..eadff38
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/header.lua
@@ -0,0 +1,42 @@
+--[[headerData = {
+    type = "header",
+    name = "My Header", -- or string id or function returning a string
+    width = "full", --or "half" (optional)
+    reference = "MyAddonHeader" -- unique global reference to control (optional)
+} ]]
+
+
+local widgetVersion = 8
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("header", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local function UpdateValue(control)
+    control.header:SetText(LAM.util.GetStringFromValue(control.data.name))
+end
+
+local MIN_HEIGHT = 30
+function LAMCreateControl.header(parent, headerData, controlName)
+    local control = LAM.util.CreateBaseControl(parent, headerData, controlName)
+    local isHalfWidth = control.isHalfWidth
+    local width = control:GetWidth()
+    control:SetDimensions(isHalfWidth and width / 2 or width, MIN_HEIGHT)
+
+    control.divider = wm:CreateControlFromVirtual(nil, control, "ZO_Options_Divider")
+    local divider = control.divider
+    divider:SetWidth(isHalfWidth and width / 2 or width)
+    divider:SetAnchor(TOPLEFT)
+
+    control.header = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
+    local header = control.header
+    header:SetAnchor(TOPLEFT, divider, BOTTOMLEFT)
+    header:SetAnchor(BOTTOMRIGHT)
+    header:SetText(LAM.util.GetStringFromValue(headerData.name))
+
+    control.UpdateValue = UpdateValue
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+
+    return control
+end
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/iconpicker.lua b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/iconpicker.lua
new file mode 100644
index 0000000..65c7782
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/iconpicker.lua
@@ -0,0 +1,436 @@
+--[[iconpickerData = {
+    type = "iconpicker",
+    name = "My Icon Picker", -- or string id or function returning a string
+    choices = {"texture path 1", "texture path 2", "texture path 3"},
+    getFunc = function() return db.var end,
+    setFunc = function(var) db.var = var doStuff() end,
+    tooltip = "Color Picker's tooltip text.", -- or string id or function returning a string (optional)
+    choicesTooltips = {"icon tooltip 1", "icon tooltip 2", "icon tooltip 3"}, -- or array of string ids or array of functions returning a string (optional)
+    maxColumns = 5, -- number of icons in one row (optional)
+    visibleRows = 4.5, -- number of visible rows (optional)
+    iconSize = 28, -- size of the icons (optional)
+    defaultColor = ZO_ColorDef:New("FFFFFF"), -- default color of the icons (optional)
+    width = "full", --or "half" (optional)
+    beforeShow = function(control, iconPicker) return preventShow end, --(optional)
+    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
+    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
+    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
+    default = defaults.var, -- default value or function that returns the default value (optional)
+    reference = "MyAddonIconPicker" -- unique global reference to control (optional)
+} ]]
+
+local widgetVersion = 8
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("iconpicker", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local IconPickerMenu = ZO_Object:Subclass()
+local iconPicker
+LAM.util.GetIconPickerMenu = function()
+    if not iconPicker then
+        iconPicker = IconPickerMenu:New("LAMIconPicker")
+        local sceneFragment = LAM:GetAddonSettingsFragment()
+        ZO_PreHook(sceneFragment, "OnHidden", function()
+            if not iconPicker.control:IsHidden() then
+                iconPicker:Clear()
+            end
+        end)
+    end
+    return iconPicker
+end
+
+function IconPickerMenu:New(...)
+    local object = ZO_Object.New(self)
+    object:Initialize(...)
+    return object
+end
+
+function IconPickerMenu:Initialize(name)
+    local control = wm:CreateTopLevelWindow(name)
+    control:SetDrawTier(DT_HIGH)
+    control:SetHidden(true)
+    self.control = control
+
+    local scrollContainer = wm:CreateControlFromVirtual(name .. "ScrollContainer", control, "ZO_ScrollContainer")
+    -- control:SetDimensions(control.container:GetWidth(), height) -- adjust to icon size / col count
+    scrollContainer:SetAnchorFill()
+    ZO_Scroll_SetUseFadeGradient(scrollContainer, false)
+    ZO_Scroll_SetHideScrollbarOnDisable(scrollContainer, false)
+    ZO_VerticalScrollbarBase_OnMouseExit(scrollContainer:GetNamedChild("ScrollBar")) -- scrollbar initialization seems to be broken so we force it to update the correct alpha value
+    local scroll = GetControl(scrollContainer, "ScrollChild")
+    self.scroll = scroll
+    self.scrollContainer = scrollContainer
+
+    local bg = wm:CreateControl(nil, scrollContainer, CT_BACKDROP)
+    bg:SetAnchor(TOPLEFT, scrollContainer, TOPLEFT, 0, -3)
+    bg:SetAnchor(BOTTOMRIGHT, scrollContainer, BOTTOMRIGHT, 2, 5)
+    bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-Border.dds", 128, 16)
+    bg:SetCenterTexture("EsoUI\\Art\\Tooltips\\UI-TooltipCenter.dds")
+    bg:SetInsets(16, 16, -16, -16)
+
+    local mungeOverlay = wm:CreateControl(nil, bg, CT_TEXTURE)
+    mungeOverlay:SetTexture("EsoUI/Art/Tooltips/munge_overlay.dds")
+    mungeOverlay:SetDrawLevel(1)
+    mungeOverlay:SetAddressMode(TEX_MODE_WRAP)
+    mungeOverlay:SetAnchorFill()
+
+    local mouseOver = wm:CreateControl(nil, scrollContainer, CT_TEXTURE)
+    mouseOver:SetDrawLevel(2)
+    mouseOver:SetTexture("EsoUI/Art/Buttons/minmax_mouseover.dds")
+    mouseOver:SetHidden(true)
+
+    local function IconFactory(pool)
+        local icon = wm:CreateControl(name .. "Entry" .. pool:GetNextControlId(), scroll, CT_TEXTURE)
+        icon:SetMouseEnabled(true)
+        icon:SetDrawLevel(3)
+        icon:SetHandler("OnMouseEnter", function()
+            mouseOver:SetAnchor(TOPLEFT, icon, TOPLEFT, 0, 0)
+            mouseOver:SetAnchor(BOTTOMRIGHT, icon, BOTTOMRIGHT, 0, 0)
+            mouseOver:SetHidden(false)
+            if self.customOnMouseEnter then
+                self.customOnMouseEnter(icon)
+            else
+                self:OnMouseEnter(icon)
+            end
+        end)
+        icon:SetHandler("OnMouseExit", function()
+            mouseOver:ClearAnchors()
+            mouseOver:SetHidden(true)
+            if self.customOnMouseExit then
+                self.customOnMouseExit(icon)
+            else
+                self:OnMouseExit(icon)
+            end
+        end)
+        icon:SetHandler("OnMouseUp", function(control, ...)
+            PlaySound("Click")
+            icon.OnSelect(icon, icon.texture)
+            self:Clear()
+        end)
+        return icon
+    end
+
+    local function ResetFunction(icon)
+        icon:ClearAnchors()
+    end
+
+    self.iconPool = ZO_ObjectPool:New(IconFactory, ResetFunction)
+    self:SetMaxColumns(1)
+    self.icons = {}
+    self.color = ZO_DEFAULT_ENABLED_COLOR
+
+    EVENT_MANAGER:RegisterForEvent(name .. "_OnGlobalMouseUp", EVENT_GLOBAL_MOUSE_UP, function()
+        if self.refCount ~= nil then
+            local moc = wm:GetMouseOverControl()
+            if(moc:GetOwningWindow() ~= control) then
+                self.refCount = self.refCount - 1
+                if self.refCount <= 0 then
+                    self:Clear()
+                end
+            end
+        end
+    end)
+end
+
+function IconPickerMenu:OnMouseEnter(icon)
+    InitializeTooltip(InformationTooltip, icon, TOPLEFT, 0, 0, BOTTOMRIGHT)
+    SetTooltipText(InformationTooltip, LAM.util.GetStringFromValue(icon.tooltip))
+    InformationTooltipTopLevel:BringWindowToTop()
+end
+
+function IconPickerMenu:OnMouseExit(icon)
+    ClearTooltip(InformationTooltip)
+end
+
+function IconPickerMenu:SetMaxColumns(value)
+    self.maxCols = value ~= nil and value or 5
+end
+
+local DEFAULT_SIZE = 28
+function IconPickerMenu:SetIconSize(value)
+    local iconSize = DEFAULT_SIZE
+    if value ~= nil then iconSize = math.max(iconSize, value) end
+    self.iconSize = iconSize
+end
+
+function IconPickerMenu:SetVisibleRows(value)
+    self.visibleRows = value ~= nil and value or 4.5
+end
+
+function IconPickerMenu:SetMouseHandlers(onEnter, onExit)
+    self.customOnMouseEnter = onEnter
+    self.customOnMouseExit = onExit
+end
+
+function IconPickerMenu:UpdateDimensions()
+    local iconSize = self.iconSize
+    local width = iconSize * self.maxCols + 20
+    local height = iconSize * self.visibleRows
+    self.control:SetDimensions(width, height)
+
+    local icons = self.icons
+    for i = 1, #icons do
+        local icon = icons[i]
+        icon:SetDimensions(iconSize, iconSize)
+    end
+end
+
+function IconPickerMenu:UpdateAnchors()
+    local iconSize = self.iconSize
+    local col, maxCols = 1, self.maxCols
+    local previousCol, previousRow
+    local scroll = self.scroll
+    local icons = self.icons
+
+    for i = 1, #icons do
+        local icon = icons[i]
+        icon:ClearAnchors()
+        if i == 1 then
+            icon:SetAnchor(TOPLEFT, scroll, TOPLEFT, 0, 0)
+            previousRow = icon
+        elseif col == 1 then
+            icon:SetAnchor(TOPLEFT, previousRow, BOTTOMLEFT, 0, 0)
+            previousRow = icon
+        else
+            icon:SetAnchor(TOPLEFT, previousCol, TOPRIGHT, 0, 0)
+        end
+        previousCol = icon
+        col = col >= maxCols and 1 or col + 1
+    end
+end
+
+function IconPickerMenu:Clear()
+    self.icons = {}
+    self.iconPool:ReleaseAllObjects()
+    self.control:SetHidden(true)
+    self.color = ZO_DEFAULT_ENABLED_COLOR
+    self.refCount = nil
+    self.parent = nil
+    self.customOnMouseEnter = nil
+    self.customOnMouseExit = nil
+end
+
+function IconPickerMenu:AddIcon(texturePath, callback, tooltip)
+    local icon, key = self.iconPool:AcquireObject()
+    icon:SetTexture(texturePath)
+    icon:SetColor(self.color:UnpackRGBA())
+    icon.texture = texturePath
+    icon.tooltip = tooltip
+    icon.OnSelect = callback
+    self.icons[#self.icons + 1] = icon
+end
+
+function IconPickerMenu:Show(parent)
+    if #self.icons == 0 then return false end
+    if not self.control:IsHidden() then self:Clear() return false end
+    self:UpdateDimensions()
+    self:UpdateAnchors()
+
+    local control = self.control
+    control:ClearAnchors()
+    control:SetAnchor(TOPLEFT, parent, BOTTOMLEFT, 0, 8)
+    control:SetHidden(false)
+    control:BringWindowToTop()
+    self.parent = parent
+    self.refCount = 2
+
+    return true
+end
+
+function IconPickerMenu:SetColor(color)
+    local icons = self.icons
+    self.color = color
+    for i = 1, #icons do
+        local icon = icons[i]
+        icon:SetColor(color:UnpackRGBA())
+    end
+end
+
+-------------------------------------------------------------
+
+local function UpdateChoices(control, choices, choicesTooltips)
+    local data = control.data
+    if not choices then
+        choices, choicesTooltips = data.choices, data.choicesTooltips or {}
+    end
+    local addedChoices = {}
+
+    local iconPicker = LAM.util.GetIconPickerMenu()
+    iconPicker:Clear()
+    for i = 1, #choices do
+        local texture = choices[i]
+        if not addedChoices[texture] then -- remove duplicates
+            iconPicker:AddIcon(choices[i], function(self, texture)
+                control.icon:SetTexture(texture)
+                data.setFunc(texture)
+                LAM.util.RequestRefreshIfNeeded(control)
+            end, LAM.util.GetStringFromValue(choicesTooltips[i]))
+        addedChoices[texture] = true
+        end
+    end
+end
+
+local function IsDisabled(control)
+    if type(control.data.disabled) == "function" then
+        return control.data.disabled()
+    else
+        return control.data.disabled
+    end
+end
+
+local function SetColor(control, color)
+    local icon = control.icon
+    if IsDisabled(control) then
+        icon:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+    else
+        icon.color = color or control.data.defaultColor or ZO_DEFAULT_ENABLED_COLOR
+        icon:SetColor(icon.color:UnpackRGBA())
+    end
+
+    local iconPicker = LAM.util.GetIconPickerMenu()
+    if iconPicker.parent == control.container and not iconPicker.control:IsHidden() then
+        iconPicker:SetColor(icon.color)
+    end
+end
+
+local function UpdateDisabled(control)
+    local disable = IsDisabled(control)
+
+    control.dropdown:SetMouseEnabled(not disable)
+    control.dropdownButton:SetEnabled(not disable)
+
+    local iconPicker = LAM.util.GetIconPickerMenu()
+    if iconPicker.parent == control.container and not iconPicker.control:IsHidden() then
+        iconPicker:Clear()
+    end
+
+    SetColor(control, control.icon.color)
+    if disable then
+        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+    else
+        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+    end
+end
+
+local function UpdateValue(control, forceDefault, value)
+    if forceDefault then --if we are forcing defaults
+        value = LAM.util.GetDefaultValue(control.data.default)
+        control.data.setFunc(value)
+        control.icon:SetTexture(value)
+    elseif value then
+        control.data.setFunc(value)
+        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+        LAM.util.RequestRefreshIfNeeded(control)
+    else
+        value = control.data.getFunc()
+        control.icon:SetTexture(value)
+    end
+end
+
+local MIN_HEIGHT = 26
+local HALF_WIDTH_LINE_SPACING = 2
+local function SetIconSize(control, size)
+    local icon = control.icon
+    icon.size = size
+    icon:SetDimensions(size, size)
+
+    local height = size + 4
+    control.dropdown:SetDimensions(size + 20, height)
+    height = math.max(height, MIN_HEIGHT)
+    control.container:SetHeight(height)
+    if control.lineControl then
+        control.lineControl:SetHeight(MIN_HEIGHT + size + HALF_WIDTH_LINE_SPACING)
+    else
+        control:SetHeight(height)
+    end
+
+    local iconPicker = LAM.util.GetIconPickerMenu()
+    if iconPicker.parent == control.container and not iconPicker.control:IsHidden() then
+        iconPicker:SetIconSize(size)
+        iconPicker:UpdateDimensions()
+        iconPicker:UpdateAnchors()
+    end
+end
+
+function LAMCreateControl.iconpicker(parent, iconpickerData, controlName)
+    local control = LAM.util.CreateLabelAndContainerControl(parent, iconpickerData, controlName)
+
+    local function ShowIconPicker()
+        local iconPicker = LAM.util.GetIconPickerMenu()
+        if iconPicker.parent == control.container then
+            iconPicker:Clear()
+        else
+            iconPicker:SetMaxColumns(iconpickerData.maxColumns)
+            iconPicker:SetVisibleRows(iconpickerData.visibleRows)
+            iconPicker:SetIconSize(control.icon.size)
+            UpdateChoices(control)
+            iconPicker:SetColor(control.icon.color)
+            if iconpickerData.beforeShow then
+                if iconpickerData.beforeShow(control, iconPicker) then
+                    iconPicker:Clear()
+                    return
+                end
+            end
+            iconPicker:Show(control.container)
+        end
+    end
+
+    local iconSize = iconpickerData.iconSize ~= nil and iconpickerData.iconSize or DEFAULT_SIZE
+    control.dropdown = wm:CreateControl(nil, control.container, CT_CONTROL)
+    local dropdown = control.dropdown
+    dropdown:SetAnchor(LEFT, control.container, LEFT, 0, 0)
+    dropdown:SetMouseEnabled(true)
+    dropdown:SetHandler("OnMouseUp", ShowIconPicker)
+    dropdown:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
+    dropdown:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
+
+    control.icon = wm:CreateControl(nil, dropdown, CT_TEXTURE)
+    local icon = control.icon
+    icon:SetAnchor(LEFT, dropdown, LEFT, 3, 0)
+    icon:SetDrawLevel(2)
+
+    local dropdownButton = wm:CreateControlFromVirtual(nil, dropdown, "ZO_DropdownButton")
+    dropdownButton:SetDimensions(16, 16)
+    dropdownButton:SetHandler("OnClicked", ShowIconPicker)
+    dropdownButton:SetAnchor(RIGHT, dropdown, RIGHT, -3, 0)
+    control.dropdownButton = dropdownButton
+
+    control.bg = wm:CreateControl(nil, dropdown, CT_BACKDROP)
+    local bg = control.bg
+    bg:SetAnchor(TOPLEFT, dropdown, TOPLEFT, 0, -3)
+    bg:SetAnchor(BOTTOMRIGHT, dropdown, BOTTOMRIGHT, 2, 5)
+    bg:SetEdgeTexture("EsoUI/Art/Tooltips/UI-Border.dds", 128, 16)
+    bg:SetCenterTexture("EsoUI/Art/Tooltips/UI-TooltipCenter.dds")
+    bg:SetInsets(16, 16, -16, -16)
+    local mungeOverlay = wm:CreateControl(nil, bg, CT_TEXTURE)
+    mungeOverlay:SetTexture("EsoUI/Art/Tooltips/munge_overlay.dds")
+    mungeOverlay:SetDrawLevel(1)
+    mungeOverlay:SetAddressMode(TEX_MODE_WRAP)
+    mungeOverlay:SetAnchorFill()
+
+    if iconpickerData.warning ~= nil or iconpickerData.requiresReload then
+        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+        control.warning:SetAnchor(RIGHT, control.container, LEFT, -5, 0)
+        control.UpdateWarning = LAM.util.UpdateWarning
+        control:UpdateWarning()
+    end
+
+    control.UpdateChoices = UpdateChoices
+    control.UpdateValue = UpdateValue
+    control:UpdateValue()
+    control.SetColor = SetColor
+    control:SetColor()
+    control.SetIconSize = SetIconSize
+    control:SetIconSize(iconSize)
+
+    if iconpickerData.disabled ~= nil then
+        control.UpdateDisabled = UpdateDisabled
+        control:UpdateDisabled()
+    end
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+    LAM.util.RegisterForReloadIfNeeded(control)
+
+    return control
+end
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/panel.lua b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/panel.lua
new file mode 100644
index 0000000..1404686
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/panel.lua
@@ -0,0 +1,126 @@
+--[[panelData = {
+    type = "panel",
+    name = "Window Title", -- or string id or function returning a string
+    displayName = "My Longer Window Title",  -- or string id or function returning a string (optional) (can be useful for long addon names or if you want to colorize it)
+    author = "Seerah",  -- or string id or function returning a string (optional)
+    version = "2.0",  -- or string id or function returning a string (optional)
+    website = "http://www.esoui.com/downloads/info7-LibAddonMenu.html", -- URL of website where the addon can be updated (optional)
+    keywords = "settings", -- additional keywords for search filter (it looks for matches in name..keywords..author) (optional)
+    slashCommand = "/myaddon", -- will register a keybind to open to this panel (don't forget to include the slash!) (optional)
+    registerForRefresh = true, --boolean (optional) (will refresh all options controls when a setting is changed and when the panel is shown)
+    registerForDefaults = true, --boolean (optional) (will set all options controls back to default values)
+    resetFunc = function() print("defaults reset") end, --(optional) custom function to run after settings are reset to defaults
+} ]]
+
+
+local widgetVersion = 13
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("panel", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local cm = CALLBACK_MANAGER
+
+local function RefreshPanel(control)
+    local panel = LAM.util.GetTopPanel(control) --callback can be fired by a single control, by the panel showing or by a nested submenu
+    local panelControls = panel.controlsToRefresh
+
+    for i = 1, #panelControls do
+        local updateControl = panelControls[i]
+        if updateControl ~= control and updateControl.UpdateValue then
+            updateControl:UpdateValue()
+        end
+        if updateControl.UpdateDisabled then
+            updateControl:UpdateDisabled()
+        end
+        if updateControl.UpdateWarning then
+            updateControl:UpdateWarning()
+        end
+    end
+end
+
+local function ForceDefaults(panel)
+    local panelControls = panel.controlsToRefresh
+
+    for i = 1, #panelControls do
+        local updateControl = panelControls[i]
+        if updateControl.UpdateValue and updateControl.data.default ~= nil then
+            updateControl:UpdateValue(true)
+        end
+    end
+
+    if panel.data.resetFunc then
+        panel.data.resetFunc()
+    end
+
+    cm:FireCallbacks("LAM-RefreshPanel", panel)
+end
+
+local callbackRegistered = false
+LAMCreateControl.scrollCount = LAMCreateControl.scrollCount or 1
+local SEPARATOR = " - "
+local LINK_COLOR = ZO_ColorDef:New("5959D5")
+local LINK_MOUSE_OVER_COLOR = ZO_ColorDef:New("B8B8D3")
+
+function LAMCreateControl.panel(parent, panelData, controlName)
+    local control = wm:CreateControl(controlName, parent, CT_CONTROL)
+
+    control.label = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
+    local label = control.label
+    label:SetAnchor(TOPLEFT, control, TOPLEFT, 0, 4)
+    label:SetText(LAM.util.GetStringFromValue(panelData.displayName or panelData.name))
+
+    if panelData.author or panelData.version then
+        control.info = wm:CreateControl(nil, control, CT_LABEL)
+        local info = control.info
+        info:SetFont(LAM.util.L["PANEL_INFO_FONT"])
+        info:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, -2)
+
+        local output = {}
+        if panelData.author then
+            output[#output + 1] = zo_strformat(LAM.util.L["AUTHOR"], LAM.util.GetStringFromValue(panelData.author))
+        end
+        if panelData.version then
+            output[#output + 1] = zo_strformat(LAM.util.L["VERSION"], LAM.util.GetStringFromValue(panelData.version))
+        end
+        info:SetText(table.concat(output, SEPARATOR))
+    end
+
+    if panelData.website then
+        control.website = wm:CreateControl(nil, control, CT_BUTTON)
+        local website = control.website
+        website:SetClickSound("Click")
+        website:SetFont(LAM.util.L["PANEL_INFO_FONT"])
+        website:SetNormalFontColor(LINK_COLOR:UnpackRGBA())
+        website:SetMouseOverFontColor(LINK_MOUSE_OVER_COLOR:UnpackRGBA())
+        if(control.info) then
+            website:SetAnchor(TOPLEFT, control.info, TOPRIGHT, 0, 0)
+            website:SetText(string.format("|cffffff%s|r%s", SEPARATOR, LAM.util.L["WEBSITE"]))
+        else
+            website:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, -2)
+            website:SetText(LAM.util.L["WEBSITE"])
+        end
+        website:SetDimensions(website:GetLabelControl():GetTextDimensions())
+        website:SetHandler("OnClicked", function()
+            RequestOpenUnsafeURL(panelData.website)
+        end)
+    end
+
+    control.container = wm:CreateControlFromVirtual("LAMAddonPanelContainer"..LAMCreateControl.scrollCount, control, "ZO_ScrollContainer")
+    LAMCreateControl.scrollCount = LAMCreateControl.scrollCount + 1
+    local container = control.container
+    container:SetAnchor(TOPLEFT, control.info or label, BOTTOMLEFT, 0, 20)
+    container:SetAnchor(BOTTOMRIGHT, control, BOTTOMRIGHT, -3, -3)
+    control.scroll = GetControl(control.container, "ScrollChild")
+    control.scroll:SetResizeToFitPadding(0, 20)
+
+    if panelData.registerForRefresh and not callbackRegistered then --don't want to register our callback more than once
+        cm:RegisterCallback("LAM-RefreshPanel", RefreshPanel)
+        callbackRegistered = true
+    end
+
+    control.ForceDefaults = ForceDefaults
+    control.data = panelData
+    control.controlsToRefresh = {}
+
+    return control
+end
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/slider.lua b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/slider.lua
new file mode 100644
index 0000000..bd721c5
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/slider.lua
@@ -0,0 +1,212 @@
+--[[sliderData = {
+    type = "slider",
+    name = "My Slider", -- or string id or function returning a string
+    getFunc = function() return db.var end,
+    setFunc = function(value) db.var = value doStuff() end,
+    min = 0,
+    max = 20,
+    step = 1, --(optional)
+    clampInput = true, -- boolean, if set to false the input won't clamp to min and max and allow any number instead (optional)
+    decimals = 0, -- when specified the input value is rounded to the specified number of decimals (optional)
+    autoSelect = false, -- boolean, automatically select everything in the text input field when it gains focus (optional)
+    inputLocation = "below", -- or "right", determines where the input field is shown. This should not be used within the addon menu and is for custom sliders (optional)
+    tooltip = "Slider's tooltip text.", -- or string id or function returning a string (optional)
+    width = "full", --or "half" (optional)
+    disabled = function() return db.someBooleanSetting end, --or boolean (optional)
+    warning = "May cause permanent awesomeness.", -- or string id or function returning a string (optional)
+    requiresReload = false, -- boolean, if set to true, the warning text will contain a notice that changes are only applied after an UI reload and any change to the value will make the "Apply Settings" button appear on the panel which will reload the UI when pressed (optional)
+    default = defaults.var, -- default value or function that returns the default value (optional)
+    reference = "MyAddonSlider" -- unique global reference to control (optional)
+} ]]
+
+local widgetVersion = 12
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("slider", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local strformat = string.format
+
+local function RoundDecimalToPlace(d, place)
+    return tonumber(strformat("%." .. tostring(place) .. "f", d))
+end
+
+local function UpdateDisabled(control)
+    local disable
+    if type(control.data.disabled) == "function" then
+        disable = control.data.disabled()
+    else
+        disable = control.data.disabled
+    end
+
+    control.slider:SetEnabled(not disable)
+    control.slidervalue:SetEditEnabled(not disable)
+    if disable then
+        control.label:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+        control.minText:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+        control.maxText:SetColor(ZO_DEFAULT_DISABLED_COLOR:UnpackRGBA())
+        control.slidervalue:SetColor(ZO_DEFAULT_DISABLED_MOUSEOVER_COLOR:UnpackRGBA())
+    else
+        control.label:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+        control.minText:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+        control.maxText:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+        control.slidervalue:SetColor(ZO_DEFAULT_ENABLED_COLOR:UnpackRGBA())
+    end
+end
+
+local function UpdateValue(control, forceDefault, value)
+    if forceDefault then --if we are forcing defaults
+        value = LAM.util.GetDefaultValue(control.data.default)
+        control.data.setFunc(value)
+    elseif value then
+        if control.data.decimals then
+            value = RoundDecimalToPlace(value, control.data.decimals)
+        end
+        if control.data.clampInput ~= false then
+            value = math.max(math.min(value, control.data.max), control.data.min)
+        end
+        control.data.setFunc(value)
+        --after setting this value, let's refresh the others to see if any should be disabled or have their settings changed
+        LAM.util.RequestRefreshIfNeeded(control)
+    else
+        value = control.data.getFunc()
+    end
+
+    control.slider:SetValue(value)
+    control.slidervalue:SetText(value)
+end
+
+function LAMCreateControl.slider(parent, sliderData, controlName)
+    local control = LAM.util.CreateLabelAndContainerControl(parent, sliderData, controlName)
+    local isInputOnRight = sliderData.inputLocation == "right"
+
+    --skipping creating the backdrop...  Is this the actual slider texture?
+    control.slider = wm:CreateControl(nil, control.container, CT_SLIDER)
+    local slider = control.slider
+    slider:SetAnchor(TOPLEFT)
+    slider:SetHeight(14)
+    if(isInputOnRight) then
+        slider:SetAnchor(TOPRIGHT, nil, nil, -60)
+    else
+        slider:SetAnchor(TOPRIGHT)
+    end
+    slider:SetMouseEnabled(true)
+    slider:SetOrientation(ORIENTATION_HORIZONTAL)
+    --put nil for highlighted texture file path, and what look to be texture coords
+    slider:SetThumbTexture("EsoUI\\Art\\Miscellaneous\\scrollbox_elevator.dds", "EsoUI\\Art\\Miscellaneous\\scrollbox_elevator_disabled.dds", nil, 8, 16)
+    local minValue = sliderData.min
+    local maxValue = sliderData.max
+    slider:SetMinMax(minValue, maxValue)
+    slider:SetHandler("OnMouseEnter", function() ZO_Options_OnMouseEnter(control) end)
+    slider:SetHandler("OnMouseExit", function() ZO_Options_OnMouseExit(control) end)
+
+    slider.bg = wm:CreateControl(nil, slider, CT_BACKDROP)
+    local bg = slider.bg
+    bg:SetCenterColor(0, 0, 0)
+    bg:SetAnchor(TOPLEFT, slider, TOPLEFT, 0, 4)
+    bg:SetAnchor(BOTTOMRIGHT, slider, BOTTOMRIGHT, 0, -4)
+    bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-SliderBackdrop.dds", 32, 4)
+
+    control.minText = wm:CreateControl(nil, slider, CT_LABEL)
+    local minText = control.minText
+    minText:SetFont("ZoFontGameSmall")
+    minText:SetAnchor(TOPLEFT, slider, BOTTOMLEFT)
+    minText:SetText(sliderData.min)
+
+    control.maxText = wm:CreateControl(nil, slider, CT_LABEL)
+    local maxText = control.maxText
+    maxText:SetFont("ZoFontGameSmall")
+    maxText:SetAnchor(TOPRIGHT, slider, BOTTOMRIGHT)
+    maxText:SetText(sliderData.max)
+
+    control.slidervalueBG = wm:CreateControlFromVirtual(nil, slider, "ZO_EditBackdrop")
+    if(isInputOnRight) then
+        control.slidervalueBG:SetDimensions(60, 26)
+        control.slidervalueBG:SetAnchor(LEFT, slider, RIGHT, 5, 0)
+    else
+        control.slidervalueBG:SetDimensions(50, 16)
+        control.slidervalueBG:SetAnchor(TOP, slider, BOTTOM, 0, 0)
+    end
+    control.slidervalue = wm:CreateControlFromVirtual(nil, control.slidervalueBG, "ZO_DefaultEditForBackdrop")
+    local slidervalue = control.slidervalue
+    slidervalue:ClearAnchors()
+    slidervalue:SetAnchor(TOPLEFT, control.slidervalueBG, TOPLEFT, 3, 1)
+    slidervalue:SetAnchor(BOTTOMRIGHT, control.slidervalueBG, BOTTOMRIGHT, -3, -1)
+    slidervalue:SetTextType(TEXT_TYPE_NUMERIC)
+    if(isInputOnRight) then
+        slidervalue:SetFont("ZoFontGameLarge")
+    else
+        slidervalue:SetFont("ZoFontGameSmall")
+    end
+
+    local isHandlingChange = false
+    local function HandleValueChanged(value)
+        if isHandlingChange then return end
+        if sliderData.decimals then
+            value = RoundDecimalToPlace(value, sliderData.decimals)
+        end
+        isHandlingChange = true
+        slider:SetValue(value)
+        slidervalue:SetText(value)
+        isHandlingChange = false
+    end
+
+    slidervalue:SetHandler("OnEscape", function(self)
+        HandleValueChanged(sliderData.getFunc())
+        self:LoseFocus()
+    end)
+    slidervalue:SetHandler("OnEnter", function(self)
+        self:LoseFocus()
+    end)
+    slidervalue:SetHandler("OnFocusLost", function(self)
+        local value = tonumber(self:GetText())
+        control:UpdateValue(false, value)
+    end)
+    slidervalue:SetHandler("OnTextChanged", function(self)
+        local input = self:GetText()
+        if(#input > 1 and not input:sub(-1):match("[0-9]")) then return end
+        local value = tonumber(input)
+        if(value) then
+            HandleValueChanged(value)
+        end
+    end)
+    if(sliderData.autoSelect) then
+        ZO_PreHookHandler(slidervalue, "OnFocusGained", function(self)
+            self:SelectAll()
+        end)
+    end
+
+    local range = maxValue - minValue
+    slider:SetValueStep(sliderData.step or 1)
+    slider:SetHandler("OnValueChanged", function(self, value, eventReason)
+        if eventReason == EVENT_REASON_SOFTWARE then return end
+        HandleValueChanged(value)
+    end)
+    slider:SetHandler("OnSliderReleased", function(self, value)
+        control:UpdateValue(false, value)
+    end)
+    slider:SetHandler("OnMouseWheel", function(self, value)
+        if(not self:GetEnabled()) then return end
+        local new_value = (tonumber(slidervalue:GetText()) or sliderData.min or 0) + ((sliderData.step or 1) * value)
+        control:UpdateValue(false, new_value)
+    end)
+
+    if sliderData.warning ~= nil or sliderData.requiresReload then
+        control.warning = wm:CreateControlFromVirtual(nil, control, "ZO_Options_WarningIcon")
+        control.warning:SetAnchor(RIGHT, slider, LEFT, -5, 0)
+        control.UpdateWarning = LAM.util.UpdateWarning
+        control:UpdateWarning()
+    end
+
+    control.UpdateValue = UpdateValue
+    control:UpdateValue()
+
+    if sliderData.disabled ~= nil then
+        control.UpdateDisabled = UpdateDisabled
+        control:UpdateDisabled()
+    end
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+    LAM.util.RegisterForReloadIfNeeded(control)
+
+    return control
+end
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/submenu.lua b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/submenu.lua
new file mode 100644
index 0000000..1766a1f
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/submenu.lua
@@ -0,0 +1,108 @@
+--[[submenuData = {
+    type = "submenu",
+    name = "Submenu Title", -- or string id or function returning a string
+    tooltip = "My submenu tooltip", -- -- or string id or function returning a string (optional)
+    controls = {sliderData, buttonData} --(optional) used by LAM
+    reference = "MyAddonSubmenu" --(optional) unique global reference to control
+} ]]
+
+local widgetVersion = 11
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("submenu", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+local am = ANIMATION_MANAGER
+
+local function UpdateValue(control)
+    control.label:SetText(LAM.util.GetStringFromValue(control.data.name))
+    if control.data.tooltip then
+        control.label.data.tooltipText = LAM.util.GetStringFromValue(control.data.tooltip)
+    end
+end
+
+local function AnimateSubmenu(clicked)
+    local control = clicked:GetParent()
+    control.open = not control.open
+
+    if control.open then
+        control.animation:PlayFromStart()
+    else
+        control.animation:PlayFromEnd()
+    end
+end
+
+function LAMCreateControl.submenu(parent, submenuData, controlName)
+    local width = parent:GetWidth() - 45
+    local control = wm:CreateControl(controlName or submenuData.reference, parent.scroll or parent, CT_CONTROL)
+    control.panel = parent
+    control.data = submenuData
+
+    control.label = wm:CreateControlFromVirtual(nil, control, "ZO_Options_SectionTitleLabel")
+    local label = control.label
+    label:SetAnchor(TOPLEFT, control, TOPLEFT, 5, 5)
+    label:SetDimensions(width, 30)
+    label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
+    label:SetText(LAM.util.GetStringFromValue(submenuData.name))
+    label:SetMouseEnabled(true)
+    if submenuData.tooltip then
+        label.data = {tooltipText = LAM.util.GetStringFromValue(submenuData.tooltip)}
+        label:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
+        label:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
+    end
+
+    control.scroll = wm:CreateControl(nil, control, CT_SCROLL)
+    local scroll = control.scroll
+    scroll:SetParent(control)
+    scroll:SetAnchor(TOPLEFT, label, BOTTOMLEFT, 0, 10)
+    scroll:SetDimensionConstraints(width + 5, 0, width + 5, 0)
+
+    control.bg = wm:CreateControl(nil, label, CT_BACKDROP)
+    local bg = control.bg
+    bg:SetAnchor(TOPLEFT, label, TOPLEFT, -5, -5)
+    bg:SetAnchor(BOTTOMRIGHT, scroll, BOTTOMRIGHT, -7, 0)
+    bg:SetEdgeTexture("EsoUI\\Art\\Tooltips\\UI-Border.dds", 128, 16)
+    bg:SetCenterTexture("EsoUI\\Art\\Tooltips\\UI-TooltipCenter.dds")
+    bg:SetInsets(16, 16, -16, -16)
+
+    control.arrow = wm:CreateControl(nil, bg, CT_TEXTURE)
+    local arrow = control.arrow
+    arrow:SetDimensions(28, 28)
+    arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortdown.dds") --list_sortup for the other way
+    arrow:SetAnchor(TOPRIGHT, bg, TOPRIGHT, -5, 5)
+
+    --figure out the cool animation later...
+    control.animation = am:CreateTimeline()
+    local animation = control.animation
+    animation:SetPlaybackType(ANIMATION_SIZE, 0) --2nd arg = loop count
+
+    control:SetResizeToFitDescendents(true)
+    control.open = false
+    label:SetHandler("OnMouseUp", AnimateSubmenu)
+    animation:SetHandler("OnStop", function(self, completedPlaying)
+        scroll:SetResizeToFitDescendents(control.open)
+        if control.open then
+            control.arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortup.dds")
+            scroll:SetResizeToFitPadding(5, 20)
+        else
+            control.arrow:SetTexture("EsoUI\\Art\\Miscellaneous\\list_sortdown.dds")
+            scroll:SetResizeToFitPadding(5, 0)
+            scroll:SetHeight(0)
+        end
+    end)
+
+    --small strip at the bottom of the submenu that you can click to close it
+    control.btmToggle = wm:CreateControl(nil, control, CT_TEXTURE)
+    local btmToggle = control.btmToggle
+    btmToggle:SetMouseEnabled(true)
+    btmToggle:SetAnchor(BOTTOMLEFT, control.scroll, BOTTOMLEFT)
+    btmToggle:SetAnchor(BOTTOMRIGHT, control.scroll, BOTTOMRIGHT)
+    btmToggle:SetHeight(15)
+    btmToggle:SetAlpha(0)
+    btmToggle:SetHandler("OnMouseUp", AnimateSubmenu)
+
+    control.UpdateValue = UpdateValue
+
+    LAM.util.RegisterForRefreshIfNeeded(control)
+
+    return control
+end
diff --git a/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/texture.lua b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/texture.lua
new file mode 100644
index 0000000..29dda7c
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAddonMenu-2.0/controls/texture.lua
@@ -0,0 +1,45 @@
+--[[textureData = {
+    type = "texture",
+    image = "file/path.dds",
+    imageWidth = 64, --max of 250 for half width, 510 for full
+    imageHeight = 32, --max of 100
+    tooltip = "Image's tooltip text.", -- or string id or function returning a string (optional)
+    width = "full", --or "half" (optional)
+    reference = "MyAddonTexture" --(optional) unique global reference to control
+} ]]
+
+--add texture coords support?
+
+local widgetVersion = 9
+local LAM = LibStub("LibAddonMenu-2.0")
+if not LAM:RegisterWidget("texture", widgetVersion) then return end
+
+local wm = WINDOW_MANAGER
+
+local MIN_HEIGHT = 26
+function LAMCreateControl.texture(parent, textureData, controlName)
+    local control = LAM.util.CreateBaseControl(parent, textureData, controlName)
+    local width = control:GetWidth()
+    control:SetResizeToFitDescendents(true)
+
+    if control.isHalfWidth then --note these restrictions
+        control:SetDimensionConstraints(width / 2, MIN_HEIGHT, width / 2, MIN_HEIGHT * 4)
+    else
+        control:SetDimensionConstraints(width, MIN_HEIGHT, width, MIN_HEIGHT * 4)
+    end
+
+    control.texture = wm:CreateControl(nil, control, CT_TEXTURE)
+    local texture = control.texture
+    texture:SetAnchor(CENTER)
+    texture:SetDimensions(textureData.imageWidth, textureData.imageHeight)
+    texture:SetTexture(textureData.image)
+
+    if textureData.tooltip then
+        texture:SetMouseEnabled(true)
+        texture.data = {tooltipText = LAM.util.GetStringFromValue(textureData.tooltip)}
+        texture:SetHandler("OnMouseEnter", ZO_Options_OnMouseEnter)
+        texture:SetHandler("OnMouseExit", ZO_Options_OnMouseExit)
+    end
+
+    return control
+end
diff --git a/AwesomeEvents2/Libs/LibAwesomeModule-2.0/LibAwesomeModule-2.0.lua b/AwesomeEvents2/Libs/LibAwesomeModule-2.0/LibAwesomeModule-2.0.lua
new file mode 100644
index 0000000..43f037a
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAwesomeModule-2.0/LibAwesomeModule-2.0.lua
@@ -0,0 +1,329 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: LibAwesomeModule-2.0.lua
+  Last Modified: 23.04.18 14:56
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local MAJOR, MINOR = 'LibAwesomeModule-2.0', 1
+local libAM, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+if not libAM then return end
+
+EVENT_AWESOME_MODULE_TIMER = 1
+ORDER_AWESOME_MODULE_PUSH_NOTIFICATION = 75
+
+COLOR_AWEVS_AVAILABLE = 1
+COLOR_AWEVS_HINT = 2
+COLOR_AWEVS_WARNING = 3
+
+ENABLED_AWEVS_NONE = 0
+ENABLED_AWEVS_ICON_AND_TEXT = 1
+ENABLED_AWEVS_ICON_ONLY = 2
+ENABLED_AWEVS_TEXT_ONLY = 3
+
+local colorDefs = { [COLOR_AWEVS_AVAILABLE]=nil,[COLOR_AWEVS_HINT]=nil,[COLOR_AWEVS_WARNING]=nil}
+
+libAM.version = MINOR
+libAM.modules = {}
+libAM.labelToMod = {}
+libAM.timer = {}
+libAM.debug = false
+libAM.CallbackManager = ZO_CallbackObject:Subclass()
+
+function libAM.d(...)
+    if libAM.debug then
+        libAM.CallbackManager:FireCallbacks('DEBUG_MESSAGE',...)
+    end
+end
+
+function libAM.SetColorDef(type,r,g,b)
+    if(colorDefs[type]==nil)then
+        colorDefs[type] = ZO_ColorDef:New(r,g,b)
+    else
+        colorDefs[type]:SetRGB(r,g,b)
+    end
+end
+
+local function __genOrderedIndex( options )
+    local orderToKeyMap,orderedNumbers,orderedIndex = {},{},{}
+    for key,option in pairs(options) do
+        local order = (option.order or 40) * 100
+        while(orderToKeyMap[order]~=nil)do
+            order = order + 1
+        end
+        orderToKeyMap[order] = key
+        table.insert( orderedNumbers, order )
+    end
+    table.sort( orderedNumbers )
+    for i,order in ipairs(orderedNumbers) do
+        table.insert( orderedIndex, orderToKeyMap[order] )
+    end
+    return orderedIndex
+end
+
+local function __getNextElement(t, state)
+    -- Equivalent of the next function, but returns the keys in the alphabetic order
+    local key
+    if state == nil then
+        -- the first time, generate the index
+        key = t.__orderedIndex[1]
+    else
+        -- fetch the next value
+        for i = 1,table.getn(t.__orderedIndex) do
+            if t.__orderedIndex[i] == state then
+                key = t.__orderedIndex[i+1]
+            end
+        end
+    end
+
+    if key then
+        return key, t[key]
+    end
+
+    -- no more value to return, cleanup
+    t.__orderedIndex = nil
+    return
+end
+
+-- Mod Constructor
+
+function libAM:New(uniqueId)
+    if(uniqueId==nil or self.modules[uniqueId]~=nil)then
+        d('[AwesomeEvents] Fatal error: Module id empty or already in use (id:'.. uniqueId..')')
+        return {}
+    end
+
+    -- MODULE CLASS
+    local Module = {
+        id = uniqueId,
+        debug = false,
+        title = 'UNTITLED_MODULE',
+        hint = GetString(SI_AWEMOD_SHOW_HINT),
+        options = {
+            enabled = true,
+            fontSize = 1,
+            spacing = 0,
+        },
+        order = 40,
+
+        initialized = false,
+        dataUpdated = true,
+    }
+
+    function Module:d(...)
+        if(self.debug)then
+            libAM.d(self.id,...)
+        end
+    end
+
+    function Module.Colorize(color,text)
+        if(colorDefs[color]~=nil)then
+            return colorDefs[color]:Colorize(text)
+        else
+            return text
+        end
+    end
+
+    function Module.GetColorStr( color )
+        if(colorDefs[color]~=nil)then
+            return '|c' .. colorDefs[color]:ToHex()
+        else
+            return '|r'
+        end
+    end
+
+    function Module:Initialize( options )
+        if(self.initialized)then return end
+        self.initialized = true
+
+        if(options.enabled) then
+            self:Enable(options)
+        end
+    end
+
+    function Module:HasUpdate()
+        return self.dataUpdated
+    end
+
+    function Module:GetEventListeners()
+        return {}
+    end
+
+    function Module.Icon(icon,options)
+        libAM.d('options',options)
+        if (options.enabled == ENABLED_AWEVS_ICON_AND_TEXT or options.enabled == ENABLED_AWEVS_ICON_ONLY)then
+            return '|t64:64:' .. icon .. '|t '
+        else
+            return ''
+        end
+    end
+
+    function Module.Text(text,options)
+        libAM.d('options',options)
+        if (options.enabled == ENABLED_AWEVS_ICON_AND_TEXT or options.enabled == ENABLED_AWEVS_TEXT_ONLY)then
+            return text
+        else
+            return ''
+        end
+    end
+
+    function Module:Enable(options)
+        self:d('Enable (in debug-mode)')
+        if(type(self.label)=='table')then
+            for i,_data in pairs(self.label) do
+                self.label[i]:SetText('')
+            end
+        else
+            self.label:SetText('')
+        end
+        self.dataUpdated = true
+    end
+
+    function Module:Disable()
+        self:d('Disable')
+        if(type(self.label)=='table')then
+            for i,_data in pairs(self.label) do
+                self.label[i]:SetText('')
+            end
+        else
+            self.label:SetText('')
+        end
+    end
+
+    function Module:Set(key,value)
+        self:d('Set['..key..']',value)
+        self.dataUpdated = true
+    end
+
+    function Module:StartTimer(seconds,updateIfFaster)
+        if(libAM.timer[self.id]==nil)then
+            self:d(GetString(SI_AWEVS_DEBUG_MODULE_NO_TIMER))
+            return
+        end
+        if(seconds == nil or seconds < 1)then
+            seconds = 1
+        end
+        local timestamp = GetTimeStamp() + seconds
+        if(libAM.timer[self.id] == 0)then
+            self:d('StartTimer['..seconds..']')
+            libAM.timer[self.id] = timestamp
+        elseif(updateIfFaster==true and self.lib.timer[self.id] > timestamp)then
+            self:d('StartTimer['..seconds..'] (faster)')
+            libAM.timer[self.id] = timestamp
+        else
+            self:d('StartTimer[ignored]')
+        end
+    end
+
+    function Module:SetTimer(seconds)
+        if(libAM.timer[self.id]==nil)then
+            self:d(GetString(SI_AWEVS_DEBUG_MODULE_NO_TIMER))
+            return
+        end
+        if(seconds == nil or seconds < 1)then
+            seconds = 1
+        end
+        self:d('SetTimer['..seconds..']')
+        libAM.timer[self.id] = GetTimeStamp() + seconds
+    end
+
+    function Module:StopTimer()
+        if(self.lib.timer[self.id]==nil)then
+            self:d(GetString(SI_AWEVS_DEBUG_MODULE_NO_TIMER))
+            return
+        end
+        self:d('StopTimer')
+        libAM.timer[self.id] = 0
+    end
+
+    local function __getNextOption(t, state)
+
+        -- Equivalent of the next function, but returns the keys in the alphabetic order
+        local key = nil
+        --d("orderedNext: state = "..tostring(state) )
+        if state == nil then
+            -- the first time, generate the index
+            key = t.__orderedIndex[1]
+        else
+            -- fetch the next value
+            for i = 1,table.getn(t.__orderedIndex) do
+                if t.__orderedIndex[i] == state then
+                    key = t.__orderedIndex[i+1]
+                end
+            end
+        end
+
+        if key then
+            return key, t[key]
+        end
+
+        -- no more value to return, cleanup
+        t.__orderedIndex = nil
+        return
+    end
+
+    function Module:option_pairs()
+        if(self.options == nil)then
+            d("SELF",self)
+            return nil,nil,nil
+        end
+
+        if(self.options.__orderedIndex == nil)then
+            self.options.__orderedIndex = __genOrderedIndex( self.options )
+        end
+        return __getNextElement, self.options, nil
+    end
+
+    self.modules[Module.id] = Module
+
+    libAM.CallbackManager:RegisterCallback('AwesomeEventsModConfig_'..uniqueId,function(options)
+        self.modules[uniqueId]:Initialize(options)
+    end)
+
+    return self.modules[Module.id]
+end
+
+local function __genModulesIndex( modules )
+    local titleToIdMap,orderedTitles,orderedIndex = {},{},{}
+    for mod_id,mod in pairs(modules) do
+        local i,title = 1,mod.title
+        while(titleToIdMap[title]~=nil)do
+            title = mod.title .. i
+            i = i+1
+        end
+        titleToIdMap[title] = mod_id
+        table.insert( orderedTitles, title )
+    end
+    table.sort( orderedTitles )
+    for i,title in ipairs(orderedTitles) do
+        table.insert( orderedIndex, titleToIdMap[title] )
+    end
+    return orderedIndex
+end
+
+function libAM:module_pairs()
+    if(self.modules.__orderedIndex == nil)then
+        self.modules.__orderedIndex = __genOrderedIndex( self.modules )
+    end
+    -- Equivalent of the pairs() function on tables. Allows to iterate
+    -- in order
+    return __getNextElement, self.modules, nil
+end
+
+function libAM.Initialize()
+    -- test for debug mode in modules
+    for mod_id,mod in libAM:module_pairs() do
+        if(mod.debug)then
+            libAM.debug = true
+        end
+    end
+    if(libAM.debug)then
+        libAM.CallbackManager:FireCallbacks("DEBUG_TOGGLE",true)
+    end
+end
\ No newline at end of file
diff --git a/AwesomeEvents2/Libs/LibAwesomeModule-2.0/README b/AwesomeEvents2/Libs/LibAwesomeModule-2.0/README
new file mode 100644
index 0000000..bca3324
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibAwesomeModule-2.0/README
@@ -0,0 +1,97 @@
+--------------------------
+--    AwesomeEvents     --
+--------------------------
+
+--[ EN ]--
+
+This AddOn was made by Ze_Mi <zemi@unive.de>.
+Updates at: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
+
+This AddOn is a modularzied, event-based, better configurable reinvention of AwesomeInfo addon from CrazyDutchGuy.
+My goal was to minimize timed refreshs and try to use as many event callbacks as possible, as well as split up the different notifications into seperate module files.
+Besides the look and feel, under the hood, there aren't many codelines left from AwesomeInfo.
+
+--[ DE ]--
+
+Dieses AddOn wurde erstellt von Ze_Mi <zemi@unive.de>.
+Updates unter: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
+
+Dieses AddOn ist eine modularizierte, eventbasierte und noch besser prsonalisierbare Neuentwicklung des AwesomeInfo Addons von CrazyDutchGuy.
+Mein Ziel dabei war es, weniger inertval basierte Aktualisierungen auszuführen und stattdessen auf Events zu reagieren. Außerdem wurden die verschiedenen Benachrichtigungen in
+eigene Module ausgelagert, was die Entwicklung von Modulen übersichtlicher und einfacher macht.
+Abgesehen von dem ursprünglichen look and feel hat sich unter der Haube so viel verändert, dass nicht mehr viele Codezeilen aus AwesoneInfo übrig geblieben sind.
+
+
+--------------------------
+--   LibAwesomeModule   --
+--------------------------
+
+--[ EN ]--
+
+This Library was made by Ze_Mi <zemi@unive.de>.
+
+Hereby I introduce LibAwesomeModule-2.0, a library that allows you to easily add new modules and notifications to AwesomeEvents.
+If you are interested in writing new modules, please have a look inside the Module folder of this addon.
+You don't have to care about layout and settings stuff, just write the minimal necessary code with maximum useability.
+
+--[ DE ]--
+
+Diese Bibliothek wurde erstellt von Ze_Mi <zemi@unive.de>.
+
+Hiermit stelle ich die neue Bibliothek LibAwesomeModule vor, eine Bibliothek mit deren Hilfe man super schnell und ohne viel Aufwand neue Benachrichtigungen in AwesomeEvents hinzufügen kann.
+Wenn du wissen möchtest, wie du neue Module hinzufügst, schau dir die Dateien im Ordner Modules an.
+Du musst dich nicht um lästige Label-Erstellungen/-Positionierung oder Einstellungen kümmern, schreibe einfach den minimal nötigen Code mit maximalem Nutzen.
+
+
+--------------------------
+--      CREDITS         --
+--------------------------
+
+--[ EN ]--
+
+Thanks to CrazyDutchGuy, Stormknight and RibbedStoic for their great AwesomeInfo AddOn!
+(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
+
+Thanks to @MissMarsupial for beta testing my AddOn.
+
+Thanks to esoui.com and all authors for maintaining the wiki and doing the job ZeniMax Media Inc is suposed to do ;)
+
+--[ DE ]--
+
+Mein Dank geht an CrazyDutchGuy, Stormknight und RibbedStoic für ihr großartiges AwesomeInfo AddOn!
+(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
+
+Danke an @MissMarsupial für das testen der Beta-Versionen meines AddOns.
+
+Danke an esoui.com und allen Authoren die an der Wiki arbeiten und diese aktuell halten und damit einen Dienst übernehmen für den sich ZeniMax Media Inc zu schön ist ;)
+
+--------------------------
+--      LICENSE         --
+--------------------------
+
+This software is under : CreativeCommons CC BY-NC-SA 4.0
+Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+You are free to:
+
+    Share — copy and redistribute the material in any medium or format
+    Adapt — remix, transform, and build upon the material
+    The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+
+Under the following terms:
+
+    Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
+    NonCommercial — You may not use the material for commercial purposes.
+    ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
+    No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
+
+
+Please read full licence at :
+http://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
+
+This Add-on is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates.
+The Elder Scrolls® and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries.
+All rights reserved.
+
+You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
\ No newline at end of file
diff --git a/AwesomeEvents2/Libs/LibMsgWin-1.0/LibMsgWin-1.0.lua b/AwesomeEvents2/Libs/LibMsgWin-1.0/LibMsgWin-1.0.lua
new file mode 100644
index 0000000..5c61219
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibMsgWin-1.0/LibMsgWin-1.0.lua
@@ -0,0 +1,221 @@
+
+--Register LAM with LibStub
+local MAJOR, MINOR = "LibMsgWin-1.0", 8
+local libmw, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+if not libmw then return end	--the same or newer version of this lib is already loaded into memory
+
+
+local function AdjustSlider(self)
+	local numHistoryLines = self:GetNamedChild("Buffer"):GetNumHistoryLines()
+	local numVisHistoryLines = self:GetNamedChild("Buffer"):GetNumVisibleLines()
+	local bufferScrollPos = self:GetNamedChild("Buffer"):GetScrollPosition()
+	local sliderMin, sliderMax = self:GetNamedChild("Slider"):GetMinMax()
+	local sliderValue = self:GetNamedChild("Slider"):GetValue()
+
+	self:GetNamedChild("Slider"):SetMinMax(0, numHistoryLines)
+
+	-- If the sliders at the bottom, stay at the bottom to show new text
+	if sliderValue == sliderMax then
+		self:GetNamedChild("Slider"):SetValue(numHistoryLines)
+	-- If the buffer is full start moving the slider up
+	elseif numHistoryLines == self:GetNamedChild("Buffer"):GetMaxHistoryLines() then
+		self:GetNamedChild("Slider"):SetValue(sliderValue-1)
+	end -- Else the slider does not move
+
+	-- If there are more history lines than visible lines show the slider
+	if numHistoryLines > numVisHistoryLines then
+		self:GetNamedChild("Slider"):SetHidden(false)
+	else
+		-- else hide the slider
+		self:GetNamedChild("Slider"):SetHidden(true)
+	end
+end
+
+function libmw:CreateMsgWindow(_UniqueName, _LabelText, _FadeDelay, _FadeTime)
+	-- Dimension Constraits
+	local minWidth = 200
+	local minHeight = 150
+
+	local tlw = WINDOW_MANAGER:CreateTopLevelWindow(_UniqueName)
+	tlw:SetMouseEnabled(true)
+	tlw:SetMovable(true)
+	tlw:SetHidden(false)
+	tlw:SetClampedToScreen(true)
+	tlw:SetDimensions(350, 400)
+	tlw:SetClampedToScreenInsets(-24)
+	tlw:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, 50,50)
+	tlw:SetDimensionConstraints(minWidth, minHeight)
+	tlw:SetResizeHandleSize(16)
+
+	-- Set Fade Delay/Times
+	tlw.fadeDelayWindow		= _FadeDelay or 0
+	tlw.fadeTimeWindow		= _FadeTime or 0
+	tlw.fadeDelayTextLines 	= tlw.fadeDelayWindow/1000
+	tlw.fadeTimeTextLines 	= tlw.fadeTimeWindow/1000
+
+	-- Create window fade timeline/animation
+	tlw.timeline = ANIMATION_MANAGER:CreateTimeline()
+	tlw.animation = tlw.timeline:InsertAnimation(ANIMATION_ALPHA, tlw, tlw.fadeDelayWindow)
+	tlw.animation:SetAlphaValues(1, 0)
+	tlw.animation:SetDuration(tlw.fadeTimeWindow)
+	tlw.timeline:PlayFromStart()
+
+
+	function tlw:AddText(_Message, _Red, _Green, _Blue)
+		local Red 	= _Red or 1
+		local Green = _Green or 1
+		local Blue 	= _Blue or 1
+
+		if not _Message then return end
+		-- Add message first
+		self:GetNamedChild("Buffer"):AddMessage(_Message, Red, Green, Blue)
+		-- Set new slider value & check visibility
+		AdjustSlider(self)
+		-- Reset Fade Timers
+		tlw:SetAlpha(1)
+		tlw.timeline:PlayFromStart()
+	end
+	function tlw:ChangeWinFade(_FadeDelay, _FadeTime)
+		if not (type(_FadeDelay) == "number" and type(_FadeTime) == "number") then return end
+		tlw.fadeDelayWindow		= _FadeDelay
+		tlw.fadeTimeWindow		= _FadeTime
+
+		tlw.timeline:SetAnimationOffset(tlw.animation, _FadeDelay)
+		tlw.animation:SetDuration(_FadeTime)
+	end
+	function tlw:ChangeTextFade(_FadeDelay, _FadeTime)
+		if not (type(_FadeDelay) == "number" and type(_FadeTime) == "number") then return end
+		tlw.fadeDelayTextLines 	= _FadeDelay/1000
+		tlw.fadeTimeTextLines 	= _FadeTime/1000
+		self:GetNamedChild("Buffer"):SetLineFade(_FadeDelay/1000, _FadeTime/1000)
+	end
+	function tlw:ClearText()
+		self:GetNamedChild("Buffer"):Clear()
+	end
+
+	local bg = WINDOW_MANAGER:CreateControl(_UniqueName.."Bg", tlw, CT_BACKDROP)
+	bg:SetAnchor(TOPLEFT, tlw, TOPLEFT, -8, -6)
+	bg:SetAnchor(BOTTOMRIGHT, tlw, BOTTOMRIGHT, 4, 4)
+	bg:SetEdgeTexture("EsoUI/Art/ChatWindow/chat_BG_edge.dds", 256, 256, 32)
+	bg:SetCenterTexture("EsoUI/Art/ChatWindow/chat_BG_center.dds")
+	bg:SetInsets(32, 32, -32, -32)
+	bg:SetDimensionConstraints(minWidth, minHeight)
+
+
+	local divider = WINDOW_MANAGER:CreateControl(_UniqueName.."Divider", tlw, CT_TEXTURE)
+	divider:SetDimensions(4, 8)
+	divider:SetAnchor(TOPLEFT, tlw, TOPLEFT, 20, 40)
+	divider:SetAnchor(TOPRIGHT, tlw, TOPRIGHT, -20, 40)
+	divider:SetTexture("EsoUI/Art/Miscellaneous/horizontalDivider.dds")
+	divider:SetTextureCoords(0.181640625, 0.818359375, 0, 1)
+
+
+	local buffer = WINDOW_MANAGER:CreateControl(_UniqueName.."Buffer", tlw, CT_TEXTBUFFER)
+	buffer:SetFont("ZoFontChat")
+	buffer:SetMaxHistoryLines(200)
+	buffer:SetMouseEnabled(true)
+	buffer:SetLinkEnabled(true)
+	buffer:SetAnchor(TOPLEFT, tlw, TOPLEFT, 20, 42)
+	buffer:SetAnchor(BOTTOMRIGHT, tlw, BOTTOMRIGHT, -35, -20)
+	buffer:SetLineFade(tlw.fadeDelayTextLines, tlw.fadeTimeTextLines)
+	buffer:SetHandler("OnLinkMouseUp", function(self, linkText, link, button)
+              --  ZO_PopupTooltip_SetLink(link)
+		ZO_LinkHandler_OnLinkMouseUp(link, button, self)
+	end)
+	buffer:SetDimensionConstraints(minWidth-55, minHeight-62)
+
+	buffer:SetHandler("OnMouseWheel", function(self, delta, ctrl, alt, shift)
+		local offset = delta
+		local slider = buffer:GetParent():GetNamedChild("Slider")
+		if shift then
+			offset = offset * buffer:GetNumVisibleLines()
+		elseif ctrl then
+			offset = offset * buffer:GetNumHistoryLines()
+		end
+		buffer:SetScrollPosition(buffer:GetScrollPosition() + offset)
+		slider:SetValue(slider:GetValue() - offset)
+	end)
+
+	buffer:SetHandler("OnMouseEnter", function(...)
+		tlw.timeline:Stop()
+		buffer:SetLineFade(0, 0)
+		buffer:ShowFadedLines()
+		tlw:SetAlpha(1)
+	end)
+	buffer:SetHandler("OnMouseExit", function(...)
+		buffer:SetLineFade(tlw.fadeDelayTextLines, tlw.fadeTimeTextLines)
+		tlw.timeline:PlayFromStart()
+	end)
+
+	local slider = WINDOW_MANAGER:CreateControl(_UniqueName.."Slider", tlw, CT_SLIDER)
+	slider:SetDimensions(15, 32)
+	slider:SetAnchor(TOPRIGHT, tlw, TOPRIGHT, -25, 60)
+	slider:SetAnchor(BOTTOMRIGHT, tlw, BOTTOMRIGHT, -15, -80)
+	slider:SetMinMax(1, 1)
+	slider:SetMouseEnabled(true)
+	slider:SetValueStep(1)
+	slider:SetValue(1)
+	slider:SetHidden(true)
+	slider:SetThumbTexture("EsoUI/Art/ChatWindow/chat_thumb.dds", "EsoUI/Art/ChatWindow/chat_thumb_disabled.dds", nil, 8, 22, nil, nil, 0.6875, nil)
+	slider:SetBackgroundMiddleTexture("EsoUI/Art/ChatWindow/chat_scrollbar_track.dds")
+
+	slider:SetHandler("OnValueChanged", function(self,value, eventReason)
+		local numHistoryLines = self:GetParent():GetNamedChild("Buffer"):GetNumHistoryLines()
+		local sliderValue = slider:GetValue()
+
+		if eventReason == EVENT_REASON_HARDWARE then
+			buffer:SetScrollPosition(numHistoryLines-sliderValue)
+		end
+	end)
+
+
+	local scrollUp = WINDOW_MANAGER:CreateControlFromVirtual(_UniqueName.."SliderScrollUp", slider, "ZO_ScrollUpButton")
+	scrollUp:SetAnchor(BOTTOM, slider, TOP, -1, 0)
+	scrollUp:SetNormalTexture("EsoUI/Art/ChatWindow/chat_scrollbar_upArrow_up.dds")
+	scrollUp:SetPressedTexture("EsoUI/Art/ChatWindow/chat_scrollbar_upArrow_down.dds")
+	scrollUp:SetMouseOverTexture("EsoUI/Art/ChatWindow/chat_scrollbar_upArrow_over.dds")
+	scrollUp:SetDisabledTexture("EsoUI/Art/ChatWindow/chat_scrollbar_upArrow_disabled.dds")
+	scrollUp:SetHandler("OnMouseDown", function(...)
+		buffer:SetScrollPosition(buffer:GetScrollPosition()+1)
+		slider:SetValue(slider:GetValue()-1)
+	end)
+
+
+	local scrollDown = WINDOW_MANAGER:CreateControlFromVirtual(_UniqueName.."SliderScrollDown", slider, "ZO_ScrollDownButton")
+	scrollDown:SetAnchor(TOP, slider, BOTTOM, -1, 0)
+	scrollDown:SetNormalTexture("EsoUI/Art/ChatWindow/chat_scrollbar_downArrow_up.dds")
+	scrollDown:SetPressedTexture("EsoUI/Art/ChatWindow/chat_scrollbar_downArrow_down.dds")
+	scrollDown:SetMouseOverTexture("EsoUI/Art/ChatWindow/chat_scrollbar_downArrow_over.dds")
+	scrollDown:SetDisabledTexture("EsoUI/Art/ChatWindow/chat_scrollbar_downArrow_disabled.dds")
+	scrollDown:SetHandler("OnMouseDown", function(...)
+		buffer:SetScrollPosition(buffer:GetScrollPosition()-1)
+		slider:SetValue(slider:GetValue()+1)
+	end)
+
+
+	local scrollEnd = WINDOW_MANAGER:CreateControlFromVirtual(_UniqueName.."SliderScrollEnd", slider, "ZO_ScrollEndButton")
+	scrollEnd:SetDimensions(16, 16)
+	scrollEnd:SetAnchor(TOP, scrollDown, BOTTOM, 0, 0)
+	scrollEnd:SetHandler("OnMouseDown", function(...)
+		buffer:SetScrollPosition(0)
+		slider:SetValue(buffer:GetNumHistoryLines())
+	end)
+
+	if _LabelText and _LabelText ~= "" then
+		local label = WINDOW_MANAGER:CreateControl(_UniqueName.."Label", tlw, CT_LABEL)
+		label:SetText(_LabelText)
+		label:SetFont("$(ANTIQUE_FONT)|24")
+		label:SetWrapMode(TEXT_WRAP_MODE_ELLIPSIS)
+		local textHeight = label:GetTextHeight()
+		label:SetDimensionConstraints(minWidth-60, textHeight, nil, textHeight)
+		label:ClearAnchors()
+		label:SetAnchor(TOPLEFT, tlw, TOPLEFT, 30, (40-textHeight)/2+5)
+		label:SetAnchor(TOPRIGHT, tlw, TOPRIGHT, -30, (40-textHeight)/2+5)
+	end
+	return tlw
+end
+
+
+
+
+
diff --git a/AwesomeEvents2/Libs/LibMsgWin-1.0/LibMsgWin-1.0.txt b/AwesomeEvents2/Libs/LibMsgWin-1.0/LibMsgWin-1.0.txt
new file mode 100644
index 0000000..84a7c33
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibMsgWin-1.0/LibMsgWin-1.0.txt
@@ -0,0 +1,10 @@
+## APIVersion: 100010
+## Title: LibMsgWin-1.0
+## Version: 1.0 r3
+## Author: Circonian
+## Description: A library used to aid in creating message windows
+
+
+LibStub\LibStub.lua
+
+LibMsgWin-1.0.lua
diff --git a/AwesomeEvents2/Libs/LibStub/LibStub.lua b/AwesomeEvents2/Libs/LibStub/LibStub.lua
new file mode 100644
index 0000000..0e6bf67
--- /dev/null
+++ b/AwesomeEvents2/Libs/LibStub/LibStub.lua
@@ -0,0 +1,38 @@
+-- LibStub is a simple versioning stub meant for use in Libraries.  http://www.wowace.com/wiki/LibStub for more info
+-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
+-- LibStub developed for World of Warcraft by above members of the WowAce community.
+-- Ported to Elder Scrolls Online by Seerah
+
+local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 4
+local LibStub = _G[LIBSTUB_MAJOR]
+
+local strformat = string.format
+if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+	LibStub = LibStub or {libs = {}, minors = {} }
+	_G[LIBSTUB_MAJOR] = LibStub
+	LibStub.minor = LIBSTUB_MINOR
+
+	function LibStub:NewLibrary(major, minor)
+		assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
+		if type(minor) ~= "number" then
+			minor = assert(tonumber(zo_strmatch(minor, "%d+%.?%d*")), "Minor version must either be a number or contain a number.")
+		end
+
+		local oldminor = self.minors[major]
+		if oldminor and oldminor >= minor then return nil end
+		self.minors[major], self.libs[major] = minor, self.libs[major] or {}
+		return self.libs[major], oldminor
+	end
+
+	function LibStub:GetLibrary(major, silent)
+		if not self.libs[major] and not silent then
+			error(strformat("Cannot find a library instance of %q.", tostring(major)), 2)
+		end
+		return self.libs[major], self.minors[major]
+	end
+
+	function LibStub:IterateLibraries() return pairs(self.libs) end
+	setmetatable(LibStub, { __call = LibStub.GetLibrary })
+end
+
+LibStub.SILENT = true
\ No newline at end of file
diff --git a/AwesomeEvents2/Modules/BuffFood.lua b/AwesomeEvents2/Modules/BuffFood.lua
new file mode 100644
index 0000000..d71392f
--- /dev/null
+++ b/AwesomeEvents2/Modules/BuffFood.lua
@@ -0,0 +1,248 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: BuffFood.lua
+  Last Modified: 02.11.17 16:36
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+local MOD = libAM:New('bufffood')
+
+MOD.title = GetString(SI_AWEMOD_BUFFFOOD)
+MOD.hint = GetString(SI_AWEMOD_BUFFFOOD_HINT)
+MOD.order = 30
+MOD.debug = true
+
+local HIDE_TIMEOUT_SECONDS = 300
+local ICON = 'EsoUI/Art/treeicons/provisioner_indexicon_stew_down.dds'
+
+-- USER SETTINGS
+
+function MOD.GetOptions()
+    return {
+        minutesLeftInfo = {
+            type = "slider",
+            name = GetString(SI_AWEMOD_BUFFFOOD_TIMER),
+            tooltip = GetString(SI_AWEMOD_BUFFFOOD_TIMER_HINT),
+            min  = 1,
+            max = 480,
+            default = 60,
+            order = 1,
+        },
+        blinkInCombat = {
+            type = "checkbox",
+            name = GetString(SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT),
+            tooltip = GetString(SI_AWEMOD_BUFFFOOD_BLINKINCOMBAT_HINT),
+            default = true,
+            order = 2,
+        },
+        hideNoBuffNoCombat = {
+            type = "checkbox",
+            name = GetString(SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT),
+            tooltip = GetString(SI_AWEMOD_BUFFFOOD_HIDENOCOMBAT_HINT),
+            default = false,
+            order = 2,
+        }
+    }
+end
+
+MOD.defaults.fontSize = 3
+
+-- OVERRIDES
+
+function MOD:Enable(options)
+    self:d('Enable (in debug-mode)')
+    self.data = {
+        availableAt = 1, --OnTimer event lazy call to OnEffectChanged
+        minutesLeft = 0,
+        buffName = 'Unknown',
+        inCombat = false,
+        blinkInCombat = options.blinkInCombat,
+        blinkColor = COLOR_AWEVS_WARNING,
+        hideAt = GetTimeStamp() + HIDE_TIMEOUT_SECONDS,
+    }
+    self.dataUpdated = true
+end
+
+function MOD:Set(key,value)
+    self:d('Set['..key..']',value)
+
+    if(key=='blinkInCombat')then
+        self.data.blinkInCombat = value
+    end
+    self.dataUpdated = true
+end
+
+-- EVENT LISTENER
+
+local function __isFoodBuff(abilityId)
+    local foodAbilityIds = {
+        [17407]=1,[17577]=1,[17581]=1,[17608]=1,[17614]=1,[61218]=1,[61255]=1,[61257]=1,[61259]=1,[61260]=1,
+        [61261]=1,[61294]=1,[61322]=1,[61325]=1,[61328]=1,[61335]=1,[61340]=1,[61345]=1,[61350]=1,[66125]=1,
+        [66128]=1,[66130]=1,[66132]=1,[66137]=1,[66141]=1,[66551]=1,[66568]=1,[66576]=1,[66586]=1,[66590]=1,
+        [66594]=1,[68411]=1,[68416]=1,[72816]=1,[72819]=1,[72822]=1,[72824]=1,[72956]=1,[72959]=1,[72961]=1,
+        [72965]=1,[72968]=1,[72971]=1,[84678]=1,[84681]=1,[84700]=1,[84704]=1,[84709]=1,[84720]=1,[84725]=1,
+        [84731]=1,[84735]=1,[85484]=1,[85497]=1,[86559]=1,[86673]=1,[86677]=1,[86746]=1,[86749]=1,[86787]=1,
+        [86789]=1,[86791]=1,[89955]=1,[89957]=1,[89971]=1,[92433]=1,[92435]=1,[92474]=1,[92476]=1
+    }
+    return foodAbilityIds[abilityId]~=nil
+end -- __isFoodBuff
+
+-- EVENT LISTENER
+
+-- EVENT_EFFECT_CHANGED (integer eventCode, integer changeType, integer effectSlot, string effectName, string unitTag, number beginTime, number endTime, integer stackCount, string iconName, string buffType, integer effectType, integer abilityType, integer statusEffectType, string unitName, integer unitId, integer abilityId, integer sourceUnitType)
+
+function MOD:GetEventListeners()
+    return {
+        {
+            eventCode = EVENT_AWESOME_MODULE_TIMER,
+            callback = function(eventCode, timestamp) return MOD:OnTimer(timestamp) end,
+        },
+        {
+            eventCode = EVENT_EFFECT_CHANGED,
+            callback = function(eventCode, changeType, effectSlot, effectName, unitTag, beginTime, endTime, stackCount, iconName, buffType, effectType, abilityType, statusEffectType, unitName, unitId, abilityId, sourceUnitType)
+                if(sourceUnitType == COMBAT_UNIT_TYPE_PLAYER and effectType == BUFF_EFFECT_TYPE_BUFF and statusEffectType == STATUS_EFFECT_TYPE_NONE and __isFoodBuff(abilityId))then
+                    MOD:OnEffectChanged(abilityId,changeType,effectName,endTime)
+                end
+            end,
+        },
+        {
+            eventCode = EVENT_PLAYER_COMBAT_STATE,
+            callback = function(eventCode, inCombat)
+                MOD:OnCombatStateChanged(inCombat)
+            end,
+        }
+    }
+end
+
+-- EVENT HANDLER
+
+function MOD:OnTimer(timestamp)
+    self:d('OnTimer')
+    -- has effect
+    if(self.data.availableAt > 0)then
+        if(timestamp >  self.data.availableAt)then
+            self:OnEffectChanged()
+        else
+            self:d(self.data.availableAt, timestamp)
+            self.data.minutesLeft = math.floor( GetDiffBetweenTimeStamps(self.data.availableAt, timestamp) / 60)
+            self.dataUpdated = true
+            self:d(' => dataUpdated')
+        end
+        return
+    end
+
+    -- has no effect, but in combat
+    if(self.data.inCombat)then
+        if(self.data.blinkInCombat)then
+            self.data.blinkColor = (self.data.blinkColor==COLOR_AWEVS_WARNING) and COLOR_AWEVS_HINT or COLOR_AWEVS_WARNING
+            self.dataUpdated = true
+            self:d(' => dataUpdated (combat)')
+            return 1
+        end
+    -- has no effect and not in combat
+    else
+        self.dataUpdated = true
+        self:d(' => dataUpdated (no-combat)')
+        if (timestamp < self.data.hideAt)then
+            return (self.data.hideAt-timestamp)
+        else
+            self.data.hideAt = 0
+            return 0
+        end
+    end
+    return 0
+end -- MOD:OnTimer
+
+function MOD:OnEffectChanged(abilityId,changeType,effectName,endTime)
+    self:d('OnEffectChanged')
+
+    -- single effect update
+    if(abilityId~=nil)then
+        if(__isFoodBuff(abilityId))then
+            if(changeType==EFFECT_RESULT_FADED)then
+                self.data.buffName = ''
+                self.data.availableAt = 0
+                self.data.minutesLeft = 0
+                self.dataUpdated = true
+                self:d(' => dataUpdated (faded)')
+                return
+            end
+            if(changeType==EFFECT_RESULT_GAINED)then
+                local secondsLeft =  math.ceil(endTime-GetFrameTimeSeconds())
+                self.data.buffName = effectName
+                self.data.availableAt = GetTimeStamp() + secondsLeft
+                self.data.minutesLeft = math.floor(secondsLeft/60)
+                self:StartTimer(1,true)
+                self.dataUpdated = true
+                self:d(' => dataUpdated (gained)')
+                return
+            end
+        end
+
+    -- scan all buffs for food-buffs
+    else
+        local numBuffs = GetNumBuffs('player')
+        self:d('numBuffs: '.. numBuffs);
+        for i=1,numBuffs do
+            --local buffName, timeStarted, timeEnding, buffSlot, stackCount, iconFilename, buffType, effectType, abilityType, statusEffectType, abilityId, canClickOff, castByPlayer
+            local buffName, _, timeEnding, _, _, _, _, _, _, _, abilityId, _, _ = GetUnitBuffInfo('player', i)
+            self:d(buffName .. (__isFoodBuff(abilityId) and ' is a foodbuff' or ' is not a foodbuff'))
+            if(__isFoodBuff(abilityId))then
+                local secondsLeft =  math.ceil(timeEnding-GetFrameTimeSeconds())
+                self.data.buffName = buffName
+                self.data.availableAt = GetTimeStamp() + secondsLeft
+                self.data.minutesLeft = math.floor(secondsLeft/60)
+                self:StartTimer(1,true)
+                self.dataUpdated = true
+				self:d(' => dataUpdated (found a buff)')
+				return
+            end
+        end
+
+        if(self.data.minutesLeft > 0 or self.data.buffName ~= '')then
+            self.dataUpdated = true
+            self:d(' => dataUpdated (no buff)')
+        end
+        self.data.availableAt = 0
+        self.data.buffName = ''
+        self.data.minutesLeft = 0
+    end
+end -- MOD:OnEffectChanged
+
+function MOD:OnCombatStateChanged(inCombat)
+    self:d('OnCombatStateChanged',inCombat)
+    self.data.inCombat = inCombat
+    if(self.data.minutesLeft==0)then
+        self.data.blinkColor = COLOR_AWEVS_WARNING
+        if(not inCombat)then
+            self.data.hideAt = GetTimeStamp() + HIDE_TIMEOUT_SECONDS
+        end
+        self:StartTimer(1,true)
+    end
+end -- MOD:OnCombatStateChanged
+
+-- LABEL HANDLER
+
+function MOD:Update(options)
+    self:d('Update')
+    local labelText = ''
+    if(self.data.minutesLeft > 0) then
+        if(self.data.minutesLeft <= options.minutesLeftInfo) then
+            labelText = MOD.Icon(ICON, options) .. MOD.Text( MOD.Colorize(COLOR_AWEVS_HINT, zo_strformat(SI_AWEMOD_BUFFFOOD_TIMER_LABEL,self.data.buffName)) .. ': ' .. FormatTimeSeconds(60 * self.data.minutesLeft, TIME_FORMAT_STYLE_DESCRIPTIVE_SHORT , TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR , TIME_FORMAT_DIRECTION_NONE), options)
+        else
+            labelText = ''
+        end
+    elseif(options.blinkInCombat and self.data.inCombat)then
+        labelText = MOD.Icon(ICON, options) .. MOD.Text( MOD.Colorize(self.data.blinkColor, GetString(SI_AWEMOD_BUFFFOOD_READY_LABEL)), options)
+    elseif(not options.hideNoBuffNoCombat or self.data.hideAt>0)then
+        labelText = MOD.Icon(ICON, options) .. MOD.Text( MOD.Colorize(COLOR_AWEVS_WARNING, GetString(SI_AWEMOD_BUFFFOOD_READY_LABEL)), options)
+    end
+    self.label:SetText(labelText)
+end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents2/Modules/Clock.lua b/AwesomeEvents2/Modules/Clock.lua
new file mode 100644
index 0000000..5fcc915
--- /dev/null
+++ b/AwesomeEvents2/Modules/Clock.lua
@@ -0,0 +1,115 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: Clock.lua
+  Last Modified: 02.11.17 16:36
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+local MOD = libAM:New('clock')
+
+local CLOCK_TYPE_TIME = 0
+local CLOCK_TYPE_DATE = 1
+
+MOD.title = GetString(SI_AWEMOD_CLOCK)
+MOD.hint = GetString(SI_AWEMOD_CLOCK_HINT)
+MOD.order = 10
+MOD.debug = false
+
+MOD.label = {}
+MOD.label[CLOCK_TYPE_TIME] = {}
+MOD.label[CLOCK_TYPE_DATE] = {}
+
+-- USER SETTINGS
+
+MOD.options = {
+    hoursFormat24 = {
+        type = "checkbox",
+        name = GetString(SI_AWEMOD_CLOCK_FORMAT),
+        tooltip = GetString(SI_AWEMOD_CLOCK_FORMAT_HINT),
+        default = true,
+        order = 1,
+    },
+    style = {
+        type = 'dropdown',
+        name = GetString(SI_AWEMOD_CLOCK_STYLE),
+        tooltip = GetString(SI_AWEMOD_CLOCK_STYLE_HINT),
+        choices = {GetString(SI_AWEMOD_CLOCK_STYLE_TIME),GetString(SI_AWEMOD_CLOCK_STYLE_DATETIME_SHORT),GetString(SI_AWEMOD_CLOCK_STYLE_DATETIME_LONG)},
+        default = GetString(SI_AWEMOD_CLOCK_STYLE_TIME),
+        order = 2,
+    },
+}
+MOD.fontSize = 5
+
+-- OVERRIDES
+
+function MOD:Enable(options)
+    self:d('Enable (in debug-mode)')
+    self.dataUpdated = true
+end -- MOD:Enable
+
+function MOD:Set(key,value)
+    self:d('Set['..key..']',value)
+
+    if(key=='style')then
+        if(value~=GetString(SI_AWEMOD_CLOCK_STYLE_DATETIME_LONG))then
+            self.label[CLOCK_TYPE_DATE]:SetText('')
+        end
+    end
+    self.dataUpdated = true
+end -- MOD:Set
+
+-- EVENT LISTENER
+
+function MOD:GetEventListeners()
+    return {
+        {
+            eventCode = EVENT_AWESOME_MODULE_TIMER,
+            callback = function(eventCode, timestamp) return MOD:OnTimer(timestamp) end,
+        },
+    }
+end -- MOD:GetEventListeners
+
+-- EVENT HANDLER
+
+function MOD:OnTimer(timestamp)
+    self:d('OnTimer')
+    self.dataUpdated = true
+    self:d(' => dataUpdated')
+end -- MOD:OnTimer
+
+-- LABEL HANDLER
+
+local function GetDateString(short)
+    local date = GetDate()
+    local year,month,day = string.sub(date,1,4), string.sub(date,5,6), string.sub(date,7,8)
+    local dateString = short and GetString(SI_AWEMOD_CLOCK_DATEFORMAT_SHORT) or GetString(SI_AWEMOD_CLOCK_DATEFORMAT_LONG)
+    dateString = string.gsub(dateString,"year",year,1)
+    dateString = string.gsub(dateString,"day",day,1)
+    dateString = string.gsub(dateString,"month",month,1)
+    return dateString
+end -- GetDateString
+
+function MOD:Update(options)
+    self:d('Update',options)
+    local labelText = ''
+
+    if(options.style == GetString(SI_AWEMOD_CLOCK_STYLE_DATETIME_LONG)) then
+        self.label[CLOCK_TYPE_DATE]:SetText(GetDateString(false))
+    elseif(options.style == GetString(SI_AWEMOD_CLOCK_STYLE_DATETIME_SHORT)) then
+        labelText = GetDateString(true) .. ' - '
+    end
+
+    local timeFormat = TIME_FORMAT_PRECISION_TWELVE_HOUR
+    if (options.hoursFormat24) then
+        timeFormat = TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR
+    end
+    labelText = labelText .. FormatTimeSeconds(GetSecondsSinceMidnight(), TIME_FORMAT_STYLE_CLOCK_TIME, timeFormat, TIME_FORMAT_DIRECTION_NONE)
+    self.label[CLOCK_TYPE_TIME]:SetText(labelText)
+end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents2/Modules/Crafting.lua b/AwesomeEvents2/Modules/Crafting.lua
new file mode 100644
index 0000000..cce8634
--- /dev/null
+++ b/AwesomeEvents2/Modules/Crafting.lua
@@ -0,0 +1,209 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: Crafting.lua
+  Last Modified: 02.11.17 16:36
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+local MOD = libAM:New('crafting')
+
+MOD.title = GetString(SI_AWEMOD_CRAFTING)
+MOD.hint = GetString(SI_AWEMOD_CRAFTING_HINT)
+MOD.order = 35
+MOD.debug = false
+
+MOD.label = {
+    [CRAFTING_TYPE_BLACKSMITHING] = {},
+    [CRAFTING_TYPE_CLOTHIER] = {},
+    [CRAFTING_TYPE_WOODWORKING] = {}
+}
+
+-- USER SETTINGS
+
+MOD.options = {
+    showBlacksmithing = {
+        type = 'checkbox',
+        name = GetString(SI_AWEMOD_CRAFTING_BLACKSMITHING),
+        tooltip = GetString(SI_AWEMOD_CRAFTING_BLACKSMITHING_HINT),
+        default = true,
+        order = 1,
+    },
+    showClothier = {
+        type = 'checkbox',
+        name = GetString(SI_AWEMOD_CRAFTING_CLOTHING),
+        tooltip = GetString(SI_AWEMOD_CRAFTING_CLOTHING_HINT),
+        default = true,
+        order = 2,
+    },
+    showWoodworking = {
+        type = 'checkbox',
+        name = GetString(SI_AWEMOD_CRAFTING_WOODWORKING),
+        tooltip = GetString(SI_AWEMOD_CRAFTING_WOODWORKING_HINT),
+        default = true,
+        order = 3,
+    },
+    minutesLeftInfo = {
+        type = 'slider',
+        name = GetString(SI_AWEMOD_CRAFTING_TIMER),
+        tooltip = GetString(SI_AWEMOD_CRAFTING_TIMER_HINT),
+        min  = 1,
+        max = 960,
+        default = 480,
+        order = 4,
+    },
+}
+
+-- OVERRIDES
+
+function MOD:Enable(options)
+    self:d('Enable (in debug-mode)')
+    self.data[CRAFTING_TYPE_BLACKSMITHING] = { unusedSlots = 0, availableAt = 0, minutesLeft = 9999, name = GetString(SI_ITEMFILTERTYPE13)}
+    self.data[CRAFTING_TYPE_CLOTHIER] = { unusedSlots = 0, availableAt = 0, minutesLeft = 9999, name = GetString(SI_ITEMFILTERTYPE14)}
+    self.data[CRAFTING_TYPE_WOODWORKING] = { unusedSlots = 0, availableAt = 0, minutesLeft = 9999, name = GetString(SI_ITEMFILTERTYPE15) }
+
+    if(options.showBlacksmithing)then
+        self:OnSmithingTraitResearch(CRAFTING_TYPE_BLACKSMITHING)
+    end
+    if(options.showClothier)then
+        self:OnSmithingTraitResearch(CRAFTING_TYPE_CLOTHIER)
+    end
+    if(options.showWoodworking)then
+        self:OnSmithingTraitResearch(CRAFTING_TYPE_WOODWORKING)
+    end
+    self.dataUpdated = true
+end -- MOD:Enable
+
+function MOD:Set(key,value)
+    self:d('Set['..key..']',value)
+
+    if(key=='showBlacksmithing')then
+        if(value)then
+            self:OnSmithingTraitResearch(CRAFTING_TYPE_BLACKSMITHING)
+        else
+            self.label[CRAFTING_TYPE_BLACKSMITHING]:SetText('')
+            self.dataUpdated = true
+        end
+    elseif(key=='showClothier')then
+        if(value)then
+            self:OnSmithingTraitResearch(CRAFTING_TYPE_CLOTHIER)
+        else
+            self.label[CRAFTING_TYPE_CLOTHIER]:SetText('')
+            self.dataUpdated = true
+        end
+    elseif(key=='showWoodworking')then
+        if(value)then
+            self:OnSmithingTraitResearch(CRAFTING_TYPE_WOODWORKING)
+        else
+            self.label[CRAFTING_TYPE_WOODWORKING]:SetText('')
+            self.dataUpdated = true
+        end
+    elseif(key=='minutesLeftInfo')then
+        self:OnTimer(GetTimeStamp())
+    end
+end -- MOD:Set
+
+-- EVENT LISTENER
+-- EVENT_SMITHING_TRAIT_RESEARCH_TIMES_UPDATED(eventCode)
+function MOD:GetEventListeners()
+    return {
+        {
+            eventCode = EVENT_AWESOME_MODULE_TIMER,
+            callback = function(eventCode, timestamp) return MOD:OnTimer(timestamp) end,
+        },
+        {
+            eventCode = EVENT_SMITHING_TRAIT_RESEARCH_STARTED,
+            callback = function(eventCode, craftingSkillType, researchLineIndex, traitIndex) MOD:OnSmithingTraitResearch(craftingSkillType) end,
+        },
+        {
+            eventCode = EVENT_SMITHING_TRAIT_RESEARCH_COMPLETED,
+            callback = function(eventCode, craftingSkillType, researchLineIndex, traitIndex) MOD:OnSmithingTraitResearch(craftingSkillType) end,
+        },
+    }
+end
+
+-- EVENT HANDLER
+
+function MOD:OnTimer(timestamp)
+    self:d('OnTimer')
+    local i
+    for i,_data in pairs(self.data) do
+        if(_data.availableAt > 0)then
+            self.data[i].minutesLeft = math.ceil( GetDiffBetweenTimeStamps(_data.availableAt, timestamp) / 60)
+            self.dataUpdated = true
+            self:d(' => dataUpdated')
+        end
+    end
+
+    if(self.data[CRAFTING_TYPE_BLACKSMITHING].availableAt == 0 and self.data[CRAFTING_TYPE_CLOTHIER].availableAt == 0 and self.data[CRAFTING_TYPE_WOODWORKING].availableAt == 0)then
+        self:StopTimer()
+    end
+end
+
+function MOD:OnSmithingTraitResearch(craftingSkillType)
+    self:d('OnSmithingResearchTrait '.. craftingSkillType)
+    local maxTimer = 2000000
+    local maxResearch = GetMaxSimultaneousSmithingResearch(craftingSkillType)   -- This is the number of research slots
+    local maxLines = GetNumSmithingResearchLines(craftingSkillType)     -- This is the number of different items craftable by this profession
+    for i = 1, maxLines, 1 do       -- loop through the different craftable items, looking to see if there is research on that item
+        local name, icon, numTraits, timeRequiredForNextResearchSecs = GetSmithingResearchLineInfo(craftingSkillType, i)  -- Get info on that specific item
+        for j = 1, numTraits, 1 do      -- loop through the traits, looking for one that is being researched
+            local duration, timeRemaining = GetSmithingResearchLineTraitTimes(craftingSkillType, i, j)
+            if (duration ~= nil and timeRemaining ~= nil) then
+                maxResearch = maxResearch - 1
+                maxTimer = math.min(maxTimer,timeRemaining)
+            end
+        end
+    end
+    if (maxResearch > 0) then   -- There is an unused research slots
+        self.data[craftingSkillType].availableAt = 0
+        self.data[craftingSkillType].minutesLeft = 0
+    else
+        local timestamp = GetTimeStamp()
+        self.data[craftingSkillType].availableAt = timestamp + maxTimer
+        self.data[craftingSkillType].minutesLeft = math.ceil(maxTimer / 60)
+        self:StartTimer()
+    end
+    self.data[craftingSkillType].unusedSlots = maxResearch
+
+    self.dataUpdated = true
+    self:d(' => dataUpdated')
+end
+
+-- LABEL HANDLER
+
+function MOD:Update(options)
+    self:d('Update')
+    if(options.showBlacksmithing) then
+        self.label[CRAFTING_TYPE_BLACKSMITHING]:SetText(self.FormatLabelText(self.data[CRAFTING_TYPE_BLACKSMITHING], options.minutesLeftInfo))
+    end
+    if(options.showClothier) then
+        self.label[CRAFTING_TYPE_CLOTHIER]:SetText(self.FormatLabelText(self.data[CRAFTING_TYPE_CLOTHIER], options.minutesLeftInfo))
+    end
+    if(options.showWoodworking) then
+        self.label[CRAFTING_TYPE_WOODWORKING]:SetText(self.FormatLabelText(self.data[CRAFTING_TYPE_WOODWORKING], options.minutesLeftInfo))
+    end
+end
+
+function MOD.FormatLabelText(data, minutesLeftInfo)
+    local text = ''
+    if (data.minutesLeft <= minutesLeftInfo) then
+        if (data.minutesLeft == 0) then
+            text = MOD.Colorize(COLOR_AWEVS_AVAILABLE,data.name) .. ': ' .. data.unusedSlots .. ' ' .. GetString(SI_AWEMOD_CRAFTING_AVAILABLE_LABEL)
+        else
+            text = MOD.Colorize(COLOR_AWEVS_HINT,data.name) .. ': ' .. FormatTimeSeconds(60 * data.minutesLeft, TIME_FORMAT_STYLE_DESCRIPTIVE_SHORT , TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR , TIME_FORMAT_DIRECTION_NONE)
+        end
+    end
+    return text
+end
+
+-- |c82D482 GREEN
+-- |cD4CD82 YELLOW
+-- |cD49682 RED
+-- |r WHITE
\ No newline at end of file
diff --git a/AwesomeEvents2/Modules/Durability.lua b/AwesomeEvents2/Modules/Durability.lua
new file mode 100644
index 0000000..89a521d
--- /dev/null
+++ b/AwesomeEvents2/Modules/Durability.lua
@@ -0,0 +1,141 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: Durability.lua
+  Last Modified: 02.11.17 16:36
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+local MOD = libAM:New('durability')
+
+MOD.title = GetString(SI_AWEMOD_DURABILITY)
+MOD.hint = GetString(SI_AWEMOD_DURABILITY_HINT)
+MOD.order = 50
+MOD.debug = false
+
+-- OVERRIDES
+
+-- USER SETTINGS
+
+MOD.options = {
+    valueLowInfo = {
+        type = 'slider',
+        name = GetString(SI_AWEMOD_DURABILITY_INFO),
+        tooltip = GetString(SI_AWEMOD_DURABILITY_INFO_HINT),
+        min  = 1,
+        max = 60,
+        default = 50,
+        order = 1,
+    },
+    valueLowWarning = {
+        type = 'slider',
+        name = GetString(SI_AWEMOD_DURABILITY_WARNING),
+        tooltip = GetString(SI_AWEMOD_DURABILITY_WARNING_HINT),
+        min  = 1,
+        max = 40,
+        default = 25,
+        order = 2,
+    },
+}
+MOD.fontSize = 4
+
+-- OVERRIDES
+
+function MOD:Enable(options)
+    self:d('Enable (in debug-mode)')
+    self.data = {
+        minimumValue = 9999,
+        repairCost = 0,
+    }
+    self:OnInventorySingleSlotUpdate(0)
+    self.dataUpdated = true
+end
+
+-- EVENT LISTENER
+
+function MOD:GetEventListeners()
+    return {
+        {
+            eventCode = EVENT_INVENTORY_SINGLE_SLOT_UPDATE,
+            callback = function(eventCode, bagId, slotId, isNewItem, itemSoundCategory, inventoryUpdateReason, stackCountChange)
+                if(bagId == BAG_WORN and inventoryUpdateReason == INVENTORY_UPDATE_REASON_DURABILITY_CHANGE) then
+                    MOD:OnInventorySingleSlotUpdate(slotId)
+                end
+            end,
+        }
+    }
+end
+
+-- EVENT HANDLER
+
+function MOD:OnInventorySingleSlotUpdate(slotId)
+    self:d('OnInventorySingleSlotUpdate ' .. slotId)
+    -- use slotId if not nil
+    --[[
+    EQUIP_SLOT_HEAD = 0
+    EQUIP_SLOT_NECK = 1
+    EQUIP_SLOT_CHEST = 2
+    EQUIP_SLOT_SHOULDERS = 3
+    EQUIP_SLOT_MAIN_HAND = 4
+    EQUIP_SLOT_OFF_HAND = 5
+    EQUIP_SLOT_WAIST = 6
+    EQUIP_SLOT_WRIST = 7
+    EQUIP_SLOT_LEGS = 8
+    EQUIP_SLOT_FEET = 9
+    EQUIP_SLOT_COSTUME = 10
+    EQUIP_SLOT_RING1 = 11
+    EQUIP_SLOT_RING2 = 12
+    EQUIP_SLOT_POISON = 13
+    EQUIP_SLOT_BACKUP_POISON = 14
+    EQUIP_SLOT_RANGED = 15
+    EQUIP_SLOT_HAND = 16
+    EQUIP_SLOT_CLASS1 = 17
+    EQUIP_SLOT_CLASS2 = 18
+    EQUIP_SLOT_CLASS3 = 19
+    EQUIP_SLOT_BACKUP_MAIN = 20
+    EQUIP_SLOT_BACKUP_OFF = 21
+    EQUIP_SLOT_MAX_VALUE = 21
+    EQUIP_SLOT_MIN_VALUE = -1
+
+    EQUIP_SLOT_NONE = -1
+    EQUIP_SLOT_TRINKET1 = 222
+    EQUIP_SLOT_TRINKET2 = 222
+    ]]--
+
+    local repairAllCost = GetRepairAllCost()
+    if( repairAllCost ~= self.data.repairCost ) then
+        self.data.repairCost = repairAllCost
+
+        local minDura = 100
+        for i=0,16,1 do
+            if (DoesItemHaveDurability(BAG_WORN,i)) then
+                minDura = math.min(minDura,GetItemCondition(BAG_WORN,i))
+            end
+        end
+        self.data.minimumValue = minDura
+        self.dataUpdated = true
+        self:d(' => dataUpdated')
+    end
+end
+
+-- LABEL HANDLER
+
+function MOD:Update(options)
+    self:d('Update')
+    local labelText = ''
+    if (self.data.minimumValue <= options.valueLowInfo) then
+        if (self.data.minimumValue <= options.valueLowWarning) then
+            labelText = MOD.Colorize(COLOR_AWEVS_WARNING, GetString(SI_AWEMOD_DURABILITY_LABEL)) .. ': ' .. self.data.minimumValue .. '%'
+        else
+            labelText = MOD.Colorize(COLOR_AWEVS_HINT, GetString(SI_AWEMOD_DURABILITY_LABEL)) .. ': ' .. self.data.minimumValue .. '%'
+        end
+        labelText = labelText .. ' (' .. self.data.repairCost .. 'g)'
+    end
+    self.label:SetText(labelText)
+end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents2/Modules/Fencing.lua b/AwesomeEvents2/Modules/Fencing.lua
new file mode 100644
index 0000000..9b0ea81
--- /dev/null
+++ b/AwesomeEvents2/Modules/Fencing.lua
@@ -0,0 +1,205 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: Fencing.lua
+  Last Modified: 02.11.17 16:36
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+local MOD = libAM:New('fencing')
+
+MOD.title = GetString(SI_AWEMOD_FENCING)
+MOD.hint = GetString(SI_AWEMOD_FENCING_HINT)
+MOD.order = 45
+MOD.debug = false
+
+-- USER SETTINGS
+
+MOD.options = {
+    showSellsLeft = {
+        type = 'checkbox',
+        name = GetString(SI_AWEMOD_FENCING_SELLS),
+        tooltip = GetString(SI_AWEMOD_FENCING_SELLS_HINT),
+        default = true,
+        order = 1,
+    },
+    sellsLeftInfo = {
+        type = 'slider',
+        name = GetString(SI_AWEMOD_FENCING_SELLS_INFO),
+        tooltip = GetString(SI_AWEMOD_FENCING_SELLS_INFO_HINT),
+        min  = 0,
+        max = 50,
+        default = 30,
+        order = 2,
+    },
+    sellsLeftWarning = {
+        type = 'slider',
+        name = GetString(SI_AWEMOD_FENCING_SELLS_WARNING),
+        tooltip = GetString(SI_AWEMOD_FENCING_SELLS_WARNING_HINT),
+        min  = 0,
+        max = 50,
+        default = 10,
+        order = 3,
+    },
+    showLaundersLeft = {
+        type = 'checkbox',
+        name = GetString(SI_AWEMOD_FENCING_LAUNDERS),
+        tooltip = GetString(SI_AWEMOD_FENCING_LAUNDERS_HINT),
+        default = true,
+        order = 4,
+    },
+    laundersLeftInfo = {
+        type = 'slider',
+        name = GetString(SI_AWEMOD_FENCING_LAUNDERS_INFO),
+        tooltip = GetString(SI_AWEMOD_FENCING_LAUNDERS_INFO_HINT),
+        min  = 0,
+        max = 50,
+        default = 30,
+        order = 5,
+    },
+    laundersLeftWarning = {
+        type = 'slider',
+        name = GetString(SI_AWEMOD_FENCING_LAUNDERS_WARNING),
+        tooltip = GetString(SI_AWEMOD_FENCING_LAUNDERS_WARNING_HINT),
+        min  = 0,
+        max = 50,
+        default = 10,
+        order = 6,
+    },
+}
+
+-- OVERRIDES
+
+function MOD:Enable(options)
+    self:d('Enable (in debug-mode)')
+    self.data.fenceOpened = false
+    self.data.sells = { total = 0, left = 0, resetAt = 1, minutesLeft = 0, name = GetString(SI_AWEMOD_FENCING_SELLS_LABEL)}
+    self.data.launders = { total = 0, left = 0, resetAt = 1, minutesLeft = 0, name = GetString(SI_AWEMOD_FENCING_LAUNDERS_LABEL)}
+    self.dataUpdated = true
+end
+
+-- EVENT LISTENER
+
+function MOD:GetEventListeners()
+    return {
+        {
+            eventCode = EVENT_AWESOME_MODULE_TIMER,
+            callback = function(eventCode, timestamp) return MOD:OnTimer(timestamp) end,
+        },
+        {
+            eventCode = EVENT_OPEN_FENCE,
+            callback = function(eventCode,allowSell,allowLaunder) MOD.data.fenceOpened = true end,
+        },
+        {
+            eventCode = EVENT_CLOSE_STORE,
+            callback = function(eventCode) if(MOD.data.fenceOpened)then MOD:OnCloseStore(GetTimeStamp()) end end,
+        },
+    }
+end
+
+-- EVENT HANDLER
+
+function MOD:OnTimer(timestamp)
+    self:d('OnTimer')
+    if(self.data.sells.left == 0 and self.data.sells.resetAt > 0)then
+        if(timestamp >  self.data.sells.resetAt)then
+            self:OnCloseStore(timestamp)
+            return
+        else
+            self.data.sells.minutesLeft = math.ceil( GetDiffBetweenTimeStamps(self.data.sells.resetAt, timestamp) / 60)
+            self.dataUpdated = true
+            self:d(' => dataUpdated')
+        end
+    end
+
+    if(self.data.launders.left == 0 and self.data.launders.resetAt > 0)then
+        if(timestamp >  self.data.launders.resetAt)then
+            self:OnCloseStore(timestamp)
+            return
+        else
+            self.data.launders.minutesLeft = math.ceil( GetDiffBetweenTimeStamps(self.data.launders.resetAt, timestamp) / 60)
+            self.dataUpdated = true
+            self:d(' => dataUpdated')
+        end
+    end
+
+    if(self.data.sells.left > 0 and self.data.launders.left > 0)then
+        return 0
+    end
+end
+
+
+function MOD:OnCloseStore(timestamp)
+    self:d('OnCloseStore')
+    self.data.fenceOpened = false
+    local used, resetSeconds
+
+    self.data.sells.total, used, resetSeconds = GetFenceSellTransactionInfo()
+    self.data.sells.left = self.data.sells.total - used
+    if(self.data.sells.left == 0)then
+        self.data.sells.resetAt = timestamp + resetSeconds
+        self.data.sells.minutesLeft = math.ceil(resetSeconds / 60)
+        self:StartTimer()
+    else
+        self.data.sells.resetAt = 0
+        self.data.sells.minutesLeft = 0
+    end
+
+
+    self.data.launders.total, used, resetSeconds = GetFenceLaunderTransactionInfo()
+    self.data.launders.left = self.data.launders.total - used
+    if(self.data.launders.left == 0)then
+        self.data.launders.resetAt = timestamp + resetSeconds
+        self.data.launders.minutesLeft = math.ceil(resetSeconds / 60)
+        self:StartTimer()
+    else
+        self.data.launders.resetAt = 0
+        self.data.launders.minutesLeft = 0
+    end
+
+    self.dataUpdated = true
+    self:d(' => dataUpdated')
+end -- MOD:OnFenceUpdate
+
+-- LABEL HANDLER
+
+function MOD:Update(options)
+    self:d('Update',options,self.data.sells)
+    local labelText = ''
+
+    -- show only one timer if both would show up
+    if(options.showSellsLeft and self.data.sells.left == 0 and options.showLaundersLeft and self.data.launders.left == 0)then
+        self.label:SetText(
+            MOD.Colorize(COLOR_AWEVS_HINT, GetString(SI_AWEMOD_FENCING_SELLS_LABEL) .. ' & ' .. GetString(SI_AWEMOD_FENCING_LAUNDERS_LABEL)) .. ': ' .. FormatTimeSeconds(60 * self.data.sells.minutesLeft, TIME_FORMAT_STYLE_DESCRIPTIVE_SHORT , TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR , TIME_FORMAT_DIRECTION_NONE)
+        )
+        return
+    end
+
+    -- show sells
+    if (options.showSellsLeft and self.data.sells.left <= options.sellsLeftInfo) then
+        if(self.data.sells.left == 0)then
+            labelText = MOD.Colorize(COLOR_AWEVS_HINT, GetString(SI_AWEMOD_FENCING_SELLS_LABEL)) .. ': ' .. FormatTimeSeconds(60 * self.data.sells.minutesLeft, TIME_FORMAT_STYLE_DESCRIPTIVE_SHORT , TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR , TIME_FORMAT_DIRECTION_NONE)
+        else
+            local color = (self.data.sells.left <= options.sellsLeftWarning) and COLOR_AWEVS_WARNING or COLOR_AWEVS_HINT
+            labelText = MOD.Colorize(color, GetString(SI_AWEMOD_FENCING_SELLS_LABEL)) .. ': ' .. self.data.sells.left
+        end
+    end
+
+    -- show launders
+    if (options.showLaundersLeft and self.data.launders.left <= options.laundersLeftInfo) then
+        if (labelText ~= '') then labelText = labelText .. MOD.Colorize(COLOR_AWEVS_HINT, ' || ') end
+        if(self.data.launders.left == 0)then
+            labelText = labelText .. MOD.Colorize(COLOR_AWEVS_HINT, GetString(SI_AWEMOD_FENCING_LAUNDERS_LABEL)) .. ': ' .. FormatTimeSeconds(60 * self.data.launders.minutesLeft, TIME_FORMAT_STYLE_DESCRIPTIVE_SHORT , TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR , TIME_FORMAT_DIRECTION_NONE)
+        else
+            local color = (self.data.launders.left <= options.laundersLeftWarning) and COLOR_AWEVS_WARNING or COLOR_AWEVS_HINT
+            labelText = labelText .. MOD.Colorize(color, GetString(SI_AWEMOD_FENCING_LAUNDERS_LABEL)) .. ': ' .. self.data.launders.left
+        end
+    end
+    self.label:SetText(labelText)
+end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents2/Modules/Inventory.lua b/AwesomeEvents2/Modules/Inventory.lua
new file mode 100644
index 0000000..9edf2af
--- /dev/null
+++ b/AwesomeEvents2/Modules/Inventory.lua
@@ -0,0 +1,227 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: Inventory.lua
+  Last Modified: 02.11.17 16:36
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+local MOD = libAM:New('inventory')
+
+MOD.title = GetString(SI_AWEMOD_INVENTORY)
+MOD.hint = GetString(SI_AWEMOD_INVENTORY_HINT)
+MOD.order = 60
+MOD.debug = false
+
+local LABEL_LOW = 1
+local LABEL_DETAILS = 2
+local LABEL_MONEY = 3
+
+MOD.label = {
+    [LABEL_LOW] = {},
+    [LABEL_DETAILS] = {},
+    [LABEL_MONEY] = {}
+}
+
+-- USER SETTINGS
+
+MOD.options = {
+    showLow = {
+        type = 'checkbox',
+        name = GetString(SI_AWEMOD_INVENTORY_LOW),
+        tooltip = GetString(SI_AWEMOD_INVENTORY_LOW_HINT),
+        default = true,
+        order = 1,
+    },
+    valueLowInfo = {
+        type = 'slider',
+        name = GetString(SI_AWEMOD_INVENTORY_LOW_INFO),
+        tooltip = GetString(SI_AWEMOD_INVENTORY_LOW_INFO_HINT),
+        min  = 1,
+        max = 60,
+        default = 20,
+        order = 2,
+    },
+    valueLowWarning = {
+        type = 'slider',
+        name = GetString(SI_AWEMOD_INVENTORY_LOW_WARNING),
+        tooltip = GetString(SI_AWEMOD_INVENTORY_LOW_WARNING_HINT),
+        min  = 1,
+        max = 40,
+        default = 10,
+        order = 3,
+    },
+    showDetails = {
+        type = 'checkbox',
+        name = GetString(SI_AWEMOD_INVENTORY_DETAILS),
+        tooltip = GetString(SI_AWEMOD_INVENTORY_DETAILS_HINT),
+        default = true,
+        order = 4,
+    },
+    showMoney = {
+        type = 'checkbox',
+        name = GetString(SI_AWEMOD_INVENTORY_MONEY),
+        tooltip = GetString(SI_AWEMOD_INVENTORY_MONEY_HINT),
+        default = true,
+        order = 5,
+    },
+}
+
+-- OVERRIDES
+
+function MOD:Enable(options)
+    self:d('Enable (in debug-mode)')
+    self.data = {
+        [BAG_BACKPACK] = {
+            numUsedSlots = 0,
+            numFreeSlots = 0,
+            numSlots = 0,
+            money = GetCurrentMoney(),
+        },
+        [BAG_BANK] = {
+            numUsedSlots = 0,
+            numFreeSlots = 0,
+            numSlots = 0,
+            money = GetBankedMoney(),
+        },
+    }
+    self:OnUpdateBag(BAG_BACKPACK,0)
+    self:OnUpdateBag(BAG_BANK,0)
+    self.dataUpdated = true
+end -- MOD:Enable
+
+function MOD:Set(key,value)
+    self:d('Set['..key..']',value)
+
+    if(key=='showLow')then
+        if(value)then
+            self:OnUpdateBag(BAG_BACKPACK,0)
+        else
+            self.label[LABEL_LOW]:SetText('')
+        end
+    elseif(key=='showDetails')then
+        if(value)then
+            self:OnUpdateBag(BAG_BACKPACK,0)
+            self:OnUpdateBag(BAG_BANK,0)
+        else
+            self.label[LABEL_DETAILS]:SetText('')
+        end
+    elseif(key=='showMoney')then
+        if(value)then
+            self.data[BAG_BACKPACK].money = GetCurrentMoney()
+            self.data[BAG_BANK].money = GetBankedMoney()
+        else
+            self.label[LABEL_MONEY]:SetText('')
+        end
+    else
+        self:OnUpdateBag(BAG_BACKPACK,0)
+        self:OnUpdateBag(BAG_BANK,0)
+    end
+    self.dataUpdated = true
+end -- MOD:Set
+
+-- EVENT LISTENER
+function MOD:GetEventListeners()
+    return {
+        {
+            eventCode = EVENT_INVENTORY_SINGLE_SLOT_UPDATE,
+            callback = function(eventCode, bagId, slotId, isNewItem, itemSoundCategory, inventoryUpdateReason, stackCountChange)
+                if(bagId == BAG_BACKPACK or bagId == BAG_BANK) then
+                    self:OnUpdateBag(bagId,stackCountChange)
+                end
+            end
+        },
+        {
+            eventCode = EVENT_INVENTORY_BAG_CAPACITY_CHANGED,
+            callback = function(eventCode, previousCapacity, currentCapacity, previousUpgrade, currentUpgrade)
+                self:d("EVENT_INVENTORY_BAG_CAPACITY_CHANGED: ", previousCapacity .. '=>' .. currentCapacity, previousUpgrade .. '=>' .. currentUpgrade)
+                self:OnUpdateBag(BAG_BACKPACK,previousCapacity-currentCapacity)
+            end
+        },
+        {
+            eventCode = EVENT_INVENTORY_BANK_CAPACITY_CHANGED,
+            callback = function(eventCode, previousCapacity, currentCapacity, previousUpgrade, currentUpgrade)
+                self:d("EVENT_INVENTORY_BANK_CAPACITY_CHANGED: ", previousCapacity .. '=>' .. currentCapacity, previousUpgrade .. '=>' .. currentUpgrade)
+                self:OnUpdateBag(BAG_BANK,previousCapacity-currentCapacity)
+            end
+        },
+        {
+            eventCode = EVENT_MONEY_UPDATE,
+            callback = function(eventCode, newMoney, oldMoney, reason)
+                self:d("EVENT_MONEY_UPDATE: ", oldMoney .. '=>' .. newMoney .. ' Reason: ' .. reason)
+                self.data[BAG_BACKPACK].money = newMoney
+                self.dataUpdated = true
+            end
+        },
+        {
+            eventCode = EVENT_BANKED_MONEY_UPDATE,
+            callback = function(eventCode, newBankedMoney, oldBankedMoney)
+                self:d("EVENT_BANKED_MONEY_UPDATE: ", oldBankedMoney .. '=>' .. newBankedMoney)
+                self.data[BAG_BANK].money = newBankedMoney
+                self.dataUpdated = true
+            end
+        }
+    }
+end -- MOD:GetEventListeners
+
+-- EVENT HANDLER
+
+function MOD:OnUpdateBag(bagId,stackCountChange)
+    local predicted = self.data[bagId].numFreeSlots - stackCountChange
+    local numFreeSlots, numUsedSlots, numSlots = GetNumBagFreeSlots(bagId),GetNumBagUsedSlots(bagId),GetBagSize(bagId)
+    -- eso+ bank fix
+    if(bagId==BAG_BANK and IsESOPlusSubscriber())then
+        numFreeSlots = numFreeSlots + GetNumBagFreeSlots(BAG_SUBSCRIBER_BANK)
+        numUsedSlots = numUsedSlots + GetNumBagUsedSlots(BAG_SUBSCRIBER_BANK)
+        numSlots = numSlots + GetBagSize(BAG_SUBSCRIBER_BANK)
+    end
+
+    if( numFreeSlots ~= self.data[bagId].numFreeSlots or numSlots ~= self.data[bagId].numSlots) then
+        self.data[bagId].numSlots = numSlots
+        self.data[bagId].numUsedSlots = numUsedSlots
+        self.data[bagId].numFreeSlots = numFreeSlots
+        self.dataUpdated = true
+        if(predicted ~= self.data[bagId].numFreeSlots)then
+            self:d(' => dataUpdated('..bagId..') Pred.: ' .. predicted .. ' / Act.:' .. self.data[bagId].numFreeSlots)
+        else
+            self:d(' => dataUpdated('..bagId..')')
+        end
+    end
+end -- MOD:OnUpdateBag
+
+-- LABEL HANDLER
+
+local function __MoneyInK(money)
+    return math.floor(money/100) / 10
+end
+
+function MOD:Update(options)
+    self:d('Update')
+
+    if(options.showLow)then
+        local labelText = ''
+        if (self.data[BAG_BACKPACK].numFreeSlots <= options.valueLowInfo) then
+            if (self.data[BAG_BACKPACK].numFreeSlots <= options.valueLowWarning) then
+                labelText = MOD.Colorize(COLOR_AWEVS_WARNING, zo_strformat(SI_AWEMOD_INVENTORY_LOW_LABEL, self.data[BAG_BACKPACK].numFreeSlots))
+            else
+                labelText = MOD.Colorize(COLOR_AWEVS_HINT, zo_strformat(SI_AWEMOD_INVENTORY_LOW_LABEL, self.data[BAG_BACKPACK].numFreeSlots))
+            end
+        end
+        self.label[LABEL_LOW]:SetText(labelText)
+    end
+
+    if(options.showDetails)then
+        self.label[LABEL_DETAILS]:SetText(zo_strformat(SI_AWEMOD_INVENTORY_DETAILS_LABEL,MOD.GetColorStr(COLOR_AWEVS_HINT),self.data[BAG_BACKPACK].numUsedSlots,self.data[BAG_BACKPACK].numSlots,self.data[BAG_BANK].numUsedSlots,self.data[BAG_BANK].numSlots))
+    end
+
+
+    if(options.showMoney)then
+        self.label[LABEL_MONEY]:SetText(MOD.Colorize(COLOR_AWEVS_AVAILABLE, zo_strformat(SI_AWEMOD_INVENTORY_MONEY_LABEL,__MoneyInK(self.data[BAG_BACKPACK].money),__MoneyInK(self.data[BAG_BANK].money))))
+    end
+end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents2/Modules/Mails.lua b/AwesomeEvents2/Modules/Mails.lua
new file mode 100644
index 0000000..1e81432
--- /dev/null
+++ b/AwesomeEvents2/Modules/Mails.lua
@@ -0,0 +1,68 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: Mails.lua
+  Last Modified: 02.11.17 16:36
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+local MOD = libAM:New('mails')
+
+MOD.title = GetString(SI_AWEMOD_MAILS)
+MOD.hint = GetString(SI_AWEMOD_MAILS_HINT)
+MOD.order = 15
+MOD.debug = false
+
+-- OVERRIDES
+
+-- USER SETTINGS
+
+-- OVERRIDES
+
+function MOD:Enable(options)
+    self:d('Enable (in debug-mode)')
+    self.data = {
+        numUnread = 0,
+    }
+    self:OnMailNumUnreadChanged(GetNumUnreadMail())
+    self.dataUpdated = true
+end
+
+-- EVENT LISTENER
+
+function MOD:GetEventListeners()
+    return {
+        {
+            eventCode = EVENT_MAIL_NUM_UNREAD_CHANGED,
+            callback = function(eventCode,numUnread) MOD:OnMailNumUnreadChanged(numUnread) end
+        }
+    }
+end
+
+-- EVENT HANDLER
+
+function MOD:OnMailNumUnreadChanged(numUnread)
+    self:d('OnMailNumUnreadChanged ' .. numUnread)
+    if( numUnread ~= self.data.numUnread ) then
+        self.data.numUnread = numUnread
+        self.dataUpdated = true
+        self:d(' => dataUpdated')
+    end
+end
+
+-- LABEL HANDLER
+
+function MOD:Update(options)
+    self:d('Update')
+    local labelText = ''
+    if (self.data.numUnread > 0) then
+        labelText = MOD.Colorize(COLOR_AWEVS_AVAILABLE, GetString(SI_AWEMOD_MAILS_LABEL)) .. ': ' .. self.data.numUnread
+    end
+    self.label:SetText(labelText)
+end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents2/Modules/Mount.lua b/AwesomeEvents2/Modules/Mount.lua
new file mode 100644
index 0000000..31bf97c
--- /dev/null
+++ b/AwesomeEvents2/Modules/Mount.lua
@@ -0,0 +1,124 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: Mount.lua
+  Last Modified: 02.11.17 16:36
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+local MOD = libAM:New('mount')
+
+MOD.title = GetString(SI_AWEMOD_MOUNT)
+MOD.hint = GetString(SI_AWEMOD_MOUNT_HINT)
+MOD.order = 30
+MOD.debug = false
+
+-- USER SETTINGS
+
+MOD.options = {
+    minutesLeftInfo = {
+        type = "slider",
+        name = GetString(SI_AWEMOD_MOUNT_TIMER),
+        tooltip = GetString(SI_AWEMOD_MOUNT_TIMER_HINT),
+        min  = 1,
+        max = 960,
+        default = 480,
+        order = 1,
+    },
+}
+
+-- OVERRIDES
+
+function MOD:Enable(options)
+    self:d('Enable (in debug-mode)')
+    self.data = {
+        hasTrainableMount = false,
+        availableAt = 1,
+        minutesLeft = 0
+    }
+    self.dataUpdated = true
+end
+
+-- EVENT LISTENER
+
+-- EVENT_ACTIVE_MOUNT_CHANGED (number eventCode)
+-- EVENT_RIDING_SKILL_IMPROVEMENT (integer eventCode,number ridingSkillType, number previous, number current, number source)
+-- EVENT_STABLE_INTERACT_END (number eventCode)
+-- EVENT_MOUNT_INFO_UPDATED (number eventCode)
+function MOD:GetEventListeners()
+    return {
+        {
+            eventCode = EVENT_AWESOME_MODULE_TIMER,
+            callback = function(eventCode, timestamp) return MOD:OnTimer(timestamp) end,
+        },
+        {
+            eventCode = EVENT_RIDING_SKILL_IMPROVEMENT,
+            callback = function(eventCode, ridingSkillType, previous, current, source) MOD:OnRidingSkillImprovement() end,
+        },
+    }
+end
+
+-- EVENT HANDLER
+
+function MOD:OnTimer(timestamp)
+    self:d('OnTimer')
+    if(self.data.availableAt > 0)then
+        if(timestamp >  self.data.availableAt)then
+            self:OnRidingSkillImprovement()
+            return
+        else
+            self.data.minutesLeft = math.ceil( GetDiffBetweenTimeStamps(self.data.availableAt, timestamp) / 60)
+            self.dataUpdated = true
+            self:d(' => dataUpdated')
+        end
+    else
+        self:StopTimer()
+    end
+end
+
+
+function MOD:OnRidingSkillImprovement()
+    self:d('OnRidingSkillImprovement')
+    self.data.availableAt = 0
+    self.data.minutesLeft = 0
+    local availableAt = GetTimeUntilCanBeTrained()
+    -- char has no mount
+    if(availableAt == nil) then
+        self.data.hasTrainableMount = false
+    else
+        local inventoryBonus, maxInventoryBonus, staminaBonus, maxStaminaBonus, speedBonus, maxSpeedBonus = GetRidingStats()
+        self.data.hasTrainableMount = not((inventoryBonus == maxInventoryBonus) and (staminaBonus == maxStaminaBonus) and (speedBonus == maxSpeedBonus))
+
+        if(self.data.hasTrainableMount and availableAt>0) then
+            self.data.availableAt = GetTimeStamp() + (availableAt / 1000)
+            self.data.minutesLeft = math.ceil( (availableAt / 1000) / 60)
+            self:StartTimer()
+        end
+    end
+
+    self.dataUpdated = true
+    self:d(' => dataUpdated')
+end -- MOD:OnFenceUpdate
+
+-- LABEL HANDLER
+
+function MOD:Update(options)
+    self:d('Update')
+    local labelText = ''
+    if (self.data.hasTrainableMount) then
+        if(self.data.availableAt > 0) then
+            if(self.data.minutesLeft <= options.minutesLeftInfo) then
+                labelText =MOD.Colorize(COLOR_AWEVS_HINT, GetString(SI_AWEMOD_MOUNT_TIMER_LABEL)) .. ': ' .. FormatTimeSeconds(60 * self.data.minutesLeft, TIME_FORMAT_STYLE_DESCRIPTIVE_SHORT , TIME_FORMAT_PRECISION_TWENTY_FOUR_HOUR , TIME_FORMAT_DIRECTION_NONE)
+            end
+        else
+            labelText = MOD.Colorize(COLOR_AWEVS_AVAILABLE, GetString(SI_AWEMOD_MOUNT_READY_LABEL))
+        end
+    end
+    self.label:SetText(labelText)
+end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents2/Modules/RepairKits.lua b/AwesomeEvents2/Modules/RepairKits.lua
new file mode 100644
index 0000000..698141b
--- /dev/null
+++ b/AwesomeEvents2/Modules/RepairKits.lua
@@ -0,0 +1,70 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: RepairKits.lua
+  Last Modified: 02.11.17 16:36
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+local MOD = libAM:New('repairkits')
+
+MOD.title = GetString(SI_AWEMOD_REPAIRKITS)
+MOD.hint = GetString(SI_AWEMOD_REPAIRKITS_HINT)
+MOD.order = 65
+MOD.debug = false
+
+-- MOD FUNCTIONS
+
+function MOD:ScanBag(bagId)
+    for slotId=1,GetBagSize(bagId) do
+        if IsItemRepairKit(bagId,slotId) then
+            local _,stackCount = GetItemInfo(bagId,slotId)
+            local tier = GetRepairKitTier(bagId,slotId)
+            self.data.details[tier] = (self.data.details[tier]==nil) and stackCount or self.data.details[tier] + stackCount
+            self.data.count = self.data.count + stackCount
+        end
+    end
+end
+
+-- OVERRIDES
+
+function MOD:Enable(options)
+    self:d('Enable (in debug-mode)')
+    self.data = { count = 0, details = {} }
+    self:ScanBag(BAG_BACKPACK)
+    self:ScanBag(BAG_VIRTUAL)
+    self.dataUpdated = true
+end -- MOD:Enable
+
+-- EVENT LISTENER
+
+function MOD:GetEventListeners()
+    return {
+        {
+            eventCode = EVENT_INVENTORY_SINGLE_SLOT_UPDATE,
+            callback = function(eventCode, bagId, slotId, isNewItem, itemSoundCategory, inventoryUpdateReason, stackCountChange)
+                if( (bagId == BAG_BACKPACK or bagId == BAG_VIRTUAL) and IsItemRepairKit(bagId,slotId))then
+                    self:d('EVENT_INVENTORY_SINGLE_SLOT_UPDATE',self.data.count,stackCountChange)
+                    self.data.count = self.data.count + stackCountChange
+                    self.dataUpdated = true
+                end
+            end
+        },
+    }
+end -- MOD:GetEventListeners
+
+-- EVENT HANDLER
+
+-- LABEL HANDLER
+
+
+function MOD:Update(options)
+    self:d('Update')
+    self.label:SetText(MOD.Colorize(COLOR_AWEVS_AVAILABLE, zo_strformat(SI_AWEMOD_REPAIRKITS_LABEL, self.data.count)))
+end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents2/Modules/Skills.lua b/AwesomeEvents2/Modules/Skills.lua
new file mode 100644
index 0000000..abb9f1f
--- /dev/null
+++ b/AwesomeEvents2/Modules/Skills.lua
@@ -0,0 +1,113 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: Skills.lua
+  Last Modified: 02.11.17 16:36
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+local MOD = libAM:New('skills')
+
+MOD.title = GetString(SI_AWEMOD_SKILLS)
+MOD.hint = GetString(SI_AWEMOD_SKILLS_HINT)
+MOD.order = 20
+MOD.debug = false
+
+local CHAMPION_ATTRIBUTES = { ATTRIBUTE_HEALTH, ATTRIBUTE_STAMINA, ATTRIBUTE_MAGICKA }
+
+-- USER SETTINGS
+
+-- OVERRIDES
+
+function MOD:Enable(options)
+    self:d('Enable (in debug-mode)')
+    self.data = {
+        attributes = 0,
+        championPoints = 0,
+        skills = 0,
+        hasUnspentPoints = false,
+    }
+    self:OnPointsChanged(0)
+    self.dataUpdated = true
+end
+
+-- EVENT LISTENER
+-- points (attribute- and skillpoints)
+-- EVENT_SKILL_POINTS_CHANGED (integer eventCode,number pointsBefore, number pointsNow, number partialPointsBefore, number partialPointsNow)
+-- EVENT_ATTRIBUTE_UPGRADE_UPDATED (number eventCode)
+-- EVENT_LEVEL_UPDATE (integer eventCode,string unitTag, number level)
+function MOD:GetEventListeners()
+    return {
+        {
+            eventCode = EVENT_SKILL_POINTS_CHANGED,
+            callback = function(eventCode, pointsBefore, pointsNow, partialPointsBefore, partialPointsNow)
+                self:d("EVENT_SKILL_POINTS_CHANGED: ", pointsBefore .. '=>' .. pointsNow, partialPointsBefore .. '=>' .. partialPointsNow)
+                MOD:OnPointsChanged(pointsNow-pointsBefore)
+            end
+        },
+        {
+            eventCode = EVENT_ATTRIBUTE_UPGRADE_UPDATED,
+            callback = function(eventCode)
+                self:d("EVENT_ATTRIBUTE_UPGRADE_UPDATED")
+                MOD:OnPointsChanged(0)
+            end
+        },
+        {
+            eventCode = EVENT_UNSPENT_CHAMPION_POINTS_CHANGED,
+            callback = function(eventCode)
+                self:d("EVENT_UNSPENT_CHAMPION_POINTS_CHANGED")
+                MOD:OnPointsChanged(0)
+            end
+        }
+}
+end -- MOD:GetEventListeners
+
+-- EVENT HANDLER
+
+function MOD:OnPointsChanged(numChanged)
+    self:d('OnSkillPointsChanged ' .. numChanged)
+    local attributes,skills,championPoints = GetAttributeUnspentPoints(),GetAvailableSkillPoints(),GetPlayerChampionPointsEarned()
+
+    for i=1,GetNumChampionDisciplines() do
+        championPoints = championPoints - GetNumPointsSpentInChampionDiscipline(i)
+    end
+    self:d(attributes,skills,championPoints)
+    if(championPoints<0) then championPoints = 0 end
+
+    if( attributes ~= self.data.attributes or championPoints ~= self.data.championPoints or skills ~= self.data.skills ) then
+        self.data.attributes = attributes
+        self.data.championPoints = championPoints
+        self.data.skills = skills
+        self.data.hasUnspentPoints = ( attributes + championPoints + skills ) > 0
+
+        self.dataUpdated = true
+        self:d(' => dataUpdated')
+    end
+end -- MOD:OnPointsChanged
+
+-- LABEL HANDLER
+
+function MOD:Update(options)
+    self:d('Update')
+    local labelText = ''
+    if (self.data.hasUnspentPoints) then
+        if (self.data.attributes > 0) then
+            labelText = MOD.Colorize(COLOR_AWEVS_AVAILABLE, GetString(SI_AWEMOD_SKILLS_ATTRIBUTES_LABEL)) .. ': ' .. self.data.attributes
+        end
+        if (self.data.skills > 0) then
+            if(labelText~='')then labelText = labelText .. MOD.Colorize(COLOR_AWEVS_AVAILABLE, ' || ') end
+            labelText = labelText .. MOD.Colorize(COLOR_AWEVS_AVAILABLE, GetString(SI_AWEMOD_SKILLS_SKILLS_LABEL)) .. ': ' .. self.data.skills
+        end
+        if (self.data.championPoints > 0) then
+            if(labelText~='')then labelText = labelText .. MOD.Colorize(COLOR_AWEVS_AVAILABLE, ' || ') end
+            labelText = labelText .. MOD.Colorize(COLOR_AWEVS_AVAILABLE, GetString(SI_AWEMOD_SKILLS_CHAMPIONPOINTS_LABEL)) .. ': ' .. self.data.championPoints
+        end
+    end
+    self.label:SetText(labelText)
+end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents2/Modules/SkyShards.lua b/AwesomeEvents2/Modules/SkyShards.lua
new file mode 100644
index 0000000..912aebd
--- /dev/null
+++ b/AwesomeEvents2/Modules/SkyShards.lua
@@ -0,0 +1,82 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: SkyShards.lua
+  Last Modified: 02.11.17 16:36
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+local MOD = libAM:New('skyshards')
+
+MOD.title = GetString(SI_AWEMOD_SKYSHARDS)
+MOD.hint = GetString(SI_AWEMOD_SKYSHARDS_HINT)
+MOD.order = 25
+MOD.debug = false
+
+-- OVERRIDES
+
+-- USER SETTINGS
+
+MOD.options = {
+    shardsLeftInfo = {
+        type = 'slider',
+        name = GetString(SI_AWEMOD_SKYSHARDS_REMAINING),
+        tooltip = GetString(SI_AWEMOD_SKYSHARDS_REMAINING_HINT),
+        min  = 1,
+        max = 3,
+        default = 1,
+        order = 1,
+    },
+}
+
+-- OVERRIDES
+
+function MOD:Enable(options)
+    self:d('Enable (in debug-mode)')
+    self.data = {
+        shardsLeft = 0,
+    }
+    self:OnAchievementUpdate(0)
+    self.dataUpdated = true
+end
+
+-- EVENT LISTENER
+
+function MOD:GetEventListeners()
+    return {
+        {
+            eventCode = EVENT_ACHIEVEMENT_UPDATED,
+            callback = function(eventCode,id) MOD:OnAchievementUpdate(id) end
+        }
+    }
+end
+
+-- EVENT HANDLER
+
+function MOD:OnAchievementUpdate(id)
+    self:d('OnAchievementUpdate ' .. id)
+    local shardsLeft = 3-GetNumSkyShards()
+    if( shardsLeft ~= self.data.shardsLeft ) then
+        self.data.shardsLeft = shardsLeft
+        self.dataUpdated = true
+        self:d(' => dataUpdated')
+    end
+end
+
+-- LABEL HANDLER
+
+function MOD:Update(options)
+    self:d('Update')
+    local labelText = ''
+    if (self.data.shardsLeft <= options.shardsLeftInfo) then
+        local color = (self.data.shardsLeft == 1) and COLOR_AWEVS_AVAILABLE or COLOR_AWEVS_HINT
+        labelText = MOD.Colorize(color, GetString(SI_AWEMOD_SKYSHARDS_REMAINING_LABEL)) .. ': ' .. self.data.shardsLeft
+    end
+    self.label:SetText(labelText)
+end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents2/Modules/SoulGems.lua b/AwesomeEvents2/Modules/SoulGems.lua
new file mode 100644
index 0000000..0a6c33d
--- /dev/null
+++ b/AwesomeEvents2/Modules/SoulGems.lua
@@ -0,0 +1,89 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: SoulGems.lua
+  Last Modified: 02.11.17 16:36
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+local MOD = libAM:New('soulgems')
+
+MOD.title = GetString(SI_AWEMOD_SOULGEMS)
+MOD.hint = GetString(SI_AWEMOD_SOULGEMS_HINT)
+MOD.order = 65
+MOD.debug = false
+
+-- MOD FUNCTIONS
+
+local function __ScanBag(bagId)
+    local empty,filled = 0,0
+    for slotId=1,GetBagSize(bagId) do
+        if(IsItemSoulGem(SOUL_GEM_TYPE_EMPTY,bagId,slotId)) then
+            local _,stackCount = GetItemInfo(bagId,slotId)
+            empty = empty + stackCount
+        elseif(IsItemSoulGem(SOUL_GEM_TYPE_FILLED,bagId,slotId)) then
+            local _,stackCount = GetItemInfo(bagId,slotId)
+            filled = filled + stackCount
+        end
+    end
+    return empty,filled
+end
+
+-- OVERRIDES
+
+function MOD:Enable(options)
+    self:d('Enable (in debug-mode)')
+    self.data = {
+        numFilled = 0,
+        numEmpty = 0,
+    }
+    self:OnChangeSoulGemCount()
+    self.dataUpdated = true
+end -- MOD:Enable
+
+-- EVENT LISTENER
+function MOD:GetEventListeners()
+    return {
+        {
+            eventCode = EVENT_INVENTORY_SINGLE_SLOT_UPDATE,
+            callback = function(eventCode, bagId, slotId, isNewItem, itemSoundCategory, inventoryUpdateReason, stackCountChange)
+                if(bagId == BAG_BACKPACK and ( IsItemSoulGem(SOUL_GEM_TYPE_FILLED,bagId,slotId) or IsItemSoulGem(SOUL_GEM_TYPE_EMPTY,bagId,slotId)))then
+                    self:OnChangeSoulGemCount()
+                end
+            end
+        },
+    }
+end -- MOD:GetEventListeners
+
+-- EVENT HANDLER
+
+function MOD:OnChangeSoulGemCount()
+    self:d('OnChangeSoulGemCount')
+    local empty,filled = __ScanBag(BAG_BACKPACK)
+    local emptyV,filledV = __ScanBag(BAG_VIRTUAL)
+
+    filled = filled + filledV
+    empty = empty + emptyV
+
+    if(self.data.numFilled ~= filled or self.data.numEmpty ~= empty)then
+        self.data.numFilled = filled
+        self.data.numEmpty = empty
+        self.dataUpdated = true
+        self:d(' => dataUpdated')
+    end
+
+end -- MOD:OnChangeSoulGemCount
+
+-- LABEL HANDLER
+
+
+function MOD:Update(options)
+    self:d('Update')
+    self.label:SetText(MOD.Colorize(COLOR_AWEVS_AVAILABLE, zo_strformat(SI_AWEMOD_SOULGEMS_LABEL, self.data.numFilled, self.data.numEmpty)))
+end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents2/Modules/WeaponCharge.lua b/AwesomeEvents2/Modules/WeaponCharge.lua
new file mode 100644
index 0000000..f37d3f2
--- /dev/null
+++ b/AwesomeEvents2/Modules/WeaponCharge.lua
@@ -0,0 +1,152 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: WeaponCharge.lua
+  Last Modified: 02.11.17 16:36
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-2.0')
+local MOD = libAM:New('weaponcharge')
+
+MOD.title = GetString(SI_AWEMOD_WEAPONCHARGE)
+MOD.hint = GetString(SI_AWEMOD_WEAPONCHARGE_HINT)
+MOD.order = 55
+MOD.debug = false
+
+-- OVERRIDES
+
+-- USER SETTINGS
+
+MOD.options = {
+    valueLowInfo = {
+        type = 'slider',
+        name = GetString(SI_AWEMOD_WEAPONCHARGE_INFO),
+        tooltip = GetString(SI_AWEMOD_WEAPONCHARGE_INFO_HINT),
+        min  = 1,
+        max = 60,
+        default = 50,
+        order = 1,
+    },
+    valueLowWarning = {
+        type = 'slider',
+        name = GetString(SI_AWEMOD_WEAPONCHARGE_WARNING),
+        tooltip = GetString(SI_AWEMOD_WEAPONCHARGE_WARNING_HINT),
+        min  = 1,
+        max = 40,
+        default = 25,
+        order = 2,
+    },
+}
+MOD.fontSize = 4
+
+-- OVERRIDES
+
+function MOD:Enable(options)
+    self:d('Enable (in debug-mode)')
+    self.data = {
+        minimumValue = 100,
+        slotId = 0,
+    }
+    self:OnInventorySingleSlotUpdate(0)
+    self.dataUpdated = true
+end
+
+-- EVENT LISTENER
+
+-- test if slotId is a weapon slot
+local function isWeaponSlot(slotId)
+	if(slotId == nil or slotId == 0)then
+		return false
+	end
+	local weaponSlots = { 4, 5, 20, 21 }
+	for i,_slotId in ipairs(weaponSlots) do
+		if(slotId == _slotId)then
+			return true
+		end
+	end
+	return false
+end -- isWeaponSlot
+
+function MOD:GetEventListeners()
+    return {
+        {
+            eventCode = EVENT_INVENTORY_SINGLE_SLOT_UPDATE,
+            callback = function(eventCode, bagId, slotId, isNewItem, itemSoundCategory, inventoryUpdateReason, stackCountChange)
+				if(bagId == BAG_WORN and isWeaponSlot(slotId))then
+					if(inventoryUpdateReason == INVENTORY_UPDATE_REASON_DEFAULT or inventoryUpdateReason == INVENTORY_UPDATE_REASON_ITEM_CHARGE) then
+						MOD:OnInventorySingleSlotUpdate(slotId)
+					end
+				end
+            end,
+        }
+    }
+end -- MOD:GetEventListeners
+
+
+-- EVENT HANDLER
+-- Weapon charge alerts
+-- Item IDs are 4 & 5 for main weapon set, 20 & 21 for alternate set.
+function MOD:OnInventorySingleSlotUpdate(slotId)
+    self:d('OnInventorySingleSlotUpdate: '..slotId)
+
+    -- use slotId if not nil for single slot update
+	if(isWeaponSlot(slotId) and IsItemChargeable(BAG_WORN, slotId))then
+		local charges, maxCharges = GetChargeInfoForItem(BAG_WORN, slotId)
+		local relativeCharge = math.floor(100 * charges / maxCharges)
+		if(relativeCharge <= self.data.minimumValue) then
+			self.data.slotId = slotId
+			self.data.minimumValue = relativeCharge
+			self.dataUpdated = true
+			self:d(' => dataUpdated (single)')
+			return
+		else
+			slotId = 0
+		end
+	end
+
+	-- recheck all slots
+    local lowestChargeSlotId = 0
+    local lowestRelativeCharge = 100
+	if(slotId == nil or slotId == 0)then
+		local weaponSlotTable = { 4, 5, 20, 21 }
+		local i,v
+		for i,_slotId in ipairs(weaponSlotTable) do
+			if(IsItemChargeable(BAG_WORN, _slotId))then
+				local charges, maxCharges = GetChargeInfoForItem(BAG_WORN, _slotId)
+				local relativeCharge = math.floor(100 * charges / maxCharges)
+				if (relativeCharge < lowestRelativeCharge) then
+					lowestRelativeCharge = relativeCharge
+					lowestChargeSlotId = _slotId
+				end
+			end
+		end
+	end
+    self:d(' => old: '..self.data.minimumValue .. '% (Item:'..self.data.slotId..')')
+    self:d(' => new: '..lowestRelativeCharge .. '% (Item:'..lowestChargeSlotId..')')
+
+    if(lowestChargeSlotId ~= self.data.slotId or lowestRelativeCharge ~= self.data.minimumValue)then
+        self.data.minimumValue = lowestRelativeCharge
+        self.data.slotId = lowestChargeSlotId
+        self.dataUpdated = true
+        self:d(' => dataUpdated')
+    end
+end -- MOD:OnInventorySingleSlotUpdate
+
+-- LABEL HANDLER
+
+function MOD:Update(options)
+    self:d('Update')
+    local labelText = ''
+    if (self.data.minimumValue <= options.valueLowInfo) then
+		local weaponSet = (self.data.slotId<6) and '1' or '2'
+		local color = (self.data.minimumValue <= options.valueLowWarning) and COLOR_AWEVS_WARNING or COLOR_AWEVS_HINT
+        labelText = MOD.Colorize(color, zo_strformat(SI_TOOLTIP_ITEM_NAME, GetItemName(BAG_WORN, self.data.slotId))) .. ': ' .. self.data.minimumValue .. '%' .. ' (' .. weaponSet .. '. ' .. GetString(SI_AWEMOD_WEAPONCHARGE_SET_LABEL) .. ')'
+    end
+    self.label:SetText(labelText)
+end -- MOD:Update
\ No newline at end of file
diff --git a/AwesomeEvents2/README b/AwesomeEvents2/README
new file mode 100644
index 0000000..bca3324
--- /dev/null
+++ b/AwesomeEvents2/README
@@ -0,0 +1,97 @@
+--------------------------
+--    AwesomeEvents     --
+--------------------------
+
+--[ EN ]--
+
+This AddOn was made by Ze_Mi <zemi@unive.de>.
+Updates at: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
+
+This AddOn is a modularzied, event-based, better configurable reinvention of AwesomeInfo addon from CrazyDutchGuy.
+My goal was to minimize timed refreshs and try to use as many event callbacks as possible, as well as split up the different notifications into seperate module files.
+Besides the look and feel, under the hood, there aren't many codelines left from AwesomeInfo.
+
+--[ DE ]--
+
+Dieses AddOn wurde erstellt von Ze_Mi <zemi@unive.de>.
+Updates unter: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
+
+Dieses AddOn ist eine modularizierte, eventbasierte und noch besser prsonalisierbare Neuentwicklung des AwesomeInfo Addons von CrazyDutchGuy.
+Mein Ziel dabei war es, weniger inertval basierte Aktualisierungen auszuführen und stattdessen auf Events zu reagieren. Außerdem wurden die verschiedenen Benachrichtigungen in
+eigene Module ausgelagert, was die Entwicklung von Modulen übersichtlicher und einfacher macht.
+Abgesehen von dem ursprünglichen look and feel hat sich unter der Haube so viel verändert, dass nicht mehr viele Codezeilen aus AwesoneInfo übrig geblieben sind.
+
+
+--------------------------
+--   LibAwesomeModule   --
+--------------------------
+
+--[ EN ]--
+
+This Library was made by Ze_Mi <zemi@unive.de>.
+
+Hereby I introduce LibAwesomeModule-2.0, a library that allows you to easily add new modules and notifications to AwesomeEvents.
+If you are interested in writing new modules, please have a look inside the Module folder of this addon.
+You don't have to care about layout and settings stuff, just write the minimal necessary code with maximum useability.
+
+--[ DE ]--
+
+Diese Bibliothek wurde erstellt von Ze_Mi <zemi@unive.de>.
+
+Hiermit stelle ich die neue Bibliothek LibAwesomeModule vor, eine Bibliothek mit deren Hilfe man super schnell und ohne viel Aufwand neue Benachrichtigungen in AwesomeEvents hinzufügen kann.
+Wenn du wissen möchtest, wie du neue Module hinzufügst, schau dir die Dateien im Ordner Modules an.
+Du musst dich nicht um lästige Label-Erstellungen/-Positionierung oder Einstellungen kümmern, schreibe einfach den minimal nötigen Code mit maximalem Nutzen.
+
+
+--------------------------
+--      CREDITS         --
+--------------------------
+
+--[ EN ]--
+
+Thanks to CrazyDutchGuy, Stormknight and RibbedStoic for their great AwesomeInfo AddOn!
+(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
+
+Thanks to @MissMarsupial for beta testing my AddOn.
+
+Thanks to esoui.com and all authors for maintaining the wiki and doing the job ZeniMax Media Inc is suposed to do ;)
+
+--[ DE ]--
+
+Mein Dank geht an CrazyDutchGuy, Stormknight und RibbedStoic für ihr großartiges AwesomeInfo AddOn!
+(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
+
+Danke an @MissMarsupial für das testen der Beta-Versionen meines AddOns.
+
+Danke an esoui.com und allen Authoren die an der Wiki arbeiten und diese aktuell halten und damit einen Dienst übernehmen für den sich ZeniMax Media Inc zu schön ist ;)
+
+--------------------------
+--      LICENSE         --
+--------------------------
+
+This software is under : CreativeCommons CC BY-NC-SA 4.0
+Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+You are free to:
+
+    Share — copy and redistribute the material in any medium or format
+    Adapt — remix, transform, and build upon the material
+    The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+
+Under the following terms:
+
+    Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
+    NonCommercial — You may not use the material for commercial purposes.
+    ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
+    No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
+
+
+Please read full licence at :
+http://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
+
+This Add-on is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates.
+The Elder Scrolls® and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries.
+All rights reserved.
+
+You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
\ No newline at end of file
diff --git a/AwesomeEvents2Mod/AwesomeEventsMod.lua b/AwesomeEvents2Mod/AwesomeEventsMod.lua
new file mode 100644
index 0000000..c61627a
--- /dev/null
+++ b/AwesomeEvents2Mod/AwesomeEventsMod.lua
@@ -0,0 +1,154 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: AwesomeEventsMod.lua
+  Last Modified: 18.02.18 08:40
+
+  Copyright (c) 2018 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local libAM = LibStub('LibAwesomeModule-1.0')
+local MOD = libAM:New('balancing')
+
+-- title: header in settings menu
+MOD.title = GetString(SI_AWEMOD_BALANCING)
+-- hint: tootltip at module show/hide toggle in settings menu
+MOD.hint = GetString(SI_AWEMOD_BALANCING_HINT)
+-- order: default in the middle order = 40, at bottom ORDER_AWESOME_MODULE_PUSH_NOTIFICATION = 75
+MOD.order = ORDER_AWESOME_MODULE_PUSH_NOTIFICATION
+-- enable debugging ingame via /aedebug balancing on
+-- disable debugging ingame via /aedebug balancing off
+-- show debugging state ingame via /aedebug balancing
+MOD.debug = false
+
+
+-- USER SETTINGS
+
+MOD.options = {
+    showSessionTotal = {
+        type = 'checkbox',
+        name = GetString(SI_AWEMOD_BALANCING_TOTAL),
+        tooltip = GetString(SI_AWEMOD_BALANCING_TOTAL_HINT),
+        default = true,
+        order = 1,
+    },
+    secondsFadeOut = {
+        type = 'slider',
+        name = GetString(SI_AWEMOD_BALANCING_TIMER),
+        tooltip = GetString(SI_AWEMOD_BALANCING_TIMER_HINT),
+        min  = 10,
+        max = 120,
+        default = 30,
+        order = 2,
+    },
+}
+-- fontSie: default = 1, max = 5
+MOD.fontSize = 5
+
+-- OVERRIDES
+
+function MOD:Enable(options)
+    self:d('Enable')
+    self.data = {
+        total = 0,
+        last = 0,
+        secondsFadeOut = options.secondsFadeOut,
+        storeOpened = false,
+        visible = false
+    }
+end
+
+function MOD:Set(key,value)
+    self:d('Set[' .. key .. '] ', value)
+    if(key=='secondsFadeOut')then
+        self.data.secondsFadeOut = value
+    end
+end
+
+-- EVENT LISTENER
+-- EVENT_MONEY_UPDATE (integer eventCode,number newMoney,number oldMoney,number reason)
+function MOD:GetEventListeners()
+    return {
+        {
+            eventCode = EVENT_AWESOME_MODULE_TIMER,
+            callback = function(eventCode, timestamp) return MOD:OnTimer(timestamp) end,
+        },
+        {
+            eventCode = EVENT_OPEN_STORE,
+            callback = function(eventCode)
+                MOD.data.last = 0
+                MOD.data.storeOpened = true
+            end,
+        },
+        {
+            eventCode = EVENT_OPEN_FENCE,
+            callback = function(eventCode)
+                MOD.data.last = 0
+                MOD.data.storeOpened = true
+            end,
+        },
+        {
+            eventCode = EVENT_MONEY_UPDATE,
+            callback = function(eventCode,newMoney,oldMoney,reason)
+                self:d('EVENT_MONEY_UPDATE[reason] = ' .. reason)
+                if(MOD.data.storeOpened)then
+                    MOD.data.last = MOD.data.last + (newMoney-oldMoney)
+                end
+            end,
+        },
+        {
+            eventCode = EVENT_CLOSE_STORE,
+            callback = function(eventCode)
+                if(MOD.data.storeOpened)then
+                    MOD:OnCloseStore()
+                end
+            end,
+        },
+    }
+end
+
+-- EVENT HANDLER
+
+function MOD:OnTimer(timestamp)
+    self:d('OnTimer')
+    self.data.visible = false
+    self.dataUpdated = true
+    self:d(' => dataUpdated')
+    -- return the number of seconds when your timer should be executed the next time
+    -- return nothing (nil) to execute the timer every full minute
+    -- return 0 is equal to calling self:StopTimer()
+    return 0
+end
+
+function MOD:OnCloseStore()
+    self:d('OnCloseStore')
+    self.data.storeOpened = false
+
+    self.data.total = self.data.total + self.data.last
+    self.data.visible = true
+	self:StartTimer(self.data.secondsFadeOut)
+
+    self.dataUpdated = true
+    self:d(' => dataUpdated')
+end -- MOD:OnFenceUpdate
+
+-- LABEL HANDLER
+
+function MOD:Update(options)
+    self:d('Update')
+    local labelText = ''
+    if(self.data.visible)then
+        local bilance = self.data.last
+        if (options.showSessionTotal) then
+            bilance = self.data.total
+        end
+        local color = (bilance >= 0) and COLOR_AWEVS_AVAILABLE or COLOR_AWEVS_WARNING
+        labelText = MOD.Colorize(color, GetString(SI_AWEMOD_BALANCING_LABEL)) .. ': ' ..bilance
+    end
+
+    self.label:SetText(labelText)
+end -- MOD:Update
diff --git a/AwesomeEvents2Mod/AwesomeEventsMod.txt b/AwesomeEvents2Mod/AwesomeEventsMod.txt
new file mode 100644
index 0000000..eb7442d
--- /dev/null
+++ b/AwesomeEvents2Mod/AwesomeEventsMod.txt
@@ -0,0 +1,20 @@
+## APIVersion: 100022
+## Version: 1.3-RC2
+## Title: |cFFFFB0Awesome Module - Balancing|r
+## Description: This addon is a balancing plugin to show you how to add new modules and notifications to the AwesomeEvents AddOn. (Version: 1.3-RC2)
+## Author: Ze_Mi
+## OptionalDependsOn: LibStub, LibAwesomeModule-1.0
+##
+## This Add-on is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates.
+## The Elder Scrolls® and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries.
+## All rights reserved
+##
+## You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
+
+Libs/LibStub/LibStub.lua
+Libs/LibAwesomeModule-1.0/LibAwesomeModule-1.0.lua
+
+Language/strings.lua
+Language/$(language).lua
+
+AwesomeEventsMod.lua
\ No newline at end of file
diff --git a/AwesomeEvents2Mod/Language/de.lua b/AwesomeEvents2Mod/Language/de.lua
new file mode 100644
index 0000000..139e364
--- /dev/null
+++ b/AwesomeEvents2Mod/Language/de.lua
@@ -0,0 +1,21 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: de.lua
+  Last Modified: 24.06.17 17:57
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+--module-balancing
+SafeAddString(SI_AWEMOD_BALANCING, "Bilanzierung", 1)
+SafeAddString(SI_AWEMOD_BALANCING_HINT, "Erhalte eine Benachrichtigung über deine Einkommensbilanz nach dem du einen Händler besucht hast.", 1)
+SafeAddString(SI_AWEMOD_BALANCING_TOTAL, "Summe anzeigen", 1)
+SafeAddString(SI_AWEMOD_BALANCING_TOTAL_HINT, "Zeige die Bilanzsumme aller Händler besuche der aktuellen Sitzung an anstatt die letzte Bilanz.", 1)
+SafeAddString(SI_AWEMOD_BALANCING_TIMER, "Ausblenden nach (sekunden)", 1)
+SafeAddString(SI_AWEMOD_BALANCING_TIMER_HINT,"Die Benachrichtigung wird nach der hier eingestellten Anzahl an Sekunden ausgeblendet.", 1)
+SafeAddString(SI_AWEMOD_BALANCING_LABEL, "Bilanz", 1)
\ No newline at end of file
diff --git a/AwesomeEvents2Mod/Language/ru.lua b/AwesomeEvents2Mod/Language/ru.lua
new file mode 100644
index 0000000..75f143f
--- /dev/null
+++ b/AwesomeEvents2Mod/Language/ru.lua
@@ -0,0 +1,26 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: Memoraike
+  Filename: ru.lua
+  Last Modified: 25.06.17 15:13
+
+  Copyright (c) 2017 by Memoraike
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  Пожалуйста, прочтите README файл для дополнительной информации.
+  ]]
+
+---
+--- Translated by: Memoraike <http://www.esoui.com/forums/member.php?u=32546>
+---
+
+--module-balancing
+SafeAddString(SI_AWEMOD_BALANCING, "Кол-во золота", 1)
+SafeAddString(SI_AWEMOD_BALANCING_HINT, "Получить уведомление об изменении кол-ва золота после посещения торговца.", 1)
+SafeAddString(SI_AWEMOD_BALANCING_TOTAL, "Показать итог", 1)
+SafeAddString(SI_AWEMOD_BALANCING_TOTAL_HINT, "Показать всю выручку с продаж, вместо последней разовой продажи.", 1)
+SafeAddString(SI_AWEMOD_BALANCING_TIMER, "Исчезновение (секунды)", 1)
+SafeAddString(SI_AWEMOD_BALANCING_TIMER_HINT,"Укажите время в секундах, после которого уведомление будет удалено с экрана.", 1)
+SafeAddString(SI_AWEMOD_BALANCING_LABEL, "Кол-во золота", 1)
\ No newline at end of file
diff --git a/AwesomeEvents2Mod/Language/strings.lua b/AwesomeEvents2Mod/Language/strings.lua
new file mode 100644
index 0000000..9710e81
--- /dev/null
+++ b/AwesomeEvents2Mod/Language/strings.lua
@@ -0,0 +1,28 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: strings.lua
+  Last Modified: 25.06.17 15:11
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local strings = {
+	--module-bagspace
+	SI_AWEMOD_BALANCING="Balancing",
+	SI_AWEMOD_BALANCING_HINT="Get a notification of your income bilance after visiting a vendor.",
+	SI_AWEMOD_BALANCING_TOTAL="Show total",
+	SI_AWEMOD_BALANCING_TOTAL_HINT="Show the currents session total bilance instead of the last bilance.",
+	SI_AWEMOD_BALANCING_TIMER="Fade out (seconds)",
+	SI_AWEMOD_BALANCING_TIMER_HINT="Set the time in seconds until this notification will be removed.",
+	SI_AWEMOD_BALANCING_LABEL="Balance",
+}
+
+for stringId, stringValue in pairs(strings) do
+   ZO_CreateStringId(stringId, stringValue)
+   SafeAddVersion(stringId, 1)
+end
diff --git a/AwesomeEvents2Mod/Libs/LibAwesomeModule-1.0/LibAwesomeModule-1.0.lua b/AwesomeEvents2Mod/Libs/LibAwesomeModule-1.0/LibAwesomeModule-1.0.lua
new file mode 100644
index 0000000..b69a54b
--- /dev/null
+++ b/AwesomeEvents2Mod/Libs/LibAwesomeModule-1.0/LibAwesomeModule-1.0.lua
@@ -0,0 +1,400 @@
+--[[
+  This file is part of Awesome Events.
+
+  Author: @Ze_Mi <zemi@unive.de>
+  Filename: LibAwesomeModule-1.0.lua
+  Last Modified: 23.04.18 14:56
+
+  Copyright (c) 2017 by Martin Unkel
+  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+  Please read the README file for further information.
+  ]]
+
+local MAJOR, MINOR = 'LibAwesomeModule-1.0', 8
+local libAM, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
+if not libAM then return end
+
+EVENT_AWESOME_MODULE_TIMER = 1
+ORDER_AWESOME_MODULE_PUSH_NOTIFICATION = 75
+
+COLOR_AWEVS_AVAILABLE = 1
+COLOR_AWEVS_HINT = 2
+COLOR_AWEVS_WARNING = 3
+
+ENABLED_AWEVS_NONE = 0
+ENABLED_AWEVS_ICON_AND_TEXT = 1
+ENABLED_AWEVS_ICON_ONLY = 2
+ENABLED_AWEVS_TEXT_ONLY = 3
+
+local colorDefs = { [COLOR_AWEVS_AVAILABLE]=nil,[COLOR_AWEVS_HINT]=nil,[COLOR_AWEVS_WARNING]=nil}
+
+libAM.version = MINOR
+libAM.labelToMod = {}
+libAM.timer = {}
+libAM.debug = false
+libAM.logCallback = nil
+libAM.log = {}
+
+local function __boolToStr(value)
+    if(value)then
+        return 'true'
+    else
+        return 'false'
+    end
+end
+
+local function __tostring(object,level)
+    local lvlPrefix = ''
+    if(level~=nil)then
+        lvlPrefix = string.rep('--',level)
+    end
+    local str=''
+    if(type(object) == 'table')then
+        if(level==nil)then
+            for i in ipairs(object)do
+                if(i==1)then
+                    str = str .. __tostring(object[i],1)
+                else
+                    str = str .. '> ' .. __tostring(object[i],1)
+                end
+            end
+        else
+            str = 'Table\n'
+            for key,value in pairs(object)do
+                str = str .. lvlPrefix .. '> .' .. key .. ' = ' .. __tostring(value,level+1)
+            end
+        end
+    elseif(type(object) == 'number')then
+        str = tostring(object)
+    elseif(type(object) == 'boolean')then
+        str = __boolToStr(object)
+    elseif(type(object) == 'string')then
+        str = object
+    else
+        str = type(object)
+    end
+    return str..'\n'
+end
+
+function libAM.d(...)
+    if(not libAM.debug)then return end
+    local args = {... }
+
+    local str = ''
+    if(args[1] ~= nil and type(args[1])=="string")then
+        args[1] = '|cD4CD82[|c82D482' .. args[1] .. '|cD4CD82]|cFFFFFF '
+        if(type(args[2])=="string")then
+            args[1] = args[1] .. ' ' .. args[2]
+            table.remove(args,2)
+        end
+        if(#args==1)then
+            str = args[1]
+        end
+    end
+    if(str=='')then
+        str=__tostring(args)
+    end
+    if(libAM.logCallback == nil)then
+        table.insert(libAM.log,str)
+    else
+        libAM.logCallback(str)
+    end
+end
+
+
+function libAM.SetColorDef(type,r,g,b)
+    if(colorDefs[type]==nil)then
+        colorDefs[type] = ZO_ColorDef:New(r,g,b)
+    else
+        colorDefs[type]:SetRGB(r,g,b)
+    end
+end
+
+local __labelIndex = 3 -- synchronous to ui-child-index
+local function __getNextLabelId()
+    local id = __labelIndex
+    __labelIndex = id + 1
+    return id
+end
+
+function libAM:CreateLabel( templateName, parentControl, previousControl, mod_id )
+    local labelId = __getNextLabelId()
+    self.labelToMod[labelId] = mod_id
+    local label = CreateControlFromVirtual('AwesomeModuleLabel' .. labelId , parentControl, templateName)
+    if( previousControl == nil) then
+        label:SetAnchor( TOP, parentControl, TOP, 0, 0)
+    else
+        label:SetAnchor( TOP, previousControl, BOTTOM, 0, 0)
+    end
+    return label
+end
+
+local function __genOrderedIndex( options )
+    local orderToKeyMap,orderedNumbers,orderedIndex = {},{},{}
+    for key,option in pairs(options) do
+        local order = (option.order or 40) * 100
+        while(orderToKeyMap[order]~=nil)do
+            order = order + 1
+        end
+        orderToKeyMap[order] = key
+        table.insert( orderedNumbers, order )
+    end
+    table.sort( orderedNumbers )
+    for i,order in ipairs(orderedNumbers) do
+        table.insert( orderedIndex, orderToKeyMap[order] )
+    end
+    return orderedIndex
+end
+
+local function __getNextElement(t, state)
+
+    -- Equivalent of the next function, but returns the keys in the alphabetic order
+    local key = nil
+    --d("orderedNext: state = "..tostring(state) )
+    if state == nil then
+        -- the first time, generate the index
+        key = t.__orderedIndex[1]
+    else
+        -- fetch the next value
+        for i = 1,table.getn(t.__orderedIndex) do
+            if t.__orderedIndex[i] == state then
+                key = t.__orderedIndex[i+1]
+            end
+        end
+    end
+
+    if key then
+        return key, t[key]
+    end
+
+    -- no more value to return, cleanup
+    t.__orderedIndex = nil
+    return
+end
+
+-- Mod Constructor
+
+function libAM:New(uniqueId)
+    self.modules = self.modules or {}
+    if(uniqueId==nil or self.modules[uniqueId]~=nil)then
+        return {}
+    end
+
+    -- MODULE CLASS
+
+    local Module = {
+        lib = self,
+        id = uniqueId,
+        debug = false,
+        title = 'UNTITLED_MODULE',
+        hint = GetString(SI_AWEMOD_SHOW_HINT),
+        icon = nil,
+        label = nil,
+        options = {},
+        data = {},
+
+        spacing = 0,
+        fontSize = 1,
+        order = 40,
+
+        initialized = false,
+        dataUpdated = true,
+    }
+
+    function Module:d(...)
+        if(self.debug)then
+            self.lib.d(self.id,...)
+        end
+    end
+
+    function Module.Colorize(color,text)
+        if(colorDefs[color]~=nil)then
+            return colorDefs[color]:Colorize(text)
+        else
+            return text
+        end
+    end
+
+    function Module.GetColorStr(color)
+        if(colorDefs[color]~=nil)then
+            return '|c' .. colorDefs[color]:ToHex()
+        else
+            return '|r'
+        end
+    end
+
+    function Module:Initialize( options, parentControl, previousControl )
+        if(self.initialized)then return end
+        self.initialized = true
+
+        if(options.enabled) then
+            self:Enable(options)
+        end
+
+        -- create labels
+        if( self.label == nil) then
+            self.label = self.lib:CreateLabel('AwesomeModuleLabel', parentControl, previousControl, self.id)
+            return self.label
+        else
+            for i,label in pairs(self.label) do
+                self.label[i] = self.lib:CreateLabel('AwesomeModuleLabel', parentControl, previousControl, self.id)
+                previousControl = self.label[i]
+            end
+            return previousControl
+        end
+    end
+
+    function Module:HasUpdate()
+        return self.dataUpdated
+    end
+
+    function Module:GetEventListeners()
+        return {}
+    end
+
+    function Module:IsIconVisible()
+        return self.options.enabled == ENABLED_AWEVS_ICON_AND_TEXT or self.options.enabled == ENABLED_AWEVS_ICON_ONLY
+    end
+
+    function Module:IsTextVisible()
+        return self.options.enabled == ENABLED_AWEVS_ICON_AND_TEXT or self.options.enabled == ENABLED_AWEVS_TEXT_ONLY
+    end
+
+    function Module:Enable(options)
+        self:d('Enable (in debug-mode)')
+        if(type(self.label)=='table')then
+            for i,_data in pairs(self.label) do
+                self.label[i]:SetText('')
+            end
+        else
+            self.label:SetText('')
+        end
+        self.dataUpdated = true
+    end
+
+    function Module:Disable()
+        self:d('Disable')
+        if(type(self.label)=='table')then
+            for i,_data in pairs(self.label) do
+                self.label[i]:SetText('')
+            end
+        else
+            self.label:SetText('')
+        end
+    end
+
+    function Module:Set(key,value)
+        self:d('Set['..key..']',value)
+        self.dataUpdated = true
+    end
+
+    function Module:StartTimer(seconds,updateIfFaster)
+        if(self.lib.timer[self.id]==nil)then
+            self:d(GetString(SI_AWEVS_DEBUG_MODULE_NO_TIMER))
+            return
+        end
+        if(seconds == nil or seconds < 1)then
+            seconds = 1
+        end
+        local timestamp = GetTimeStamp() + seconds
+        if(self.lib.timer[self.id] == 0)then
+            self:d('StartTimer['..seconds..']')
+            self.lib.timer[self.id] = timestamp
+        elseif(updateIfFaster==true and self.lib.timer[self.id] > timestamp)then
+            self:d('StartTimer['..seconds..'] (faster)')
+            self.lib.timer[self.id] = timestamp
+        else
+            self:d('StartTimer[ignored]')
+        end
+    end
+
+    function Module:SetTimer(seconds)
+        if(self.lib.timer[self.id]==nil)then
+            self:d(GetString(SI_AWEVS_DEBUG_MODULE_NO_TIMER))
+            return
+        end
+        if(seconds == nil or seconds < 1)then
+            seconds = 1
+        end
+        self:d('SetTimer['..seconds..']')
+        self.lib.timer[self.id] = GetTimeStamp() + seconds
+    end
+
+    function Module:StopTimer()
+        if(self.lib.timer[self.id]==nil)then
+            self:d(GetString(SI_AWEVS_DEBUG_MODULE_NO_TIMER))
+            return
+        end
+        self:d('StopTimer')
+        self.lib.timer[self.id] = 0
+    end
+
+    local function __getNextOption(t, state)
+
+        -- Equivalent of the next function, but returns the keys in the alphabetic order
+        local key = nil
+        --d("orderedNext: state = "..tostring(state) )
+        if state == nil then
+            -- the first time, generate the index
+            key = t.__orderedIndex[1]
+        else
+            -- fetch the next value
+            for i = 1,table.getn(t.__orderedIndex) do
+                if t.__orderedIndex[i] == state then
+                    key = t.__orderedIndex[i+1]
+                end
+            end
+        end
+
+        if key then
+            return key, t[key]
+        end
+
+        -- no more value to return, cleanup
+        t.__orderedIndex = nil
+        return
+    end
+
+    function Module:option_pairs()
+        if(self.options == nil)then
+            d("SELF",self)
+            return nil,nil,nil
+        end
+
+        if(self.options.__orderedIndex == nil)then
+            self.options.__orderedIndex = __genOrderedIndex( self.options )
+        end
+        return __getNextElement, self.options, nil
+    end
+
+    self.modules[Module.id] = Module
+    return self.modules[Module.id]
+end
+
+local function __genModulesIndex( modules )
+    local titleToIdMap,orderedTitles,orderedIndex = {},{},{}
+    for mod_id,mod in pairs(modules) do
+        local i,title = 1,mod.title
+        while(titleToIdMap[title]~=nil)do
+            title = mod.title .. i
+            i = i+1
+        end
+        titleToIdMap[title] = mod_id
+        table.insert( orderedTitles, title )
+    end
+    table.sort( orderedTitles )
+    for i,title in ipairs(orderedTitles) do
+        table.insert( orderedIndex, titleToIdMap[title] )
+    end
+    return orderedIndex
+end
+
+function libAM:module_pairs()
+    if(self.modules.__orderedIndex == nil)then
+        self.modules.__orderedIndex = __genOrderedIndex( self.modules )
+    end
+    -- Equivalent of the pairs() function on tables. Allows to iterate
+    -- in order
+    return __getNextElement, self.modules, nil
+end
\ No newline at end of file
diff --git a/AwesomeEvents2Mod/Libs/LibAwesomeModule-1.0/README b/AwesomeEvents2Mod/Libs/LibAwesomeModule-1.0/README
new file mode 100644
index 0000000..ded7911
--- /dev/null
+++ b/AwesomeEvents2Mod/Libs/LibAwesomeModule-1.0/README
@@ -0,0 +1,97 @@
+--------------------------
+--    AwesomeEvents     --
+--------------------------
+
+--[ EN ]--
+
+This AddOn was made by Ze_Mi <zemi@unive.de>.
+Updates at: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
+
+This AddOn is a modularzied, event-based, better configurable reinvention of AwesomeInfo addon from CrazyDutchGuy.
+My goal was to minimize timed refreshs and try to use as many event callbacks as possible, as well as split up the different notifications into seperate module files.
+Besides the look and feel, under the hood, there aren't many codelines left from AwesomeInfo.
+
+--[ DE ]--
+
+Dieses AddOn wurde erstellt von Ze_Mi <zemi@unive.de>.
+Updates unter: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
+
+Dieses AddOn ist eine modularizierte, eventbasierte und noch besser prsonalisierbare Neuentwicklung des AwesomeInfo Addons von CrazyDutchGuy.
+Mein Ziel dabei war es, weniger inertval basierte Aktualisierungen auszuführen und stattdessen auf Events zu reagieren. Außerdem wurden die verschiedenen Benachrichtigungen in
+eigene Module ausgelagert, was die Entwicklung von Modulen übersichtlicher und einfacher macht.
+Abgesehen von dem ursprünglichen look and feel hat sich unter der Haube so viel verändert, dass nicht mehr viele Codezeilen aus AwesoneInfo übrig geblieben sind.
+
+
+--------------------------
+--   LibAwesomeModule   --
+--------------------------
+
+--[ EN ]--
+
+This Library was made by Ze_Mi <zemi@unive.de>.
+
+Hereby I introduce LibAwesomeModule-1.0, a library that allows you to easily add new modules and notifications to AwesomeEvents.
+If you are interested in writing new modules, please have a look inside the Module folder of this addon.
+You don't have to care about layout and settings stuff, just write the minimal necessary code with maximum useability.
+
+--[ DE ]--
+
+Diese Bibliothek wurde erstellt von Ze_Mi <zemi@unive.de>.
+
+Hiermit stelle ich die neue Bibliothek LibAwesomeModule vor, eine Bibliothek mit deren Hilfe man super schnell und ohne viel Aufwand neue Benachrichtigungen in AwesomeEvents hinzufügen kann.
+Wenn du wissen möchtest, wie du neue Module hinzufügst, schau dir die Dateien im Ordner Modules an.
+Du musst dich nicht um lästige Label-Erstellungen/-Positionierung oder Einstellungen kümmern, schreibe einfach den minimal nötigen Code mit maximalem Nutzen.
+
+
+--------------------------
+--      CREDITS         --
+--------------------------
+
+--[ EN ]--
+
+Thanks to CrazyDutchGuy, Stormknight and RibbedStoic for their great AwesomeInfo AddOn!
+(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
+
+Thanks to @MissMarsupial for beta testing my AddOn.
+
+Thanks to esoui.com and all authors for maintaining the wiki and doing the job ZeniMax Media Inc is suposed to do ;)
+
+--[ DE ]--
+
+Mein Dank geht an CrazyDutchGuy, Stormknight und RibbedStoic für ihr großartiges AwesomeInfo AddOn!
+(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
+
+Danke an @MissMarsupial für das testen der Beta-Versionen meines AddOns.
+
+Danke an esoui.com und allen Authoren die an der Wiki arbeiten und diese aktuell halten und damit einen Dienst übernehmen für den sich ZeniMax Media Inc zu schön ist ;)
+
+--------------------------
+--      LICENSE         --
+--------------------------
+
+This software is under : CreativeCommons CC BY-NC-SA 4.0
+Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+You are free to:
+
+    Share — copy and redistribute the material in any medium or format
+    Adapt — remix, transform, and build upon the material
+    The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+
+Under the following terms:
+
+    Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
+    NonCommercial — You may not use the material for commercial purposes.
+    ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
+    No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
+
+
+Please read full licence at :
+http://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
+
+This Add-on is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates.
+The Elder Scrolls® and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries.
+All rights reserved.
+
+You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
\ No newline at end of file
diff --git a/AwesomeEvents2Mod/Libs/LibStub/LibStub.lua b/AwesomeEvents2Mod/Libs/LibStub/LibStub.lua
new file mode 100644
index 0000000..0e6bf67
--- /dev/null
+++ b/AwesomeEvents2Mod/Libs/LibStub/LibStub.lua
@@ -0,0 +1,38 @@
+-- LibStub is a simple versioning stub meant for use in Libraries.  http://www.wowace.com/wiki/LibStub for more info
+-- LibStub is hereby placed in the Public Domain Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke
+-- LibStub developed for World of Warcraft by above members of the WowAce community.
+-- Ported to Elder Scrolls Online by Seerah
+
+local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 4
+local LibStub = _G[LIBSTUB_MAJOR]
+
+local strformat = string.format
+if not LibStub or LibStub.minor < LIBSTUB_MINOR then
+	LibStub = LibStub or {libs = {}, minors = {} }
+	_G[LIBSTUB_MAJOR] = LibStub
+	LibStub.minor = LIBSTUB_MINOR
+
+	function LibStub:NewLibrary(major, minor)
+		assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
+		if type(minor) ~= "number" then
+			minor = assert(tonumber(zo_strmatch(minor, "%d+%.?%d*")), "Minor version must either be a number or contain a number.")
+		end
+
+		local oldminor = self.minors[major]
+		if oldminor and oldminor >= minor then return nil end
+		self.minors[major], self.libs[major] = minor, self.libs[major] or {}
+		return self.libs[major], oldminor
+	end
+
+	function LibStub:GetLibrary(major, silent)
+		if not self.libs[major] and not silent then
+			error(strformat("Cannot find a library instance of %q.", tostring(major)), 2)
+		end
+		return self.libs[major], self.minors[major]
+	end
+
+	function LibStub:IterateLibraries() return pairs(self.libs) end
+	setmetatable(LibStub, { __call = LibStub.GetLibrary })
+end
+
+LibStub.SILENT = true
\ No newline at end of file
diff --git a/AwesomeEvents2Mod/README b/AwesomeEvents2Mod/README
new file mode 100644
index 0000000..5d98815
--- /dev/null
+++ b/AwesomeEvents2Mod/README
@@ -0,0 +1,91 @@
+--------------------------
+--   AwesomeEventsMod   --
+--------------------------
+
+--[ EN ]--
+
+This AddOn was made by Ze_Mi <zemi@unive.de>.
+Updates at: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
+
+This is an example AddOn Module to show how to add custom notifications to AwesomeEvents
+
+--[ DE ]--
+
+Dieses AddOn wurde erstellt von Ze_Mi <zemi@unive.de>.
+Updates unter: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
+
+Dies ist ein Beispiel für eine AddOn Modul, um zu zeigen wie man eigene Benachrichtigungen zu AwesomeEvents hinzufügt.
+
+--------------------------
+--   LibAwesomeModule   --
+--------------------------
+
+--[ EN ]--
+
+This Library was made by Ze_Mi <zemi@unive.de>.
+
+Hereby I introduce LibAwesomeModule-1.0, a library that allows you to easily add new modules and notifications to AwesomeEvents.
+If you are interested in writing new modules, please have a look inside the Module folder of this addon.
+You don't have to care about layout and settings stuff, just write the minimal necessary code with maximum useability.
+
+--[ DE ]--
+
+Diese Bibliothek wurde erstellt von Ze_Mi <zemi@unive.de>.
+
+Hiermit stelle ich die neue Bibliothek LibAwesomeModule vor, eine Bibliothek mit deren Hilfe man super schnell und ohne viel Aufwand neue Benachrichtigungen in AwesomeEvents hinzufügen kann.
+Wenn du wissen möchtest, wie du neue Module hinzufügst, schau dir die Dateien im Ordner Modules an.
+Du musst dich nicht um lästige Label-Erstellungen/-Positionierung oder Einstellungen kümmern, schreibe einfach den minimal nötigen Code mit maximalem Nutzen.
+
+
+--------------------------
+--      CREDITS         --
+--------------------------
+
+--[ EN ]--
+
+Thanks to CrazyDutchGuy, Stormknight and RibbedStoic for their great AwesomeInfo AddOn!
+(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
+
+Thanks to @MissMarsupial for beta testing my AddOn.
+
+Thanks to esoui.com and all authors for maintaining the wiki and doing the job ZeniMax Media Inc is suposed to do ;)
+
+--[ DE ]--
+
+Mein Dank geht an CrazyDutchGuy, Stormknight und RibbedStoic für ihr großartiges AwesomeInfo AddOn!
+(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
+
+Danke an @MissMarsupial für das testen der Beta-Versionen meines AddOns.
+
+Danke an esoui.com und allen Authoren die an der Wiki arbeiten und diese aktuell halten und damit einen Dienst übernehmen für den sich ZeniMax Media Inc zu schön ist ;)
+
+--------------------------
+--      LICENSE         --
+--------------------------
+
+This software is under : CreativeCommons CC BY-NC-SA 4.0
+Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
+
+You are free to:
+
+    Share — copy and redistribute the material in any medium or format
+    Adapt — remix, transform, and build upon the material
+    The licensor cannot revoke these freedoms as long as you follow the license terms.
+
+
+Under the following terms:
+
+    Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
+    NonCommercial — You may not use the material for commercial purposes.
+    ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
+    No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
+
+
+Please read full licence at :
+http://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
+
+This Add-on is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates.
+The Elder Scrolls® and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries.
+All rights reserved.
+
+You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
\ No newline at end of file
diff --git a/AwesomeEventsMod/AwesomeEventsMod.lua b/AwesomeEventsMod/AwesomeEventsMod.lua
deleted file mode 100644
index c61627a..0000000
--- a/AwesomeEventsMod/AwesomeEventsMod.lua
+++ /dev/null
@@ -1,154 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: AwesomeEventsMod.lua
-  Last Modified: 18.02.18 08:40
-
-  Copyright (c) 2018 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local libAM = LibStub('LibAwesomeModule-1.0')
-local MOD = libAM:New('balancing')
-
--- title: header in settings menu
-MOD.title = GetString(SI_AWEMOD_BALANCING)
--- hint: tootltip at module show/hide toggle in settings menu
-MOD.hint = GetString(SI_AWEMOD_BALANCING_HINT)
--- order: default in the middle order = 40, at bottom ORDER_AWESOME_MODULE_PUSH_NOTIFICATION = 75
-MOD.order = ORDER_AWESOME_MODULE_PUSH_NOTIFICATION
--- enable debugging ingame via /aedebug balancing on
--- disable debugging ingame via /aedebug balancing off
--- show debugging state ingame via /aedebug balancing
-MOD.debug = false
-
-
--- USER SETTINGS
-
-MOD.options = {
-    showSessionTotal = {
-        type = 'checkbox',
-        name = GetString(SI_AWEMOD_BALANCING_TOTAL),
-        tooltip = GetString(SI_AWEMOD_BALANCING_TOTAL_HINT),
-        default = true,
-        order = 1,
-    },
-    secondsFadeOut = {
-        type = 'slider',
-        name = GetString(SI_AWEMOD_BALANCING_TIMER),
-        tooltip = GetString(SI_AWEMOD_BALANCING_TIMER_HINT),
-        min  = 10,
-        max = 120,
-        default = 30,
-        order = 2,
-    },
-}
--- fontSie: default = 1, max = 5
-MOD.fontSize = 5
-
--- OVERRIDES
-
-function MOD:Enable(options)
-    self:d('Enable')
-    self.data = {
-        total = 0,
-        last = 0,
-        secondsFadeOut = options.secondsFadeOut,
-        storeOpened = false,
-        visible = false
-    }
-end
-
-function MOD:Set(key,value)
-    self:d('Set[' .. key .. '] ', value)
-    if(key=='secondsFadeOut')then
-        self.data.secondsFadeOut = value
-    end
-end
-
--- EVENT LISTENER
--- EVENT_MONEY_UPDATE (integer eventCode,number newMoney,number oldMoney,number reason)
-function MOD:GetEventListeners()
-    return {
-        {
-            eventCode = EVENT_AWESOME_MODULE_TIMER,
-            callback = function(eventCode, timestamp) return MOD:OnTimer(timestamp) end,
-        },
-        {
-            eventCode = EVENT_OPEN_STORE,
-            callback = function(eventCode)
-                MOD.data.last = 0
-                MOD.data.storeOpened = true
-            end,
-        },
-        {
-            eventCode = EVENT_OPEN_FENCE,
-            callback = function(eventCode)
-                MOD.data.last = 0
-                MOD.data.storeOpened = true
-            end,
-        },
-        {
-            eventCode = EVENT_MONEY_UPDATE,
-            callback = function(eventCode,newMoney,oldMoney,reason)
-                self:d('EVENT_MONEY_UPDATE[reason] = ' .. reason)
-                if(MOD.data.storeOpened)then
-                    MOD.data.last = MOD.data.last + (newMoney-oldMoney)
-                end
-            end,
-        },
-        {
-            eventCode = EVENT_CLOSE_STORE,
-            callback = function(eventCode)
-                if(MOD.data.storeOpened)then
-                    MOD:OnCloseStore()
-                end
-            end,
-        },
-    }
-end
-
--- EVENT HANDLER
-
-function MOD:OnTimer(timestamp)
-    self:d('OnTimer')
-    self.data.visible = false
-    self.dataUpdated = true
-    self:d(' => dataUpdated')
-    -- return the number of seconds when your timer should be executed the next time
-    -- return nothing (nil) to execute the timer every full minute
-    -- return 0 is equal to calling self:StopTimer()
-    return 0
-end
-
-function MOD:OnCloseStore()
-    self:d('OnCloseStore')
-    self.data.storeOpened = false
-
-    self.data.total = self.data.total + self.data.last
-    self.data.visible = true
-	self:StartTimer(self.data.secondsFadeOut)
-
-    self.dataUpdated = true
-    self:d(' => dataUpdated')
-end -- MOD:OnFenceUpdate
-
--- LABEL HANDLER
-
-function MOD:Update(options)
-    self:d('Update')
-    local labelText = ''
-    if(self.data.visible)then
-        local bilance = self.data.last
-        if (options.showSessionTotal) then
-            bilance = self.data.total
-        end
-        local color = (bilance >= 0) and COLOR_AWEVS_AVAILABLE or COLOR_AWEVS_WARNING
-        labelText = MOD.Colorize(color, GetString(SI_AWEMOD_BALANCING_LABEL)) .. ': ' ..bilance
-    end
-
-    self.label:SetText(labelText)
-end -- MOD:Update
diff --git a/AwesomeEventsMod/AwesomeEventsMod.txt b/AwesomeEventsMod/AwesomeEventsMod.txt
deleted file mode 100644
index eb7442d..0000000
--- a/AwesomeEventsMod/AwesomeEventsMod.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-## APIVersion: 100022
-## Version: 1.3-RC2
-## Title: |cFFFFB0Awesome Module - Balancing|r
-## Description: This addon is a balancing plugin to show you how to add new modules and notifications to the AwesomeEvents AddOn. (Version: 1.3-RC2)
-## Author: Ze_Mi
-## OptionalDependsOn: LibStub, LibAwesomeModule-1.0
-##
-## This Add-on is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates.
-## The Elder Scrolls® and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries.
-## All rights reserved
-##
-## You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
-
-Libs/LibStub/LibStub.lua
-Libs/LibAwesomeModule-1.0/LibAwesomeModule-1.0.lua
-
-Language/strings.lua
-Language/$(language).lua
-
-AwesomeEventsMod.lua
\ No newline at end of file
diff --git a/AwesomeEventsMod/Language/de.lua b/AwesomeEventsMod/Language/de.lua
deleted file mode 100644
index 139e364..0000000
--- a/AwesomeEventsMod/Language/de.lua
+++ /dev/null
@@ -1,21 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: de.lua
-  Last Modified: 24.06.17 17:57
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
---module-balancing
-SafeAddString(SI_AWEMOD_BALANCING, "Bilanzierung", 1)
-SafeAddString(SI_AWEMOD_BALANCING_HINT, "Erhalte eine Benachrichtigung über deine Einkommensbilanz nach dem du einen Händler besucht hast.", 1)
-SafeAddString(SI_AWEMOD_BALANCING_TOTAL, "Summe anzeigen", 1)
-SafeAddString(SI_AWEMOD_BALANCING_TOTAL_HINT, "Zeige die Bilanzsumme aller Händler besuche der aktuellen Sitzung an anstatt die letzte Bilanz.", 1)
-SafeAddString(SI_AWEMOD_BALANCING_TIMER, "Ausblenden nach (sekunden)", 1)
-SafeAddString(SI_AWEMOD_BALANCING_TIMER_HINT,"Die Benachrichtigung wird nach der hier eingestellten Anzahl an Sekunden ausgeblendet.", 1)
-SafeAddString(SI_AWEMOD_BALANCING_LABEL, "Bilanz", 1)
\ No newline at end of file
diff --git a/AwesomeEventsMod/Language/ru.lua b/AwesomeEventsMod/Language/ru.lua
deleted file mode 100644
index 75f143f..0000000
--- a/AwesomeEventsMod/Language/ru.lua
+++ /dev/null
@@ -1,26 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: Memoraike
-  Filename: ru.lua
-  Last Modified: 25.06.17 15:13
-
-  Copyright (c) 2017 by Memoraike
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  Пожалуйста, прочтите README файл для дополнительной информации.
-  ]]
-
----
---- Translated by: Memoraike <http://www.esoui.com/forums/member.php?u=32546>
----
-
---module-balancing
-SafeAddString(SI_AWEMOD_BALANCING, "Кол-во золота", 1)
-SafeAddString(SI_AWEMOD_BALANCING_HINT, "Получить уведомление об изменении кол-ва золота после посещения торговца.", 1)
-SafeAddString(SI_AWEMOD_BALANCING_TOTAL, "Показать итог", 1)
-SafeAddString(SI_AWEMOD_BALANCING_TOTAL_HINT, "Показать всю выручку с продаж, вместо последней разовой продажи.", 1)
-SafeAddString(SI_AWEMOD_BALANCING_TIMER, "Исчезновение (секунды)", 1)
-SafeAddString(SI_AWEMOD_BALANCING_TIMER_HINT,"Укажите время в секундах, после которого уведомление будет удалено с экрана.", 1)
-SafeAddString(SI_AWEMOD_BALANCING_LABEL, "Кол-во золота", 1)
\ No newline at end of file
diff --git a/AwesomeEventsMod/Language/strings.lua b/AwesomeEventsMod/Language/strings.lua
deleted file mode 100644
index 9710e81..0000000
--- a/AwesomeEventsMod/Language/strings.lua
+++ /dev/null
@@ -1,28 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: strings.lua
-  Last Modified: 25.06.17 15:11
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local strings = {
-	--module-bagspace
-	SI_AWEMOD_BALANCING="Balancing",
-	SI_AWEMOD_BALANCING_HINT="Get a notification of your income bilance after visiting a vendor.",
-	SI_AWEMOD_BALANCING_TOTAL="Show total",
-	SI_AWEMOD_BALANCING_TOTAL_HINT="Show the currents session total bilance instead of the last bilance.",
-	SI_AWEMOD_BALANCING_TIMER="Fade out (seconds)",
-	SI_AWEMOD_BALANCING_TIMER_HINT="Set the time in seconds until this notification will be removed.",
-	SI_AWEMOD_BALANCING_LABEL="Balance",
-}
-
-for stringId, stringValue in pairs(strings) do
-   ZO_CreateStringId(stringId, stringValue)
-   SafeAddVersion(stringId, 1)
-end
diff --git a/AwesomeEventsMod/Libs/LibAwesomeModule-1.0/LibAwesomeModule-1.0.lua b/AwesomeEventsMod/Libs/LibAwesomeModule-1.0/LibAwesomeModule-1.0.lua
deleted file mode 100644
index b69a54b..0000000
--- a/AwesomeEventsMod/Libs/LibAwesomeModule-1.0/LibAwesomeModule-1.0.lua
+++ /dev/null
@@ -1,400 +0,0 @@
---[[
-  This file is part of Awesome Events.
-
-  Author: @Ze_Mi <zemi@unive.de>
-  Filename: LibAwesomeModule-1.0.lua
-  Last Modified: 23.04.18 14:56
-
-  Copyright (c) 2017 by Martin Unkel
-  License : CreativeCommons CC BY-NC-SA 4.0 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-  Please read the README file for further information.
-  ]]
-
-local MAJOR, MINOR = 'LibAwesomeModule-1.0', 8
-local libAM, oldminor = LibStub:NewLibrary(MAJOR, MINOR)
-if not libAM then return end
-
-EVENT_AWESOME_MODULE_TIMER = 1
-ORDER_AWESOME_MODULE_PUSH_NOTIFICATION = 75
-
-COLOR_AWEVS_AVAILABLE = 1
-COLOR_AWEVS_HINT = 2
-COLOR_AWEVS_WARNING = 3
-
-ENABLED_AWEVS_NONE = 0
-ENABLED_AWEVS_ICON_AND_TEXT = 1
-ENABLED_AWEVS_ICON_ONLY = 2
-ENABLED_AWEVS_TEXT_ONLY = 3
-
-local colorDefs = { [COLOR_AWEVS_AVAILABLE]=nil,[COLOR_AWEVS_HINT]=nil,[COLOR_AWEVS_WARNING]=nil}
-
-libAM.version = MINOR
-libAM.labelToMod = {}
-libAM.timer = {}
-libAM.debug = false
-libAM.logCallback = nil
-libAM.log = {}
-
-local function __boolToStr(value)
-    if(value)then
-        return 'true'
-    else
-        return 'false'
-    end
-end
-
-local function __tostring(object,level)
-    local lvlPrefix = ''
-    if(level~=nil)then
-        lvlPrefix = string.rep('--',level)
-    end
-    local str=''
-    if(type(object) == 'table')then
-        if(level==nil)then
-            for i in ipairs(object)do
-                if(i==1)then
-                    str = str .. __tostring(object[i],1)
-                else
-                    str = str .. '> ' .. __tostring(object[i],1)
-                end
-            end
-        else
-            str = 'Table\n'
-            for key,value in pairs(object)do
-                str = str .. lvlPrefix .. '> .' .. key .. ' = ' .. __tostring(value,level+1)
-            end
-        end
-    elseif(type(object) == 'number')then
-        str = tostring(object)
-    elseif(type(object) == 'boolean')then
-        str = __boolToStr(object)
-    elseif(type(object) == 'string')then
-        str = object
-    else
-        str = type(object)
-    end
-    return str..'\n'
-end
-
-function libAM.d(...)
-    if(not libAM.debug)then return end
-    local args = {... }
-
-    local str = ''
-    if(args[1] ~= nil and type(args[1])=="string")then
-        args[1] = '|cD4CD82[|c82D482' .. args[1] .. '|cD4CD82]|cFFFFFF '
-        if(type(args[2])=="string")then
-            args[1] = args[1] .. ' ' .. args[2]
-            table.remove(args,2)
-        end
-        if(#args==1)then
-            str = args[1]
-        end
-    end
-    if(str=='')then
-        str=__tostring(args)
-    end
-    if(libAM.logCallback == nil)then
-        table.insert(libAM.log,str)
-    else
-        libAM.logCallback(str)
-    end
-end
-
-
-function libAM.SetColorDef(type,r,g,b)
-    if(colorDefs[type]==nil)then
-        colorDefs[type] = ZO_ColorDef:New(r,g,b)
-    else
-        colorDefs[type]:SetRGB(r,g,b)
-    end
-end
-
-local __labelIndex = 3 -- synchronous to ui-child-index
-local function __getNextLabelId()
-    local id = __labelIndex
-    __labelIndex = id + 1
-    return id
-end
-
-function libAM:CreateLabel( templateName, parentControl, previousControl, mod_id )
-    local labelId = __getNextLabelId()
-    self.labelToMod[labelId] = mod_id
-    local label = CreateControlFromVirtual('AwesomeModuleLabel' .. labelId , parentControl, templateName)
-    if( previousControl == nil) then
-        label:SetAnchor( TOP, parentControl, TOP, 0, 0)
-    else
-        label:SetAnchor( TOP, previousControl, BOTTOM, 0, 0)
-    end
-    return label
-end
-
-local function __genOrderedIndex( options )
-    local orderToKeyMap,orderedNumbers,orderedIndex = {},{},{}
-    for key,option in pairs(options) do
-        local order = (option.order or 40) * 100
-        while(orderToKeyMap[order]~=nil)do
-            order = order + 1
-        end
-        orderToKeyMap[order] = key
-        table.insert( orderedNumbers, order )
-    end
-    table.sort( orderedNumbers )
-    for i,order in ipairs(orderedNumbers) do
-        table.insert( orderedIndex, orderToKeyMap[order] )
-    end
-    return orderedIndex
-end
-
-local function __getNextElement(t, state)
-
-    -- Equivalent of the next function, but returns the keys in the alphabetic order
-    local key = nil
-    --d("orderedNext: state = "..tostring(state) )
-    if state == nil then
-        -- the first time, generate the index
-        key = t.__orderedIndex[1]
-    else
-        -- fetch the next value
-        for i = 1,table.getn(t.__orderedIndex) do
-            if t.__orderedIndex[i] == state then
-                key = t.__orderedIndex[i+1]
-            end
-        end
-    end
-
-    if key then
-        return key, t[key]
-    end
-
-    -- no more value to return, cleanup
-    t.__orderedIndex = nil
-    return
-end
-
--- Mod Constructor
-
-function libAM:New(uniqueId)
-    self.modules = self.modules or {}
-    if(uniqueId==nil or self.modules[uniqueId]~=nil)then
-        return {}
-    end
-
-    -- MODULE CLASS
-
-    local Module = {
-        lib = self,
-        id = uniqueId,
-        debug = false,
-        title = 'UNTITLED_MODULE',
-        hint = GetString(SI_AWEMOD_SHOW_HINT),
-        icon = nil,
-        label = nil,
-        options = {},
-        data = {},
-
-        spacing = 0,
-        fontSize = 1,
-        order = 40,
-
-        initialized = false,
-        dataUpdated = true,
-    }
-
-    function Module:d(...)
-        if(self.debug)then
-            self.lib.d(self.id,...)
-        end
-    end
-
-    function Module.Colorize(color,text)
-        if(colorDefs[color]~=nil)then
-            return colorDefs[color]:Colorize(text)
-        else
-            return text
-        end
-    end
-
-    function Module.GetColorStr(color)
-        if(colorDefs[color]~=nil)then
-            return '|c' .. colorDefs[color]:ToHex()
-        else
-            return '|r'
-        end
-    end
-
-    function Module:Initialize( options, parentControl, previousControl )
-        if(self.initialized)then return end
-        self.initialized = true
-
-        if(options.enabled) then
-            self:Enable(options)
-        end
-
-        -- create labels
-        if( self.label == nil) then
-            self.label = self.lib:CreateLabel('AwesomeModuleLabel', parentControl, previousControl, self.id)
-            return self.label
-        else
-            for i,label in pairs(self.label) do
-                self.label[i] = self.lib:CreateLabel('AwesomeModuleLabel', parentControl, previousControl, self.id)
-                previousControl = self.label[i]
-            end
-            return previousControl
-        end
-    end
-
-    function Module:HasUpdate()
-        return self.dataUpdated
-    end
-
-    function Module:GetEventListeners()
-        return {}
-    end
-
-    function Module:IsIconVisible()
-        return self.options.enabled == ENABLED_AWEVS_ICON_AND_TEXT or self.options.enabled == ENABLED_AWEVS_ICON_ONLY
-    end
-
-    function Module:IsTextVisible()
-        return self.options.enabled == ENABLED_AWEVS_ICON_AND_TEXT or self.options.enabled == ENABLED_AWEVS_TEXT_ONLY
-    end
-
-    function Module:Enable(options)
-        self:d('Enable (in debug-mode)')
-        if(type(self.label)=='table')then
-            for i,_data in pairs(self.label) do
-                self.label[i]:SetText('')
-            end
-        else
-            self.label:SetText('')
-        end
-        self.dataUpdated = true
-    end
-
-    function Module:Disable()
-        self:d('Disable')
-        if(type(self.label)=='table')then
-            for i,_data in pairs(self.label) do
-                self.label[i]:SetText('')
-            end
-        else
-            self.label:SetText('')
-        end
-    end
-
-    function Module:Set(key,value)
-        self:d('Set['..key..']',value)
-        self.dataUpdated = true
-    end
-
-    function Module:StartTimer(seconds,updateIfFaster)
-        if(self.lib.timer[self.id]==nil)then
-            self:d(GetString(SI_AWEVS_DEBUG_MODULE_NO_TIMER))
-            return
-        end
-        if(seconds == nil or seconds < 1)then
-            seconds = 1
-        end
-        local timestamp = GetTimeStamp() + seconds
-        if(self.lib.timer[self.id] == 0)then
-            self:d('StartTimer['..seconds..']')
-            self.lib.timer[self.id] = timestamp
-        elseif(updateIfFaster==true and self.lib.timer[self.id] > timestamp)then
-            self:d('StartTimer['..seconds..'] (faster)')
-            self.lib.timer[self.id] = timestamp
-        else
-            self:d('StartTimer[ignored]')
-        end
-    end
-
-    function Module:SetTimer(seconds)
-        if(self.lib.timer[self.id]==nil)then
-            self:d(GetString(SI_AWEVS_DEBUG_MODULE_NO_TIMER))
-            return
-        end
-        if(seconds == nil or seconds < 1)then
-            seconds = 1
-        end
-        self:d('SetTimer['..seconds..']')
-        self.lib.timer[self.id] = GetTimeStamp() + seconds
-    end
-
-    function Module:StopTimer()
-        if(self.lib.timer[self.id]==nil)then
-            self:d(GetString(SI_AWEVS_DEBUG_MODULE_NO_TIMER))
-            return
-        end
-        self:d('StopTimer')
-        self.lib.timer[self.id] = 0
-    end
-
-    local function __getNextOption(t, state)
-
-        -- Equivalent of the next function, but returns the keys in the alphabetic order
-        local key = nil
-        --d("orderedNext: state = "..tostring(state) )
-        if state == nil then
-            -- the first time, generate the index
-            key = t.__orderedIndex[1]
-        else
-            -- fetch the next value
-            for i = 1,table.getn(t.__orderedIndex) do
-                if t.__orderedIndex[i] == state then
-                    key = t.__orderedIndex[i+1]
-                end
-            end
-        end
-
-        if key then
-            return key, t[key]
-        end
-
-        -- no more value to return, cleanup
-        t.__orderedIndex = nil
-        return
-    end
-
-    function Module:option_pairs()
-        if(self.options == nil)then
-            d("SELF",self)
-            return nil,nil,nil
-        end
-
-        if(self.options.__orderedIndex == nil)then
-            self.options.__orderedIndex = __genOrderedIndex( self.options )
-        end
-        return __getNextElement, self.options, nil
-    end
-
-    self.modules[Module.id] = Module
-    return self.modules[Module.id]
-end
-
-local function __genModulesIndex( modules )
-    local titleToIdMap,orderedTitles,orderedIndex = {},{},{}
-    for mod_id,mod in pairs(modules) do
-        local i,title = 1,mod.title
-        while(titleToIdMap[title]~=nil)do
-            title = mod.title .. i
-            i = i+1
-        end
-        titleToIdMap[title] = mod_id
-        table.insert( orderedTitles, title )
-    end
-    table.sort( orderedTitles )
-    for i,title in ipairs(orderedTitles) do
-        table.insert( orderedIndex, titleToIdMap[title] )
-    end
-    return orderedIndex
-end
-
-function libAM:module_pairs()
-    if(self.modules.__orderedIndex == nil)then
-        self.modules.__orderedIndex = __genOrderedIndex( self.modules )
-    end
-    -- Equivalent of the pairs() function on tables. Allows to iterate
-    -- in order
-    return __getNextElement, self.modules, nil
-end
\ No newline at end of file
diff --git a/AwesomeEventsMod/Libs/LibAwesomeModule-1.0/README b/AwesomeEventsMod/Libs/LibAwesomeModule-1.0/README
deleted file mode 100644
index ded7911..0000000
--- a/AwesomeEventsMod/Libs/LibAwesomeModule-1.0/README
+++ /dev/null
@@ -1,97 +0,0 @@
---------------------------
---    AwesomeEvents     --
---------------------------
-
---[ EN ]--
-
-This AddOn was made by Ze_Mi <zemi@unive.de>.
-Updates at: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
-
-This AddOn is a modularzied, event-based, better configurable reinvention of AwesomeInfo addon from CrazyDutchGuy.
-My goal was to minimize timed refreshs and try to use as many event callbacks as possible, as well as split up the different notifications into seperate module files.
-Besides the look and feel, under the hood, there aren't many codelines left from AwesomeInfo.
-
---[ DE ]--
-
-Dieses AddOn wurde erstellt von Ze_Mi <zemi@unive.de>.
-Updates unter: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
-
-Dieses AddOn ist eine modularizierte, eventbasierte und noch besser prsonalisierbare Neuentwicklung des AwesomeInfo Addons von CrazyDutchGuy.
-Mein Ziel dabei war es, weniger inertval basierte Aktualisierungen auszuführen und stattdessen auf Events zu reagieren. Außerdem wurden die verschiedenen Benachrichtigungen in
-eigene Module ausgelagert, was die Entwicklung von Modulen übersichtlicher und einfacher macht.
-Abgesehen von dem ursprünglichen look and feel hat sich unter der Haube so viel verändert, dass nicht mehr viele Codezeilen aus AwesoneInfo übrig geblieben sind.
-
-
---------------------------
---   LibAwesomeModule   --
---------------------------
-
---[ EN ]--
-
-This Library was made by Ze_Mi <zemi@unive.de>.
-
-Hereby I introduce LibAwesomeModule-1.0, a library that allows you to easily add new modules and notifications to AwesomeEvents.
-If you are interested in writing new modules, please have a look inside the Module folder of this addon.
-You don't have to care about layout and settings stuff, just write the minimal necessary code with maximum useability.
-
---[ DE ]--
-
-Diese Bibliothek wurde erstellt von Ze_Mi <zemi@unive.de>.
-
-Hiermit stelle ich die neue Bibliothek LibAwesomeModule vor, eine Bibliothek mit deren Hilfe man super schnell und ohne viel Aufwand neue Benachrichtigungen in AwesomeEvents hinzufügen kann.
-Wenn du wissen möchtest, wie du neue Module hinzufügst, schau dir die Dateien im Ordner Modules an.
-Du musst dich nicht um lästige Label-Erstellungen/-Positionierung oder Einstellungen kümmern, schreibe einfach den minimal nötigen Code mit maximalem Nutzen.
-
-
---------------------------
---      CREDITS         --
---------------------------
-
---[ EN ]--
-
-Thanks to CrazyDutchGuy, Stormknight and RibbedStoic for their great AwesomeInfo AddOn!
-(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
-
-Thanks to @MissMarsupial for beta testing my AddOn.
-
-Thanks to esoui.com and all authors for maintaining the wiki and doing the job ZeniMax Media Inc is suposed to do ;)
-
---[ DE ]--
-
-Mein Dank geht an CrazyDutchGuy, Stormknight und RibbedStoic für ihr großartiges AwesomeInfo AddOn!
-(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
-
-Danke an @MissMarsupial für das testen der Beta-Versionen meines AddOns.
-
-Danke an esoui.com und allen Authoren die an der Wiki arbeiten und diese aktuell halten und damit einen Dienst übernehmen für den sich ZeniMax Media Inc zu schön ist ;)
-
---------------------------
---      LICENSE         --
---------------------------
-
-This software is under : CreativeCommons CC BY-NC-SA 4.0
-Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-You are free to:
-
-    Share — copy and redistribute the material in any medium or format
-    Adapt — remix, transform, and build upon the material
-    The licensor cannot revoke these freedoms as long as you follow the license terms.
-
-
-Under the following terms:
-
-    Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
-    NonCommercial — You may not use the material for commercial purposes.
-    ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
-    No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
-
-
-Please read full licence at :
-http://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
-
-This Add-on is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates.
-The Elder Scrolls® and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries.
-All rights reserved.
-
-You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
\ No newline at end of file
diff --git a/AwesomeEventsMod/Libs/LibStub/LibStub.lua b/AwesomeEventsMod/Libs/LibStub/LibStub.lua
deleted file mode 100644
index 0e6bf67..0000000
--- a/AwesomeEventsMod/Libs/LibStub/LibStub.lua
+++ /dev/null
@@ -1,38 +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
--- LibStub developed for World of Warcraft by above members of the WowAce community.
--- Ported to Elder Scrolls Online by Seerah
-
-local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 4
-local LibStub = _G[LIBSTUB_MAJOR]
-
-local strformat = string.format
-if not LibStub or LibStub.minor < LIBSTUB_MINOR then
-	LibStub = LibStub or {libs = {}, minors = {} }
-	_G[LIBSTUB_MAJOR] = LibStub
-	LibStub.minor = LIBSTUB_MINOR
-
-	function LibStub:NewLibrary(major, minor)
-		assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)")
-		if type(minor) ~= "number" then
-			minor = assert(tonumber(zo_strmatch(minor, "%d+%.?%d*")), "Minor version must either be a number or contain a number.")
-		end
-
-		local oldminor = self.minors[major]
-		if oldminor and oldminor >= minor then return nil end
-		self.minors[major], self.libs[major] = minor, self.libs[major] or {}
-		return self.libs[major], oldminor
-	end
-
-	function LibStub:GetLibrary(major, silent)
-		if not self.libs[major] and not silent then
-			error(strformat("Cannot find a library instance of %q.", tostring(major)), 2)
-		end
-		return self.libs[major], self.minors[major]
-	end
-
-	function LibStub:IterateLibraries() return pairs(self.libs) end
-	setmetatable(LibStub, { __call = LibStub.GetLibrary })
-end
-
-LibStub.SILENT = true
\ No newline at end of file
diff --git a/AwesomeEventsMod/README b/AwesomeEventsMod/README
deleted file mode 100644
index 5d98815..0000000
--- a/AwesomeEventsMod/README
+++ /dev/null
@@ -1,91 +0,0 @@
---------------------------
---   AwesomeEventsMod   --
---------------------------
-
---[ EN ]--
-
-This AddOn was made by Ze_Mi <zemi@unive.de>.
-Updates at: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
-
-This is an example AddOn Module to show how to add custom notifications to AwesomeEvents
-
---[ DE ]--
-
-Dieses AddOn wurde erstellt von Ze_Mi <zemi@unive.de>.
-Updates unter: http://www.esoui.com/downloads/info1739-AwesomeEvents.html
-
-Dies ist ein Beispiel für eine AddOn Modul, um zu zeigen wie man eigene Benachrichtigungen zu AwesomeEvents hinzufügt.
-
---------------------------
---   LibAwesomeModule   --
---------------------------
-
---[ EN ]--
-
-This Library was made by Ze_Mi <zemi@unive.de>.
-
-Hereby I introduce LibAwesomeModule-1.0, a library that allows you to easily add new modules and notifications to AwesomeEvents.
-If you are interested in writing new modules, please have a look inside the Module folder of this addon.
-You don't have to care about layout and settings stuff, just write the minimal necessary code with maximum useability.
-
---[ DE ]--
-
-Diese Bibliothek wurde erstellt von Ze_Mi <zemi@unive.de>.
-
-Hiermit stelle ich die neue Bibliothek LibAwesomeModule vor, eine Bibliothek mit deren Hilfe man super schnell und ohne viel Aufwand neue Benachrichtigungen in AwesomeEvents hinzufügen kann.
-Wenn du wissen möchtest, wie du neue Module hinzufügst, schau dir die Dateien im Ordner Modules an.
-Du musst dich nicht um lästige Label-Erstellungen/-Positionierung oder Einstellungen kümmern, schreibe einfach den minimal nötigen Code mit maximalem Nutzen.
-
-
---------------------------
---      CREDITS         --
---------------------------
-
---[ EN ]--
-
-Thanks to CrazyDutchGuy, Stormknight and RibbedStoic for their great AwesomeInfo AddOn!
-(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
-
-Thanks to @MissMarsupial for beta testing my AddOn.
-
-Thanks to esoui.com and all authors for maintaining the wiki and doing the job ZeniMax Media Inc is suposed to do ;)
-
---[ DE ]--
-
-Mein Dank geht an CrazyDutchGuy, Stormknight und RibbedStoic für ihr großartiges AwesomeInfo AddOn!
-(http://www.esoui.com/downloads/info192-AwesomeInfo.html)
-
-Danke an @MissMarsupial für das testen der Beta-Versionen meines AddOns.
-
-Danke an esoui.com und allen Authoren die an der Wiki arbeiten und diese aktuell halten und damit einen Dienst übernehmen für den sich ZeniMax Media Inc zu schön ist ;)
-
---------------------------
---      LICENSE         --
---------------------------
-
-This software is under : CreativeCommons CC BY-NC-SA 4.0
-Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
-
-You are free to:
-
-    Share — copy and redistribute the material in any medium or format
-    Adapt — remix, transform, and build upon the material
-    The licensor cannot revoke these freedoms as long as you follow the license terms.
-
-
-Under the following terms:
-
-    Attribution — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
-    NonCommercial — You may not use the material for commercial purposes.
-    ShareAlike — If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.
-    No additional restrictions — You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.
-
-
-Please read full licence at :
-http://creativecommons.org/licenses/by-nc-sa/4.0/legalcode
-
-This Add-on is not created by, affiliated with or sponsored by ZeniMax Media Inc. or its affiliates.
-The Elder Scrolls® and related logos are registered trademarks or trademarks of ZeniMax Media Inc. in the United States and/or other countries.
-All rights reserved.
-
-You can read the full terms at https://account.elderscrollsonline.com/add-on-terms
\ No newline at end of file