Quantcast

update to 4.4

Steven Jackson [09-16-14 - 20:17]
update to 4.4
Filename
Interface/AddOns/SVUI/Bindings.xml
Interface/AddOns/SVUI/SVUI.lua
Interface/AddOns/SVUI/SVUI.xml
Interface/AddOns/SVUI/installer/presets/auras.lua
Interface/AddOns/SVUI/installer/presets/bars.lua
Interface/AddOns/SVUI/installer/presets/layouts.lua
Interface/AddOns/SVUI/installer/presets/media.lua
Interface/AddOns/SVUI/installer/presets/units.lua
Interface/AddOns/SVUI/installer/setup.lua
Interface/AddOns/SVUI/language/chinese_ui.lua
Interface/AddOns/SVUI/language/english_ui.lua
Interface/AddOns/SVUI/language/french_ui.lua
Interface/AddOns/SVUI/language/german_ui.lua
Interface/AddOns/SVUI/language/italian_ui.lua
Interface/AddOns/SVUI/language/korean_ui.lua
Interface/AddOns/SVUI/language/portuguese_ui.lua
Interface/AddOns/SVUI/language/russian_ui.lua
Interface/AddOns/SVUI/language/spanish_ui.lua
Interface/AddOns/SVUI/language/taiwanese_ui.lua
Interface/AddOns/SVUI/libs/LibBalancePowerTracker-1.1/LibBalancePowerTracker-1.1.lua
Interface/AddOns/SVUI/libs/LibLocale-1.0/LibLocale-1.0.lua
Interface/AddOns/SVUI/libs/LibSystemRegistry-1.0/LibSystemRegistry-1.0.lua
Interface/AddOns/SVUI/libs/libs.xml
Interface/AddOns/SVUI/libs/oUF/LICENSE
Interface/AddOns/SVUI/libs/oUF/blizzard.lua
Interface/AddOns/SVUI/libs/oUF/colors.lua
Interface/AddOns/SVUI/libs/oUF/elements/altpowerbar.lua
Interface/AddOns/SVUI/libs/oUF/elements/assistant.lua
Interface/AddOns/SVUI/libs/oUF/elements/aura.lua
Interface/AddOns/SVUI/libs/oUF/elements/castbar.lua
Interface/AddOns/SVUI/libs/oUF/elements/combat.lua
Interface/AddOns/SVUI/libs/oUF/elements/cpoints.lua
Interface/AddOns/SVUI/libs/oUF/elements/druidmana.lua
Interface/AddOns/SVUI/libs/oUF/elements/eclipsebar.lua
Interface/AddOns/SVUI/libs/oUF/elements/healprediction.lua
Interface/AddOns/SVUI/libs/oUF/elements/health.lua
Interface/AddOns/SVUI/libs/oUF/elements/leader.lua
Interface/AddOns/SVUI/libs/oUF/elements/lfdrole.lua
Interface/AddOns/SVUI/libs/oUF/elements/masterlooter.lua
Interface/AddOns/SVUI/libs/oUF/elements/picon.lua
Interface/AddOns/SVUI/libs/oUF/elements/portraits.lua
Interface/AddOns/SVUI/libs/oUF/elements/power.lua
Interface/AddOns/SVUI/libs/oUF/elements/pvp.lua
Interface/AddOns/SVUI/libs/oUF/elements/qicon.lua
Interface/AddOns/SVUI/libs/oUF/elements/range.lua
Interface/AddOns/SVUI/libs/oUF/elements/readycheck.lua
Interface/AddOns/SVUI/libs/oUF/elements/resting.lua
Interface/AddOns/SVUI/libs/oUF/elements/resurrect.lua
Interface/AddOns/SVUI/libs/oUF/elements/ricons.lua
Interface/AddOns/SVUI/libs/oUF/elements/runebar.lua
Interface/AddOns/SVUI/libs/oUF/elements/stagger.lua
Interface/AddOns/SVUI/libs/oUF/elements/tags.lua
Interface/AddOns/SVUI/libs/oUF/elements/threat.lua
Interface/AddOns/SVUI/libs/oUF/elements/totems.lua
Interface/AddOns/SVUI/libs/oUF/events.lua
Interface/AddOns/SVUI/libs/oUF/factory.lua
Interface/AddOns/SVUI/libs/oUF/finalize.lua
Interface/AddOns/SVUI/libs/oUF/init.lua
Interface/AddOns/SVUI/libs/oUF/oUF.toc
Interface/AddOns/SVUI/libs/oUF/oUF.xml
Interface/AddOns/SVUI/libs/oUF/ouf.lua
Interface/AddOns/SVUI/libs/oUF/private.lua
Interface/AddOns/SVUI/libs/oUF/units.lua
Interface/AddOns/SVUI/libs/oUF/utils/changelog
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ActionPanel/oUF_ActionPanel.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ActionPanel/oUF_ActionPanel.toc
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Afflicted/oUF_Afflicted.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Afflicted/oUF_Afflicted.toc
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.toc
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_AuraBars/oUF_AuraBars.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_AuraWatch/oUF_AuraWatch.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_AuraWatch/oUF_AuraWatch.toc
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_CombatFader/oUF_CombatFader.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_CombatFader/oUF_CombatFader.toc
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Combatant/oUF_Combatant.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Combatant/oUF_Combatant.toc
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_DruidMana/oUF_DruidMana.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_DruidMana/oUF_DruidMana.toc
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_DrunkenMaster/oUF_DrunkenMaster.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Experience/oUF_Experience.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Experience/oUF_Experience.toc
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Friendship/oUF_Friendship.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Friendship/oUF_Friendship.toc
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_HyperCombo/oUF_HyperCombo.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_MainTank/oUF_MainTank.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_MonkHarmony/oUF_MonkHarmony.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_PallyPower/oUF_PallyPower.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Plugins.xml
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_PriestOrbs/oUF_PriestOrbs.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.toc
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Reputation/oUF_Reputation.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Reputation/oUF_Reputation.toc
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Smooth/oUF_Smooth.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_TotemBars/oUF_TotemBars.lua
Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_WarlockShards/oUF_WarlockShards.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ActionPanel/oUF_ActionPanel.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ActionPanel/oUF_ActionPanel.toc
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Afflicted/oUF_Afflicted.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Afflicted/oUF_Afflicted.toc
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.toc
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_AuraBars/oUF_AuraBars.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_AuraWatch/oUF_AuraWatch.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_AuraWatch/oUF_AuraWatch.toc
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_CombatFader/oUF_CombatFader.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_CombatFader/oUF_CombatFader.toc
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Combatant/oUF_Combatant.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Combatant/oUF_Combatant.toc
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_DruidMana/oUF_DruidMana.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_DruidMana/oUF_DruidMana.toc
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_DrunkenMaster/oUF_DrunkenMaster.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Experience/oUF_Experience.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Experience/oUF_Experience.toc
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Friendship/oUF_Friendship.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Friendship/oUF_Friendship.toc
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_HyperCombo/oUF_HyperCombo.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_MainTank/oUF_MainTank.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_MonkHarmony/oUF_MonkHarmony.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_PallyPower/oUF_PallyPower.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_PriestOrbs/oUF_PriestOrbs.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.toc
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Reputation/oUF_Reputation.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Reputation/oUF_Reputation.toc
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Smooth/oUF_Smooth.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_TotemBars/oUF_TotemBars.lua
Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_WarlockShards/oUF_WarlockShards.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/LICENSE
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/blizzard.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/colors.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/altpowerbar.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/assistant.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/aura.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/castbar.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/combat.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/cpoints.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/druidmana.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/eclipsebar.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/healprediction.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/health.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/leader.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/lfdrole.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/masterlooter.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/picon.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/portraits.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/power.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/pvp.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/qicon.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/range.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/readycheck.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/resting.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/resurrect.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/ricons.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/runebar.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/stagger.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/tags.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/threat.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/totems.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/events.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/factory.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/finalize.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/init.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/oUF_core.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/ouf.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/private.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/units.lua
Interface/AddOns/SVUI/libs/oUF_Villain/oUF/utils/changelog
Interface/AddOns/SVUI/libs/oUF_Villain/oUF_Villain.xml
Interface/AddOns/SVUI/packages/actionbar/KeyBind.lua
Interface/AddOns/SVUI/packages/actionbar/SVBar.lua
Interface/AddOns/SVUI/packages/aura/SVAura.lua
Interface/AddOns/SVUI/packages/aura/SVAura.xml
Interface/AddOns/SVUI/packages/bag/SVBag.lua
Interface/AddOns/SVUI/packages/bag/tools/breakstuff.lua
Interface/AddOns/SVUI/packages/bag/tools/sorting.lua
Interface/AddOns/SVUI/packages/chat/SVChat.lua
Interface/AddOns/SVUI/packages/dock/SVDock.lua
Interface/AddOns/SVUI/packages/gear/SVGear.lua
Interface/AddOns/SVUI/packages/henchmen/SVHenchmen.lua
Interface/AddOns/SVUI/packages/map/SVMap.lua
Interface/AddOns/SVUI/packages/override/SVOverride.lua
Interface/AddOns/SVUI/packages/plates/SVPlate.lua
Interface/AddOns/SVUI/packages/stats/SVStats.lua
Interface/AddOns/SVUI/packages/stats/stats/bags.lua
Interface/AddOns/SVUI/packages/stats/stats/cta.lua
Interface/AddOns/SVUI/packages/stats/stats/dps.lua
Interface/AddOns/SVUI/packages/stats/stats/durability.lua
Interface/AddOns/SVUI/packages/stats/stats/experience.lua
Interface/AddOns/SVUI/packages/stats/stats/friends.lua
Interface/AddOns/SVUI/packages/stats/stats/gold.lua
Interface/AddOns/SVUI/packages/stats/stats/guild.lua
Interface/AddOns/SVUI/packages/stats/stats/hps.lua
Interface/AddOns/SVUI/packages/stats/stats/reputation.lua
Interface/AddOns/SVUI/packages/stats/stats/system.lua
Interface/AddOns/SVUI/packages/stats/stats/time.lua
Interface/AddOns/SVUI/packages/stats/stats/tokens.lua
Interface/AddOns/SVUI/packages/tip/SVTip.lua
Interface/AddOns/SVUI/packages/unit/SVUnit.lua
Interface/AddOns/SVUI/packages/unit/config.lua
Interface/AddOns/SVUI/packages/unit/elements/auras.lua
Interface/AddOns/SVUI/packages/unit/elements/castbar.lua
Interface/AddOns/SVUI/packages/unit/elements/essentials.lua
Interface/AddOns/SVUI/packages/unit/elements/misc.lua
Interface/AddOns/SVUI/packages/unit/elements/tags.lua
Interface/AddOns/SVUI/packages/unit/frames.lua
Interface/AddOns/SVUI/packages/unit/resources/deathknight.lua
Interface/AddOns/SVUI/packages/unit/resources/druid.lua
Interface/AddOns/SVUI/packages/unit/resources/hunter.lua
Interface/AddOns/SVUI/packages/unit/resources/mage.lua
Interface/AddOns/SVUI/packages/unit/resources/monk.lua
Interface/AddOns/SVUI/packages/unit/resources/paladin.lua
Interface/AddOns/SVUI/packages/unit/resources/priest.lua
Interface/AddOns/SVUI/packages/unit/resources/rogue.lua
Interface/AddOns/SVUI/packages/unit/resources/shaman.lua
Interface/AddOns/SVUI/packages/unit/resources/warlock.lua
Interface/AddOns/SVUI/packages/unit/resources/warrior.lua
Interface/AddOns/SVUI/scripts/comix.lua
Interface/AddOns/SVUI/scripts/misc.lua
Interface/AddOns/SVUI/scripts/mounts.lua
Interface/AddOns/SVUI/scripts/questwatch.lua
Interface/AddOns/SVUI/scripts/raid.lua
Interface/AddOns/SVUI/scripts/reactions.lua
Interface/AddOns/SVUI/scripts/spellbind.lua
Interface/AddOns/SVUI/system/alerts.lua
Interface/AddOns/SVUI/system/animate.lua
Interface/AddOns/SVUI/system/common.lua
Interface/AddOns/SVUI/system/database.lua
Interface/AddOns/SVUI/system/deepcopy.lua
Interface/AddOns/SVUI/system/events.xml
Interface/AddOns/SVUI/system/load.lua
Interface/AddOns/SVUI/system/media.lua
Interface/AddOns/SVUI/system/mentalo.lua
Interface/AddOns/SVUI/system/setup.lua
Interface/AddOns/SVUI/system/slash.lua
Interface/AddOns/SVUI/system/timers.lua
Interface/AddOns/SVUI/system/utilities.lua
Interface/AddOns/SVUI/system/visibility.lua
Interface/AddOns/SVUI/xml/system.xml
Interface/AddOns/SVUI/xml/utility.xml
Interface/AddOns/SVUI_AnsweringService/SVUI_AnsweringService.lua
Interface/AddOns/SVUI_ArtOfWar/Bindings.xml
Interface/AddOns/SVUI_ArtOfWar/SVUI_ArtOfWar.lua
Interface/AddOns/SVUI_ConfigOMatic/SVUI_ConfigOMatic.lua
Interface/AddOns/SVUI_ConfigOMatic/language/generic.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/art.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/aura.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/bag.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/bar.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/chat.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/dock.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/dynamic.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/filter.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/henchmen.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/map.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/mode.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/plate.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/profiles.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/stat.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/tip.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/units/core.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/units/focus.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/units/grid.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/units/other.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/units/party.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/units/pet.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/units/player.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/units/raid.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/units/target.lua
Interface/AddOns/SVUI_Laborer/Bindings.xml
Interface/AddOns/SVUI_Laborer/SVUI_Laborer.lua
Interface/AddOns/SVUI_Laborer/modes/archaeology.lua
Interface/AddOns/SVUI_Laborer/modes/cooking.lua
Interface/AddOns/SVUI_Laborer/modes/farming.lua
Interface/AddOns/SVUI_Laborer/modes/fishing.lua
Interface/AddOns/SVUI_LogOMatic/SVUI_LogOMatic.lua
Interface/AddOns/SVUI_StyleOMatic/SVUI_StyleOMatic.lua
Interface/AddOns/SVUI_StyleOMatic/addons/achievement.lua
Interface/AddOns/SVUI_StyleOMatic/addons/alert.lua
Interface/AddOns/SVUI_StyleOMatic/addons/archeology.lua
Interface/AddOns/SVUI_StyleOMatic/addons/auctionhouse.lua
Interface/AddOns/SVUI_StyleOMatic/addons/barbershop.lua
Interface/AddOns/SVUI_StyleOMatic/addons/battlefield.lua
Interface/AddOns/SVUI_StyleOMatic/addons/blackmarket.lua
Interface/AddOns/SVUI_StyleOMatic/addons/calendar.lua
Interface/AddOns/SVUI_StyleOMatic/addons/challenges.lua
Interface/AddOns/SVUI_StyleOMatic/addons/character.lua
Interface/AddOns/SVUI_StyleOMatic/addons/chat.lua
Interface/AddOns/SVUI_StyleOMatic/addons/dressup.lua
Interface/AddOns/SVUI_StyleOMatic/addons/encounterjournal.lua
Interface/AddOns/SVUI_StyleOMatic/addons/friends.lua
Interface/AddOns/SVUI_StyleOMatic/addons/gossip.lua
Interface/AddOns/SVUI_StyleOMatic/addons/guild.lua
Interface/AddOns/SVUI_StyleOMatic/addons/help.lua
Interface/AddOns/SVUI_StyleOMatic/addons/inspect.lua
Interface/AddOns/SVUI_StyleOMatic/addons/itemsocketing.lua
Interface/AddOns/SVUI_StyleOMatic/addons/itemupgrade.lua
Interface/AddOns/SVUI_StyleOMatic/addons/keybinding.lua
Interface/AddOns/SVUI_StyleOMatic/addons/lfd.lua
Interface/AddOns/SVUI_StyleOMatic/addons/loothistory.lua
Interface/AddOns/SVUI_StyleOMatic/addons/lossofcontrol.lua
Interface/AddOns/SVUI_StyleOMatic/addons/macro.lua
Interface/AddOns/SVUI_StyleOMatic/addons/mailbox.lua
Interface/AddOns/SVUI_StyleOMatic/addons/merchant.lua
Interface/AddOns/SVUI_StyleOMatic/addons/petbattle.lua
Interface/AddOns/SVUI_StyleOMatic/addons/petition.lua
Interface/AddOns/SVUI_StyleOMatic/addons/petjournal.lua
Interface/AddOns/SVUI_StyleOMatic/addons/petstable.lua
Interface/AddOns/SVUI_StyleOMatic/addons/pvp.lua
Interface/AddOns/SVUI_StyleOMatic/addons/quest.lua
Interface/AddOns/SVUI_StyleOMatic/addons/raid.lua
Interface/AddOns/SVUI_StyleOMatic/addons/reforging.lua
Interface/AddOns/SVUI_StyleOMatic/addons/spellbook.lua
Interface/AddOns/SVUI_StyleOMatic/addons/store.lua
Interface/AddOns/SVUI_StyleOMatic/addons/supervillain.lua
Interface/AddOns/SVUI_StyleOMatic/addons/system.lua
Interface/AddOns/SVUI_StyleOMatic/addons/tabard.lua
Interface/AddOns/SVUI_StyleOMatic/addons/talents.lua
Interface/AddOns/SVUI_StyleOMatic/addons/taxi.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/ACP.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/AdiBags.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Altoholic.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/AtlasLoot.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/AuctionLite.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/BigWigs.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Bugsack.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Clique.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Cooline.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/DBM.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/DXE.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/LightHeaded.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Mogit.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Omen.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Outfitter.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Postal.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Quartz.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Recount.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/SexyCooldown.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Skada.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/TinyDPS.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/TomTom.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/TradeSkillDW.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/VEM.lua
Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/alDamageMeter.lua
Interface/AddOns/SVUI_StyleOMatic/addons/timemanager.lua
Interface/AddOns/SVUI_StyleOMatic/addons/trade.lua
Interface/AddOns/SVUI_StyleOMatic/addons/tradeskill.lua
Interface/AddOns/SVUI_StyleOMatic/addons/trainer.lua
Interface/AddOns/SVUI_StyleOMatic/addons/transmog.lua
Interface/AddOns/SVUI_StyleOMatic/addons/voidstorage.lua
Interface/AddOns/SVUI_StyleOMatic/addons/worldmap.lua
Interface/AddOns/SVUI_StyleOMatic/addons/worldstate.lua
Interface/AddOns/SVUI_StyleOMatic/common/methods.lua
Interface/AddOns/SVUI_TrackingDevice/SVUI_TrackingDevice.lua
Interface/AddOns/SVUI_TrackingDevice/SVUI_TrackingDevice.toc
Interface/SPELLBOOK/Professions-Book-Left.blp
Interface/SPELLBOOK/Professions-Book-Right.blp
Interface/SPELLBOOK/Spellbook-Page-1.blp
Interface/SPELLBOOK/Spellbook-Page-2.blp
diff --git a/Interface/AddOns/SVUI/Bindings.xml b/Interface/AddOns/SVUI/Bindings.xml
index 844e72f..d0c3a17 100644
--- a/Interface/AddOns/SVUI/Bindings.xml
+++ b/Interface/AddOns/SVUI/Bindings.xml
@@ -1,11 +1,11 @@
 <Bindings>
-  <Binding name="RaidMarker" description="Raid Marker" header="SVUI" runOnUp="true">
+  <Binding name="SVUI_MARKERS" description="Raid Marker" category="ADDONS" header="SVUI" runOnUp="true">
     RaidMark_HotkeyPressed(keystate)
   </Binding>
-  <Binding name="ToggleDocks" description="Toggle Docks" header="SVUI" runOnUp="false">
+  <Binding name="SVUI_DOCKS" description="Toggle Docks" category="ADDONS" runOnUp="false">
     HideSuperDocks()
   </Binding>
-  <Binding name="LetsRide" description="Lets Ride" header="SVUI" runOnUp="false">
+  <Binding name="SVUI_RIDE" description="Lets Ride" category="ADDONS" runOnUp="false">
     SVUILetsRide()
   </Binding>
 </Bindings>
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/SVUI.lua b/Interface/AddOns/SVUI/SVUI.lua
index 0a1eac1..cd0fdcb 100644
--- a/Interface/AddOns/SVUI/SVUI.lua
+++ b/Interface/AddOns/SVUI/SVUI.lua
@@ -12,7 +12,20 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 ##############################################################################
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ############################################################################## ]]--
+
+--[[  CONSTANTS ]]--
+
+BINDING_HEADER_SVUI = "Supervillain UI";
+BINDING_NAME_SVUI_MARKERS = "Raid Markers";
+BINDING_NAME_SVUI_DOCKS = "Toggle Docks";
+BINDING_NAME_SVUI_RIDE = "Let's Ride";
+
+SLASH_RELOADUI1 = "/rl"
+SLASH_RELOADUI2 = "/reloadui"
+SlashCmdList.RELOADUI = ReloadUI
+
 --[[ GLOBALS ]]--
+
 local _G = _G;
 local unpack        = _G.unpack;
 local select        = _G.select;
@@ -37,42 +50,18 @@ local floor = math.floor
 --[[ TABLE METHODS ]]--
 local twipe, tsort, tconcat = table.wipe, table.sort, table.concat;

+--[[ GET THE REGISTRY LIB ]]--
+
+local LibRegistry = LibStub("LibSystemRegistry-1.0")
+
 --[[ LOCALS ]]--

-local SVUINameSpace, SVUICore = ...;
-local SVUIVersion = GetAddOnMetadata(..., "Version");
-local clientVersion, internalVersion, releaseDate, uiVersion = GetBuildInfo();
 local callbacks = {};
 local numCallbacks = 0;
 local playerClass = select(2,UnitClass("player"));
-local dumb = function() return end
-
-local messagePattern = "|cffFF2F00%s:|r"
-local debugPattern = "|cffFF2F00%s|r [|cff992FFF%s|r]|cffFF2F00:|r"
-local PLUGIN_LISTING = "";
-local ModuleQueue, ScriptQueue = {},{};
-
-local INFO_BY = "%s |cff0099FFby %s|r";
-local INFO_VERSION = "%s%s |cff33FF00Version: %s|r";
-local INFO_NAME = "Plugins";
-local INFO_HEADER = "Supervillain UI (version %.3f): Plugins";
-
-if GetLocale() == "ruRU" then
-    INFO_BY = "%s |cff0099FFот %s|r";
-    INFO_VERSION = "%s%s |cff33FF00Версия: %s|r";
-    INFO_NAME = "Плагины";
-    INFO_HEADER = "Supervillain UI (устарела %.3f): Плагины";
-end

 local actualWidth, actualHeight = UIParent:GetSize()

---[[  CONSTANTS ]]--
-
-BINDING_HEADER_SVUI = "Supervillain UI";
-SLASH_RELOADUI1 = "/rl"
-SLASH_RELOADUI2 = "/reloadui"
-SlashCmdList.RELOADUI = ReloadUI
-
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--

 function enforce(condition, ...)
@@ -89,53 +78,6 @@ function enforce(condition, ...)
 end
 local assert = enforce;

---[[ META METHODS ]]--
-
-local rootstring = function(self) return self.___addonName end
-
---[[ ENSURE META METHODS ]]--
-
-local function SaveMetaMethods(obj)
-    local mt = {}
-    local old = getmetatable(obj)
-    if old then
-        for k, v in pairs(old) do mt[k] = v end
-    end
-    mt.__tostring = rootstring
-    setmetatable(obj, mt)
-end
-
---[[ LOCALIZATION HELPERS ]]--
-
-local failsafe = function() assert(false) end
-
-local metaread = {
-    __index = function(self, key)
-        rawset(self, key, key)
-        return key
-    end
-}
-
-local activeLocale
-
-local defaultwrite = setmetatable({}, {
-    __newindex = function(self, key, value)
-        if not rawget(activeLocale, key) then
-            rawset(activeLocale, key, value == true and key or value)
-        end
-    end,
-    __index = failsafe
-})
-
-local metawrite = setmetatable({}, {
-    __newindex = function(self, key, value)
-        rawset(activeLocale, key, value == true and key or value)
-    end,
-    __index = failsafe
-})
-
-local Localization = setmetatable({}, metaread);
-
 --[[ CLASS COLOR LOCALS ]]--

 local function formatValueString(text)
@@ -307,12 +249,6 @@ end

 --[[ CORE ENGINE CONSTRUCT ]]--

-local Core_StaticPopup_Show = function(self, arg)
-    if arg == "ADDON_ACTION_FORBIDDEN" then
-        StaticPopup_Hide(arg)
-    end
-end
-
 local Core_ResetAllUI = function(self, confirmed)
     if InCombatLockdown()then
         SendAddonMessage(ERR_NOT_IN_COMBAT)
@@ -362,500 +298,12 @@ local Core_ToggleConfig = function(self)
     GameTooltip:Hide()
 end

---/script SVUI[1]:TaintHandler("SVUI", "Script", "Function")
 local Core_TaintHandler = function(self, taint, sourceName, sourceFunc)
     if GetCVarBool('scriptErrors') ~= 1 then return end
     local errorString = ("Error Captured: %s->%s->{%s}"):format(taint, sourceName or "Unknown", sourceFunc or "Unknown")
     self:AddonMessage(errorString)
     self:StaticPopup_Show("TAINT_RL")
 end
-
-local function _sendmessage(msg, prefix)
-    if(type(msg) == "table") then
-        msg = tostring(msg)
-    end
-
-    if(not msg) then return end
-
-    if(prefix) then
-        local outbound = ("%s %s"):format(prefix, msg);
-        print(outbound)
-    else
-        print(msg)
-    end
-end
-
-local Core_Debugger = function(self, msg)
-    if(not self.DebuggingMode) then return end
-    local outbound = (debugPattern):format("SVUI", "DEBUG")
-    _sendmessage(msg, outbound)
-end
-
-local Core_AddonMessage = function(self, msg)
-    local outbound = (messagePattern):format("SVUI")
-    _sendmessage(msg, outbound)
-end
-
-local Core_SetLocaleStrings = function(self, locale, isDefault)
-    local gameLocale = GetLocale()
-    if gameLocale == "enGB" then gameLocale = "enUS" end
-
-    activeLocale = Localization
-
-    if isDefault then
-        return defaultwrite
-    elseif(locale == GAME_LOCALE or locale == gameLocale) then
-        return metawrite
-    end
-end
-
-local Core_Prototype = function(self, name)
-    local version = GetAddOnMetadata(name, "Version")
-    local schema = GetAddOnMetadata(name, "X-SVUI-Schema")
-
-    self.Configs[schema] = {["enable"] = false}
-
-    local obj = {
-        ___addonName = name,
-        ___version = version,
-        ___schema = schema
-    }
-
-    local mt = {}
-    local old = getmetatable(obj)
-    if old then
-        for k, v in pairs(old) do mt[k] = v end
-    end
-    mt.__tostring = rootstring
-    setmetatable(obj, mt)
-    return obj
-end
-
---[[ REGISTRY CONSTRUCT ]]--
-
-local changeDBVar = function(self, value, key, sub1, sub2, sub3)
-    local core = self.___core
-    local schema = self.___schema
-    local config = core.db[schema]
-
-    if((sub1 and sub2 and sub3) and (config[sub1] and config[sub1][sub2] and config[sub1][sub2][sub3])) then
-        core.db[schema][sub1][sub2][sub3][key] = value
-    elseif((sub1 and sub2) and (config[sub1] and config[sub1][sub2])) then
-        core.db[schema][sub1][sub2][key] = value
-    elseif(sub1 and config[sub1]) then
-        core.db[schema][sub1][key] = value
-    else
-        core.db[schema][key] = value
-    end
-
-    self.db = core.db[schema]
-
-    if(self.UpdateLocals) then
-        self:UpdateLocals()
-    end
-end
-
-local innerOnEvent = function(self, event, ...)
-    local obj = self.module
-    if self[event] and type(self[event]) == "function" then
-        self[event](obj, event, ...)
-    end
-end
-
-local registerEvent = function(self, eventname, eventfunc)
-    if not self.___eventframe then
-        self.___eventframe = CreateFrame("Frame", nil)
-        self.___eventframe.module = self
-        self.___eventframe:SetScript("OnEvent", innerOnEvent)
-    end
-
-    if(not self.___eventframe[eventname]) then
-        local fn = eventfunc
-        if type(eventfunc) == "string" then
-            fn = self[eventfunc]
-        elseif(not fn and self[eventname]) then
-            fn = self[eventname]
-        end
-        self.___eventframe[eventname] = fn
-    end
-
-    self.___eventframe:RegisterEvent(eventname)
-end
-
-local unregisterEvent = function(self, event, ...)
-    if(self.___eventframe) then
-        self.___eventframe:UnregisterEvent(event)
-    end
-end
-
-local innerOnUpdate = function(self, elapsed)
-    if self.elapsed and self.elapsed > (self.throttle) then
-        local obj = self.module
-        local core = obj.___core
-        local callbacks = self.callbacks
-
-        for name, fn in pairs(callbacks) do
-            local _, error = pcall(fn, obj)
-            if(error and core.Debugging) then
-                print(error)
-            end
-        end
-
-        self.elapsed = 0
-    else
-        self.elapsed = (self.elapsed or 0) + elapsed
-    end
-end
-
-local registerUpdate = function(self, updatefunc, throttle)
-    if not self.___updateframe then
-        self.___updateframe = CreateFrame("Frame", nil);
-        self.___updateframe.module = self;
-        self.___updateframe.callbacks = {};
-        self.___updateframe.elapsed = 0;
-        self.___updateframe.throttle = throttle or 0.2;
-    end
-
-    if(updatefunc and type(updatefunc) == "string" and self[updatefunc]) then
-        self.___updateframe.callbacks[updatefunc] = self[updatefunc]
-    end
-
-    self.___updateframe:SetScript("OnUpdate", innerOnUpdate)
-end
-
-local unregisterUpdate = function(self, updatefunc)
-    if(updatefunc and type(updatefunc) == "string" and self.___updateframe.callbacks[updatefunc]) then
-        self.___updateframe.callbacks[updatefunc] = nil
-        if(#self.___updateframe.callbacks == 0) then
-            self.___updateframe:SetScript("OnUpdate", nil)
-        end
-    else
-        self.___updateframe:SetScript("OnUpdate", nil)
-    end
-end
-
-local add_OptionsIndex = function(self, index, data)
-    local addonName = self.___addonName
-    local schema = self.___schema
-    local core = self.___core
-    local header = GetAddOnMetadata(addonName, "X-SVUI-Header")
-
-    core.Options.args.plugins.args.pluginOptions.args[schema].args[index] = data
-end
-
-local function SetPluginString(addonName)
-    local pluginString = PLUGIN_LISTING or ""
-    local author = GetAddOnMetadata(addonName, "Author") or "Unknown"
-    local Pname = GetAddOnMetadata(addonName, "Title") or addonName
-    local version = GetAddOnMetadata(addonName, "Version") or "???"
-    pluginString = INFO_BY:format(pluginString, author)
-    pluginString = ("%s %s"):format(pluginString, Pname)
-    pluginString = INFO_VERSION:format(pluginString, "|cff00FF00", version)
-    pluginString = ("%s|r\n"):format(pluginString)
-
-    PLUGIN_LISTING = pluginString
-end
-
-local function SetInternalModule(obj, core, schema)
-    local addonmeta = {}
-    local oldmeta = getmetatable(obj)
-    if oldmeta then
-        for k, v in pairs(oldmeta) do addonmeta[k] = v end
-    end
-    addonmeta.__tostring = rootstring
-    setmetatable( obj, addonmeta )
-
-    local addonName = ("SVUI [%s]"):format(schema)
-
-    obj.___addonName = addonName
-    obj.___schema = schema
-    obj.___core = core
-
-    obj.initialized = false
-    obj.CombatLocked = false
-    obj.ChangeDBVar = changeDBVar
-    obj.RegisterEvent = registerEvent
-    obj.UnregisterEvent = unregisterEvent
-    obj.RegisterUpdate = registerUpdate
-    obj.UnregisterUpdate = unregisterUpdate
-
-    return obj
-end
-
-local function SetExternalModule(obj, core, schema, addonName, header, lod)
-    local addonmeta = {}
-    local oldmeta = getmetatable(obj)
-    if oldmeta then
-        for k, v in pairs(oldmeta) do addonmeta[k] = v end
-    end
-    addonmeta.__tostring = rootstring
-    setmetatable( obj, addonmeta )
-
-    obj.___addonName = addonName
-    obj.___schema = schema
-    obj.___header = header
-    obj.___core = core
-    obj.___lod = lod
-
-    obj.initialized = false
-    obj.CombatLocked = false
-    obj.ChangeDBVar = changeDBVar
-    obj.RegisterEvent = registerEvent
-    obj.UnregisterEvent = unregisterEvent
-    obj.RegisterUpdate = registerUpdate
-    obj.UnregisterUpdate = unregisterUpdate
-    obj.AddOption = add_OptionsIndex
-
-    if(lod) then
-        -- print("PLUGIN: " .. addonName)
-        core.Options.args.plugins.args.pluginOptions.args[schema] = {
-            type = "group",
-            name = header,
-            childGroups = "tree",
-            args = {
-                enable = {
-                    order = 1,
-                    type = "execute",
-                    width = "full",
-                    name = function()
-                        local nameString = "Disable"
-                        if(not IsAddOnLoaded(addonName)) then
-                            nameString = "Enable"
-                        end
-                        return nameString
-                    end,
-                    func = function()
-                        if(not IsAddOnLoaded(addonName)) then
-                            local loaded, reason = LoadAddOn(addonName)
-                            core:UpdateDatabase()
-                            obj:ChangeDBVar(true, "enable")
-                        else
-                            obj:ChangeDBVar(false, "enable")
-                            core:StaticPopup_Show("RL_CLIENT")
-                        end
-                    end,
-                }
-            }
-        }
-    else
-        core.Options.args.plugins.args.pluginOptions.args[schema] = {
-            type = "group",
-            name = header,
-            childGroups = "tree",
-            args = {
-                enable = {
-                    order = 1,
-                    type = "toggle",
-                    name = "Enable",
-                    get = function() return obj.db.enable end,
-                    set = function(key, value) obj:ChangeDBVar(value, "enable"); core:StaticPopup_Show("RL_CLIENT") end,
-                }
-            }
-        }
-    end
-
-    return obj
-end
-
-local Registry_NewCallback = function(self, fn)
-    if(fn and type(fn) == "function") then
-        self.Callbacks[#self.Callbacks+1] = fn
-    end
-end
-
-local Registry_NewScript = function(self, fn)
-    if(fn and type(fn) == "function") then
-        ScriptQueue[#ScriptQueue+1] = fn
-    end
-end
-
-local Registry_NewPackage = function(self, obj, schema)
-    local core = self.___core
-    if(core[schema]) then return end
-
-    ModuleQueue[#ModuleQueue+1] = schema
-    self.Modules[#self.Modules+1] = schema
-
-    core[schema] = SetInternalModule(obj, core, schema)
-
-    if(core.AddonLaunched) then
-        if(core[schema].Load) then
-            core[schema]:Load()
-        end
-    end
-end
-
-local Registry_NewPlugin = function(self, obj)
-    local core = self.___core
-    local coreName = core.___addonName
-    local addonName = obj.___addonName
-
-    if(addonName and addonName ~= coreName) then
-        local schema = GetAddOnMetadata(addonName, "X-SVUI-Schema");
-        local header = GetAddOnMetadata(addonName, "X-SVUI-Header");
-        local lod = IsAddOnLoadOnDemand(addonName)
-        if(not schema) then return end
-
-        ModuleQueue[#ModuleQueue+1] = schema
-        self.Modules[#self.Modules+1] = schema
-
-        SetPluginString(addonName)
-
-        core[schema] = SetExternalModule(obj, core, schema, addonName, header, lod)
-
-        if(core.AddonLaunched and core[schema].Load) then
-            core[schema]:Load()
-            --print(schema)
-        end
-    end
-end
-
-local Registry_NewAddon = function(self, addonName, schema, header)
-    local core = self.___core
-    self.Addons[addonName] = schema;
-
-    core.Options.args.plugins.args.pluginOptions.args[schema] = {
-        type = "group",
-        name = header,
-        childGroups = "tree",
-        args = {
-            enable = {
-                order = 1,
-                type = "execute",
-                width = "full",
-                name = function()
-                    local nameString = "Disable"
-                    if(not IsAddOnLoaded(addonName)) then
-                        nameString = "Enable"
-                    end
-                    return nameString
-                end,
-                func = function()
-                    if(not IsAddOnLoaded(addonName)) then
-                        local loaded, reason = LoadAddOn(addonName)
-                        core:UpdateDatabase()
-                        core.db[schema].enable = true
-                        self:LoadPackages()
-                    else
-                        core.db[schema].enable = false
-                        core:StaticPopup_Show("RL_CLIENT")
-                    end
-                end,
-            }
-        }
-    }
-end
-
-local Registry_FetchAddons = function(self)
-    local addonCount = GetNumAddOns()
-    local core = self.___core
-
-    for i = 1, addonCount do
-        local addonName, _, _, _, _, reason = GetAddOnInfo(i)
-        local lod = IsAddOnLoadOnDemand(i)
-        local header = GetAddOnMetadata(i, "X-SVUI-Header")
-        local schema = GetAddOnMetadata(i, "X-SVUI-Schema")
-
-        if(lod and schema) then
-            self:NewAddon(addonName, schema, header)
-        end
-    end
-end
-
-local Registry_RunCallbacks = function(self)
-    local callbacks = self.Callbacks
-    for i=1, #callbacks do
-        local fn = callbacks[i]
-        if(fn and type(fn) == "function") then
-            fn()
-        end
-    end
-end
-
-local Registry_Update = function(self, name, dataOnly)
-    local core = self.___core
-    local obj = core[name]
-    if obj then
-        if core.db[name] then
-            obj.db = core.db[name]
-        end
-        if obj.ReLoad and not dataOnly then
-            obj:ReLoad()
-        end
-    end
-end
-
-local Registry_UpdateAll = function(self)
-    local modules = self.Modules
-    local core = self.___core
-    for _,name in pairs(modules) do
-        local obj = core[name]
-
-        if core.db[name] then
-            obj.db = core.db[name]
-        end
-
-        if obj and obj.ReLoad then
-            obj:ReLoad()
-        end
-    end
-end
-
-local Registry_LoadOnDemand = function(self)
-    local core = self.___core
-    local addons = self.Addons
-    for name,schema in pairs(addons) do
-        local config = core.db[schema]
-        if(config and (config.enable or config.enable ~= false)) then
-            if(not IsAddOnLoaded(name)) then
-                local loaded, reason = LoadAddOn(name)
-            end
-            EnableAddOn(name)
-        end
-    end
-end
-
-local Registry_Load = function(self)
-    if not ModuleQueue then return end
-    local core = self.___core
-
-    for i=1,#ModuleQueue do
-        local name = ModuleQueue[i]
-        local obj = core[name]
-        if obj and not obj.initialized then
-            if core.db[name] then
-                obj.db = core.db[name]
-            end
-
-            if obj.Load then
-                local halt = false
-                if(obj.db.incompatible) then
-                    for addon,_ in pairs(obj.db.incompatible) do
-                        if IsAddOnLoaded(addon) then halt = true end
-                    end
-                end
-                if(not halt) then
-                    obj:Load()
-                    obj.Load = nil
-                    --print(name)
-                end
-            end
-            obj.initialized = true;
-        end
-    end
-
-    twipe(ModuleQueue)
-
-    if not ScriptQueue then return end
-    for i=1, #ScriptQueue do
-        local fn = ScriptQueue[i]
-        if(fn and type(fn) == "function") then
-            fn()
-        end
-    end
-
-    ScriptQueue = nil
-end
 --[[
 #####################################################################################
   /$$$$$$  /$$    /$$ /$$   /$$ /$$$$$$        /$$$$$$   /$$$$$$  /$$$$$$$  /$$$$$$$$
@@ -868,80 +316,31 @@ end
  \______/     \_/     \______/ |______/       \______/  \______/ |__/  |__/|________/
 #####################################################################################
 ]]--
-local SVUI = {
-    ___addonName = SVUINameSpace,
-    ___version = GetAddOnMetadata(SVUINameSpace, "Version"),
-    ___interface = tonumber(uiVersion),
-
-    db = {},
-    Global = { Accountant = {}, profiles = {}, profileKeys = {} },
-    Configs = {},
-    Media = {},
-    DisplayAudit = {},
-    DynamicOptions = {},
-    Dispellable = {},
-    Snap = {},
-    class = playerClass,
-    fubar = dumb,
-    ClassRole = "",
-    UnitRole = "NONE",
-    ConfigurationMode = false,
-    DebuggingMode = false,
-    EffectiveScale = 1,
-    ActualHeight = actualHeight,
-    ActualWidth = actualWidth,
-    yScreenArea = (actualHeight * 0.33),
-    xScreenArea = (actualWidth * 0.33),
-    SetLocaleStrings = Core_SetLocaleStrings,
-    Prototype = Core_Prototype,
-    AddonMessage = Core_AddonMessage,
-    Debugger = Core_Debugger,
-    StaticPopup_Show = Core_StaticPopup_Show,
-    ResetAllUI = Core_ResetAllUI,
-    ResetUI = Core_ResetUI,
-    ToggleConfig = Core_ToggleConfig,
-    TaintHandler = Core_TaintHandler,
-    Options = {
-        type = "group",
-        name = "|cff339fffConfig-O-Matic|r",
-        args = {
-            plugins = {
-                order = -2,
-                type = "group",
-                name = "Plugins",
-                childGroups = "tab",
-                args = {
-                    pluginheader = {
-                        order = 1,
-                        type = "header",
-                        name = "Supervillain Plugins",
-                    },
-                    pluginOptions = {
-                        order = 2,
-                        type = "group",
-                        name = "",
-                        args = {
-                            pluginlist = {
-                                order = 1,
-                                type = "group",
-                                name = "Summary",
-                                args = {
-                                    active = {
-                                        order = 1,
-                                        type = "description",
-                                        name = function() return PLUGIN_LISTING end
-                                    }
-                                }
-                            },
-                        }
-                    }
-                }
-            }
-        }
-    }
-}

-SaveMetaMethods(SVUI)
+--[[ INITIALIZE THE CORE OBJECT ]]--
+
+local SVUI = LibRegistry:InitializeCore()
+
+SVUI.Snap               = {}
+SVUI.Media              = {}
+SVUI.DisplayAudit       = {}
+SVUI.DynamicOptions     = {}
+SVUI.Dispellable        = {}
+
+SVUI.class              = playerClass
+SVUI.ClassRole          = ""
+SVUI.UnitRole           = "NONE"
+SVUI.ConfigurationMode  = false
+SVUI.EffectiveScale     = 1
+SVUI.ActualHeight       = actualHeight
+SVUI.ActualWidth        = actualWidth
+SVUI.yScreenArea        = (actualHeight * 0.33)
+SVUI.xScreenArea        = (actualWidth * 0.33)
+
+SVUI.ResetAllUI         = Core_ResetAllUI
+SVUI.ResetUI            = Core_ResetUI
+SVUI.ToggleConfig       = Core_ToggleConfig
+SVUI.TaintHandler       = Core_TaintHandler

 --[[ UTILITY FRAMES ]]--

@@ -954,36 +353,41 @@ SVUI.Snap[1] = SVUI.UIParent;
 SVUI.Cloaked = CreateFrame("Frame", nil, UIParent);
 SVUI.Cloaked:Hide();

-local Registry = {
-    ___core = SVUI,
-    Modules = {},
-    Addons = {},
-    Callbacks = {},
-    INFO_VERSION = INFO_VERSION,
-    INFO_NEW = INFO_NEW,
-    INFO_NAME = INFO_NAME,
-    INFO_HEADER = INFO_HEADER,
-    NewCallback = Registry_NewCallback,
-    NewScript = Registry_NewScript,
-    NewPackage = Registry_NewPackage,
-    NewPlugin = Registry_NewPlugin,
-    NewAddon = Registry_NewAddon,
-    FindAddons = Registry_FetchAddons,
-    LoadRegisteredAddons = Registry_LoadOnDemand,
-    RunCallbacks = Registry_RunCallbacks,
-    Update = Registry_Update,
-    UpdateAll = Registry_UpdateAll,
-    LoadPackages = Registry_Load,
-}
-
-SaveMetaMethods(Registry)
-
---[[ COMMON FUNCTIONS ]]--
-
-SVUICore[1] = SVUI
-SVUICore[2] = Localization
-SVUICore[3] = Registry
-
---[[ SET MASTER GLOBAL ]]--
-
-_G[SVUINameSpace] = SVUICore;
\ No newline at end of file
+SVUI.Options = {
+    type = "group",
+    name = "|cff339fffConfig-O-Matic|r",
+    args = {
+        plugins = {
+            order = -2,
+            type = "group",
+            name = "Plugins",
+            childGroups = "tab",
+            args = {
+                pluginheader = {
+                    order = 1,
+                    type = "header",
+                    name = "Supervillain Plugins",
+                },
+                pluginOptions = {
+                    order = 2,
+                    type = "group",
+                    name = "",
+                    args = {
+                        pluginlist = {
+                            order = 1,
+                            type = "group",
+                            name = "Summary",
+                            args = {
+                                active = {
+                                    order = 1,
+                                    type = "description",
+                                    name = function() return LibRegistry:GetPlugins() end
+                                }
+                            }
+                        },
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/SVUI.xml b/Interface/AddOns/SVUI/SVUI.xml
index dbe1328..3c8071d 100644
--- a/Interface/AddOns/SVUI/SVUI.xml
+++ b/Interface/AddOns/SVUI/SVUI.xml
@@ -1,110 +1,10 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/">
+
+    <Include file="libs\libs.xml"/>
+    <Include file="xml\system.xml"/>

     <Script file="SVUI.lua"/>

-	 <Frame name="SVUI_PanelTemplate" virtual="true" toplevel="true">
-        <Layers>
-            <Layer level="BACKGROUND">
-                <Texture name="$parentBG" setAllPoints="true"/>
-            </Layer>
-            <Layer level="OVERLAY">
-                <Texture name="$parentTitleBG">
-                    <Anchors>
-                        <Anchor point="BOTTOMLEFT" relativeTo="$parentBG" relativePoint="TOPLEFT"/>
-                        <Anchor point="TOPRIGHT" relativeTo="$parentBG" relativePoint="TOPRIGHT">
-                            <Offset x="0" y="30"/>
-                        </Anchor>
-                    </Anchors>
-                </Texture>
-            </Layer>
-        </Layers>
-    </Frame>
-
-    <Frame name="SVUI_MovingPanelTemplate" virtual="true" movable="true" clampedToScreen="true" toplevel="true">
-        <Layers>
-            <Layer level="BACKGROUND">
-                <Texture name="$parentBG" setAllPoints="true"/>
-            </Layer>
-            <Layer level="OVERLAY">
-                <Texture name="$parentTitleBG">
-                    <Anchors>
-                        <Anchor point="TOPLEFT"/>
-                        <Anchor point="BOTTOMRIGHT" relativePoint="TOPRIGHT">
-                            <Offset x="0" y="-30"/>
-                        </Anchor>
-                    </Anchors>
-                </Texture>
-            </Layer>
-        </Layers>
-        <Frames>
-            <Frame name="$parentTitleButton">
-                <Anchors>
-                    <Anchor point="TOPLEFT" relativeTo="$parentTitleBG"/>
-                    <Anchor point="BOTTOMRIGHT" relativeTo="$parentTitleBG"/>
-                </Anchors>
-            </Frame>
-        </Frames>
-    </Frame>
-
-    <Frame name="SVUI_MessagePanelTemplate" virtual="true" toplevel="true">
-        <Layers>
-            <Layer level="BACKGROUND">
-                <Texture name="$parentBG" setAllPoints="true"/>
-            </Layer>
-            <Layer level="OVERLAY">
-                <Texture name="$parentTitleBG">
-                    <Anchors>
-                        <Anchor point="TOPLEFT">
-                            <Offset x="8" y="-8"/>
-                        </Anchor>
-                        <Anchor point="BOTTOMRIGHT" relativePoint="TOPRIGHT">
-                            <Offset x="-32" y="-24"/>
-                        </Anchor>
-                    </Anchors>
-                </Texture>
-                <Texture name="$parentDialogBG">
-                    <Anchors>
-                        <Anchor point="TOPLEFT">
-                            <Offset x="8" y="-32"/>
-                        </Anchor>
-                        <Anchor point="BOTTOMRIGHT">
-                            <Offset x="-32" y="32"/>
-                        </Anchor>
-                    </Anchors>
-                </Texture>
-            </Layer>
-            <Layer level="ARTWORK">
-                <FontString parentKey="Title" inherits="GameFontNormal">
-                    <Anchors>
-                        <Anchor point="TOPLEFT">
-                            <Offset x="8" y="-8"/>
-                        </Anchor>
-                        <Anchor point="TOPRIGHT">
-                            <Offset x="-32" y="-24"/>
-                        </Anchor>
-                    </Anchors>
-                </FontString>
-            </Layer>
-        </Layers>
-        <Frames>
-            <Button parentKey="Close" inherits="UIPanelCloseButton">
-                <Anchors>
-                    <Anchor point="TOPRIGHT">
-                        <Offset x="-2" y="-2"/>
-                    </Anchor>
-                </Anchors>
-            </Button>
-        </Frames>
-    </Frame>
-
-    <Script file="libs\LibStub\LibStub.lua"/>
-    <Script file="libs\CallbackHandler-1.0\CallbackHandler-1.0.lua"/>
-    <Script file="libs\LibSharedMedia-3.0\LibSharedMedia-3.0.lua"/>
-    <Script file="libs\LibActionButton-1.0\LibActionButton-1.0.lua"/>
-    <Script file="libs\LibBalancePowerTracker-1.1\LibBalancePowerTracker-1.1.lua"/>
-    <Include file="libs\oUF\oUF.xml"/>
-    <Include file="libs\oUF_Plugins\oUF_Plugins.xml"/>
-
     <Script file="language\english_ui.lua"/>
     <Script file="language\italian_ui.lua"/>
     <Script file="language\french_ui.lua"/>
diff --git a/Interface/AddOns/SVUI/installer/presets/auras.lua b/Interface/AddOns/SVUI/installer/presets/auras.lua
deleted file mode 100644
index 5ee13c4..0000000
--- a/Interface/AddOns/SVUI/installer/presets/auras.lua
+++ /dev/null
@@ -1,283 +0,0 @@
---[[
-##############################################################################
-_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
- ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__      #
-  __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____     #
-   ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____    #
-    ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____   #
-     _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____  #
-      __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ #
-       _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_#
-        ___\///////////___________\///___________\/////////_____\///////////_#
-##############################################################################
-S U P E R - V I L L A I N - U I   By: Munglunch                              #
-##############################################################################
-##########################################################
-LOCALIZED LUA FUNCTIONS
-##########################################################
-]]--
---[[ GLOBALS ]]--
-local _G = _G;
-local unpack    = _G.unpack;
-local select    = _G.select;
-local pairs     = _G.pairs;
---[[
-##########################################################
-LOCALIZED GLOBALS
-##########################################################
-]]--
-local SVUI_CLASS_COLORS = _G.SVUI_CLASS_COLORS
-local RAID_CLASS_COLORS = _G.RAID_CLASS_COLORS
---[[
-##########################################################
-GET ADDON DATA
-##########################################################
-]]--
-local SV, L = unpack(select(2, ...));
-local scc = SVUI_CLASS_COLORS[SV.class];
-local rcc = RAID_CLASS_COLORS[SV.class];
-local r2 = .1 + (rcc.r * .1)
-local g2 = .1 + (rcc.g * .1)
-local b2 = .1 + (rcc.b * .1)
---[[
-##########################################################
-LAYOUT PRESETS
-##########################################################
-]]--
-local presets = {
-	["auras"] = {
-		["link"] = "SVUnit",
-		["default"] = {
-			["player"] = {
-				["buffs"] = {
-					enable = false,
-					attachTo = "DEBUFFS",
-					anchorPoint = 'TOPLEFT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'RIGHT',
-				},
-				["debuffs"] = {
-					enable = false,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPLEFT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'RIGHT',
-				},
-				["aurabar"] = {
-					enable = false
-				}
-			},
-			["target"] = {
-				["smartAuraDisplay"] = "DISABLED",
-				["buffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "BUFFS",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["aurabar"] = {
-					enable = false
-				}
-			},
-			["focus"] = {
-				["smartAuraDisplay"] = "DISABLED",
-				["buffs"] = {
-					enable = false,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["aurabar"] = {
-					enable = false
-				}
-			}
-		},
-		["icons"] = {
-			["player"] = {
-				["buffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPLEFT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'RIGHT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "BUFFS",
-					anchorPoint = 'TOPLEFT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'RIGHT',
-				},
-				["aurabar"] = {
-					enable = false
-				}
-			},
-			["target"] = {
-				["smartAuraDisplay"] = "DISABLED",
-				["buffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "BUFFS",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["aurabar"] = {
-					enable = false
-				}
-			},
-			["focus"] = {
-				["smartAuraDisplay"] = "DISABLED",
-				["buffs"] = {
-					enable = false,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["aurabar"] = {
-					enable = false
-				}
-			}
-		},
-		["bars"] = {
-			["player"] = {
-				["buffs"] = {
-					enable = false,
-					attachTo = "FRAME"
-				},
-				["debuffs"] = {
-					enable = false,
-					attachTo = "FRAME"
-				},
-				["aurabar"] = {
-					enable = true,
-					attachTo = "FRAME"
-				}
-			},
-			["target"] = {
-				["smartAuraDisplay"] = "SHOW_DEBUFFS_ON_FRIENDLIES",
-				["buffs"] = {
-					enable = false,
-					attachTo = "FRAME"
-				},
-				["debuffs"] = {
-					enable = false,
-					attachTo = "FRAME"
-				},
-				["aurabar"] = {
-					enable = true,
-					attachTo = "FRAME"
-				}
-			},
-			["focus"] = {
-				["smartAuraDisplay"] = "SHOW_DEBUFFS_ON_FRIENDLIES",
-				["buffs"] = {
-					enable = false,
-					attachTo = "FRAME"
-				},
-				["debuffs"] = {
-					enable = false,
-					attachTo = "FRAME"
-				},
-				["aurabar"] = {
-					enable = true,
-					attachTo = "FRAME"
-				}
-			}
-		},
-		["theworks"] = {
-			["player"] = {
-				["buffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPLEFT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'RIGHT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "BUFFS",
-					anchorPoint = 'TOPLEFT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'RIGHT',
-				},
-				["aurabar"] = {
-					enable = true,
-					attachTo = "DEBUFFS"
-				}
-			},
-			["target"] = {
-				["smartAuraDisplay"] = "SHOW_DEBUFFS_ON_FRIENDLIES",
-				["buffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "BUFFS",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["aurabar"] = {
-					enable = true,
-					attachTo = "DEBUFFS"
-				}
-			},
-			["focus"] = {
-				["smartAuraDisplay"] = "SHOW_DEBUFFS_ON_FRIENDLIES",
-				["buffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "BUFFS",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["aurabar"] = {
-					enable = true,
-					attachTo = "DEBUFFS"
-				}
-			}
-		},
-	}
-};
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/installer/presets/bars.lua b/Interface/AddOns/SVUI/installer/presets/bars.lua
deleted file mode 100644
index 2e667df..0000000
--- a/Interface/AddOns/SVUI/installer/presets/bars.lua
+++ /dev/null
@@ -1,133 +0,0 @@
---[[
-##############################################################################
-_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
- ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__      #
-  __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____     #
-   ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____    #
-    ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____   #
-     _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____  #
-      __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ #
-       _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_#
-        ___\///////////___________\///___________\/////////_____\///////////_#
-##############################################################################
-S U P E R - V I L L A I N - U I   By: Munglunch                              #
-##############################################################################
-##########################################################
-LOCALIZED LUA FUNCTIONS
-##########################################################
-]]--
---[[ GLOBALS ]]--
-local _G = _G;
-local unpack    = _G.unpack;
-local select    = _G.select;
-local pairs     = _G.pairs;
---[[
-##########################################################
-LOCALIZED GLOBALS
-##########################################################
-]]--
-local SVUI_CLASS_COLORS = _G.SVUI_CLASS_COLORS
-local RAID_CLASS_COLORS = _G.RAID_CLASS_COLORS
---[[
-##########################################################
-GET ADDON DATA
-##########################################################
-]]--
-local SV, L = unpack(select(2, ...));
-local scc = SVUI_CLASS_COLORS[SV.class];
-local rcc = RAID_CLASS_COLORS[SV.class];
-local r2 = .1 + (rcc.r * .1)
-local g2 = .1 + (rcc.g * .1)
-local b2 = .1 + (rcc.b * .1)
---[[
-##########################################################
-LAYOUT PRESETS
-##########################################################
-]]--
-local presets = {
-	["bars"] = {
-		["link"] = "SVBar",
-		["default"] = {
-			["Bar1"] = {
-				buttonsize = 32
-			},
-			["Bar2"] = {
-				enable = false
-			},
-			["Bar3"] = {
-				buttons = 6,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 32
-			},
-			["Bar5"] = {
-				buttons = 6,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 32
-			}
-		},
-		["onebig"] = {
-			["Bar1"] = {
-				buttonsize = 40
-			},
-			["Bar2"] = {
-				enable = false
-			},
-			["Bar3"] = {
-				buttons = 6,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 40
-			},
-			["Bar5"] = {
-				buttons = 6,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 40
-			}
-		},
-		["twosmall"] = {
-			["Bar1"] = {
-				buttonsize = 32
-			},
-			["Bar2"] = {
-				enable = true,
-				buttonsize = 32
-			},
-			["Bar3"] = {
-				buttons = 12,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 32
-			},
-			["Bar5"] = {
-				buttons = 12,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 32
-			}
-		},
-		["twobig"] = {
-			["Bar1"] = {
-				buttonsize = 40
-			},
-			["Bar2"] = {
-				enable = true,
-				buttonsize = 40
-			},
-			["Bar3"] = {
-				buttons = 12,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 40
-			},
-			["Bar5"] = {
-				buttons = 12,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 40
-			}
-		},
-	},
-};
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/installer/presets/layouts.lua b/Interface/AddOns/SVUI/installer/presets/layouts.lua
deleted file mode 100644
index 63248ee..0000000
--- a/Interface/AddOns/SVUI/installer/presets/layouts.lua
+++ /dev/null
@@ -1,394 +0,0 @@
---[[
-##############################################################################
-_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
- ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__      #
-  __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____     #
-   ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____    #
-    ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____   #
-     _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____  #
-      __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ #
-       _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_#
-        ___\///////////___________\///___________\/////////_____\///////////_#
-##############################################################################
-S U P E R - V I L L A I N - U I   By: Munglunch                              #
-##############################################################################
-##########################################################
-LOCALIZED LUA FUNCTIONS
-##########################################################
-]]--
---[[ GLOBALS ]]--
-local _G = _G;
-local unpack    = _G.unpack;
-local select    = _G.select;
-local pairs     = _G.pairs;
---[[
-##########################################################
-LOCALIZED GLOBALS
-##########################################################
-]]--
-local SVUI_CLASS_COLORS = _G.SVUI_CLASS_COLORS
-local RAID_CLASS_COLORS = _G.RAID_CLASS_COLORS
---[[
-##########################################################
-GET ADDON DATA
-##########################################################
-]]--
-local SV, L = unpack(select(2, ...));
-local scc = SVUI_CLASS_COLORS[SV.class];
-local rcc = RAID_CLASS_COLORS[SV.class];
-local r2 = .1 + (rcc.r * .1)
-local g2 = .1 + (rcc.g * .1)
-local b2 = .1 + (rcc.b * .1)
---[[
-##########################################################
-LAYOUT PRESETS
-##########################################################
-]]--
-local presets = {
-	["layouts"] = {
-		["link"] = "SVUnit",
-		["default"] = {
-			["grid"] = {
-				["enable"] = false,
-			},
-			["party"] = {
-				width = 75,
-				height = 60,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				icons = {
-					roleIcon = {
-						["attachTo"] = "INNERBOTTOMRIGHT",
-						["xOffset"] = 0,
-						["yOffset"] = 0,
-					},
-				},
-				name = {
-					["font"] = "SVUI Default Font",
-					["fontOutline"] = "OUTLINE",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 0,
-					["yOffset"] = 0,
-				},
-			},
-			["raid10"] = {
-				width = 50,
-				height = 30,
-				gRowCol = 1,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				showBy = "RIGHT_DOWN",
-				["power"] = {
-					["enable"] = false,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERBOTTOMLEFT",
-						["xOffset"] = 8,
-						["yOffset"] = 1,
-					},
-				},
-				["name"] = {
-					["font"] = "SVUI Default Font",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 8,
-					["yOffset"] = 0,
-				},
-			},
-			["raid25"] = {
-				width = 50,
-				height = 30,
-				gRowCol = 1,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				showBy = "RIGHT_DOWN",
-				["power"] = {
-					["enable"] = false,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERBOTTOMLEFT",
-						["xOffset"] = 8,
-						["yOffset"] = 1,
-					},
-				},
-				["name"] = {
-					["font"] = "SVUI Default Font",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 8,
-					["yOffset"] = 0,
-				},
-			},
-			["raid40"] = {
-				width = 50,
-				height = 30,
-				gRowCol = 1,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				showBy = "RIGHT_DOWN",
-				["power"] = {
-					["enable"] = false,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERBOTTOMLEFT",
-						["xOffset"] = 8,
-						["yOffset"] = 1,
-					},
-				},
-				["name"] = {
-					["font"] = "SVUI Default Font",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 8,
-					["yOffset"] = 0,
-				},
-			},
-		},
-		["healer"] = {
-			["grid"] = {
-				["enable"] = false,
-			},
-			["party"] = {
-				width = 75,
-				height = 60,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERBOTTOMRIGHT",
-						["xOffset"] = 0,
-						["yOffset"] = 0,
-					},
-				},
-				["name"] = {
-					["font"] = "SVUI Default Font",
-					["fontOutline"] = "OUTLINE",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 0,
-					["yOffset"] = 0,
-				},
-			},
-			["raid10"] = {
-				width = 50,
-				height = 30,
-				["showBy"] = "DOWN_RIGHT",
-				["gRowCol"] = 1,
-				["wrapXOffset"] = 4,
-				["wrapYOffset"] = 4,
-				["power"] = {
-					["enable"] = true,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERBOTTOMLEFT",
-						["xOffset"] = 8,
-						["yOffset"] = 0,
-					},
-				},
-				["name"] = {
-					["font"] = "SVUI Default Font",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 8,
-					["yOffset"] = 0,
-				},
-			},
-			["raid25"] = {
-				width = 50,
-				height = 30,
-				["showBy"] = "DOWN_RIGHT",
-				["gRowCol"] = 1,
-				["wrapXOffset"] = 4,
-				["wrapYOffset"] = 4,
-				["power"] = {
-					["enable"] = true,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERBOTTOMLEFT",
-						["xOffset"] = 8,
-						["yOffset"] = 0,
-					},
-				},
-				["name"] = {
-					["font"] = "SVUI Default Font",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 8,
-					["yOffset"] = 0,
-				},
-			},
-			["raid40"] = {
-				width = 50,
-				height = 30,
-				["showBy"] = "DOWN_RIGHT",
-				["gRowCol"] = 1,
-				["wrapXOffset"] = 4,
-				["wrapYOffset"] = 4,
-				["power"] = {
-					["enable"] = true,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERBOTTOMLEFT",
-						["xOffset"] = 8,
-						["yOffset"] = 0,
-					},
-				},
-				["name"] = {
-					["font"] = "SVUI Default Font",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 8,
-					["yOffset"] = 0,
-				},
-			},
-		},
-		["dps"] = {
-			["grid"] = {
-				["enable"] = false,
-			},
-			["party"] = {
-				width = 115,
-				height = 25,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				["power"] = {
-					["enable"] = false,
-				},
-				portrait = {
-					enable = false,
-					overlay = false,
-					style = "2D",
-					width = 35,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "LEFT",
-						["xOffset"] = -2,
-						["yOffset"] = 0,
-					},
-				},
-				["name"] = {
-					["font"] = "Roboto",
-					["fontOutline"] = "NONE",
-					["position"] = "CENTER",
-					["xOffset"] = 0,
-					["yOffset"] = 1,
-				},
-			},
-			["raid10"] = {
-				["showBy"] = "UP_RIGHT",
-				["gRowCol"] = 2,
-				["wrapXOffset"] = 4,
-				["wrapYOffset"] = 4,
-				["power"] = {
-					["enable"] = false,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERLEFT",
-						["xOffset"] = 10,
-						["yOffset"] = 1,
-					},
-				},
-				["name"] = {
-					["font"] = "Roboto",
-					["position"] = "CENTER",
-					["xOffset"] = 0,
-					["yOffset"] = 1,
-				},
-				["width"] = 80,
-				["height"] = 20,
-			},
-			["raid25"] = {
-				["showBy"] = "UP_RIGHT",
-				["gRowCol"] = 3,
-				["wrapXOffset"] = 4,
-				["wrapYOffset"] = 4,
-				["power"] = {
-					["enable"] = false,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERLEFT",
-						["xOffset"] = 10,
-						["yOffset"] = 1,
-					},
-				},
-				["name"] = {
-					["font"] = "Roboto",
-					["position"] = "CENTER",
-					["xOffset"] = 0,
-					["yOffset"] = 1,
-				},
-				["width"] = 80,
-				["height"] = 20,
-			},
-			["raid40"] = {
-				["showBy"] = "UP_RIGHT",
-				["gRowCol"] = 4,
-				["wrapXOffset"] = 4,
-				["wrapYOffset"] = 4,
-				["power"] = {
-					["enable"] = false,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERLEFT",
-						["xOffset"] = 10,
-						["yOffset"] = 1,
-					},
-				},
-				["name"] = {
-					["font"] = "Roboto",
-					["position"] = "CENTER",
-					["xOffset"] = 0,
-					["yOffset"] = 1,
-				},
-				["width"] = 80,
-				["height"] = 20,
-			},
-		},
-		["grid"] = {
-			["grid"] = {
-				["enable"] = true,
-				["size"] = 34,
-				["shownames"] = true,
-			},
-			["party"] = {
-				["gridAllowed"] = true,
-				["wrapXOffset"] = 1,
-				["wrapYOffset"] = 1,
-			},
-			["raid10"] = {
-				["gridAllowed"] = true,
-				["wrapXOffset"] = 1,
-				["wrapYOffset"] = 1,
-				["gRowCol"] = 1,
-				["showBy"] = "RIGHT_DOWN",
-			},
-			["raid25"] = {
-				["gridAllowed"] = true,
-				["wrapXOffset"] = 1,
-				["wrapYOffset"] = 1,
-				["gRowCol"] = 1,
-				["showBy"] = "RIGHT_DOWN",
-			},
-			["raid40"] = {
-				["gridAllowed"] = true,
-				["wrapXOffset"] = 1,
-				["wrapYOffset"] = 1,
-				["gRowCol"] = 1,
-				["showBy"] = "RIGHT_DOWN",
-			},
-		},
-	}
-};
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/installer/presets/media.lua b/Interface/AddOns/SVUI/installer/presets/media.lua
deleted file mode 100644
index 6724b9b..0000000
--- a/Interface/AddOns/SVUI/installer/presets/media.lua
+++ /dev/null
@@ -1,119 +0,0 @@
---[[
-##############################################################################
-_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
- ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__      #
-  __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____     #
-   ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____    #
-    ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____   #
-     _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____  #
-      __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ #
-       _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_#
-        ___\///////////___________\///___________\/////////_____\///////////_#
-##############################################################################
-S U P E R - V I L L A I N - U I   By: Munglunch                              #
-##############################################################################
-##########################################################
-LOCALIZED LUA FUNCTIONS
-##########################################################
-]]--
---[[ GLOBALS ]]--
-local _G = _G;
-local unpack    = _G.unpack;
-local select    = _G.select;
-local pairs     = _G.pairs;
---[[
-##########################################################
-LOCALIZED GLOBALS
-##########################################################
-]]--
-local SVUI_CLASS_COLORS = _G.SVUI_CLASS_COLORS
-local RAID_CLASS_COLORS = _G.RAID_CLASS_COLORS
---[[
-##########################################################
-GET ADDON DATA
-##########################################################
-]]--
-local SV, L = unpack(select(2, ...));
-local scc = SVUI_CLASS_COLORS[SV.class];
-local rcc = RAID_CLASS_COLORS[SV.class];
-local r2 = .1 + (rcc.r * .1)
-local g2 = .1 + (rcc.g * .1)
-local b2 = .1 + (rcc.b * .1)
---[[
-##########################################################
-LAYOUT PRESETS
-##########################################################
-]]--
-local presets = {
-	["media"] = {
-		["link"] = "media",
-		["default"] = {
-			["colors"] = {
-				["special"] = {.37, .32, .29, 1},
-			},
-			["textures"] = {
-				["pattern"] = "SVUI Backdrop 1",
-				["comic"] = "SVUI Comic 1",
-				["unitlarge"] = "SVUI Unit BG 1",
-				["unitsmall"] = "SVUI Small BG 1",
-			},
-			["unitframes"] = {
-				["buff_bars"] = {.91, .91, .31, 1},
-				["health"] = {.1, .6, .02, 1},
-				["casting"] = {.91, .91, .31, 1},
-				["spark"] = {1, .72, 0, 1},
-			},
-		},
-		["kaboom"] = {
-			["colors"] = {
-				["special"] = {.28, .31, .32, 1},
-			},
-			["textures"] = {
-				["pattern"] = "SVUI Backdrop 2",
-				["comic"] = "SVUI Comic 2",
-				["unitlarge"] = "SVUI Unit BG 2",
-				["unitsmall"] = "SVUI Small BG 2",
-			},
-			["unitframes"] = {
-				["buff_bars"] = {.51, .79, 0, 1},
-				["health"] = {.16, .86, .22, 1},
-				["casting"] = {.91, .91, 0, 1},
-				["spark"] = {1, .72, 0, 1},
-			},
-		},
-		["classy"] = {
-			["colors"] = {
-				["special"] = {r2, g2, b2, 1},
-			},
-			["textures"] = {
-				["pattern"] = "SVUI Backdrop 3",
-				["comic"] = "SVUI Comic 3",
-				["unitlarge"] = "SVUI Unit BG 3",
-				["unitsmall"] = "SVUI Small BG 3",
-			},
-			["unitframes"] = {
-				["buff_bars"] = {scc.r, scc.g, scc.b, 1},
-				["health"] = {.16, .86, .22, 1},
-				["casting"] = {.91, .91, 0, 1},
-				["spark"] = {1, .72, 0, 1},
-			},
-		},
-		["dark"] = {
-			["colors"] = {
-				["special"] = {.25, .26, .27, 1},
-			},
-			["textures"] = {
-				["pattern"] = "SVUI Backdrop 4",
-				["comic"] = "SVUI Comic 4",
-				["unitlarge"] = "SVUI Unit BG 4",
-				["unitsmall"] = "SVUI Small BG 4",
-			},
-			["unitframes"] = {
-				["buff_bars"] = {.45, .55, .15, 1},
-				["health"] = {.06, .06, .06, 1},
-				["casting"] = {.8, .8, 0, 1},
-				["spark"] = {1, .72, 0, 1},
-			},
-		},
-	}
-};
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/installer/presets/units.lua b/Interface/AddOns/SVUI/installer/presets/units.lua
deleted file mode 100644
index 2e997ce..0000000
--- a/Interface/AddOns/SVUI/installer/presets/units.lua
+++ /dev/null
@@ -1,385 +0,0 @@
---[[
-##############################################################################
-_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
- ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__      #
-  __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____     #
-   ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____    #
-    ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____   #
-     _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____  #
-      __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ #
-       _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_#
-        ___\///////////___________\///___________\/////////_____\///////////_#
-##############################################################################
-S U P E R - V I L L A I N - U I   By: Munglunch                              #
-##############################################################################
-##########################################################
-LOCALIZED LUA FUNCTIONS
-##########################################################
-]]--
---[[ GLOBALS ]]--
-local _G = _G;
-local unpack    = _G.unpack;
-local select    = _G.select;
-local pairs     = _G.pairs;
---[[
-##########################################################
-LOCALIZED GLOBALS
-##########################################################
-]]--
-local SVUI_CLASS_COLORS = _G.SVUI_CLASS_COLORS
-local RAID_CLASS_COLORS = _G.RAID_CLASS_COLORS
---[[
-##########################################################
-GET ADDON DATA
-##########################################################
-]]--
-local SV, L = unpack(select(2, ...));
-local scc = SVUI_CLASS_COLORS[SV.class];
-local rcc = RAID_CLASS_COLORS[SV.class];
-local r2 = .1 + (rcc.r * .1)
-local g2 = .1 + (rcc.g * .1)
-local b2 = .1 + (rcc.b * .1)
---[[
-##########################################################
-LAYOUT PRESETS
-##########################################################
-]]--
-local presets = {
-	["units"] = {
-		["link"] = "SVUnit",
-		["default"] = {
-			["player"] = {
-				width = 215,
-				height = 60,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				}
-			},
-			["target"] = {
-				width = 215,
-				height = 60,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				}
-			},
-			["pet"] = {
-				width = 130,
-				height = 30,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				name = {
-					position = "CENTER"
-				},
-			},
-			["targettarget"] = {
-				width = 130,
-				height = 30,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				name = {
-					position = "CENTER"
-				},
-			},
-			["boss"] = {
-				width = 200,
-				height = 45,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				}
-			},
-			["party"] = {
-				width = 75,
-				height = 60,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				name = {
-					position = "INNERTOPLEFT"
-				},
-			},
-			["raid10"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid25"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid40"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-		},
-		["super"] = {
-			["player"] = {
-				width = 215,
-				height = 60,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				}
-			},
-			["target"] = {
-				width = 215,
-				height = 60,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				}
-			},
-			["pet"] = {
-				width = 150,
-				height = 30,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				name = {
-					position = "CENTER"
-				},
-			},
-			["targettarget"] = {
-				width = 150,
-				height = 30,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				name = {
-					position = "CENTER"
-				},
-			},
-			["boss"] = {
-				width = 200,
-				height = 45,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				}
-			},
-			["party"] = {
-				width = 75,
-				height = 60,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				name = {
-					position = "INNERTOPLEFT"
-				},
-			},
-			["raid10"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid25"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid40"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-		},
-		["simple"] = {
-			["player"] = {
-				width = 215,
-				height = 60,
-				portrait = {
-					enable = true,
-					overlay = false,
-					style = "2D",
-					width = 60,
-				}
-			},
-			["target"] = {
-				width = 215,
-				height = 60,
-				portrait = {
-					enable = true,
-					overlay = false,
-					style = "2D",
-					width = 60,
-				}
-			},
-			["pet"] = {
-				width = 150,
-				height = 30,
-				portrait = {
-					enable = true,
-					overlay = false,
-					style = "2D",
-					width = 30,
-				},
-				name = {
-					position = "INNERLEFT"
-				},
-			},
-			["targettarget"] = {
-				width = 150,
-				height = 30,
-				portrait = {
-					enable = true,
-					overlay = false,
-					style = "2D",
-					width = 30,
-				},
-				name = {
-					position = "INNERLEFT"
-				},
-			},
-			["boss"] = {
-				width = 200,
-				height = 45,
-				portrait = {
-					enable = true,
-					overlay = false,
-					style = "2D",
-					width = 45,
-				}
-			},
-			["party"] = {
-				width = 100,
-				height = 35,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				portrait = {
-					enable = true,
-					overlay = false,
-					style = "2D",
-					width = 35,
-				},
-				name = {
-					position = "INNERRIGHT"
-				},
-			},
-			["raid10"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid25"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid40"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-		},
-		["compact"] = {
-			["player"] = {
-				width = 215,
-				height = 50,
-				portrait = {
-					enable = false
-				}
-			},
-			["target"] = {
-				width = 215,
-				height = 50,
-				portrait = {
-					enable = false
-				}
-			},
-			["pet"] = {
-				width = 130,
-				height = 30,
-				portrait = {
-					enable = false
-				},
-				name = {
-					position = "CENTER"
-				},
-			},
-			["targettarget"] = {
-				width = 130,
-				height = 30,
-				portrait = {
-					enable = false
-				},
-				name = {
-					position = "CENTER"
-				},
-			},
-			["boss"] = {
-				width = 200,
-				height = 45,
-				portrait = {
-					enable = false
-				}
-			},
-			["party"] = {
-				width = 70,
-				height = 30,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				portrait = {
-					enable = false
-				},
-				name = {
-					position = "INNERTOPLEFT"
-				},
-			},
-			["raid10"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid25"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid40"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-		},
-	}
-};
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/installer/setup.lua b/Interface/AddOns/SVUI/installer/setup.lua
deleted file mode 100644
index bb2b478..0000000
--- a/Interface/AddOns/SVUI/installer/setup.lua
+++ /dev/null
@@ -1,2401 +0,0 @@
---[[
-##############################################################################
-_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
- ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__      #
-  __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____     #
-   ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____    #
-    ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____   #
-     _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____  #
-      __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ #
-       _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_#
-        ___\///////////___________\///___________\/////////_____\///////////_#
-##############################################################################
-S U P E R - V I L L A I N - U I   By: Munglunch                              #
-##############################################################################
-##########################################################
-LOCALIZED LUA FUNCTIONS
-##########################################################
-]]--
---[[ GLOBALS ]]--
-local _G = _G;
-local unpack 	= _G.unpack;
-local select 	= _G.select;
-local type 		= _G.type;
-local string 	= _G.string;
-local table     = _G.table;
-local format = string.format;
-local tcopy = table.copy;
---[[
-##########################################################
-GET ADDON DATA
-##########################################################
-]]--
-local SV, L, Registry = unpack(select(2, ...));
---[[
-##########################################################
-LOCAL VARS
-##########################################################
-]]--
-local CURRENT_PAGE, MAX_PAGE, XOFF = 0, 9, (GetScreenWidth() * 0.025)
-local okToResetMOVE = false
-local mungs = false;
-local user_music_vol;
-local musicIsPlaying;
-
-local SVUI_CLASS_COLORS = _G.SVUI_CLASS_COLORS
-local RAID_CLASS_COLORS = _G.RAID_CLASS_COLORS
-local scc = SVUI_CLASS_COLORS[SV.class];
-local rcc = RAID_CLASS_COLORS[SV.class];
-local r2 = .1 + (rcc.r * .1)
-local g2 = .1 + (rcc.g * .1)
-local b2 = .1 + (rcc.b * .1)
---[[
-##########################################################
-SETUP CLASS OBJECT
-##########################################################
-]]--
-local Setup = {};
---[[
-##########################################################
-LAYOUT PRESETS
-##########################################################
-]]--
-local PRESET_DATA;
-
-local function LoadAllPresets()
-	PRESET_DATA = {}
-
-	PRESET_DATA["media"] = {
-		["link"] = "media",
-		["default"] = {
-			["colors"] = {
-				["special"] = {.37, .32, .29, 1},
-			},
-			["textures"] = {
-				["pattern"] = "SVUI Backdrop 1",
-				["comic"] = "SVUI Comic 1",
-				["unitlarge"] = "SVUI Unit BG 1",
-				["unitsmall"] = "SVUI Small BG 1",
-			},
-			["unitframes"] = {
-				["buff_bars"] = {.91, .91, .31, 1},
-				["health"] = {.1, .6, .02, 1},
-				["casting"] = {.91, .91, .31, 1},
-				["spark"] = {1, .72, 0, 1},
-			},
-		},
-		["kaboom"] = {
-			["colors"] = {
-				["special"] = {.28, .31, .32, 1},
-			},
-			["textures"] = {
-				["pattern"] = "SVUI Backdrop 2",
-				["comic"] = "SVUI Comic 2",
-				["unitlarge"] = "SVUI Unit BG 2",
-				["unitsmall"] = "SVUI Small BG 2",
-			},
-			["unitframes"] = {
-				["buff_bars"] = {.51, .79, 0, 1},
-				["health"] = {.16, .86, .22, 1},
-				["casting"] = {.91, .91, 0, 1},
-				["spark"] = {1, .72, 0, 1},
-			},
-		},
-		["classy"] = {
-			["colors"] = {
-				["special"] = {r2, g2, b2, 1},
-			},
-			["textures"] = {
-				["pattern"] = "SVUI Backdrop 3",
-				["comic"] = "SVUI Comic 3",
-				["unitlarge"] = "SVUI Unit BG 3",
-				["unitsmall"] = "SVUI Small BG 3",
-			},
-			["unitframes"] = {
-				["buff_bars"] = {scc.r, scc.g, scc.b, 1},
-				["health"] = {.16, .86, .22, 1},
-				["casting"] = {.91, .91, 0, 1},
-				["spark"] = {1, .72, 0, 1},
-			},
-		},
-		["dark"] = {
-			["colors"] = {
-				["special"] = {.25, .26, .27, 1},
-			},
-			["textures"] = {
-				["pattern"] = "SVUI Backdrop 4",
-				["comic"] = "SVUI Comic 4",
-				["unitlarge"] = "SVUI Unit BG 4",
-				["unitsmall"] = "SVUI Small BG 4",
-			},
-			["unitframes"] = {
-				["buff_bars"] = {.45, .55, .15, 1},
-				["health"] = {.06, .06, .06, 1},
-				["casting"] = {.8, .8, 0, 1},
-				["spark"] = {1, .72, 0, 1},
-			},
-		},
-	}
-	PRESET_DATA["auras"] = {
-		["link"] = "SVUnit",
-		["default"] = {
-			["player"] = {
-				["buffs"] = {
-					enable = false,
-					attachTo = "DEBUFFS",
-					anchorPoint = 'TOPLEFT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'RIGHT',
-				},
-				["debuffs"] = {
-					enable = false,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPLEFT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'RIGHT',
-				},
-				["aurabar"] = {
-					enable = false
-				}
-			},
-			["target"] = {
-				["smartAuraDisplay"] = "DISABLED",
-				["buffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "BUFFS",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["aurabar"] = {
-					enable = false
-				}
-			},
-			["focus"] = {
-				["smartAuraDisplay"] = "DISABLED",
-				["buffs"] = {
-					enable = false,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["aurabar"] = {
-					enable = false
-				}
-			}
-		},
-		["icons"] = {
-			["player"] = {
-				["buffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPLEFT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'RIGHT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "BUFFS",
-					anchorPoint = 'TOPLEFT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'RIGHT',
-				},
-				["aurabar"] = {
-					enable = false
-				}
-			},
-			["target"] = {
-				["smartAuraDisplay"] = "DISABLED",
-				["buffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "BUFFS",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["aurabar"] = {
-					enable = false
-				}
-			},
-			["focus"] = {
-				["smartAuraDisplay"] = "DISABLED",
-				["buffs"] = {
-					enable = false,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["aurabar"] = {
-					enable = false
-				}
-			}
-		},
-		["bars"] = {
-			["player"] = {
-				["buffs"] = {
-					enable = false,
-					attachTo = "FRAME"
-				},
-				["debuffs"] = {
-					enable = false,
-					attachTo = "FRAME"
-				},
-				["aurabar"] = {
-					enable = true,
-					attachTo = "FRAME"
-				}
-			},
-			["target"] = {
-				["smartAuraDisplay"] = "SHOW_DEBUFFS_ON_FRIENDLIES",
-				["buffs"] = {
-					enable = false,
-					attachTo = "FRAME"
-				},
-				["debuffs"] = {
-					enable = false,
-					attachTo = "FRAME"
-				},
-				["aurabar"] = {
-					enable = true,
-					attachTo = "FRAME"
-				}
-			},
-			["focus"] = {
-				["smartAuraDisplay"] = "SHOW_DEBUFFS_ON_FRIENDLIES",
-				["buffs"] = {
-					enable = false,
-					attachTo = "FRAME"
-				},
-				["debuffs"] = {
-					enable = false,
-					attachTo = "FRAME"
-				},
-				["aurabar"] = {
-					enable = true,
-					attachTo = "FRAME"
-				}
-			}
-		},
-		["theworks"] = {
-			["player"] = {
-				["buffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPLEFT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'RIGHT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "BUFFS",
-					anchorPoint = 'TOPLEFT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'RIGHT',
-				},
-				["aurabar"] = {
-					enable = true,
-					attachTo = "DEBUFFS"
-				}
-			},
-			["target"] = {
-				["smartAuraDisplay"] = "SHOW_DEBUFFS_ON_FRIENDLIES",
-				["buffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "BUFFS",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["aurabar"] = {
-					enable = true,
-					attachTo = "DEBUFFS"
-				}
-			},
-			["focus"] = {
-				["smartAuraDisplay"] = "SHOW_DEBUFFS_ON_FRIENDLIES",
-				["buffs"] = {
-					enable = true,
-					attachTo = "FRAME",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["debuffs"] = {
-					enable = true,
-					attachTo = "BUFFS",
-					anchorPoint = 'TOPRIGHT',
-					verticalGrowth = 'UP',
-					horizontalGrowth = 'LEFT',
-				},
-				["aurabar"] = {
-					enable = true,
-					attachTo = "DEBUFFS"
-				}
-			}
-		},
-	}
-	PRESET_DATA["bars"] = {
-		["link"] = "SVBar",
-		["default"] = {
-			["Bar1"] = {
-				buttonsize = 32
-			},
-			["Bar2"] = {
-				enable = false
-			},
-			["Bar3"] = {
-				buttons = 6,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 32
-			},
-			["Bar5"] = {
-				buttons = 6,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 32
-			}
-		},
-		["onebig"] = {
-			["Bar1"] = {
-				buttonsize = 40
-			},
-			["Bar2"] = {
-				enable = false
-			},
-			["Bar3"] = {
-				buttons = 6,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 40
-			},
-			["Bar5"] = {
-				buttons = 6,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 40
-			}
-		},
-		["twosmall"] = {
-			["Bar1"] = {
-				buttonsize = 32
-			},
-			["Bar2"] = {
-				enable = true,
-				buttonsize = 32
-			},
-			["Bar3"] = {
-				buttons = 12,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 32
-			},
-			["Bar5"] = {
-				buttons = 12,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 32
-			}
-		},
-		["twobig"] = {
-			["Bar1"] = {
-				buttonsize = 40
-			},
-			["Bar2"] = {
-				enable = true,
-				buttonsize = 40
-			},
-			["Bar3"] = {
-				buttons = 12,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 40
-			},
-			["Bar5"] = {
-				buttons = 12,
-				buttonspacing = 2,
-				buttonsPerRow = 6,
-				buttonsize = 40
-			}
-		},
-	}
-	PRESET_DATA["units"] = {
-		["link"] = "SVUnit",
-		["default"] = {
-			["player"] = {
-				width = 215,
-				height = 60,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				}
-			},
-			["target"] = {
-				width = 215,
-				height = 60,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				}
-			},
-			["pet"] = {
-				width = 130,
-				height = 30,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				name = {
-					position = "CENTER"
-				},
-			},
-			["targettarget"] = {
-				width = 130,
-				height = 30,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				name = {
-					position = "CENTER"
-				},
-			},
-			["boss"] = {
-				width = 200,
-				height = 45,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				}
-			},
-			["party"] = {
-				width = 75,
-				height = 60,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				name = {
-					position = "INNERTOPLEFT"
-				},
-			},
-			["raid10"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid25"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid40"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-		},
-		["super"] = {
-			["player"] = {
-				width = 215,
-				height = 60,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				}
-			},
-			["target"] = {
-				width = 215,
-				height = 60,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				}
-			},
-			["pet"] = {
-				width = 150,
-				height = 30,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				name = {
-					position = "CENTER"
-				},
-			},
-			["targettarget"] = {
-				width = 150,
-				height = 30,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				name = {
-					position = "CENTER"
-				},
-			},
-			["boss"] = {
-				width = 200,
-				height = 45,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				}
-			},
-			["party"] = {
-				width = 75,
-				height = 60,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				name = {
-					position = "INNERTOPLEFT"
-				},
-			},
-			["raid10"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid25"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid40"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-		},
-		["simple"] = {
-			["player"] = {
-				width = 215,
-				height = 60,
-				portrait = {
-					enable = true,
-					overlay = false,
-					style = "2D",
-					width = 60,
-				}
-			},
-			["target"] = {
-				width = 215,
-				height = 60,
-				portrait = {
-					enable = true,
-					overlay = false,
-					style = "2D",
-					width = 60,
-				}
-			},
-			["pet"] = {
-				width = 150,
-				height = 30,
-				portrait = {
-					enable = true,
-					overlay = false,
-					style = "2D",
-					width = 30,
-				},
-				name = {
-					position = "INNERLEFT"
-				},
-			},
-			["targettarget"] = {
-				width = 150,
-				height = 30,
-				portrait = {
-					enable = true,
-					overlay = false,
-					style = "2D",
-					width = 30,
-				},
-				name = {
-					position = "INNERLEFT"
-				},
-			},
-			["boss"] = {
-				width = 200,
-				height = 45,
-				portrait = {
-					enable = true,
-					overlay = false,
-					style = "2D",
-					width = 45,
-				}
-			},
-			["party"] = {
-				width = 100,
-				height = 35,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				portrait = {
-					enable = true,
-					overlay = false,
-					style = "2D",
-					width = 35,
-				},
-				name = {
-					position = "INNERRIGHT"
-				},
-			},
-			["raid10"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid25"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid40"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-		},
-		["compact"] = {
-			["player"] = {
-				width = 215,
-				height = 50,
-				portrait = {
-					enable = false
-				}
-			},
-			["target"] = {
-				width = 215,
-				height = 50,
-				portrait = {
-					enable = false
-				}
-			},
-			["pet"] = {
-				width = 130,
-				height = 30,
-				portrait = {
-					enable = false
-				},
-				name = {
-					position = "CENTER"
-				},
-			},
-			["targettarget"] = {
-				width = 130,
-				height = 30,
-				portrait = {
-					enable = false
-				},
-				name = {
-					position = "CENTER"
-				},
-			},
-			["boss"] = {
-				width = 200,
-				height = 45,
-				portrait = {
-					enable = false
-				}
-			},
-			["party"] = {
-				width = 70,
-				height = 30,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				portrait = {
-					enable = false
-				},
-				name = {
-					position = "INNERTOPLEFT"
-				},
-			},
-			["raid10"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid25"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-			["raid40"] = {
-				width = 50,
-				height = 30,
-				wrapXOffset = 6,
-				wrapYOffset = 6,
-			},
-		},
-	}
-	PRESET_DATA["layouts"] = {
-		["link"] = "SVUnit",
-		["default"] = {
-			["grid"] = {
-				["enable"] = false,
-			},
-			["party"] = {
-				width = 75,
-				height = 60,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				icons = {
-					roleIcon = {
-						["attachTo"] = "INNERBOTTOMRIGHT",
-						["xOffset"] = 0,
-						["yOffset"] = 0,
-					},
-				},
-				name = {
-					["font"] = "SVUI Default Font",
-					["fontOutline"] = "OUTLINE",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 0,
-					["yOffset"] = 0,
-				},
-			},
-			["raid10"] = {
-				width = 50,
-				height = 30,
-				gRowCol = 1,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				showBy = "RIGHT_DOWN",
-				["power"] = {
-					["enable"] = false,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERBOTTOMLEFT",
-						["xOffset"] = 8,
-						["yOffset"] = 1,
-					},
-				},
-				["name"] = {
-					["font"] = "SVUI Default Font",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 8,
-					["yOffset"] = 0,
-				},
-			},
-			["raid25"] = {
-				width = 50,
-				height = 30,
-				gRowCol = 1,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				showBy = "RIGHT_DOWN",
-				["power"] = {
-					["enable"] = false,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERBOTTOMLEFT",
-						["xOffset"] = 8,
-						["yOffset"] = 1,
-					},
-				},
-				["name"] = {
-					["font"] = "SVUI Default Font",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 8,
-					["yOffset"] = 0,
-				},
-			},
-			["raid40"] = {
-				width = 50,
-				height = 30,
-				gRowCol = 1,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				showBy = "RIGHT_DOWN",
-				["power"] = {
-					["enable"] = false,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERBOTTOMLEFT",
-						["xOffset"] = 8,
-						["yOffset"] = 1,
-					},
-				},
-				["name"] = {
-					["font"] = "SVUI Default Font",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 8,
-					["yOffset"] = 0,
-				},
-			},
-		},
-		["healer"] = {
-			["grid"] = {
-				["enable"] = false,
-			},
-			["party"] = {
-				width = 75,
-				height = 60,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				portrait = {
-					enable = true,
-					overlay = true,
-					style = "3D",
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERBOTTOMRIGHT",
-						["xOffset"] = 0,
-						["yOffset"] = 0,
-					},
-				},
-				["name"] = {
-					["font"] = "SVUI Default Font",
-					["fontOutline"] = "OUTLINE",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 0,
-					["yOffset"] = 0,
-				},
-			},
-			["raid10"] = {
-				width = 50,
-				height = 30,
-				["showBy"] = "DOWN_RIGHT",
-				["gRowCol"] = 1,
-				["wrapXOffset"] = 4,
-				["wrapYOffset"] = 4,
-				["power"] = {
-					["enable"] = true,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERBOTTOMLEFT",
-						["xOffset"] = 8,
-						["yOffset"] = 0,
-					},
-				},
-				["name"] = {
-					["font"] = "SVUI Default Font",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 8,
-					["yOffset"] = 0,
-				},
-			},
-			["raid25"] = {
-				width = 50,
-				height = 30,
-				["showBy"] = "DOWN_RIGHT",
-				["gRowCol"] = 1,
-				["wrapXOffset"] = 4,
-				["wrapYOffset"] = 4,
-				["power"] = {
-					["enable"] = true,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERBOTTOMLEFT",
-						["xOffset"] = 8,
-						["yOffset"] = 0,
-					},
-				},
-				["name"] = {
-					["font"] = "SVUI Default Font",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 8,
-					["yOffset"] = 0,
-				},
-			},
-			["raid40"] = {
-				width = 50,
-				height = 30,
-				["showBy"] = "DOWN_RIGHT",
-				["gRowCol"] = 1,
-				["wrapXOffset"] = 4,
-				["wrapYOffset"] = 4,
-				["power"] = {
-					["enable"] = true,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERBOTTOMLEFT",
-						["xOffset"] = 8,
-						["yOffset"] = 0,
-					},
-				},
-				["name"] = {
-					["font"] = "SVUI Default Font",
-					["position"] = "INNERTOPLEFT",
-					["xOffset"] = 8,
-					["yOffset"] = 0,
-				},
-			},
-		},
-		["dps"] = {
-			["grid"] = {
-				["enable"] = false,
-			},
-			["party"] = {
-				width = 115,
-				height = 25,
-				wrapXOffset = 9,
-				wrapYOffset = 13,
-				["power"] = {
-					["enable"] = false,
-				},
-				portrait = {
-					enable = false,
-					overlay = false,
-					style = "2D",
-					width = 35,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "LEFT",
-						["xOffset"] = -2,
-						["yOffset"] = 0,
-					},
-				},
-				["name"] = {
-					["font"] = "Roboto",
-					["fontOutline"] = "NONE",
-					["position"] = "CENTER",
-					["xOffset"] = 0,
-					["yOffset"] = 1,
-				},
-			},
-			["raid10"] = {
-				["showBy"] = "UP_RIGHT",
-				["gRowCol"] = 2,
-				["wrapXOffset"] = 4,
-				["wrapYOffset"] = 4,
-				["power"] = {
-					["enable"] = false,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERLEFT",
-						["xOffset"] = 10,
-						["yOffset"] = 1,
-					},
-				},
-				["name"] = {
-					["font"] = "Roboto",
-					["position"] = "CENTER",
-					["xOffset"] = 0,
-					["yOffset"] = 1,
-				},
-				["width"] = 80,
-				["height"] = 20,
-			},
-			["raid25"] = {
-				["showBy"] = "UP_RIGHT",
-				["gRowCol"] = 3,
-				["wrapXOffset"] = 4,
-				["wrapYOffset"] = 4,
-				["power"] = {
-					["enable"] = false,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERLEFT",
-						["xOffset"] = 10,
-						["yOffset"] = 1,
-					},
-				},
-				["name"] = {
-					["font"] = "Roboto",
-					["position"] = "CENTER",
-					["xOffset"] = 0,
-					["yOffset"] = 1,
-				},
-				["width"] = 80,
-				["height"] = 20,
-			},
-			["raid40"] = {
-				["showBy"] = "UP_RIGHT",
-				["gRowCol"] = 4,
-				["wrapXOffset"] = 4,
-				["wrapYOffset"] = 4,
-				["power"] = {
-					["enable"] = false,
-				},
-				["icons"] = {
-					["roleIcon"] = {
-						["attachTo"] = "INNERLEFT",
-						["xOffset"] = 10,
-						["yOffset"] = 1,
-					},
-				},
-				["name"] = {
-					["font"] = "Roboto",
-					["position"] = "CENTER",
-					["xOffset"] = 0,
-					["yOffset"] = 1,
-				},
-				["width"] = 80,
-				["height"] = 20,
-			},
-		},
-		["grid"] = {
-			["grid"] = {
-				["enable"] = true,
-				["size"] = 34,
-				["shownames"] = true,
-			},
-			["party"] = {
-				["gridAllowed"] = true,
-				["wrapXOffset"] = 1,
-				["wrapYOffset"] = 1,
-			},
-			["raid10"] = {
-				["gridAllowed"] = true,
-				["wrapXOffset"] = 1,
-				["wrapYOffset"] = 1,
-				["gRowCol"] = 1,
-				["showBy"] = "RIGHT_DOWN",
-			},
-			["raid25"] = {
-				["gridAllowed"] = true,
-				["wrapXOffset"] = 1,
-				["wrapYOffset"] = 1,
-				["gRowCol"] = 1,
-				["showBy"] = "RIGHT_DOWN",
-			},
-			["raid40"] = {
-				["gridAllowed"] = true,
-				["wrapXOffset"] = 1,
-				["wrapYOffset"] = 1,
-				["gRowCol"] = 1,
-				["showBy"] = "RIGHT_DOWN",
-			},
-		},
-	}
-end
-
-local function _copyPresets(saved, preset)
-	if(type(preset) == 'table') then
-        for key,val in pairs(preset) do
-        	if(not saved[key]) then saved[key] = {} end
-    		if(type(val) == "table") then
-    			_copyPresets(saved[key], val)
-    		elseif(saved[key]) then
-            	saved[key] = val
-            end
-        end
-    else
-    	saved = preset
-    end
-end
---[[
-##########################################################
-LOCAL FUNCTIONS
-##########################################################
-]]--
-local function SetInstallButton(button)
-    if(not button) then return end
-    button.Left:SetAlpha(0)
-    button.Middle:SetAlpha(0)
-    button.Right:SetAlpha(0)
-    button:SetNormalTexture("")
-    button:SetPushedTexture("")
-    button:SetPushedTexture("")
-    button:SetDisabledTexture("")
-    button:RemoveTextures()
-    button:SetFrameLevel(button:GetFrameLevel() + 1)
-end
-
-local function forceCVars()
-	SetCVar("alternateResourceText",1)
-	SetCVar("statusTextDisplay","BOTH")
-	SetCVar("ShowClassColorInNameplate",1)
-	SetCVar("screenshotQuality",10)
-	SetCVar("chatMouseScroll",1)
-	SetCVar("chatStyle","classic")
-	SetCVar("WholeChatWindowClickable",0)
-	SetCVar("ConversationMode","inline")
-	SetCVar("showTutorials",0)
-	SetCVar("UberTooltips",1)
-	SetCVar("threatWarning",3)
-	SetCVar('alwaysShowActionBars',1)
-	SetCVar('lockActionBars',1)
-	SetCVar('SpamFilter',0)
-	InterfaceOptionsActionBarsPanelPickupActionKeyDropDown:SetValue('SHIFT')
-	InterfaceOptionsActionBarsPanelPickupActionKeyDropDown:RefreshValue()
-end
-
-local function ShowLayout(show40)
-	if(not _G["SVUI_Raid40"] or (show40 and _G["SVUI_Raid40"].forceShow == true)) then return end
-	if(not show40 and _G["SVUI_Raid40"].forceShow ~= true) then return end
-	SV.SVUnit:UpdateGroupConfig(_G["SVUI_Raid40"], show40)
-end
-
-local function BarShuffle()
-	local bar2 = SV.db.SVBar.Bar2.enable;
-	local base = 30;
-	local bS = SV.db.SVBar.Bar1.buttonspacing;
-	local tH = SV.db.SVBar.Bar1.buttonsize  +  (base - bS);
-	local b2h = bar2 and tH or base;
-	local sph = (400 - b2h);
-	if not SV.db.framelocations then SV.db.framelocations = {} end
-	SV.db.framelocations.SVUI_SpecialAbility_MOVE = "BOTTOMSVUIParentBOTTOM0"..sph;
-	SV.db.framelocations.SVUI_ActionBar2_MOVE = "BOTTOMSVUI_ActionBar1TOP0"..(-bS);
-	SV.db.framelocations.SVUI_ActionBar3_MOVE = "BOTTOMLEFTSVUI_ActionBar1BOTTOMRIGHT40";
-	SV.db.framelocations.SVUI_ActionBar5_MOVE = "BOTTOMRIGHTSVUI_ActionBar1BOTTOMLEFT-40";
-	if bar2 then
-		SV.db.framelocations.SVUI_PetActionBar_MOVE = "BOTTOMLEFTSVUI_ActionBar2TOPLEFT04"
-		SV.db.framelocations.SVUI_StanceBar_MOVE = "BOTTOMRIGHTSVUI_ActionBar2TOPRIGHT04";
-	else
-		SV.db.framelocations.SVUI_PetActionBar_MOVE = "BOTTOMLEFTSVUI_ActionBar1TOPLEFT04"
-		SV.db.framelocations.SVUI_StanceBar_MOVE = "BOTTOMRIGHTSVUI_ActionBar1TOPRIGHT04";
-	end
-end
-
-local function UFMoveBottomQuadrant(toggle)
-	if not SV.db.framelocations then SV.db.framelocations = {} end
-	if not toggle then
-		SV.db.framelocations.SVUI_Player_MOVE = "BOTTOMSVUIParentBOTTOM-278182"
-		SV.db.framelocations.SVUI_PlayerCastbar_MOVE = "BOTTOMSVUIParentBOTTOM-278122"
-		SV.db.framelocations.SVUI_Target_MOVE = "BOTTOMSVUIParentBOTTOM278182"
-		SV.db.framelocations.SVUI_TargetCastbar_MOVE = "BOTTOMSVUIParentBOTTOM278122"
-		SV.db.framelocations.SVUI_Pet_MOVE = "BOTTOMSVUIParentBOTTOM0181"
-		SV.db.framelocations.SVUI_TargetTarget_MOVE = "BOTTOMSVUIParentBOTTOM0214"
-		SV.db.framelocations.SVUI_Focus_MOVE = "BOTTOMSVUIParentBOTTOM310432"
-		SV.db.framelocations.SVUI_ThreatBar_MOVE = "BOTTOMRIGHTSVUIParentBOTTOMRIGHT-495182"
-	elseif toggle == "shift" then
-		SV.db.framelocations.SVUI_Player_MOVE = "BOTTOMSVUIParentBOTTOM-278210"
-		SV.db.framelocations.SVUI_PlayerCastbar_MOVE = "BOTTOMSVUIParentBOTTOM-278150"
-		SV.db.framelocations.SVUI_Target_MOVE = "BOTTOMSVUIParentBOTTOM278210"
-		SV.db.framelocations.SVUI_TargetCastbar_MOVE = "BOTTOMSVUIParentBOTTOM278150"
-		SV.db.framelocations.SVUI_Pet_MOVE = "BOTTOMSVUIParentBOTTOM0209"
-		SV.db.framelocations.SVUI_TargetTarget_MOVE = "BOTTOMSVUIParentBOTTOM0242"
-		SV.db.framelocations.SVUI_Focus_MOVE = "BOTTOMSVUIParentBOTTOM310432"
-		SV.db.framelocations.SVUI_ThreatBar_MOVE = "BOTTOMRIGHTSVUIParentBOTTOMRIGHT-495210"
-	else
-		local c = 136;
-		local d = 135;
-		local e = 80;
-		SV.db.framelocations.SVUI_Player_MOVE = "BOTTOMSVUIParentBOTTOM"..-c..""..d;
-		SV.db.framelocations.SVUI_PlayerCastbar_MOVE = "BOTTOMSVUIParentBOTTOM"..-c..""..(d-60);
-		SV.db.framelocations.SVUI_Target_MOVE = "BOTTOMSVUIParentBOTTOM"..c..""..d;
-		SV.db.framelocations.SVUI_TargetCastbar_MOVE = "BOTTOMSVUIParentBOTTOM"..c..""..(d-60);
-		SV.db.framelocations.SVUI_Pet_MOVE = "BOTTOMSVUIParentBOTTOM"..-c..""..e;
-		SV.db.framelocations.SVUI_TargetTarget_MOVE = "BOTTOMSVUIParentBOTTOM"..c..""..e;
-		SV.db.framelocations.SVUI_Focus_MOVE = "BOTTOMSVUIParentBOTTOM"..c..""..(d + 150);
-		SV.db.framelocations.SVUI_ThreatBar_MOVE = "BOTTOMRIGHTSVUIParentBOTTOMRIGHT-495"..d;
-	end
-end
-
-local function UFMoveLeftQuadrant(toggle)
-	if not SV.db.framelocations then SV.db.framelocations = {} end
-	if not toggle then
-		SV.db.framelocations.SVUI_Assist_MOVE = "TOPLEFTSVUIParentTOPLEFT"..XOFF.."-250"
-		SV.db.framelocations.SVUI_Tank_MOVE = "TOPLEFTSVUIParentTOPLEFT"..XOFF.."-175"
-		SV.db.framelocations.SVUI_Raidpet_MOVE = "TOPLEFTSVUIParentTOPLEFT"..XOFF.."-325"
-		SV.db.framelocations.SVUI_Party_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT"..XOFF.."400"
-		SV.db.framelocations.SVUI_Raid10_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT"..XOFF.."400"
-		SV.db.framelocations.SVUI_Raid25_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT"..XOFF.."400"
-		SV.db.framelocations.SVUI_Raid40_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT"..XOFF.."400"
-	else
-		SV.db.framelocations.SVUI_Assist_MOVE = "TOPLEFTSVUIParentTOPLEFT4-250"
-		SV.db.framelocations.SVUI_Tank_MOVE = "TOPLEFTSVUIParentTOPLEFT4-175"
-		SV.db.framelocations.SVUI_Raidpet_MOVE = "TOPLEFTSVUIParentTOPLEFT4-325"
-		SV.db.framelocations.SVUI_Party_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT4300"
-		SV.db.framelocations.SVUI_Raid40_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT4300"
-		SV.db.framelocations.SVUI_Raid10_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT4300"
-		SV.db.framelocations.SVUI_Raid25_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT4300"
-	end
-end
-
-local function UFMoveTopQuadrant(toggle)
-	if not SV.db.framelocations then SV.db.framelocations = {} end
-	if not toggle then
-		SV.db.framelocations.GM_MOVE = "TOPLEFTSVUIParentTOPLEFT250-25"
-		SV.db.framelocations.SVUI_LootFrame_MOVE = "BOTTOMSVUIParentBOTTOM0350"
-		SV.db.framelocations.SVUI_AltPowerBar_MOVE = "TOPSVUIParentTOP0-40"
-		SV.db.framelocations.LoC_MOVE = "BOTTOMSVUIParentBOTTOM0350"
-		SV.db.framelocations.BNET_MOVE = "TOPRIGHTSVUIParentTOPRIGHT-4-250"
-	else
-		SV.db.framelocations.GM_MOVE = "TOPLEFTSVUIParentTOPLEFT344-25"
-		SV.db.framelocations.SVUI_LootFrame_MOVE = "BOTTOMSVUIParentBOTTOM0254"
-		SV.db.framelocations.SVUI_AltPowerBar_MOVE = "TOPSVUIParentTOP0-39"
-		SV.db.framelocations.LoC_MOVE = "BOTTOMSVUIParentBOTTOM0443"
-		SV.db.framelocations.BNET_MOVE = "TOPRIGHTSVUIParentTOPRIGHT-4-248"
-	end
-end
-
-local function UFMoveRightQuadrant(toggle)
-	if not SV.db.framelocations then SV.db.framelocations = {} end
-	local dH = SV.db.SVDock.dockRightHeight  +  60
-	if not toggle or toggle == "high" then
-		SV.db.framelocations.SVUI_BossHolder_MOVE = "RIGHTSVUIParentRIGHT-1050"
-		SV.db.framelocations.SVUI_ArenaHolder_MOVE = "RIGHTSVUIParentRIGHT-1050"
-		SV.db.framelocations.Tooltip_MOVE = "BOTTOMRIGHTSVUIParentBOTTOMRIGHT-284"..dH;
-	else
-		SV.db.framelocations.SVUI_BossHolder_MOVE = "RIGHTSVUIParentRIGHT-1050"
-		SV.db.framelocations.SVUI_ArenaHolder_MOVE = "RIGHTSVUIParentRIGHT-1050"
-		SV.db.framelocations.Tooltip_MOVE = "BOTTOMRIGHTSVUIParentBOTTOMRIGHT-284"..dH;
-	end
-end
-
-local function InitializeChatFrames(mungs)
-	forceCVars()
-	FCF_ResetChatWindows()
-	FCF_SetLocked(ChatFrame1, 1)
-	FCF_DockFrame(ChatFrame2)
-	FCF_SetLocked(ChatFrame2, 1)
-	FCF_OpenNewWindow(LOOT)
-	FCF_DockFrame(ChatFrame3)
-	FCF_SetLocked(ChatFrame3, 1)
-	for i = 1, NUM_CHAT_WINDOWS do
-		local chat = _G["ChatFrame"..i]
-		local chatID = chat:GetID()
-		if i == 1 then
-			chat:ClearAllPoints()
-			chat:Point("BOTTOMLEFT", LeftSuperDock, "BOTTOMLEFT", 5, 5)
-			chat:Point("TOPRIGHT", LeftSuperDock, "TOPRIGHT", -5, -10)
-		end
-		FCF_SavePositionAndDimensions(chat)
-		FCF_StopDragging(chat)
-		FCF_SetChatWindowFontSize(nil, chat, 12)
-		if i == 1 then
-			FCF_SetWindowName(chat, GENERAL)
-		elseif i == 2 then
-			FCF_SetWindowName(chat, GUILD_EVENT_LOG)
-		elseif i == 3 then
-			FCF_SetWindowName(chat, LOOT)
-		end
-	end
-	ChatFrame_RemoveAllMessageGroups(ChatFrame1)
-	ChatFrame_AddMessageGroup(ChatFrame1, "SAY")
-	ChatFrame_AddMessageGroup(ChatFrame1, "EMOTE")
-	ChatFrame_AddMessageGroup(ChatFrame1, "YELL")
-	ChatFrame_AddMessageGroup(ChatFrame1, "GUILD")
-	ChatFrame_AddMessageGroup(ChatFrame1, "OFFICER")
-	ChatFrame_AddMessageGroup(ChatFrame1, "GUILD_ACHIEVEMENT")
-	ChatFrame_AddMessageGroup(ChatFrame1, "WHISPER")
-	ChatFrame_AddMessageGroup(ChatFrame1, "MONSTER_SAY")
-	ChatFrame_AddMessageGroup(ChatFrame1, "MONSTER_EMOTE")
-	ChatFrame_AddMessageGroup(ChatFrame1, "MONSTER_YELL")
-	ChatFrame_AddMessageGroup(ChatFrame1, "MONSTER_BOSS_EMOTE")
-	ChatFrame_AddMessageGroup(ChatFrame1, "PARTY")
-	ChatFrame_AddMessageGroup(ChatFrame1, "PARTY_LEADER")
-	ChatFrame_AddMessageGroup(ChatFrame1, "RAID")
-	ChatFrame_AddMessageGroup(ChatFrame1, "RAID_LEADER")
-	ChatFrame_AddMessageGroup(ChatFrame1, "RAID_WARNING")
-	ChatFrame_AddMessageGroup(ChatFrame1, "INSTANCE_CHAT")
-	ChatFrame_AddMessageGroup(ChatFrame1, "INSTANCE_CHAT_LEADER")
-	ChatFrame_AddMessageGroup(ChatFrame1, "BATTLEGROUND")
-	ChatFrame_AddMessageGroup(ChatFrame1, "BATTLEGROUND_LEADER")
-	ChatFrame_AddMessageGroup(ChatFrame1, "BG_HORDE")
-	ChatFrame_AddMessageGroup(ChatFrame1, "BG_ALLIANCE")
-	ChatFrame_AddMessageGroup(ChatFrame1, "BG_NEUTRAL")
-	ChatFrame_AddMessageGroup(ChatFrame1, "SYSTEM")
-	ChatFrame_AddMessageGroup(ChatFrame1, "ERRORS")
-	ChatFrame_AddMessageGroup(ChatFrame1, "AFK")
-	ChatFrame_AddMessageGroup(ChatFrame1, "DND")
-	ChatFrame_AddMessageGroup(ChatFrame1, "IGNORED")
-	ChatFrame_AddMessageGroup(ChatFrame1, "ACHIEVEMENT")
-	ChatFrame_AddMessageGroup(ChatFrame1, "BN_WHISPER")
-	ChatFrame_AddMessageGroup(ChatFrame1, "BN_CONVERSATION")
-	ChatFrame_AddMessageGroup(ChatFrame1, "BN_INLINE_TOAST_ALERT")
-	ChatFrame_AddMessageGroup(ChatFrame1, "COMBAT_FACTION_CHANGE")
-	ChatFrame_AddMessageGroup(ChatFrame1, "SKILL")
-	ChatFrame_AddMessageGroup(ChatFrame1, "LOOT")
-	ChatFrame_AddMessageGroup(ChatFrame1, "MONEY")
-	ChatFrame_AddMessageGroup(ChatFrame1, "COMBAT_XP_GAIN")
-	ChatFrame_AddMessageGroup(ChatFrame1, "COMBAT_HONOR_GAIN")
-	ChatFrame_AddMessageGroup(ChatFrame1, "COMBAT_GUILD_XP_GAIN")
-
-	ChatFrame_RemoveAllMessageGroups(ChatFrame3)
-	ChatFrame_AddMessageGroup(ChatFrame3, "COMBAT_FACTION_CHANGE")
-	ChatFrame_AddMessageGroup(ChatFrame3, "SKILL")
-	ChatFrame_AddMessageGroup(ChatFrame3, "LOOT")
-	ChatFrame_AddMessageGroup(ChatFrame3, "MONEY")
-	ChatFrame_AddMessageGroup(ChatFrame3, "COMBAT_XP_GAIN")
-	ChatFrame_AddMessageGroup(ChatFrame3, "COMBAT_HONOR_GAIN")
-	ChatFrame_AddMessageGroup(ChatFrame3, "COMBAT_GUILD_XP_GAIN")
-
-	ChatFrame_AddChannel(ChatFrame1, GENERAL)
-
-	ToggleChatColorNamesByClassGroup(true, "SAY")
-	ToggleChatColorNamesByClassGroup(true, "EMOTE")
-	ToggleChatColorNamesByClassGroup(true, "YELL")
-	ToggleChatColorNamesByClassGroup(true, "GUILD")
-	ToggleChatColorNamesByClassGroup(true, "OFFICER")
-	ToggleChatColorNamesByClassGroup(true, "GUILD_ACHIEVEMENT")
-	ToggleChatColorNamesByClassGroup(true, "ACHIEVEMENT")
-	ToggleChatColorNamesByClassGroup(true, "WHISPER")
-	ToggleChatColorNamesByClassGroup(true, "PARTY")
-	ToggleChatColorNamesByClassGroup(true, "PARTY_LEADER")
-	ToggleChatColorNamesByClassGroup(true, "RAID")
-	ToggleChatColorNamesByClassGroup(true, "RAID_LEADER")
-	ToggleChatColorNamesByClassGroup(true, "RAID_WARNING")
-	ToggleChatColorNamesByClassGroup(true, "BATTLEGROUND")
-	ToggleChatColorNamesByClassGroup(true, "BATTLEGROUND_LEADER")
-	ToggleChatColorNamesByClassGroup(true, "INSTANCE_CHAT")
-	ToggleChatColorNamesByClassGroup(true, "INSTANCE_CHAT_LEADER")
-	ToggleChatColorNamesByClassGroup(true, "CHANNEL1")
-	ToggleChatColorNamesByClassGroup(true, "CHANNEL2")
-	ToggleChatColorNamesByClassGroup(true, "CHANNEL3")
-	ToggleChatColorNamesByClassGroup(true, "CHANNEL4")
-	ToggleChatColorNamesByClassGroup(true, "CHANNEL5")
-	ToggleChatColorNamesByClassGroup(true, "CHANNEL6")
-	ToggleChatColorNamesByClassGroup(true, "CHANNEL7")
-	ToggleChatColorNamesByClassGroup(true, "CHANNEL8")
-	ToggleChatColorNamesByClassGroup(true, "CHANNEL9")
-	ToggleChatColorNamesByClassGroup(true, "CHANNEL10")
-	ToggleChatColorNamesByClassGroup(true, "CHANNEL11")
-
-	ChangeChatColor("CHANNEL1", 195 / 255, 230 / 255, 232 / 255)
-	ChangeChatColor("CHANNEL2", 232 / 255, 158 / 255, 121 / 255)
-	ChangeChatColor("CHANNEL3", 232 / 255, 228 / 255, 121 / 255)
-
-	if not mungs then
-		if SV.Chat then
-			SV.Chat:ReLoad(true)
-			if SVUI_Cache["Dock"].RightSuperDockFaded  == true then RightSuperDockToggleButton:Click()end
-			if SVUI_Cache["Dock"].LeftSuperDockFaded  == true then LeftSuperDockToggleButton:Click()end
-		end
-		SV:SavedPopup()
-	end
-end
-
-local function SetUserScreen(rez, preserve)
-	if not preserve then
-		if okToResetMOVE then
-			SV:ResetMovables("")
-			okToResetMOVE = false;
-		end
-		SV.db:SetDefault("SVUnit")
-	end
-
-	if not SV.db.framelocations then SV.db.framelocations = {} end
-	if rez == "low" then
-		if not preserve then
-			SV.db.SVDock.dockLeftWidth = 350;
-			SV.db.SVDock.dockLeftHeight = 180;
-			SV.db.SVDock.dockRightWidth = 350;
-			SV.db.SVDock.dockRightHeight = 180;
-			SV.db.SVAura.wrapAfter = 10
-			SV.db.SVUnit.fontSize = 10;
-			SV.db.SVUnit.player.width = 200;
-			SV.db.SVUnit.player.castbar.width = 200;
-			SV.db.SVUnit.player.classbar.fill = "fill"
-			SV.db.SVUnit.player.health.tags = "[health:color][health:current]"
-			SV.db.SVUnit.target.width = 200;
-			SV.db.SVUnit.target.castbar.width = 200;
-			SV.db.SVUnit.target.health.tags = "[health:color][health:current]"
-			SV.db.SVUnit.pet.power.enable = false;
-			SV.db.SVUnit.pet.width = 200;
-			SV.db.SVUnit.pet.height = 26;
-			SV.db.SVUnit.targettarget.debuffs.enable = false;
-			SV.db.SVUnit.targettarget.power.enable = false;
-			SV.db.SVUnit.targettarget.width = 200;
-			SV.db.SVUnit.targettarget.height = 26;
-			SV.db.SVUnit.boss.width = 200;
-			SV.db.SVUnit.boss.castbar.width = 200;
-			SV.db.SVUnit.arena.width = 200;
-			SV.db.SVUnit.arena.castbar.width = 200
-		end
-		if not mungs then
-			UFMoveBottomQuadrant(true)
-			UFMoveLeftQuadrant(true)
-			UFMoveTopQuadrant(true)
-			UFMoveRightQuadrant(true)
-		end
-		SV.ghettoMonitor = true
-	else
-		SV.db:SetDefault("SVDock")
-		SV.db:SetDefault("SVAura")
-		if not mungs then
-			UFMoveBottomQuadrant()
-			UFMoveLeftQuadrant()
-			UFMoveTopQuadrant()
-			UFMoveRightQuadrant()
-		end
-		SV.ghettoMonitor = nil
-	end
-
-	if(not preserve and not mungs) then
-		BarShuffle()
-    	SV:SetSVMovablesPositions()
-		Registry:Update('SVDock')
-		Registry:Update('SVAura')
-		Registry:Update('SVBar')
-		Registry:Update('SVUnit')
-		SV:SavedPopup()
-	end
-end
---[[
-##########################################################
-GLOBAL/MODULE FUNCTIONS
-##########################################################
-]]--
-function Setup:LoadPresetData(category, theme)
-	if(not PRESET_DATA) then LoadAllPresets() end
-	if(PRESET_DATA and PRESET_DATA[category] and PRESET_DATA[category]["link"]) then
-		theme = theme or "default"
-		local saved = PRESET_DATA[category]["link"]
-		local preset =  PRESET_DATA[category][theme]
-	    _copyPresets(SV.db[saved], preset)
-	end
-end
-
-function Setup:SetColorTheme(style, preserve)
-	style = style or "default";
-
-	if not preserve then
-		SV.db:SetDefault("media")
-	end
-
-	local presets = self:LoadPresetData("media", style)
-	SV.db.LAYOUT.mediastyle = style;
-
-	if(style == "default") then
-		SV.db.SVUnit.healthclass = true;
-	else
-		SV.db.SVUnit.healthclass = false;
-	end
-
-	if(not mungs) then
-		SV:MediaUpdate()
-		Registry:Update('SVStats')
-		Registry:Update('SVUnit')
-		if(not preserve) then
-			SV:SavedPopup()
-		end
-	end
-end
-
-function Setup:SetUnitframeLayout(style, preserve)
-	style = style or "default";
-
-	if not SV.db.framelocations then SV.db.framelocations = {} end
-
-	if not preserve then
-		SV.db:SetDefault("SVUnit")
-		SV.db:SetDefault("SVStats")
-		if okToResetMOVE then
-			SV:ResetMovables('')
-			okToResetMOVE = false
-		end
-	end
-
-	local presets = self:LoadPresetData("units", style)
-	SV.db.LAYOUT.unitstyle = style
-
-	if(SV.db.LAYOUT.mediastyle == "default") then
-		SV.db.SVUnit.healthclass = true;
-	end
-
-	if(not mungs) then
-		if(not preserve) then
-			if SV.db.LAYOUT.barstyle and (SV.db.LAYOUT.barstyle == "twosmall" or SV.db.LAYOUT.barstyle == "twobig") then
-				UFMoveBottomQuadrant("shift")
-			else
-				UFMoveBottomQuadrant()
-			end
-			SV:SetSVMovablesPositions()
-		end
-		Registry:Update('SVStats')
-		Registry:Update('SVUnit')
-		if(not preserve) then
-			SV:SavedPopup()
-		end
-	end
-end
-
-function Setup:SetGroupframeLayout(style, preserve)
-	style = style or "default";
-
-	local presets = self:LoadPresetData("layouts", style)
-	SV.db.LAYOUT.groupstyle = style
-
-	if(not mungs) then
-		Registry:Update('SVUnit')
-		if(not preserve) then
-			SV:SavedPopup()
-		end
-	end
-end
-
-function Setup:SetupBarLayout(style, preserve)
-	style = style or "default";
-
-	if not SV.db.framelocations then SV.db.framelocations={} end
-	if not preserve then
-		SV.db:SetDefault("SVBar")
-		if okToResetMOVE then
-			SV:ResetMovables('')
-			okToResetMOVE=false
-		end
-	end
-
-	local presets = self:LoadPresetData("bars", style)
-	SV.db.LAYOUT.barstyle = style;
-
-	if(not mungs) then
-		if(not preserve) then
-			if(style == 'twosmall' or style == 'twobig') then
-				UFMoveBottomQuadrant("shift")
-			else
-				UFMoveBottomQuadrant()
-			end
-		end
-		if(not preserve) then
-			BarShuffle()
-			SV:SetSVMovablesPositions()
-		end
-		Registry:Update('SVStats')
-		Registry:Update('SVBar')
-		if(not preserve) then
-			SV:SavedPopup()
-		end
-	end
-end
-
-function Setup:SetupAuralayout(style, preserve)
-	style = style or "default";
-	local presets = self:LoadPresetData("auras", style)
-	SV.db.LAYOUT.aurastyle = style;
-
-	if(not mungs) then
-		Registry:Update('SVStats')
-		Registry:Update('SVAura')
-		Registry:Update('SVUnit')
-		if(not preserve) then
-			SV:SavedPopup()
-		end
-	end
-end
-
-local function PlayThemeSong()
-	if(not musicIsPlaying) then
-		SetCVar("Sound_MusicVolume", 100)
-		SetCVar("Sound_EnableMusic", 1)
-		StopMusic()
-		PlayMusic([[Interface\AddOns\SVUI\assets\sounds\SV.mp3]])
-		musicIsPlaying = true
-	end
-end
-
-local function InstallComplete()
-	SVUI_Profile.SAFEDATA.install_version = SV.___version;
-	StopMusic()
-	SetCVar("Sound_MusicVolume",user_music_vol)
-	okToResetMOVE = false;
-	ReloadUI()
-end
-
-local function InstallMungsChoice()
-	mungs = true;
-	okToResetMOVE = false;
-	InitializeChatFrames(true);
-	SetUserScreen('high');
-	SV:SetColorTheme();
-	SV.db.LAYOUT.unitstyle = nil;
-	SV:SetUnitframeLayout();
-	SV.db.LAYOUT.groupstyle = nil;
-	SV.db.LAYOUT.barstyle = nil;
-	SV:SetupBarLayout();
-	SV:SetupAuralayout();
-	SVUI_Profile.SAFEDATA.install_version = SV.___version;
-	StopMusic()
-	SetCVar("Sound_MusicVolume",user_music_vol)
-	ReloadUI()
-end
-
-local function ResetAll()
-	SVUI_InstallNextButton:Disable()
-	SVUI_InstallPrevButton:Disable()
-	SVUI_InstallOption01Button:Hide()
-	SVUI_InstallOption01Button:SetScript("OnClick",nil)
-	SVUI_InstallOption01Button:SetText("")
-	SVUI_InstallOption02Button:Hide()
-	SVUI_InstallOption02Button:SetScript("OnClick",nil)
-	SVUI_InstallOption02Button:SetText("")
-	SVUI_InstallOption03Button:Hide()
-	SVUI_InstallOption03Button:SetScript("OnClick",nil)
-	SVUI_InstallOption03Button:SetText("")
-	SVUI_InstallOption1Button:Hide()
-	SVUI_InstallOption1Button:SetScript("OnClick",nil)
-	SVUI_InstallOption1Button:SetText("")
-	SVUI_InstallOption2Button:Hide()
-	SVUI_InstallOption2Button:SetScript('OnClick',nil)
-	SVUI_InstallOption2Button:SetText('')
-	SVUI_InstallOption3Button:Hide()
-	SVUI_InstallOption3Button:SetScript('OnClick',nil)
-	SVUI_InstallOption3Button:SetText('')
-	SVUI_InstallOption4Button:Hide()
-	SVUI_InstallOption4Button:SetScript('OnClick',nil)
-	SVUI_InstallOption4Button:SetText('')
-	SVUI_SetupHolder.SubTitle:SetText("")
-	SVUI_SetupHolder.Desc1:SetText("")
-	SVUI_SetupHolder.Desc2:SetText("")
-	SVUI_SetupHolder.Desc3:SetText("")
-	SVUI_SetupHolder:Size(550,400)
-end
-
-local function SetPage(newPage)
-	CURRENT_PAGE = newPage;
-	ResetAll()
-	InstallStatus.text:SetText(CURRENT_PAGE.."  /  "..MAX_PAGE)
-	local setupFrame = SVUI_SetupHolder;
-	if newPage  ~= MAX_PAGE then
-		SVUI_InstallNextButton:Enable()
-		SVUI_InstallNextButton:Show()
-	end
-	if newPage  ~= 1 then
-		SVUI_InstallPrevButton:Enable()
-		SVUI_InstallPrevButton:Show()
-	end
-	--[[
-		more useful globalstrings
-
-		CUSTOM
-		SETTINGS
-		DEFAULT
-		DEFAULTS
-		USE
-		UIOPTIONS_MENU
-		LFGWIZARD_TITLE
-		CONTINUE
-	]]--
-	ShowLayout()
-	if newPage == 1 then
-		local hasOldConfig = SVUI_Profile.SAFEDATA.install_version
-		SVUI_InstallPrevButton:Disable()
-		SVUI_InstallPrevButton:Hide()
-		okToResetMOVE = true
-		setupFrame.SubTitle:SetText(format(L["This is Supervillain UI version %s!"], SV.___version))
-		setupFrame.Desc1:SetText(L["Before I can turn you loose, persuing whatever villainy you feel will advance your professional career... I need to ask some questions and turn a few screws first."])
-		setupFrame.Desc2:SetText(L["At any time you can get to the config options by typing the command  / sv. For quick changes to frame, bar or color sets, call your henchman by clicking the button on the bottom right of your screen. (Its the one with his stupid face on it)"])
-		setupFrame.Desc3:SetText(L["CHOOSE_OR_DIE"])
-		SVUI_InstallOption01Button:Show()
-		SVUI_InstallOption01Button:SetScript("OnClick", InstallMungsChoice)
-		SVUI_InstallOption01Button:SetText(USE.."\n"..DEFAULT.."\n"..SETTINGS)
-
-		SVUI_InstallOption02Button:Show()
-		SVUI_InstallOption02Button:SetScript("OnClick", InstallComplete)
-		SVUI_InstallOption02Button:SetText("PRETEND YOU\nDID THIS\nALREADY")
-
-		if(hasOldConfig) then
-			SVUI_InstallOption03Button:Show()
-			SVUI_InstallOption03Button:SetScript("OnClick", InstallComplete)
-			SVUI_InstallOption03Button:SetText("Keep\nSaved\n"..SETTINGS)
-		end
-
-	elseif newPage == 2 then
-		setupFrame.SubTitle:SetText(CHAT)
-		setupFrame.Desc1:SetText(L["Whether you want to or not, you will be needing a communicator so other villains can either update you on their doings-of-evil or inform you about the MANY abilities of Chuck Norris"])
-		setupFrame.Desc2:SetText(L["The chat windows function the same as standard chat windows, you can right click the tabs and drag them, rename them, slap them around, you know... whatever. Clickity-click to setup your chat windows."])
-		setupFrame.Desc3:SetText(L["CHOOSE_OR_DIE"])
-		SVUI_InstallOption1Button:Show()
-		SVUI_InstallOption1Button:SetScript("OnClick", function()
-			InitializeChatFrames(false)
-		end)
-		SVUI_InstallOption1Button:SetText(CHAT_DEFAULTS)
-
-	elseif newPage == 3 then
-		local rez = GetCVar("gxResolution")
-		setupFrame.SubTitle:SetText(RESOLUTION)
-		setupFrame.Desc1:SetText(format(L["Your current resolution is %s, this is considered a %s resolution."], rez, (SV.ghettoMonitor and LOW or HIGH)))
-		if SV.ghettoMonitor then
-			setupFrame.Desc2:SetText(L["This resolution requires that you change some settings to get everything to fit on your screen."].." "..L["Click the button below to resize your chat frames, unitframes, and reposition your actionbars."].." "..L["You may need to further alter these settings depending how low your resolution is."])
-			setupFrame.Desc3:SetText(L["CHOOSE_OR_DIE"])
-		else
-			setupFrame.Desc2:SetText(L["This resolution doesn't require that you change settings for the UI to fit on your screen."].." "..L["Click the button below to resize your chat frames, unitframes, and reposition your actionbars."].." "..L["This is completely optional."])
-			setupFrame.Desc3:SetText(L["CHOOSE_OR_DIE"])
-		end
-		SVUI_InstallOption1Button:Show()
-		SVUI_InstallOption1Button:SetScript("OnClick", function()
-			SetUserScreen("high")
-			SVUI_SetupHolder.Desc1:SetText(L["|cffFF9F00"..HIGH.." "..RESOLUTION.."!|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["So what you think your better than me with your big monitor? HUH?!?!"])
-			SVUI_SetupHolder.Desc3:SetText(L["Dont forget whos in charge here! But enjoy the incredible detail."])
-		end)
-		SVUI_InstallOption1Button:SetText(HIGH)
-		SVUI_InstallOption2Button:Show()
-		SVUI_InstallOption2Button:SetScript("OnClick", function()
-			SetUserScreen("low")
-			SVUI_SetupHolder.Desc1:SetText(L["|cffFF9F00"..LOW.." "..RESOLUTION.."|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["Why are you playing this on what I would assume is a calculator display?"])
-			SVUI_SetupHolder.Desc3:SetText(L["Enjoy the ONE incredible pixel that fits on this screen."])
-		end)
-		SVUI_InstallOption2Button:SetText(LOW)
-
-	elseif newPage == 4 then
-		setupFrame.SubTitle:SetText(COLOR.." "..SETTINGS)
-		setupFrame.Desc1:SetText(L["Choose a theme layout you wish to use for your initial setup."])
-		setupFrame.Desc2:SetText(L["You can always change fonts and colors of any element of Supervillain UI from the in-game configuration."])
-		setupFrame.Desc3:SetText(L["CHOOSE_OR_DIE"])
-		SVUI_InstallOption1Button:Show()
-		SVUI_InstallOption1Button:SetScript("OnClick", function()
-			SV:SetColorTheme("kaboom")
-			SVUI_SetupHolder.Desc1:SetText(L["|cffFF9F00KABOOOOM!|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["This theme tells the world that you are a villain who can put on a show"]..CONTINUED)
-			SVUI_SetupHolder.Desc3:SetText(CONTINUED..L["or better yet, you ARE the show!"])
-		end)
-		SVUI_InstallOption1Button:SetText(L["Kaboom!"])
-		SVUI_InstallOption2Button:Show()
-		SVUI_InstallOption2Button:SetScript("OnClick", function()
-			SV:SetColorTheme("dark")
-			SVUI_SetupHolder.Desc1:SetText(L["|cffAF30FFThe Darkest Night|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["This theme indicates that you have no interest in wasting time"]..CONTINUED)
-			SVUI_SetupHolder.Desc3:SetText(CONTINUED..L[" the dying begins NOW!"])
-		end)
-		SVUI_InstallOption2Button:SetText(L["Darkness"])
-		SVUI_InstallOption3Button:Show()
-		SVUI_InstallOption3Button:SetScript("OnClick", function()
-			SV:SetColorTheme("classy")
-			SVUI_SetupHolder.Desc1:SetText(L["|cffFFFF00"..CLASS_COLORS.."|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["This theme is for villains who take pride in their class"]..CONTINUED)
-			SVUI_SetupHolder.Desc3:SetText(CONTINUED..L[" villains know how to reprezent!"])
-		end)
-		SVUI_InstallOption3Button:SetText(L["Class" .. "\n" .. "Colors"])
-		SVUI_InstallOption4Button:Show()
-		SVUI_InstallOption4Button:SetScript("OnClick", function()
-			SV:SetColorTheme()
-			SVUI_SetupHolder.Desc1:SetText(L["|cff00FFFFPlain and Simple|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["This theme is for any villain who sticks to their traditions"]..CONTINUED)
-			SVUI_SetupHolder.Desc3:SetText(CONTINUED..L["you don't need fancyness to kick some ass!"])
-		end)
-		SVUI_InstallOption4Button:SetText(L["Vintage"])
-
-	elseif newPage == 5 then
-		ShowLayout(true)
-		setupFrame.SubTitle:SetText(UNITFRAME_LABEL.." "..SETTINGS)
-		setupFrame.Desc1:SetText(L["You can now choose what primary unitframe style you wish to use."])
-		setupFrame.Desc2:SetText(L["This will change the layout of your unitframes (ie.. Player, Target, Pet, Party, Raid ...etc)."])
-		setupFrame.Desc3:SetText(L["CHOOSE_OR_DIE"])
-		SVUI_InstallOption1Button:Show()
-		SVUI_InstallOption1Button:SetScript("OnClick", function()
-			SV.db.LAYOUT.unitstyle = nil;
-			SV:SetUnitframeLayout("super")
-			SVUI_SetupHolder.Desc1:SetText(L["|cff00FFFFLets Do This|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["This layout is anything but minimal! Using this is like being at a rock concert"]..CONTINUED)
-			SVUI_SetupHolder.Desc3:SetText(CONTINUED..L["then annihilating the crowd with frickin lazer beams!"])
-		end)
-		SVUI_InstallOption1Button:SetText(L["Super"])
-		SVUI_InstallOption2Button:Show()
-		SVUI_InstallOption2Button:SetScript("OnClick", function()
-			SV.db.LAYOUT.unitstyle = nil;
-			SV:SetUnitframeLayout("simple")
-			SVUI_SetupHolder.Desc1:SetText(L["|cff00FFFFSimply Simple|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["This layout is for the villain who just wants to get things done!"]..CONTINUED)
-			SVUI_SetupHolder.Desc3:SetText(CONTINUED..L["but he still wants to see your face before he hits you!"])
-		end)
-		SVUI_InstallOption2Button:SetText(L["Simple"])
-		SVUI_InstallOption3Button:Show()
-		SVUI_InstallOption3Button:SetScript("OnClick", function()
-			SV.db.LAYOUT.unitstyle = nil;
-			SV:SetUnitframeLayout("compact")
-			SVUI_SetupHolder.Desc1:SetText(L["|cff00FFFFEl Compacto|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["Just the necessities so you can see more of the world around you"]..CONTINUED)
-			SVUI_SetupHolder.Desc3:SetText(CONTINUED..L["you dont need no fanciness getting in the way of world domination do you?"])
-		end)
-		SVUI_InstallOption3Button:SetText(L["Compact"])
-
-	elseif newPage == 6 then
-		ShowLayout(true)
-		setupFrame.SubTitle:SetText("Group Layout")
-		setupFrame.Desc1:SetText(L["You can now choose what group layout you prefer."])
-		setupFrame.Desc2:SetText(L["This will adjust various settings on group units, attempting to make certain roles more usable"])
-		setupFrame.Desc3:SetText(L["CHOOSE_OR_DIE"])
-
-		SVUI_InstallOption1Button:Show()
-		SVUI_InstallOption1Button:SetScript("OnClick", function()
-			SV.db.LAYOUT.groupstyle = "default";
-			SV:SetGroupframeLayout("default")
-			SVUI_SetupHolder.Desc1:SetText(L["|cff00FFFFStandard|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["You are good to go with the default layout"]..CONTINUED)
-			SVUI_SetupHolder.Desc3:SetText(CONTINUED..L["frames schmames, lets kill some stuff!"])
-		end)
-		SVUI_InstallOption1Button:SetText(L["Standard"])
-
-		SVUI_InstallOption2Button:Show()
-		SVUI_InstallOption2Button:SetScript("OnClick", function()
-			SV.db.LAYOUT.groupstyle = nil;
-			SV:SetGroupframeLayout("healer")
-			SVUI_SetupHolder.Desc1:SetText(L["|cff00FFFFMEDIC!!|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["You are pretty helpful.. for a VILLAIN!"]..CONTINUED)
-			SVUI_SetupHolder.Desc3:SetText(CONTINUED..L["Hey, even a super villain gets his ass kicked once in awhile. We need the likes of you!"])
-		end)
-		SVUI_InstallOption2Button:SetText(L["Healer"])
-
-		SVUI_InstallOption3Button:Show()
-		SVUI_InstallOption3Button:SetScript("OnClick", function()
-			SV.db.LAYOUT.groupstyle = nil;
-			SV:SetGroupframeLayout("dps")
-			SVUI_SetupHolder.Desc1:SetText(L["|cff00FFFFDeath Dealer|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["You are the kings of our craft. Handing out pain like its halloween candy."]..CONTINUED)
-			SVUI_SetupHolder.Desc3:SetText(CONTINUED..L["I will move and squeeze group frames out of your way so you have more room for BOOM!"])
-		end)
-		SVUI_InstallOption3Button:SetText(L["DPS"])
-
-		SVUI_InstallOption4Button:Show()
-		SVUI_InstallOption4Button:SetScript("OnClick", function()
-			SV.db.LAYOUT.groupstyle = nil;
-			SV:SetGroupframeLayout("grid")
-			SVUI_SetupHolder.Desc1:SetText(L["|cff00FFFFCubed|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["You are cold and calculated, your frames should reflect as much."]..CONTINUED)
-			SVUI_SetupHolder.Desc3:SetText(CONTINUED..L["I'm gonna make these frames so precise that you can cut your finger on them!"])
-		end)
-		SVUI_InstallOption4Button:SetText(L["Grid"])
-
-	elseif newPage == 7 then
-		setupFrame.SubTitle:SetText(ACTIONBAR_LABEL.." "..SETTINGS)
-		setupFrame.Desc1:SetText(L["Choose a layout for your action bars."])
-		setupFrame.Desc2:SetText(L["Sometimes you need big buttons, sometimes you don't. Your choice here."])
-		setupFrame.Desc3:SetText(L["CHOOSE_OR_DIE"])
-		SVUI_InstallOption1Button:Show()
-		SVUI_InstallOption1Button:SetScript("OnClick", function()
-			SV.db.LAYOUT.barstyle = nil;
-			SV:SetupBarLayout("default")
-			SVUI_SetupHolder.Desc1:SetText(L["|cff00FFFFLean And Clean|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["Lets keep it slim and deadly, not unlike a ninja sword."])
-			SVUI_SetupHolder.Desc3:SetText(L["You dont ever even look at your bar hardly, so pick this one!"])
-		end)
-		SVUI_InstallOption1Button:SetText(L["Small" .. "\n" .. "Row"])
-		SVUI_InstallOption2Button:Show()
-		SVUI_InstallOption2Button:SetScript("OnClick", function()
-			SV.db.LAYOUT.barstyle = nil;
-			SV:SetupBarLayout("twosmall")
-			SVUI_SetupHolder.Desc1:SetText(L["|cff00FFFFMore For Less|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["Granted, you dont REALLY need the buttons due to your hotkey-leetness, you just like watching cooldowns!"])
-			SVUI_SetupHolder.Desc3:SetText(L["Sure thing cowboy, your secret is safe with me!"])
-		end)
-		SVUI_InstallOption2Button:SetText(L["2 Small" .. "\n" .. "Rows"])
-		SVUI_InstallOption3Button:Show()
-		SVUI_InstallOption3Button:SetScript("OnClick", function()
-			SV.db.LAYOUT.barstyle = nil;
-			SV:SetupBarLayout("onebig")
-			SVUI_SetupHolder.Desc1:SetText(L["|cff00FFFFWhat Big Buttons You Have|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["The better to PEW-PEW you with my dear!"])
-			SVUI_SetupHolder.Desc3:SetText(L["When you have little time for mouse accuracy, choose this set!"])
-		end)
-		SVUI_InstallOption3Button:SetText(L["Big" .. "\n" .. "Row"])
-		SVUI_InstallOption4Button:Show()
-		SVUI_InstallOption4Button:SetScript("OnClick", function()
-			SV.db.LAYOUT.barstyle = nil;
-			SV:SetupBarLayout("twobig")
-			SVUI_SetupHolder.Desc1:SetText(L["|cff00FFFFThe Double Down|r"])
-			SVUI_SetupHolder.Desc2:SetText(L["Lets be honest for a moment. Who doesnt like a huge pair in their face?"])
-			SVUI_SetupHolder.Desc3:SetText(L["Double your bars then double their size for maximum button goodness!"])
-		end)
-		SVUI_InstallOption4Button:SetText(L["2 Big" .. "\n" .. "Rows"])
-
-	elseif newPage == 8 then
-		setupFrame.SubTitle:SetText(AURAS.." "..SETTINGS)
-		setupFrame.Desc1:SetText(L["Select an aura layout. \"Icons\" will display only icons and aurabars won't be used. \"Bars\" will display only aurabars and icons won't be used (duh). \"The Works!\" does just what it says.... icons, bars and awesomeness."])
-		setupFrame.Desc2:SetText(L["If you have an aura that you don't want to display simply hold down shift and right click the icon for it to suffer a painful death."])
-		setupFrame.Desc3:SetText(L["CHOOSE_OR_DIE"])
-
-		SVUI_InstallOption1Button:Show()
-		SVUI_InstallOption1Button:SetScript("OnClick", function()
-			SV:SetupAuralayout()
-		end)
-		SVUI_InstallOption1Button:SetText(L["Vintage"])
-
-		SVUI_InstallOption2Button:Show()
-		SVUI_InstallOption2Button:SetScript("OnClick", function()
-			SV:SetupAuralayout("icons")
-		end)
-		SVUI_InstallOption2Button:SetText(L["Icons"])
-
-		SVUI_InstallOption3Button:Show()
-		SVUI_InstallOption3Button:SetScript("OnClick", function()
-			SV:SetupAuralayout("bars")
-		end)
-		SVUI_InstallOption3Button:SetText(L["Bars"])
-
-		SVUI_InstallOption4Button:Show()
-		SVUI_InstallOption4Button:SetScript("OnClick", function()
-			SV:SetupAuralayout("theworks")
-		end)
-		SVUI_InstallOption4Button:SetText(L["The" .. "\n" .. "Works!"])
-
-	elseif newPage == 9 then
-		SVUI_InstallNextButton:Disable()
-		SVUI_InstallNextButton:Hide()
-		setupFrame.SubTitle:SetText(BASIC_OPTIONS_TOOLTIP..CONTINUED..AUCTION_TIME_LEFT0)
-		setupFrame.Desc1:SetText(L["Thats it! All done! Now we just need to hand these choices off to the henchmen so they can get you ready to (..insert evil tasks here..)!"])
-		setupFrame.Desc2:SetText(L["Click the button below to reload and get on your way! Good luck villain!"])
-		SVUI_InstallOption1Button:Show()
-		SVUI_InstallOption1Button:SetScript("OnClick", InstallComplete)
-		SVUI_InstallOption1Button:SetText(L["THE_BUTTON_BELOW"])
-		SVUI_SetupHolder:Size(550, 350)
-	end
-end
-
-local function NextPage()
-	if CURRENT_PAGE ~= MAX_PAGE then
-		CURRENT_PAGE = CURRENT_PAGE + 1;
-		SetPage(CURRENT_PAGE)
-	end
-end
-
-local function PreviousPage()
-	if CURRENT_PAGE ~= 1 then
-		CURRENT_PAGE = CURRENT_PAGE - 1;
-		SetPage(CURRENT_PAGE)
-	end
-end
-
-local function ResetGlobalVariables()
-	for k,v in pairs(SVUI_Cache) do
-		SVUI_Cache[k] = nil
-	end
-end
-
-function Setup:Reset()
-	mungs = true;
-	okToResetMOVE = false;
-	InitializeChatFrames(true);
-	SV.db:Reset()
-	SetUserScreen();
-
-	if SV.db.LAYOUT.mediastyle then
-        SV:SetColorTheme(SV.db.LAYOUT.mediastyle)
-    else
-    	SV.db.LAYOUT.mediastyle = nil;
-    	SV:SetColorTheme()
-    end
-
-    if SV.db.LAYOUT.unitstyle then
-        SV:SetUnitframeLayout(SV.db.LAYOUT.unitstyle)
-    else
-    	SV.db.LAYOUT.unitstyle = nil;
-    	SV:SetUnitframeLayout()
-    end
-
-    if SV.db.LAYOUT.barstyle then
-        SV:SetupBarLayout(SV.db.LAYOUT.barstyle)
-    else
-    	SV.db.LAYOUT.barstyle = nil;
-    	SV:SetupBarLayout()
-    end
-
-    if SV.db.LAYOUT.aurastyle then
-        SV:SetupAuralayout(SV.db.LAYOUT.aurastyle)
-    else
-    	SV.db.LAYOUT.aurastyle = nil;
-    	SV:SetupAuralayout()
-    end
-
-	SVUI_Profile.SAFEDATA.install_version = SV.___version;
-	ResetGlobalVariables()
-	ReloadUI()
-end
-
-function Setup:Install(autoLoaded)
-	if(not user_music_vol) then
-		user_music_vol = GetCVar("Sound_MusicVolume")
-	end
-
-	-- frame
-	if not SVUI_SetupHolder then
-		local frame = CreateFrame("Button", "SVUI_SetupHolder", UIParent)
-		frame.SetPage = SetPage;
-		frame:Size(550, 400)
-		frame:SetPanelTemplate("Action")
-		frame:SetPoint("CENTER")
-		frame:SetFrameStrata("TOOLTIP")
-		frame.Title = frame:CreateFontString(nil, "OVERLAY")
-		frame.Title:SetFont(SV.Media.font.narrator, 22, "OUTLINE")
-		frame.Title:Point("TOP", 0, -5)
-		frame.Title:SetText(L["Supervillain UI Installation"])
-
-		frame.Next = CreateFrame("Button", "SVUI_InstallNextButton", frame, "UIPanelButtonTemplate")
-		frame.Next:RemoveTextures()
-		frame.Next:Size(110, 25)
-		frame.Next:Point("BOTTOMRIGHT", 50, 5)
-		SetInstallButton(frame.Next)
-		frame.Next.texture = frame.Next:CreateTexture(nil, "BORDER")
-		frame.Next.texture:Size(110, 75)
-		frame.Next.texture:Point("RIGHT")
-		frame.Next.texture:SetTexture("Interface\\AddOns\\SVUI\\assets\\artwork\\Template\\OPTION-ARROW")
-		frame.Next.texture:SetVertexColor(1, 0.5, 0)
-		frame.Next.text = frame.Next:CreateFontString(nil, "OVERLAY")
-		frame.Next.text:SetFont(SV.Media.font.action, 18, "OUTLINE")
-		frame.Next.text:SetPoint("CENTER")
-		frame.Next.text:SetText(CONTINUE)
-		frame.Next:Disable()
-		frame.Next:SetScript("OnClick", NextPage)
-		frame.Next:SetScript("OnEnter", function(this)
-			this.texture:SetVertexColor(1, 1, 0)
-		end)
-		frame.Next:SetScript("OnLeave", function(this)
-			this.texture:SetVertexColor(1, 0.5, 0)
-		end)
-
-		frame.Prev = CreateFrame("Button", "SVUI_InstallPrevButton", frame, "UIPanelButtonTemplate")
-		frame.Prev:RemoveTextures()
-		frame.Prev:Size(110, 25)
-		frame.Prev:Point("BOTTOMLEFT", -50, 5)
-		SetInstallButton(frame.Prev)
-		frame.Prev.texture = frame.Prev:CreateTexture(nil, "BORDER")
-		frame.Prev.texture:Size(110, 75)
-		frame.Prev.texture:Point("LEFT")
-		frame.Prev.texture:SetTexture("Interface\\AddOns\\SVUI\\assets\\artwork\\Template\\OPTION-ARROW")
-		frame.Prev.texture:SetTexCoord(1, 0, 1, 1, 0, 0, 0, 1)
-		frame.Prev.texture:SetVertexColor(1, 0.5, 0)
-		frame.Prev.text = frame.Prev:CreateFontString(nil, "OVERLAY")
-		frame.Prev.text:SetFont(SV.Media.font.action, 18, "OUTLINE")
-		frame.Prev.text:SetPoint("CENTER")
-		frame.Prev.text:SetText(PREVIOUS)
-		frame.Prev:Disable()
-		frame.Prev:SetScript("OnClick", PreviousPage)
-		frame.Prev:SetScript("OnEnter", function(this)
-			this.texture:SetVertexColor(1, 1, 0)
-		end)
-		frame.Prev:SetScript("OnLeave", function(this)
-			this.texture:SetVertexColor(1, 0.5, 0)
-		end)
-		frame.Status = CreateFrame("Frame", "InstallStatus", frame)
-		frame.Status:SetFrameLevel(frame.Status:GetFrameLevel() + 2)
-		frame.Status:Size(150, 30)
-		frame.Status:Point("BOTTOM", frame, "TOP", 0, 2)
-		frame.Status.text = frame.Status:CreateFontString(nil, "OVERLAY")
-		frame.Status.text:SetFont(SV.Media.font.numbers, 22, "OUTLINE")
-		frame.Status.text:SetPoint("CENTER")
-		frame.Status.text:SetText(CURRENT_PAGE.."  /  "..MAX_PAGE)
-
-		frame.Option01 = CreateFrame("Button", "SVUI_InstallOption01Button", frame, "UIPanelButtonTemplate")
-		frame.Option01:RemoveTextures()
-		frame.Option01:Size(160, 30)
-		frame.Option01:Point("BOTTOM", 0, 15)
-		frame.Option01:SetText("")
-		SetInstallButton(frame.Option01)
-		frame.Option01.texture = frame.Option01:CreateTexture(nil, "BORDER")
-		frame.Option01.texture:Size(160, 160)
-		frame.Option01.texture:Point("CENTER", frame.Option01, "BOTTOM", 0, -15)
-		frame.Option01.texture:SetTexture("Interface\\AddOns\\SVUI\\assets\\artwork\\Template\\OPTION")
-		frame.Option01.texture:SetGradient("VERTICAL", 0, 0.3, 0, 0, 0.7, 0)
-		frame.Option01:SetScript("OnEnter", function(this)
-			this.texture:SetVertexColor(0.5, 1, 0.4)
-		end)
-		frame.Option01:SetScript("OnLeave", function(this)
-			this.texture:SetGradient("VERTICAL", 0, 0.3, 0, 0, 0.7, 0)
-		end)
-		hooksecurefunc(frame.Option01, "SetWidth", function(g, h)
-			g.texture:Size(h, h)
-			g.texture:Point("CENTER", g, "BOTTOM", 0, -(h * 0.09))
-		end)
-		frame.Option01:SetFrameLevel(frame.Option01:GetFrameLevel() + 10)
-		frame.Option01:Hide()
-
-		frame.Option02 = CreateFrame("Button", "SVUI_InstallOption02Button", frame, "UIPanelButtonTemplate")
-		frame.Option02:RemoveTextures()
-		frame.Option02:Size(130, 30)
-		frame.Option02:Point("BOTTOMLEFT", frame, "BOTTOM", 4, 15)
-		frame.Option02:SetText("")
-		SetInstallButton(frame.Option02)
-		frame.Option02.texture = frame.Option02:CreateTexture(nil, "BORDER")
-		frame.Option02.texture:Size(130, 110)
-		frame.Option02.texture:Point("CENTER", frame.Option02, "BOTTOM", 0, -15)
-		frame.Option02.texture:SetTexture("Interface\\AddOns\\SVUI\\assets\\artwork\\Template\\OPTION")
-		frame.Option02.texture:SetGradient("VERTICAL", 0.3, 0, 0, 0.7, 0, 0)
-		frame.Option02:SetScript("OnEnter", function(this)
-			this.texture:SetVertexColor(0.5, 1, 0.4)
-		end)
-		frame.Option02:SetScript("OnLeave", function(this)
-			this.texture:SetGradient("VERTICAL", 0.3, 0, 0, 0.7, 0, 0)
-		end)
-		hooksecurefunc(frame.Option02, "SetWidth", function(g, h)
-			g.texture:Size(h, h)
-			g.texture:Point("CENTER", g, "BOTTOM", 0, -(h * 0.09))
-		end)
-		frame.Option02:SetScript("OnShow", function()
-			frame.Option01:SetWidth(130)
-			frame.Option01:ClearAllPoints()
-			frame.Option01:Point("BOTTOMRIGHT", frame, "BOTTOM", -4, 15)
-		end)
-		frame.Option02:SetScript("OnHide", function()
-			frame.Option01:SetWidth(160)
-			frame.Option01:ClearAllPoints()
-			frame.Option01:Point("BOTTOM", 0, 15)
-		end)
-		frame.Option02:SetFrameLevel(frame.Option01:GetFrameLevel() + 10)
-		frame.Option02:Hide()
-
-		frame.Option03 = CreateFrame("Button", "SVUI_InstallOption03Button", frame, "UIPanelButtonTemplate")
-		frame.Option03:RemoveTextures()
-		frame.Option03:Size(130, 30)
-		frame.Option03:Point("BOTTOM", frame, "BOTTOM", 0, 15)
-		frame.Option03:SetText("")
-		SetInstallButton(frame.Option03)
-		frame.Option03.texture = frame.Option03:CreateTexture(nil, "BORDER")
-		frame.Option03.texture:Size(130, 110)
-		frame.Option03.texture:Point("CENTER", frame.Option03, "BOTTOM", 0, -15)
-		frame.Option03.texture:SetTexture("Interface\\AddOns\\SVUI\\assets\\artwork\\Template\\OPTION")
-		frame.Option03.texture:SetGradient("VERTICAL", 0, 0.1, 0.3, 0, 0.5, 0.7)
-		frame.Option03:SetScript("OnEnter", function(this)
-			this.texture:SetVertexColor(0.2, 0.5, 1)
-		end)
-		frame.Option03:SetScript("OnLeave", function(this)
-			this.texture:SetGradient("VERTICAL", 0, 0.1, 0.3, 0, 0.5, 0.7)
-		end)
-		hooksecurefunc(frame.Option03, "SetWidth", function(g, h)
-			g.texture:Size(h, h)
-			g.texture:Point("CENTER", g, "BOTTOM", 0, -(h * 0.09))
-		end)
-		frame.Option03:SetScript("OnShow", function(self)
-			self:SetWidth(130)
-			frame.Option01:SetWidth(130)
-			frame.Option01:ClearAllPoints()
-			frame.Option01:Point("RIGHT", self, "LEFT", -8, 0)
-			frame.Option02:SetWidth(130)
-			frame.Option02:ClearAllPoints()
-			frame.Option02:Point("LEFT", self, "RIGHT", 8, 0)
-		end)
-		frame.Option03:SetScript("OnHide", function()
-			frame.Option01:SetWidth(160)
-			frame.Option01:ClearAllPoints()
-			frame.Option01:Point("BOTTOM", 0, 15)
-			frame.Option02:ClearAllPoints()
-			frame.Option02:Point("BOTTOMLEFT", frame, "BOTTOM", 4, 15)
-		end)
-		frame.Option03:SetFrameLevel(frame.Option01:GetFrameLevel() + 10)
-		frame.Option03:Hide()
-
-		frame.Option1 = CreateFrame("Button", "SVUI_InstallOption1Button", frame, "UIPanelButtonTemplate")
-		frame.Option1:RemoveTextures()
-		frame.Option1:Size(160, 30)
-		frame.Option1:Point("BOTTOM", 0, 15)
-		frame.Option1:SetText("")
-		SetInstallButton(frame.Option1)
-		frame.Option1.texture = frame.Option1:CreateTexture(nil, "BORDER")
-		frame.Option1.texture:Size(160, 160)
-		frame.Option1.texture:Point("CENTER", frame.Option1, "BOTTOM", 0, -15)
-		frame.Option1.texture:SetTexture("Interface\\AddOns\\SVUI\\assets\\artwork\\Template\\OPTION")
-		frame.Option1.texture:SetGradient("VERTICAL", 0.3, 0.3, 0.3, 0.7, 0.7, 0.7)
-		frame.Option1:SetScript("OnEnter", function(this)
-			this.texture:SetVertexColor(0.5, 1, 0.4)
-		end)
-		frame.Option1:SetScript("OnLeave", function(this)
-			this.texture:SetGradient("VERTICAL", 0.3, 0.3, 0.3, 0.7, 0.7, 0.7)
-		end)
-		hooksecurefunc(frame.Option1, "SetWidth", function(g, h)
-			g.texture:Size(h, h)
-			g.texture:Point("CENTER", g, "BOTTOM", 0, -(h * 0.09))
-		end)
-		frame.Option1:SetFrameLevel(frame.Option1:GetFrameLevel() + 10)
-		frame.Option1:Hide()
-
-		frame.Option2 = CreateFrame("Button", "SVUI_InstallOption2Button", frame, "UIPanelButtonTemplate")
-		frame.Option2:RemoveTextures()
-		frame.Option2:Size(120, 30)
-		frame.Option2:Point("BOTTOMLEFT", frame, "BOTTOM", 4, 15)
-		frame.Option2:SetText("")
-		SetInstallButton(frame.Option2)
-		frame.Option2.texture = frame.Option2:CreateTexture(nil, "BORDER")
-		frame.Option2.texture:Size(120, 110)
-		frame.Option2.texture:Point("CENTER", frame.Option2, "BOTTOM", 0, -15)
-		frame.Option2.texture:SetTexture("Interface\\AddOns\\SVUI\\assets\\artwork\\Template\\OPTION")
-		frame.Option2.texture:SetGradient("VERTICAL", 0.3, 0.3, 0.3, 0.7, 0.7, 0.7)
-		frame.Option2:SetScript("OnEnter", function(this)
-			this.texture:SetVertexColor(0.5, 1, 0.4)
-		end)
-		frame.Option2:SetScript("OnLeave", function(this)
-			this.texture:SetGradient("VERTICAL", 0.3, 0.3, 0.3, 0.7, 0.7, 0.7)
-		end)
-		hooksecurefunc(frame.Option2, "SetWidth", function(g, h)
-			g.texture:Size(h, h)
-			g.texture:Point("CENTER", g, "BOTTOM", 0, -(h * 0.09))
-		end)
-		frame.Option2:SetScript("OnShow", function()
-			frame.Option1:SetWidth(120)
-			frame.Option1:ClearAllPoints()
-			frame.Option1:Point("BOTTOMRIGHT", frame, "BOTTOM", -4, 15)
-		end)
-		frame.Option2:SetScript("OnHide", function()
-			frame.Option1:SetWidth(160)
-			frame.Option1:ClearAllPoints()
-			frame.Option1:Point("BOTTOM", 0, 15)
-		end)
-		frame.Option2:SetFrameLevel(frame.Option1:GetFrameLevel() + 10)
-		frame.Option2:Hide()
-
-		frame.Option3 = CreateFrame("Button", "SVUI_InstallOption3Button", frame, "UIPanelButtonTemplate")
-		frame.Option3:RemoveTextures()
-		frame.Option3:Size(110, 30)
-		frame.Option3:Point("LEFT", frame.Option2, "RIGHT", 4, 0)
-		frame.Option3:SetText("")
-		SetInstallButton(frame.Option3)
-		frame.Option3.texture = frame.Option3:CreateTexture(nil, "BORDER")
-		frame.Option3.texture:Size(110, 100)
-		frame.Option3.texture:Point("CENTER", frame.Option3, "BOTTOM", 0, -9)
-		frame.Option3.texture:SetTexture("Interface\\AddOns\\SVUI\\assets\\artwork\\Template\\OPTION")
-		frame.Option3.texture:SetGradient("VERTICAL", 0.3, 0.3, 0.3, 0.7, 0.7, 0.7)
-		frame.Option3:SetScript("OnEnter", function(this)
-			this.texture:SetVertexColor(0.5, 1, 0.4)
-		end)
-		frame.Option3:SetScript("OnLeave", function(this)
-			this.texture:SetGradient("VERTICAL", 0.3, 0.3, 0.3, 0.7, 0.7, 0.7)
-		end)
-		frame.Option3:SetScript("OnShow", function()
-			frame.Option1:SetWidth(110)
-			frame.Option1:ClearAllPoints()
-			frame.Option1:Point("RIGHT", frame.Option2, "LEFT", -4, 0)
-			frame.Option2:SetWidth(110)
-			frame.Option2:ClearAllPoints()
-			frame.Option2:Point("BOTTOM", frame, "BOTTOM", 0, 15)
-		end)
-		frame.Option3:SetScript("OnHide", function()
-			frame.Option1:SetWidth(160)
-			frame.Option1:ClearAllPoints()
-			frame.Option1:Point("BOTTOM", 0, 15)
-			frame.Option2:SetWidth(120)
-			frame.Option2:ClearAllPoints()
-			frame.Option2:Point("BOTTOMLEFT", frame, "BOTTOM", 4, 15)
-		end)
-		frame.Option3:SetFrameLevel(frame.Option1:GetFrameLevel() + 10)
-		frame.Option3:Hide()
-
-		frame.Option4 = CreateFrame("Button", "SVUI_InstallOption4Button", frame, "UIPanelButtonTemplate")
-		frame.Option4:RemoveTextures()
-		frame.Option4:Size(110, 30)
-		frame.Option4:Point("LEFT", frame.Option3, "RIGHT", 4, 0)
-		frame.Option4:SetText("")
-		SetInstallButton(frame.Option4)
-		frame.Option4.texture = frame.Option4:CreateTexture(nil, "BORDER")
-		frame.Option4.texture:Size(110, 100)
-		frame.Option4.texture:Point("CENTER", frame.Option4, "BOTTOM", 0, -9)
-		frame.Option4.texture:SetTexture("Interface\\AddOns\\SVUI\\assets\\artwork\\Template\\OPTION")
-		frame.Option4.texture:SetGradient("VERTICAL", 0.3, 0.3, 0.3, 0.7, 0.7, 0.7)
-		frame.Option4:SetScript("OnEnter", function(this)
-			this.texture:SetVertexColor(0.5, 1, 0.4)
-		end)
-		frame.Option4:SetScript("OnLeave", function(this)
-			this.texture:SetGradient("VERTICAL", 0.3, 0.3, 0.3, 0.7, 0.7, 0.7)
-		end)
-		frame.Option4:SetScript("OnShow", function()
-			frame.Option1:Width(110)
-			frame.Option2:Width(110)
-			frame.Option1:ClearAllPoints()
-			frame.Option1:Point("RIGHT", frame.Option2, "LEFT", -4, 0)
-			frame.Option2:ClearAllPoints()
-			frame.Option2:Point("BOTTOMRIGHT", frame, "BOTTOM", -4, 15)
-		end)
-		frame.Option4:SetScript("OnHide", function()
-			frame.Option1:SetWidth(160)
-			frame.Option1:ClearAllPoints()
-			frame.Option1:Point("BOTTOM", 0, 15)
-			frame.Option2:SetWidth(120)
-			frame.Option2:ClearAllPoints()
-			frame.Option2:Point("BOTTOMLEFT", frame, "BOTTOM", 4, 15)
-		end)
-
-		frame.Option4:SetFrameLevel(frame.Option1:GetFrameLevel() + 10)
-		frame.Option4:Hide()
-
-		frame.SubTitle = frame:CreateFontString(nil, "OVERLAY")
-		frame.SubTitle:SetFont(SV.Media.font.roboto, 16, "OUTLINE")
-		frame.SubTitle:Point("TOP", 0, -40)
-		frame.Desc1 = frame:CreateFontString(nil, "OVERLAY")
-		frame.Desc1:SetFont(SV.Media.font.roboto, 14, "OUTLINE")
-		frame.Desc1:Point("TOPLEFT", 20, -75)
-		frame.Desc1:Width(frame:GetWidth()-40)
-		frame.Desc2 = frame:CreateFontString(nil, "OVERLAY")
-		frame.Desc2:SetFont(SV.Media.font.roboto, 14, "OUTLINE")
-		frame.Desc2:Point("TOPLEFT", 20, -125)
-		frame.Desc2:Width(frame:GetWidth()-40)
-		frame.Desc3 = frame:CreateFontString(nil, "OVERLAY")
-		frame.Desc3:SetFont(SV.Media.font.roboto, 14, "OUTLINE")
-		frame.Desc3:Point("TOPLEFT", 20, -175)
-		frame.Desc3:Width(frame:GetWidth()-40)
-		local closeButton = CreateFrame("Button", "SVUI_InstallCloseButton", frame, "UIPanelCloseButton")
-		closeButton:SetPoint("TOPRIGHT", frame, "TOPRIGHT")
-		closeButton:SetScript("OnClick", function()frame:Hide()end)
-		frame.tutorialImage = frame:CreateTexture("InstallTutorialImage", "OVERLAY")
-		frame.tutorialImage:Size(256, 128)
-		frame.tutorialImage:SetTexture("Interface\\AddOns\\SVUI\\assets\\artwork\\SPLASH")
-		frame.tutorialImage:Point("BOTTOM", 0, 70)
-	end
-
-	SVUI_SetupHolder:SetScript("OnHide", function()
-		StopMusic()
-		SetCVar("Sound_MusicVolume", user_music_vol)
-		musicIsPlaying = nil
-	end)
-
-	SVUI_SetupHolder:Show()
-	NextPage()
-	if(not autoLoaded) then
-		PlayThemeSong()
-	else
-		SV.Timers:ExecuteTimer(PlayThemeSong, 5)
-	end
-end
-
-SV.Setup = Setup
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/language/chinese_ui.lua b/Interface/AddOns/SVUI/language/chinese_ui.lua
index a21ab8e..2360e49 100644
--- a/Interface/AddOns/SVUI/language/chinese_ui.lua
+++ b/Interface/AddOns/SVUI/language/chinese_ui.lua
@@ -1,5 +1,5 @@
-local SV, L = unpack(select(2, ...))
-local L = SV:SetLocaleStrings("zhCN");
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale:SetLocaleData("zhCN");
 if not L then return end
 --[[REACTION TEXTS]]--
 L[" is drinking."] = true;
diff --git a/Interface/AddOns/SVUI/language/english_ui.lua b/Interface/AddOns/SVUI/language/english_ui.lua
index 9447d8e..424a8d4 100644
--- a/Interface/AddOns/SVUI/language/english_ui.lua
+++ b/Interface/AddOns/SVUI/language/english_ui.lua
@@ -1,5 +1,5 @@
-local SV, L = unpack(select(2, ...))
-local L = SV:SetLocaleStrings("enUS", true);
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale:SetLocaleData("enUS", true);
 if not L then return; end
 --[[REACTION TEXTS]]--
 L[" is drinking."] = true;
diff --git a/Interface/AddOns/SVUI/language/french_ui.lua b/Interface/AddOns/SVUI/language/french_ui.lua
index 68862c7..7e0c622 100644
--- a/Interface/AddOns/SVUI/language/french_ui.lua
+++ b/Interface/AddOns/SVUI/language/french_ui.lua
@@ -1,5 +1,5 @@
-local SV, L = unpack(select(2, ...))
-local L = SV:SetLocaleStrings("frFR");
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale:SetLocaleData("frFR");
 if not L then return; end
 --[[REACTION TEXTS]]--
 L[" is drinking."] = true;
diff --git a/Interface/AddOns/SVUI/language/german_ui.lua b/Interface/AddOns/SVUI/language/german_ui.lua
index 08bc236..479db1c 100644
--- a/Interface/AddOns/SVUI/language/german_ui.lua
+++ b/Interface/AddOns/SVUI/language/german_ui.lua
@@ -1,5 +1,5 @@
-local SV, L = unpack(select(2, ...))
-local L = SV:SetLocaleStrings("deDE");
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale:SetLocaleData("deDE");
 if not L then return end
 --[[REACTION TEXTS]]--
 L[" is drinking."] = true;
diff --git a/Interface/AddOns/SVUI/language/italian_ui.lua b/Interface/AddOns/SVUI/language/italian_ui.lua
index 17e2ef9..2b7f338 100644
--- a/Interface/AddOns/SVUI/language/italian_ui.lua
+++ b/Interface/AddOns/SVUI/language/italian_ui.lua
@@ -1,5 +1,5 @@
-local SV, L = unpack(select(2, ...))
-local L = SV:SetLocaleStrings("itIT");
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale:SetLocaleData("itIT");
 if not L then return; end
 --[[REACTION TEXTS]]--
 L[" is drinking."] = true;
diff --git a/Interface/AddOns/SVUI/language/korean_ui.lua b/Interface/AddOns/SVUI/language/korean_ui.lua
index 05bfd00..b6d555c 100644
--- a/Interface/AddOns/SVUI/language/korean_ui.lua
+++ b/Interface/AddOns/SVUI/language/korean_ui.lua
@@ -1,5 +1,5 @@
-local SV, L = unpack(select(2, ...))
-local L = SV:SetLocaleStrings("koKR");
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale:SetLocaleData("koKR");
 if not L then return; end
 --[[REACTION TEXTS]]--
 L[" is drinking."] = true;
diff --git a/Interface/AddOns/SVUI/language/portuguese_ui.lua b/Interface/AddOns/SVUI/language/portuguese_ui.lua
index c2f89aa..44d9bff 100644
--- a/Interface/AddOns/SVUI/language/portuguese_ui.lua
+++ b/Interface/AddOns/SVUI/language/portuguese_ui.lua
@@ -1,5 +1,5 @@
-local SV, L = unpack(select(2, ...))
-local L = SV:SetLocaleStrings("ptBR");
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale:SetLocaleData("ptBR");
 if not L then return; end
 --[[REACTION TEXTS]]--
 L[" is drinking."] = true;
diff --git a/Interface/AddOns/SVUI/language/russian_ui.lua b/Interface/AddOns/SVUI/language/russian_ui.lua
index c4dc965..882b3bb 100644
--- a/Interface/AddOns/SVUI/language/russian_ui.lua
+++ b/Interface/AddOns/SVUI/language/russian_ui.lua
@@ -1,5 +1,5 @@
-local SV, L = unpack(select(2, ...))
-local L = SV:SetLocaleStrings("ruRU");
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale:SetLocaleData("ruRU");
 if not L then return; end
 --[[REACTION TEXTS]]--
 L[" is drinking."] = true;
diff --git a/Interface/AddOns/SVUI/language/spanish_ui.lua b/Interface/AddOns/SVUI/language/spanish_ui.lua
index 83dfdf0..7766dd4 100644
--- a/Interface/AddOns/SVUI/language/spanish_ui.lua
+++ b/Interface/AddOns/SVUI/language/spanish_ui.lua
@@ -1,7 +1,7 @@
-local SV, L = unpack(select(2, ...))
-local L = SV:SetLocaleStrings("esES");
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale:SetLocaleData("esES");
 if not L then
-	L = SV:SetLocaleStrings("esMX")
+	L = LibLocale:SetLocaleData("esMX")
 end
 if not L then return; end
 --[[REACTION TEXTS]]--
diff --git a/Interface/AddOns/SVUI/language/taiwanese_ui.lua b/Interface/AddOns/SVUI/language/taiwanese_ui.lua
index fecf485..8048d63 100644
--- a/Interface/AddOns/SVUI/language/taiwanese_ui.lua
+++ b/Interface/AddOns/SVUI/language/taiwanese_ui.lua
@@ -1,5 +1,5 @@
-local SV, L = unpack(select(2, ...))
-local L = SV:SetLocaleStrings("zhTW");
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale:SetLocaleData("zhTW");
 if not L then return; end
 --[[REACTION TEXTS]]--
 L[" is drinking."] = true;
diff --git a/Interface/AddOns/SVUI/libs/LibBalancePowerTracker-1.1/LibBalancePowerTracker-1.1.lua b/Interface/AddOns/SVUI/libs/LibBalancePowerTracker-1.1/LibBalancePowerTracker-1.1.lua
deleted file mode 100644
index a3e2b2d..0000000
--- a/Interface/AddOns/SVUI/libs/LibBalancePowerTracker-1.1/LibBalancePowerTracker-1.1.lua
+++ /dev/null
@@ -1,1012 +0,0 @@
---[[
-Interface: 5.0.1
-Title: LibBalancePowerTracker
-Version: 1.1.5
-Author: Kurohoshi (EU-Minahonda), Tristimdorio (Omega1970)
-
---INFO
-	LibBalancePowerTracker is a library designed to provide the foresee energy feature to Balance Druids.
-	CPU is only used when required, so the CPU usage is very low (busy waitting forbidden, always on demand).
-
-	FORESEE ENERGY:
-	Foresee Energy is a feature that analizes the spells you are casting but are yet to be finished and and computes
-	the energy of them. This allows the library to distinguish between two kinds of energy and Eclipse direction: One real,
-	the one you have at the moment and other virtual, the one you'll have when you finish your cast.
-	All the features with the 'virtual' tag (virtual Energy, virtual Eclipse ...) rely on Foresee Energy.
-
---API
-	There are 5 variables related to Eclipse energy used in this addon:
-		energy: The energy you have at the moment. Int = [-100,100]
-		direction: The direction of the arrow. String = {"none","sun","moon"}
-		virtual_energy: The energy you will have when the spell you're casting and all the flying spells land. Int = [-100,100]
-		virtual_direction: The direction of the arrow when the spell you're casting and all the flying spells land. String = {"none","sun","moon"}
-		virtual_eclipse: -100 if lunar, 100 if solar, false otherwise.
-
-	FUNCTIONS:
-
-	id = LibBalancePowerTracker:RegisterCallback(function(energy, direction, virtual_energy, virtual_direction, virtual_eclipse))
-	These callbacks will be fired when there is a change in one of the Eclipse energy variables, usually twice per WR/SF/SS.
-	NOTE: When registering a callback, that callback will be fired once.
-
-	failed = LibBalancePowerTracker:UnregisterCallback(id)
-	Tries to unregister the callback with identifier id (id is returned only when you register the callback).
-
-	energy, direction, virtual_energy, virtual_direction, virtual_eclipse = LibBalancePowerTracker:GetEclipseEnergyInfo()
-	Gets the current state of the variables.
-
-	version,subversion,revision = LibBalancePowerTracker:GetVersion()
-	Gets the current working version of the library.
-
---Must keep an eye on this:
-	AoE silence ----------------------------------------------- Working in 4.1
-	Critters and wild pets don't give energy ------------------ True in 5.0.3
-	While changing from 2nd spec to 1st, UnitPower is wrong --- True in 5.0.4
-
---CHANGELOG
-v 1.1.5 Removed Soul of the Forest energy bonsu
-		Removed Critter Protection Code (CPU Intensive)
-		Cleanup of unneeded code
-v 1.1.4	Checks eclipse direction more often
-		Balance check uses GetSpecialization()
-		Should be more responsive when casting
-		Logging changed a little
-		Fixed timers
-		Removed double check for no energy change
-
-v 1.1.3	Cast failed detection improved
-		Included LICENSE.txt in Lib
-		CPU usage by critter detection recalculated
-		Fixed bug in loading check
-
-v 1.1.2	Astral empowerment removed
-		Euphoria now has 100% chance
-		Astral Communion updated
-		Tried to not count energy if the target is a wild pet or a critter, let's see how it goes
-		Fixed 0 bug when spellcast delayed by hit
-		Fixed AC ticks left when delayed by hit
-		Fixed bug where BPT would show no direction after gaining a eclipse immediately after zoning
-		Recast AC fixed
-		4pT12 tested
-
-v 1.1.1 SotF energy prediction while in neutral state fixed
-		Fixed interaction between CA and PvP bonus
-		Added WoW v check on load
-		Added 'select' to locals
-		Celestial Aligment & Astral Empowerment check when changing talents
-		Added Astral Empowerment mechanics
-		Fixed double call on log
-		Added debug function
-		Fixed AC not erasing as soon as reching 100 energy
-		Fixed failed prediction when reaching eclipse and then spending a talent point
-		Talent reset/spent correctly handled, even with buffs
-		Cancel buffs (AE & CA) support
-
-v 1.1.0 Many changes to update LBPT for WoW 5.0, including new spell mechanics
-
-v 1.0.13 Renamed SpellQueueADT to LBPT_SpellQueueADT
-
-v 1.0.12 Changes in UnitByName(Name)
-		 Changed _Sent to account for spell number
-		 Fixed not reseting eclipse direction when entering arena (this was fixed in 4.3 by Blizz)
-		 PVP 4p bug workaround isn't needed anymore
-		 Increased SS and WR autodelete timers to 5s (so it works at max distance on Ragnaros figth)
-		 Updated SpellQueueADT-1.1
-		 Memory usage no longer increases in combat (Memory leak fixed)
-		 Added support to UNIT_DESTROYED event, but commented till it's necessary
-		 .toc updated
-
-v 1.0.11 Updated code to handle Euphoria & 4T12 bonus hotfix
-
-v 1.0.10 Simplified some code
-		 Sync even when not Balance
-		 Checking for tier12 even when not Balance
-
-v 1.0.9 Increased WR and SS autodelete timers by 1s, SF's by .5s
-		Fixed advanced settings bugs
-		Eclipse stat rewritten (less CPU used)
-
-v 1.0.8 SpellQueueADT updated
-
-v 1.0.7 Tier12 fully supported
-		Handling specialWR now here
-		Updated SpellQueueADT
-		Some code improvements
-		Changed reachEnd to virtualEclipse
-
-v 1.0.6	WoW 4.2 fix
-		SF autodelete timer increased by .5s
-		Updated SpellQueueADT-1.1
-		Interrupted spell bug fixed
-		Fixed DoTs' energy for 4.2
-		Early support for 4t12 bonus
-		Included tier set
-		Removed some unnecessary functions (RmoveFirsto0...)
-		Minor bug in Advanced settings fixed.
-		Minor bug causing to fire two callbacks when crossing 0 fixed.
-
-v 1.0.5 Moved UpdateEuphoria into ReCheck
-		4.1 fix
-		Now shouldnt load when not a druid succeesfully
-		Future log compatibility functions
-		The mark shouldnt 'dance' at 0,100 and -100 energy anymore.
-		Extra functions to avoid letting a spell remain in the queue when it must be erased.
-
-v 1.0.4 Changed Euphoria chance based on Hamlet's findings on www.elitistjerks.com
-		Added target of target to the unit check.
-		Fixed casting glyph of SS counting as casting SS
-		Use spellId instead of names
-
-v 1.0.3 Changed to use propperly SpellQueueADT 1.1.2
-		Now erases flying spells when teleporting.
-		FEATURE: Eclipse chance calculation.
-		FEATURE: Energy statistically calculation.
-
-v 1.0.2 Fixed sometimes not fetching the direction properly.
-		Fixed PvP bonus
-
-v 1.0.1 Reduced the number of callbacks fired.
-
-v 1.0.0 Release
---]]
-
-local version = {1,1,5};
-if (LibBalancePowerTracker and LibBalancePowerTracker.CompareVersion and LibBalancePowerTracker:CompareVersion(version)) then return; end
-if select(4, GetBuildInfo())<50001 then return end
-
---Initialize Global Lib
-LibBalancePowerTracker = {};
-function LibBalancePowerTracker:CompareVersion(versionTable)
-	-- if mine is equal or better than versionTable, return true
-	for i,v in ipairs(versionTable) do
-		if version[i] ~= v then
-			return version[i] > v
-		end
-	end
-	return true
-end
-
---Locals
-----GLOBALS TO LOCALS-------------------------------------------------------------------
-local GetEclipseDirection,UnitPower,SPELL_FAILED_NOT_READY,SPELL_FAILED_SPELL_IN_PROGRESS = GetEclipseDirection,UnitPower,SPELL_FAILED_NOT_READY,SPELL_FAILED_SPELL_IN_PROGRESS
-local UnitGUID,UnitBuff,GetTalentInfo,GetSpellInfo = UnitGUID,UnitBuff,GetTalentInfo,GetSpellInfo
-local GetInventoryItemID,abs,pairs,ipairs,tonumber,GetSpecialization,GetTime,select = GetInventoryItemID,abs,pairs,ipairs,tonumber,GetSpecialization,GetTime,select
-local LibBalancePowerTracker = LibBalancePowerTracker
-local SPELL_POWER_ECLIPSE,UnitCastingInfo,UnitChannelInfo = SPELL_POWER_ECLIPSE,UnitCastingInfo,UnitChannelInfo
-----DATA--------------------------------------------------------------------------------
-------STATIC----------------------------------------------------------------------------
-local data ={
-	WR  = {name = GetSpellInfo(5176)  , energy = 15, energize_events = 1, spellId=5176  }, -- name & energy Wrath
-	SF  = {name = GetSpellInfo(2912)  , energy = 20, energize_events = 1, spellId=2912  }, -- name & energy Starfire
-	SS  = {name = GetSpellInfo(78674) , energy = 20, energize_events = 1, spellId=78674 }, -- name & energy StarSurge
-	AC	= {name = GetSpellInfo(127663), energy = 25, energize_events = 4, ms_btwn_events = 1000, spellId=127663}, -- name & energy Astral Comunion
-
-	EE  			= {spellId = 89265}, -- Eclipse Energy spell
-
-	--Buffs
-	CA				= {name = GetSpellInfo(112071), spellId = 112071}, -- Celestial Aligment buff id
-	LunarEclipse  	= {name = GetSpellInfo(48518) , spellId = 48518 }, -- Lunar eclipse buff id
-	SolarEclipse  	= {name = GetSpellInfo(48517) , spellId = 48517 }, -- Solar eclipse buff id
-
-	balanceTiersItemId ={ --Pieces of bonus that change things
-		[12]={
-			[1]={ [71108]="n",[71497]="h"},--head
-			[3]={ [71111]="n",[71500]="h"},--shoulders
-			[5]={ [71110]="n",[71499]="h"},--chest
-			[7]={ [71109]="n",[71498]="h"},--trousers
-			[10]={[71107]="n",[71496]="h"},--gloves
-			bonus4p = true,
-			tested4p = true,
-		},
-	},
-}
-------VARS------------------------------------------------------------------------------
-local vars = {
-	isDruid = nil,
-	isBalance = nil,
-
-	spell_casting = 0,
-	spell_num = 0,
-	energize_events_remaining = 0,
-	--next_energize_at = 0,
-	last_energize_at = 0,
-
-	celestial_lockout_end = 0,
-
-	energy = 0,
-	vEnergy = 0,
-	eclipse = false,
-	vEclipse = false,
-	direction = "none",
-	vDirection = "none",
-
-	tiers = {
-		[1]=false,--head
-		[3]=false,--shoulders
-		[5]=false,--chest
-		[7]=false,--trousers
-		[10]=false,--gloves
-		tierPieceCount = setmetatable({}, {__index = function () return 0 end}),
-	}
-}
-local playerGUID,lastCallback,callbacks,number_callbacks = false,0,{},0
-------ENERGY FUNCTIONS------------------------------------------------------------------
---[[If dir == none then
-----index is side of bar
---else
-----index is eclipse
---I realize there are some combinations that aren't going to happen]]
-local energyFromSpell={
-	[data.SF.spellId]={
-		moon	= {
-			[-100] = 0,
-			[ 000] = 0,
-			[ 100] = 0,
-		},
-		sun		= {
-			[-100] = data.SF.energy,
-			[ 000] = 2*data.SF.energy,
-			[ 100] = 2*data.SF.energy,
-		},
-		none 	= {
-			[-100] = 2*data.SF.energy,
-			[ 000] = 2*data.SF.energy,
-			[ 100] = 2*data.SF.energy,
-		},
-	},
-	[data.WR.spellId]={
-		moon	= {
-			[-100] = -2*data.WR.energy,
-			[ 000] = -2*data.WR.energy,
-			[ 100] = -data.WR.energy,
-		},
-		sun		= {
-			[-100] = 0,
-			[ 000] = 0,
-			[ 100] = 0,
-		},
-		none 	= {
-			[-100] = -2*data.WR.energy,
-			[ 000] = -2*data.WR.energy,
-			[ 100] = -2*data.WR.energy,
-		},
-	},
-	[data.SS.spellId]={
-		moon	= {
-			[-100] = -2*data.SS.energy,
-			[ 000] = -2*data.SS.energy,
-			[ 100] = -data.SS.energy,
-		},
-		sun		= {
-			[-100] = data.SS.energy,
-			[ 000] = 2*data.SS.energy,
-			[ 100] = 2*data.SS.energy,
-		},
-		none 	= {
-			[-100] = -2*data.SS.energy,
-			[ 000] = 2*data.SS.energy,
-			[ 100] = 2*data.SS.energy,
-		},
-	},
-	[data.AC.spellId]={
-		moon	= {
-			[-100] = -data.AC.energy,
-			[ 000] = -data.AC.energy,
-			[ 100] = -data.AC.energy,
-		},
-		sun		= {
-			[-100] = data.AC.energy,
-			[ 000] = data.AC.energy,
-			[ 100] = data.AC.energy,
-		},
-		none 	= {
-			[-100] = -data.AC.energy,
-			[ 000] = data.AC.energy,
-			[ 100] = data.AC.energy,
-		},
-	},
-}
-local energizeEventsFromSpell={
-	[data.SF.spellId]={
-		moon	= 0,
-		sun		= data.SF.energize_events,
-		none 	= data.SF.energize_events,
-	},
-	[data.WR.spellId]={
-		moon	= data.WR.energize_events,
-		sun		= 0,
-		none 	= data.WR.energize_events,
-	},
-	[data.SS.spellId]={
-		moon	= data.SS.energize_events,
-		sun		= data.SS.energize_events,
-		none 	= data.SS.energize_events,
-	},
-	[data.AC.spellId]={
-		moon	= data.AC.energize_events,
-		sun		= data.AC.energize_events,
-		none 	= data.AC.energize_events,
-	},
-}
-----TIMERS-------------------------------------------------------------------------------
-local timers={holder 	= CreateFrame("Frame",nil,UIParent)}
-timers.broadcastTier 	= CreateFrame("Cooldown",nil,timers.holder)
-timers.delayedUpdate 	= CreateFrame("Cooldown",nil,timers.holder)
-----FRAME--------------------------------------------------------------------------------
-local frame = CreateFrame("Frame",nil,UIParent) --(loading events & workaround)
-local combatFrame = CreateFrame("Frame",nil,UIParent) --Combat events
-local LBPT = {}
------------------------------------------------------------------------------------------
-
------------------------------------------------------------------------------------------
---Aux functions
-local spellsUsed = {
-	[data.WR.name] = tonumber(data.WR.spellId),
-	[data.SS.name] = tonumber(data.SS.spellId),
-	[data.SF.name] = tonumber(data.SF.spellId),
-	[data.AC.name] = tonumber(data.AC.spellId),
-	[data.WR.spellId] = tostring(data.WR.name),
-	[data.SS.spellId] = tostring(data.SS.name),
-	[data.SF.spellId] = tostring(data.SF.name),
-	[data.AC.spellId] = tostring(data.AC.name),
-}
-local function deleteSpell()
-	vars.spell_casting = 0;
-	vars.spell_num = 0;
-	vars.energize_events_remaining = 0;
-	LBPT.RecalcEnergy()
-end
-local function UpdateEclipseOnEnergyDirection(energy,direction)
-	if abs(energy) == 100 then
-		vars.eclipse = energy
-	elseif (direction == "moon" and energy <=0) or (direction == "sun"  and energy >=0) or (direction == "none") then
-		vars.eclipse = false;
-	end
-	return vars.eclipse;
-end
-local function CheckEcplipseBuff()
-	vars.eclipse = (UnitBuff('player',data.SolarEclipse.name) and 100) or (UnitBuff('player',data.LunarEclipse.name) and -100)
-	return vars.eclipse
-end
-local function checkCelestialAligmentBuff()
-	local tim_end = select(7,UnitBuff('player',data.CA.name)) or 0;
-	vars.celestial_lockout_end = tim_end*1000;
-	return vars.celestial_lockout_end
-end
-local function isBalance()
-	return GetSpecialization() == 1
-end
-local function UpdateEnergizeAt(channeled)
-	if channeled then
-		vars.last_energize_at = select(6,UnitChannelInfo("player")) or 0
-		--vars.next_energize_at = vars.last_energize_at - data.AC.ms_btwn_events * (vars.energize_events_remaining-1)
-	else
-		vars.last_energize_at = select(6,UnitCastingInfo("player")) or 0
-		--vars.next_energize_at = vars.last_energize_at
-	end
-end
-
-do --Loading
-	frame:SetScript("OnEvent",  function(_, event, ...) LBPT[event](...) end);
-	frame:RegisterEvent("PLAYER_LOGIN");
-	LBPT.postLogin = false;
-
-	function LBPT.PLAYER_LOGIN()
-		LBPT.postLogin = true;
-		vars.isDruid = select(2,UnitClass("player"))=="DRUID";
-		if vars.isDruid and number_callbacks ~= 0 then
-			LBPT.load()
-		end
-	end
-
-	--[[loading:
-	energia ok on login
-
-	con info sin desconectar (apagando red)
-		load
-			direction,eclipse ok on ECLIPSE_DIRECTION_CHANGE
-
-	con info desconectando
-		load
-			con eclipse -> ok on login, dos ECLIPSE_DIRECTION_CHANGE y gana y pierde eclipse
-			sin eclipse -> ok on login, dos ECLIPSE_DIRECTION_CHANGE
-
-	sin info deconectando
-		load
-			all ok on login --sin eventos raros
-
-	reloading
-		all ok on login
-	]]
-
-	function LBPT.load()
-		--on reload, info working ok
-		--on load, no
-		playerGUID=UnitGUID("player");
-
-		frame:RegisterEvent("PLAYER_SPECIALIZATION_CHANGED");
-
-		--Check tier
-		frame:RegisterEvent("PLAYER_EQUIPMENT_CHANGED");
-		for k in pairs(vars.tiers) do if tonumber(k) then LBPT.PLAYER_EQUIPMENT_CHANGED(k,GetInventoryItemID("player", k)) end end
-
-		vars.isBalance = isBalance()
-		LBPT.RegisterCombatEvents(vars.isBalance)
-		LBPT.Reset(vars.isBalance)
-
-		if vars.isBalance and (not vars.eclipse) and vars.direction == "none" then --balance, Login & no conseguimos los valores actualizados
-			frame:RegisterEvent("ECLIPSE_DIRECTION_CHANGE"); --not fired when /reload, used to check eclipse & dir on load
-
-			timers.delayedUpdate:SetScript("OnHide",function() frame:UnregisterEvent("ECLIPSE_DIRECTION_CHANGE"); end)
-			timers.delayedUpdate:SetCooldown(GetTime(),.05)
-		end
-	end
-
-	function LBPT.unload()
-		frame:UnregisterAllEvents();
-		combatFrame:UnregisterAllEvents();
-	end
-
-	function LBPT.ECLIPSE_DIRECTION_CHANGE()
-		LBPT.Reset(true)
-		timers.delayedUpdate:SetCooldown(GetTime(),.05)
-	end
-
-	function LBPT.RegisterCombatEvents(balanceNow)
-		if balanceNow then
-			for k in pairs(LBPT.combat) do
-				if k == "COMBAT_LOG_EVENT_UNFILTERED" then
-					combatFrame:RegisterUnitEvent(k, UnitGUID('player'))
-				else
-					combatFrame:RegisterEvent(k);
-				end
-			end
-		else
-			for k in pairs(LBPT.combat) do
-				combatFrame:UnregisterEvent(k);
-			end
-		end
-	end
-
-	function LBPT.Reset(balanceNow)
-		--Reset values
-		vars.energy = 0
-		vars.vEnergy = 0
-		vars.eclipse = false
-		vars.vEclipse = false
-		vars.direction = "none"
-		vars.vDirection = "none"
-		vars.celestial_lockout_end = 0
-
-		--Propagate values
-		if balanceNow then
-			vars.direction = GetEclipseDirection() or vars.direction --accurate when changing talents
-			CheckEcplipseBuff() --accurate when changing talents
-			checkCelestialAligmentBuff()
-			LBPT.RecalcEnergy(); --energy is not accurate when changing talents --Need to avoid not updating it
-		else
-			LBPT.FireCallbacks()
-		end
-	end
-end
-
-do --Talent check/change events
-	local frequentFiredOnce = false;
-
-	function LBPT.PLAYER_SPECIALIZATION_CHANGED()
-		local balanceNow = isBalance()
-
-		if vars.isBalance and balanceNow and GetEclipseDirection() then
-			--GetEclipseDirection is nil on teleport, handled by its own event, put here to avoid firing this event when portaling
-			LBPT.Reset(balanceNow)
-
-			if (UnitPower("player",SPELL_POWER_ECLIPSE) ~= 0)  then
-				--Si al pasar de pollo a pollo tenemos energia, retrasar un evento para actualizar cuando vuelva a 0
-				--Only interesting when switching specs from boomkin to boomkin, to reset the energy
-				--It's not very interesting having a FREQUENT event free for more time than needed, so the delayed unregister for the event
-
-				frequentFiredOnce = false;
-				frame:RegisterUnitEvent("UNIT_POWER_FREQUENT", "player");
-				timers.delayedUpdate:SetScript("OnHide",function() frame:UnregisterEvent("UNIT_POWER_FREQUENT"); end)
-				timers.delayedUpdate:SetCooldown(GetTime(),.05)
-			end
-		end
-
-		if vars.isBalance ~= balanceNow then --Si cambiamos de pollo a chopo o viceversa, hemos de actualizar los eventos y resetear los valores
-			vars.isBalance = balanceNow
-			LBPT.RegisterCombatEvents(balanceNow)
-			LBPT.Reset(balanceNow)
-		end
-	end
-
-	function LBPT.UNIT_POWER_FREQUENT(unit,power)
-		if not power == "ECLIPSE" then return end
-
-		local e = UnitPower("player", SPELL_POWER_ECLIPSE)
-		local d = GetEclipseDirection()
-
-		if (vars.energy ~= e or vars.direction ~= d) then
-			LBPT.RecalcEnergy(e,d)
-			frequentFiredOnce = true;
-		end
-
-		if frequentFiredOnce then
-			frame:UnregisterEvent("UNIT_POWER_FREQUENT");
-		end
-		frequentFiredOnce = true;
-	end
-end
-
-do --Combat events-------------
-	LBPT.combat = {};
-
-	do --Combat frame script creation
-		local combatTable = LBPT.combat;
-		combatFrame:SetScript("OnEvent",  function(_, event, ...) combatTable[event](...) end);
-	end
-
-	local function startSpell(unit,num,id,channeled)
-		if unit == "player" and spellsUsed[id] then
-			if LBPT.Critter and LBPT.Critter(num) then return end -- Energy not given by critters
-
-			if channeled and vars.energize_events_remaining>0 and vars.spell_casting == id then
-				vars.energize_events_remaining = energizeEventsFromSpell[id][vars.direction] + 1;
-			else
-				vars.energize_events_remaining = energizeEventsFromSpell[id][vars.direction];
-				vars.spell_casting = id;
-			end
-			vars.spell_num = num;
-
-			vars.started_in_CA = vars.celestial_lockout_end ~= 0 --To math events left in AC by time
-			UpdateEnergizeAt(channeled)
-
-			LBPT.RecalcEnergy()
-		end
-	end
-
-	function LBPT.combat.UNIT_SPELLCAST_START(unit,_,_,num,id)			startSpell(unit,num,id,false)	end
-	function LBPT.combat.UNIT_SPELLCAST_CHANNEL_START(unit,_,_,num,id)	startSpell(unit,num,id,true )	end
-
-	local function delaySpell(unit,num,id,channeled)
-		if unit == "player" and spellsUsed[id] and vars.celestial_lockout_end ~= 0 and vars.spell_num == num and vars.spell_casting == id then
-			UpdateEnergizeAt(channeled)
-			LBPT.RecalcEnergy()
-		end
-	end
-
-	function LBPT.combat.UNIT_SPELLCAST_DELAYED(unit,_,_,num,id)		delaySpell(unit,num,id,false) end
-	function LBPT.combat.UNIT_SPELLCAST_CHANNEL_UPDATE(unit,_,_,num,id)	delaySpell(unit,num,id,true ) end
-
-	local function finishSpell(unit,num,id)
-		if unit == "player" and spellsUsed[id] and vars.spell_num == num and vars.spell_casting == id then
-			deleteSpell()
-		end
-	end
-
-	function LBPT.combat.UNIT_SPELLCAST_SUCCEEDED(unit,_,_,num,id)		finishSpell(unit,num,id) end
-	function LBPT.combat.UNIT_SPELLCAST_FAILED(unit,_,_,num,id)			finishSpell(unit,num,id) end
-	function LBPT.combat.UNIT_SPELLCAST_CHANNEL_STOP(unit,_,_,num,id)	finishSpell(unit,num,id) end
-	function LBPT.combat.UNIT_SPELLCAST_INTERRUPTED(unit,_,_,num,id)	if not UnitCastingInfo("player") then finishSpell(unit,num,id) end end
-
-	function LBPT.combat.PLAYER_DEAD() --Reset queue & clear energy upon death
-		deleteSpell()
-	end
-
-	function LBPT.UNIT_POWER(unit,power) --Scheduled energy recheck by combat events (0bug & AC energy update)
-		if unit == "player" and power == "ECLIPSE" then
-			frame:UnregisterEvent("UNIT_POWER")
-
-			if vars.isBalance then
-				local e = UnitPower("player",SPELL_POWER_ECLIPSE)
-				local d = GetEclipseDirection()
-
-				UpdateEclipseOnEnergyDirection(e,d)
-
-				if (vars.energy ~= e or vars.direction ~= d) then
-					LBPT.RecalcEnergy(e,d)
-				end
-			end
-		end
-	end
-
-	do --COMBAT LOG HANDLER -------------------------------------------------------
-		local auraLossFunctionTable = {
-			[data.LunarEclipse.spellId] = 	function() if vars.eclipse then vars.eclipse = false;  LBPT.RecalcEnergy() end end,
-			[data.SolarEclipse.spellId] = 	function() if vars.eclipse then vars.eclipse = false;  LBPT.RecalcEnergy() end end,
-			[data.CA.spellId] 			= 	function() if vars.celestial_lockout_end ~=0 then vars.celestial_lockout_end = 0; LBPT.RecalcEnergy() end end,
-		}
-
-		local function UpdateACTicksLeft()
-			--Only fired by energize
-			-- if SOFT, soft is discounted, so don't worry about it
-			-- only need to recalc the events left once,
-			--	It's not perfect, but the only thing that scrambles it is lag,
-			--  and if you're laggy, you probably have lag for more than 1s
-			-- However, it's only fired for AC when cast during CA, something very unlikely
-
-			if vars.started_in_CA then
-				vars.energize_events_remaining = math.floor((vars.last_energize_at - GetTime()*1000)/data.AC.ms_btwn_events + .5)
-				vars.started_in_CA = false;
-			end
-			return vars.energize_events_remaining
-		end
-
-		local function addEnergy(a,b)
-			local ret = a + b
-			if ret <=-100 then return -100 end
-			if ret >= 100 then return  100 end
-			return ret;
-		end
-
-		local unfilteredCombatLogTable = {
-			SPELL_ENERGIZE 		= function(id,amount,typeEnergy)
-									if (typeEnergy == SPELL_POWER_ECLIPSE) then
-										local energy = UnitPower("player" , SPELL_POWER_ECLIPSE);
-										local direction;
-
-										if id == data.EE.spellId then
-											if vars.celestial_lockout_end == 0 then
-												--SOTF interaction with CA,
-												--to not to erase spells when the energy is CA's
-
-												vars.energize_events_remaining = vars.energize_events_remaining -1;
-												if vars.energize_events_remaining <=0 or (UpdateACTicksLeft() <= 0) or (abs(energy)==100) then
-													--Updating ticks on AC using time due to not having energize events during CA
-													--A lot of things (abs(energy)...) rely on the fact that AC is the only spell with more than 1 energize event
-
-													vars.spell_casting = 0;
-													vars.spell_num = 0;
-													vars.energize_events_remaining = 0;
-												--else
-													--UpdateEnergizeAt(true)
-												end
-											else
-												--Only remove CA if gained by this spell, since CA only prevents gaining energy from this spell
-												vars.celestial_lockout_end = 0 --CA no more
-											end
-										end
-
-										if (energy ~= addEnergy(vars.energy,amount)) then --need to check 0bug (and SS)
-											energy = addEnergy(vars.energy,amount) --predict with the energy we have
-											direction = vars.vDirection;
-										else
-											direction = GetEclipseDirection();
-										end
-
-										if energy == 100 then
-											direction = "moon";
-										elseif energy == -100 then
-											direction = "sun";
-										end
-
-										UpdateEclipseOnEnergyDirection(energy,direction)
-
-										LBPT.RecalcEnergy(energy,direction)
-									end
-								end,
-			SPELL_AURA_APPLIED 	= function(id)
-									if id == data.CA.spellId then
-										checkCelestialAligmentBuff()
-
-										if UnitPower("player",SPELL_POWER_ECLIPSE) ~= 0 then
-											frame:RegisterEvent("UNIT_POWER"); --Schedule energy check
-										end
-										LBPT.RecalcEnergy(0)
-									end
-								end,
-			SPELL_AURA_REMOVED 	= function(id)
-									local f = auraLossFunctionTable[id]
-									if f then f(); end
-								end,
-		}
-		function LBPT.combat.COMBAT_LOG_EVENT_UNFILTERED(_,event,_,gUIDor,_,_,_,destGUID,_,_,_,spellId,_,_,amountEnergy,typeEnergy)
-			if (gUIDor == playerGUID) then
-				event = unfilteredCombatLogTable[event]
-				if event then event(spellId,amountEnergy,typeEnergy) end
-			elseif (destGUID == playerGUID) and event=="SPELL_INTERRUPT" and vars.spell_casting == amountEnergy then
-				deleteSpell()
-			end
-		end
-	end
-
-	do --Direction & energy when teleporting
-		function LBPT.combat.PLAYER_ENTERING_WORLD()
-			deleteSpell()
-		end
-	end
-end
-
-do --Recalc Energy function
-	local function ExtraEnergy(energy,direction,eclipse) --computes extra energy
-		local newEclipse;
-		local newEnergy;
-		local newDirection;
-
-		--Get spell energy
-		if vars.energize_events_remaining > 0 and vars.last_energize_at > vars.celestial_lockout_end then
-			newEnergy = energy + energyFromSpell[vars.spell_casting][direction][((direction == "none") and ((energy>=0 and 100) or -100)) or (eclipse or 0) ];
-		else
-			newEnergy = energy;
-		end
-
-		--Set energy boundaries
-		if newEnergy>=100 then
-			newEnergy,newDirection,newEclipse = 100,"moon",100;
-		elseif newEnergy<=-100 then
-			newEnergy,newDirection,newEclipse = -100,"sun",-100;
-		elseif (direction == "moon" and newEnergy <=0) or (direction == "sun"  and newEnergy >=0) or (direction == "none") then
-			newEclipse = false;
-			newDirection = direction
-		else
-			newEclipse = eclipse
-			newDirection = direction
-		end
-
-		if energy ~= newEnergy then
-			return newEnergy,newDirection,newEclipse;
-		else
-			return energy,direction,eclipse;
-		end
-	end
-
-	function LBPT.RecalcEnergy(energy,direction)
-		if not energy then  energy = UnitPower("player" , SPELL_POWER_ECLIPSE); end
-		if not direction then direction = GetEclipseDirection() or "none" end
-
-		vars.energy = energy;
-		vars.direction = direction;
-
-		vars.vEnergy,vars.vDirection,vars.vEclipse = ExtraEnergy(energy,direction,vars.eclipse)
-		LBPT.FireCallbacks()
-	end
-end
-
-do --Calling callbacks functions
-	function LBPT.FireCallbacks()
-		for k,v in pairs(callbacks)
-			do v(vars.energy,vars.direction,vars.vEnergy,vars.vDirection,vars.vEclipse);
-		end
-	end
-end
-
-do --Called functions (API)
-	function LibBalancePowerTracker:RegisterCallback(callback)
-		if number_callbacks==0 and LBPT.postLogin and vars.isDruid then
-			LBPT.load();
-		end
-
-		number_callbacks=number_callbacks+1
-
-		lastCallback=lastCallback+1
-		callbacks[lastCallback]=callback;
-
-		callback(vars.energy,vars.direction,vars.vEnergy,vars.vDirection,vars.vEclipse)
-		return lastCallback
-	end
-	function LibBalancePowerTracker:UnregisterCallback(id)
-		if callbacks[id] then
-			callbacks[id]=nil;
-		else
-			return true;
-		end
-
-		number_callbacks=number_callbacks-1
-
-		if number_callbacks==0 then
-			LBPT.unload();
-		end
-	end
-	function LibBalancePowerTracker:GetVersion()	return version[1],version[2],version[3]; end
-
-	-- Only used when AC was cast in CA (Who would want to...?, begins to fail when being hit after CA ends but before a energize event fires, pretty low chance, but taken care of anyway)
-	--[[	time	0		1		2		3		4
-			cast	[		|		|		|		|]
-			ev.left	444444443333333322222222111111110
-			happens        ( )     {-}
-	]]
-	local returned = data.AC.energize_events
-	local ac_end_time = 0;
-	function LibBalancePowerTracker.GetEnergizeEventsRemaining()
-		if vars.started_in_CA then
-			--It's not an energize event, it it were, it should be handled before with the other function
-			--Assumes it will be called every time spell cast is delayed
-
-			local end_time = select(6,UnitChannelInfo("player"))
-			local msGetTime = GetTime()*1000
-			local events_left = min(math.floor((end_time - msGetTime)/data.AC.ms_btwn_events)+1,data.AC.energize_events)
-
-			if ac_end_time > msGetTime then
-				events_left = min(events_left,returned)
-			end
-
-			returned = events_left
-			ac_end_time = end_time
-
-			return events_left
-		end
-		return vars.energize_events_remaining
-	end
-
-
-	do --GetEclipseEnergyInfo
-		--If called once, it would be called again, so I create a callback inside this do-end block
-		local e,d,vE,vD,vEc;
-		local callbackId = nil
-
-		function LibBalancePowerTracker:GetEclipseEnergyInfo()
-			if not callbackId then
-				callbackId = self:RegisterCallback(
-					function(energy,direction,vEnergy,vDirection,vEclipse)
-						e,d,vE,vD,vEc = energy,direction,vEnergy,vDirection,vEclipse
-					end
-				)
-			end
-
-			return e,d,vE,vD,vEc
-		end
-	end
-end
-
-----TIER MODIFIER FUCNTION (At the end, so it sees and can modify all locals, sometimes I'll need to remove do-end blocks)
-do --Tier bonus check
-	local broadcasted = {}
-	setmetatable(broadcasted, {__index = function () return 0 end})
-	timers.broadcastTier:SetScript("OnHide",function()
-		for k,v in pairs(vars.tiers.tierPieceCount) do
-			if broadcasted[k] ~= v then --broadcast
-				if broadcasted[k] < v then --gained bonus
-					for i = broadcasted[k]+1,v do
-						if data.balanceTiersItemId[k]["bonus"..i.."p"] then
-							if data.balanceTiersItemId[k]["tested"..i.."p"] then
-								print("|c00a080ffLibBalancePowerTracker|r: Tier"..k.." "..i.."p bonus detected.")
-							else
-								print("|c00a080ffLibBalancePowerTracker|r: Tier"..k.." "..i.."p bonus detected (Untested).")
-							end
-						end
-					end
-				else --lost bonus
-					for i = v+1,broadcasted[k] do
-						if data.balanceTiersItemId[k]["bonus"..i.."p"] then
-							print("|c00a080ffLibBalancePowerTracker|r: No tier"..k.." "..i.."p bonus detected.")
-						end
-					end
-				end
-				broadcasted[k] = v
-			end
-		end
-	end)
-
-	function LBPT.PLAYER_EQUIPMENT_CHANGED(slot,hasItem)
-		local setInSlot = vars.tiers[slot]
-		if setInSlot then						--print("retirado objeto de "..slot)
-			vars.tiers[slot]=false;
-
-			local num_p_tier = vars.tiers.tierPieceCount[setInSlot]-1
-			vars.tiers.tierPieceCount[setInSlot]= num_p_tier --print("Tienes "..vars.tiers.tierPieceCount[setInSlot].." piezas de tier "..setInSlot)
-
-			if data.balanceTiersItemId[setInSlot]["bonus"..(num_p_tier+1).."p"] and LBPT.BonusTier[setInSlot][num_p_tier+1].Off() then
-				timers.broadcastTier:SetCooldown(GetTime(),.05)
-			end
-		end
-
-		if hasItem and setInSlot ~= nil then 				--print("se intenta poner una pieza en "..slot)
-			local id = GetInventoryItemID("player", slot)	--print("el id de la pieza es "..tostring(id))
-			for k,v in pairs(data.balanceTiersItemId) do	--print("buscando en tier "..k)
-				if v[slot] and v[slot][id] then				--print("encontrado en tier "..k)
-					vars.tiers[slot]=k;
-
-					local num_p_tier = vars.tiers.tierPieceCount[k]+1
-					vars.tiers.tierPieceCount[k]= num_p_tier --print("Tienes "..vars.tiers.tierPieceCount[k].." piezas de tier "..k);
-
-					if v["bonus"..num_p_tier.."p"] and LBPT.BonusTier[k][num_p_tier].On() then
-						timers.broadcastTier:SetCooldown(GetTime(),.05)
-					end
-
-					return
-				end
-			end
-		end
-	end
-end
-
-LBPT.BonusTier={
-	[12]={
-		[4]={
-			On  = 	function()
-						energyFromSpell[data.SF.spellId].sun[100]  = 2*(data.SF.energy+5)
-						energyFromSpell[data.SF.spellId].sun[000]  = 2*(data.SF.energy+5)
-
-						energyFromSpell[data.SF.spellId].none[-100] = 2*(data.SF.energy+5)
-						energyFromSpell[data.SF.spellId].none[ 000] = 2*(data.SF.energy+5)
-						energyFromSpell[data.SF.spellId].none[ 100] = 2*(data.SF.energy+5)
-
-						energyFromSpell[data.WR.spellId].moon[-100] = 2*(-data.WR.energy-3)
-						energyFromSpell[data.WR.spellId].moon[ 000] = 2*(-data.WR.energy-3)
-
-						energyFromSpell[data.WR.spellId].none[-100] = 2*(-data.WR.energy-3)
-						energyFromSpell[data.WR.spellId].none[ 000] = 2*(-data.WR.energy-3)
-						energyFromSpell[data.WR.spellId].none[ 100] = 2*(-data.WR.energy-3)
-
-						return true;
-					end,
-			Off = 	function()
-						energyFromSpell[data.SF.spellId].sun[100]  = 2*data.SF.energy
-						energyFromSpell[data.SF.spellId].sun[000]  = 2*data.SF.energy
-
-						energyFromSpell[data.SF.spellId].none[-100] = 2*data.SF.energy
-						energyFromSpell[data.SF.spellId].none[ 000] = 2*data.SF.energy
-						energyFromSpell[data.SF.spellId].none[ 100] = 2*data.SF.energy
-
-						energyFromSpell[data.WR.spellId].moon[-100] = -2*data.WR.energy
-						energyFromSpell[data.WR.spellId].moon[ 000] = -2*data.WR.energy
-
-						energyFromSpell[data.WR.spellId].none[-100] = -2*data.WR.energy
-						energyFromSpell[data.WR.spellId].none[ 000] = -2*data.WR.energy
-						energyFromSpell[data.WR.spellId].none[ 100] = -2*data.WR.energy
-
-						return true;
-					end,
-		},
-	},
-}
-
-do ----DEBUG---------------------
-	local dbug = false;
-	local dbug_init = false;
-
-	function LibBalancePowerTracker:ToogleDebug()
-		dbug = not dbug;
-		print("|c00a080ffLibBalancePowerTracker|r: Debug:",dbug)
-
-		LBPT_DEBUG_EVENT_LIST = {}
-		LBPT_DEBUG_EVENT_LIST.insertAt = 1;
-
-		if BalancePowerTracker_Options then BalancePowerTracker_Options.debug_event_list = LBPT_DEBUG_EVENT_LIST end
-
-		if not dbug_init then
-			local function insert(event,drawn,...)
-				if not dbug then return end
-
-				LBPT_DEBUG_EVENT_LIST[LBPT_DEBUG_EVENT_LIST.insertAt] = {event,drawn,GetTime(),UnitPower("player",SPELL_POWER_ECLIPSE),vars.energy,vars.vEnergy,GetEclipseDirection(),vars.direction,vars.vDirection,CheckEcplipseBuff(),vars.vEclipse,...}
-				LBPT_DEBUG_EVENT_LIST.insertAt = LBPT_DEBUG_EVENT_LIST.insertAt+1
-			end
-
-			function LibBalancePowerTracker.PrintDebugEvents(i)
-				if (not i) or type(i) ~= "number" or i<=0 then i = 50 end
-
-				for i = max(LBPT_DEBUG_EVENT_LIST.insertAt-i,1),LBPT_DEBUG_EVENT_LIST.insertAt do
-					print(unpack(LBPT_DEBUG_EVENT_LIST[i] or {}))
-				end
-			end
-
-			local drawn = false;
-			function LBPT.FireCallbacks()
-				drawn = true;
-				for k,v in pairs(callbacks)
-					do v(vars.energy,vars.direction,vars.vEnergy,vars.vDirection,vars.vEclipse);
-				end
-			end
-
-			combatFrame:SetScript("OnEvent",  	function(_, event, ...) drawn = false;  LBPT.combat[event](...)	insert(event,drawn,...) end);
-			frame:SetScript("OnEvent",  		function(_, event, ...) drawn = false;  LBPT[event](...) 		insert(event,drawn,...) end);
-
-			function LibBalancePowerTracker:mySearch(s,t,n,l)
-				if not n then n = 0; end
-				if not l then l = "" end
-				if not t then t = _G end
-
-				for k,v in pairs(t) do
-					k = tostring(k)
-					if type(v) == "string" and string.find(v,s) then
-						print(l,k,v)
-					elseif type(v)=="table" and k ~= "_G" then
-						if n>10 then return end
-						self:mySearch(s,v,n+1,l.." "..k)
-					elseif string.find(k,s) then
-						print(l,k,v)
-					end
-				end
-			end
-		end
-		dbug_init = true;
-	end
-end
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/LibLocale-1.0/LibLocale-1.0.lua b/Interface/AddOns/SVUI/libs/LibLocale-1.0/LibLocale-1.0.lua
new file mode 100644
index 0000000..a64ec44
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/LibLocale-1.0/LibLocale-1.0.lua
@@ -0,0 +1,66 @@
+--[[ GLOBALS ]]--
+
+local _G 						= _G;
+local rawset        			= _G.rawset;
+local rawget        			= _G.rawget;
+local getmetatable  			= _G.getmetatable;
+local setmetatable  			= _G.setmetatable;
+
+local MAJOR, MINOR = "LibLocale", 1
+local LibLocale = _G[MAJOR]
+
+if not LibLocale or LibLocale.minor < MINOR then
+    LibLocale = LibLocale or {}
+    _G[MAJOR] = LibLocale
+    LibLocale.minor = MINOR
+
+    local rootstring = function(self) return self.___addonName end
+
+    local failsafe = function() assert(false) end
+
+    local metaread = {
+        __index = function(self, key)
+            rawset(self, key, key)
+            return key
+        end
+    }
+
+    local activeLocale
+
+    local defaultwrite = setmetatable({}, {
+        __newindex = function(self, key, value)
+            if not rawget(activeLocale, key) then
+                rawset(activeLocale, key, value == true and key or value)
+            end
+        end,
+        __index = failsafe
+    })
+
+    local metawrite = setmetatable({}, {
+        __newindex = function(self, key, value)
+            rawset(activeLocale, key, value == true and key or value)
+        end,
+        __index = failsafe
+    })
+
+    local Localization = setmetatable({}, metaread);
+
+    function LibLocale:SetLocaleData(locale, isDefault)
+        local gameLocale = GetLocale()
+        if gameLocale == "enGB" then gameLocale = "enUS" end
+
+        activeLocale = Localization
+
+        if isDefault then
+            return defaultwrite
+        elseif(locale == GAME_LOCALE or locale == gameLocale) then
+            return metawrite
+        end
+    end
+
+    function LibLocale:GetLocaleData()
+        return Localization
+    end
+
+    setmetatable(LibLocale, { __call = LibLocale.GetLocaleData })
+end
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/LibSystemRegistry-1.0/LibSystemRegistry-1.0.lua b/Interface/AddOns/SVUI/libs/LibSystemRegistry-1.0/LibSystemRegistry-1.0.lua
new file mode 100644
index 0000000..d20005d
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/LibSystemRegistry-1.0/LibSystemRegistry-1.0.lua
@@ -0,0 +1,555 @@
+local AddonName, AddonCore = ...
+local MAJOR, MINOR = "LibSystemRegistry-1.0", 1
+local lib = LibStub:NewLibrary(MAJOR, MINOR)
+
+if not lib then return end
+
+--[[ GLOBALS ]]--
+
+local _G 						= _G;
+local unpack        			= _G.unpack;
+local select        			= _G.select;
+local pairs         			= _G.pairs;
+local type          			= _G.type;
+local rawset        			= _G.rawset;
+local rawget        			= _G.rawget;
+local tostring      			= _G.tostring;
+local error         			= _G.error;
+local getmetatable  			= _G.getmetatable;
+local setmetatable  			= _G.setmetatable;
+local string    				= _G.string;
+local math      				= _G.math;
+local table     				= _G.table;
+local tinsert                   = _G.tinsert;
+local tremove                   = _G.tremove;
+
+local upper 					= string.upper;
+local format, find, match, gsub = string.format, string.find, string.match, string.gsub;
+local floor 					= math.floor
+local twipe, tsort, tconcat 	= table.wipe, table.sort, table.concat;
+
+--[[ LOCAL VARS ]]--
+local AddonVersion = GetAddOnMetadata(..., "Version");
+local clientVersion, internalVersion, releaseDate, uiVersion = GetBuildInfo();
+
+local PluginString = ""
+local PluginList, Modules, LoadOnDemand, Callbacks, ModuleQueue, ScriptQueue = {},{},{},{},{},{};
+
+local INFO_FORMAT = "|cffFFFF00%s|r\n        |cff33FF00Version: %s|r |cff0099FFby %s|r";
+
+if GetLocale() == "ruRU" then
+    INFO_FORMAT = "|cffFFFF00%s|r\n        |cff33FF00Версия: %s|r |cff0099FFот %s|r";
+end
+
+local schemaHeader = "X-" .. AddonName .. "-Schema";
+local messagePattern = "|cffFF2F00%s:|r";
+local debugPattern = "|cffFF2F00%s|r [|cff992FFF%s|r]|cffFF2F00:|r";
+
+--[[ META METHODS ]]--
+
+local rootstring = function(self) return self.___addonName end
+
+--[[ REGISTRY CONSTRUCT ]]--
+
+local changeDBVar = function(self, value, key, sub1, sub2, sub3)
+    local schema = self.___schema
+    local config = AddonCore.db[schema]
+
+    if((sub1 and sub2 and sub3) and (config[sub1] and config[sub1][sub2] and config[sub1][sub2][sub3])) then
+        AddonCore.db[schema][sub1][sub2][sub3][key] = value
+    elseif((sub1 and sub2) and (config[sub1] and config[sub1][sub2])) then
+        AddonCore.db[schema][sub1][sub2][key] = value
+    elseif(sub1 and config[sub1]) then
+        AddonCore.db[schema][sub1][key] = value
+    else
+        AddonCore.db[schema][key] = value
+    end
+
+    self.db = AddonCore.db[schema]
+
+    if(self.UpdateLocals) then
+        self:UpdateLocals()
+    end
+end
+
+local innerOnEvent = function(self, event, ...)
+    local obj = self.module
+    if self[event] and type(self[event]) == "function" then
+        self[event](obj, event, ...)
+    end
+end
+
+local registerEvent = function(self, eventname, eventfunc)
+    if not self.___eventframe then
+        self.___eventframe = CreateFrame("Frame", nil)
+        self.___eventframe.module = self
+        self.___eventframe:SetScript("OnEvent", innerOnEvent)
+    end
+
+    if(not self.___eventframe[eventname]) then
+        local fn = eventfunc
+        if type(eventfunc) == "string" then
+            fn = self[eventfunc]
+        elseif(not fn and self[eventname]) then
+            fn = self[eventname]
+        end
+        self.___eventframe[eventname] = fn
+    end
+
+    self.___eventframe:RegisterEvent(eventname)
+end
+
+local unregisterEvent = function(self, event, ...)
+    if(self.___eventframe) then
+        self.___eventframe:UnregisterEvent(event)
+    end
+end
+
+local innerOnUpdate = function(self, elapsed)
+    if self.elapsed and self.elapsed > (self.throttle) then
+        local obj = self.module
+        local callbacks = self.callbacks
+
+        for name, fn in pairs(callbacks) do
+            local _, error = pcall(fn, obj)
+            if(error and AddonCore.Debugging) then
+                print(error)
+            end
+        end
+
+        self.elapsed = 0
+    else
+        self.elapsed = (self.elapsed or 0) + elapsed
+    end
+end
+
+local registerUpdate = function(self, updatefunc, throttle)
+    if not self.___updateframe then
+        self.___updateframe = CreateFrame("Frame", nil);
+        self.___updateframe.module = self;
+        self.___updateframe.callbacks = {};
+        self.___updateframe.elapsed = 0;
+        self.___updateframe.throttle = throttle or 0.2;
+    end
+
+    if(updatefunc and type(updatefunc) == "string" and self[updatefunc]) then
+        self.___updateframe.callbacks[updatefunc] = self[updatefunc]
+    end
+
+    self.___updateframe:SetScript("OnUpdate", innerOnUpdate)
+end
+
+local unregisterUpdate = function(self, updatefunc)
+    if(updatefunc and type(updatefunc) == "string" and self.___updateframe.callbacks[updatefunc]) then
+        self.___updateframe.callbacks[updatefunc] = nil
+        if(#self.___updateframe.callbacks == 0) then
+            self.___updateframe:SetScript("OnUpdate", nil)
+        end
+    else
+        self.___updateframe:SetScript("OnUpdate", nil)
+    end
+end
+
+local add_OptionsIndex = function(self, index, data)
+    local addonName = self.___addonName
+    local schema = self.___schema
+    local header = GetAddOnMetadata(addonName, "X-SVUI-Header")
+
+    AddonCore.Options.args.plugins.args.pluginOptions.args[schema].args[index] = data
+end
+
+local function SetPluginString(addonName)
+    local author = GetAddOnMetadata(addonName, "Author") or "Unknown"
+    local name = GetAddOnMetadata(addonName, "Title") or addonName
+    local version = GetAddOnMetadata(addonName, "Version") or "???"
+    return INFO_FORMAT:format(name, version, author)
+end
+
+local function SetInternalModule(obj, schema)
+    local addonmeta = {}
+    local oldmeta = getmetatable(obj)
+    if oldmeta then
+        for k, v in pairs(oldmeta) do addonmeta[k] = v end
+    end
+    addonmeta.__tostring = rootstring
+    setmetatable( obj, addonmeta )
+
+    local addonName = ("SVUI [%s]"):format(schema)
+
+    obj.___addonName = addonName
+    obj.___schema = schema
+
+    obj.initialized = false
+    obj.CombatLocked = false
+    obj.ChangeDBVar = changeDBVar
+    obj.RegisterEvent = registerEvent
+    obj.UnregisterEvent = unregisterEvent
+    obj.RegisterUpdate = registerUpdate
+    obj.UnregisterUpdate = unregisterUpdate
+
+    return obj
+end
+
+local function SetExternalModule(obj, schema, addonName, header, lod)
+    local addonmeta = {}
+    local oldmeta = getmetatable(obj)
+    if oldmeta then
+        for k, v in pairs(oldmeta) do addonmeta[k] = v end
+    end
+    addonmeta.__tostring = rootstring
+    setmetatable( obj, addonmeta )
+
+    obj.___addonName = addonName
+    obj.___schema = schema
+    obj.___header = header
+    obj.___lod = lod
+
+    obj.initialized = false
+    obj.CombatLocked = false
+    obj.ChangeDBVar = changeDBVar
+    obj.RegisterEvent = registerEvent
+    obj.UnregisterEvent = unregisterEvent
+    obj.RegisterUpdate = registerUpdate
+    obj.UnregisterUpdate = unregisterUpdate
+    obj.AddOption = add_OptionsIndex
+
+    if(lod) then
+        -- print("PLUGIN: " .. addonName)
+        AddonCore.Options.args.plugins.args.pluginOptions.args[schema] = {
+            type = "group",
+            name = header,
+            childGroups = "tree",
+            args = {
+                enable = {
+                    order = 1,
+                    type = "execute",
+                    width = "full",
+                    name = function()
+                        local nameString = "Disable"
+                        if(not IsAddOnLoaded(addonName)) then
+                            nameString = "Enable"
+                        end
+                        return nameString
+                    end,
+                    func = function()
+                        if(not IsAddOnLoaded(addonName)) then
+                            local loaded, reason = LoadAddOn(addonName)
+                            AddonCore:UpdateDatabase()
+                            obj:ChangeDBVar(true, "enable")
+                        else
+                            obj:ChangeDBVar(false, "enable")
+                            AddonCore:StaticPopup_Show("RL_CLIENT")
+                        end
+                    end,
+                }
+            }
+        }
+    else
+        AddonCore.Options.args.plugins.args.pluginOptions.args[schema] = {
+            type = "group",
+            name = header,
+            childGroups = "tree",
+            args = {
+                enable = {
+                    order = 1,
+                    type = "toggle",
+                    name = "Enable",
+                    get = function() return obj.db.enable end,
+                    set = function(key, value) obj:ChangeDBVar(value, "enable"); AddonCore:StaticPopup_Show("RL_CLIENT") end,
+                }
+            }
+        }
+    end
+
+    return obj
+end
+
+--[[ PUBLIC METHODS ]]--
+
+function lib:NewCallback(fn)
+    if(fn and type(fn) == "function") then
+        Callbacks[#Callbacks+1] = fn
+    end
+end
+
+function lib:NewScript(fn)
+    if(fn and type(fn) == "function") then
+        ScriptQueue[#ScriptQueue+1] = fn
+    end
+end
+
+function lib:NewPackage(obj, schema)
+    if(AddonCore[schema]) then return end
+
+    ModuleQueue[#ModuleQueue+1] = schema
+    Modules[#Modules+1] = schema
+
+    AddonCore[schema] = SetInternalModule(obj, schema)
+
+    if(AddonCore.AddonLaunched) then
+        if(AddonCore[schema].Load) then
+            AddonCore[schema]:Load()
+        end
+    end
+end
+
+function lib:NewPlugin(obj)
+    local coreName = AddonCore.___addonName
+    local addonName = obj.___addonName
+
+    if(addonName and addonName ~= coreName) then
+        local schema = GetAddOnMetadata(addonName, "X-SVUI-Schema");
+        local header = GetAddOnMetadata(addonName, "X-SVUI-Header");
+        local lod = IsAddOnLoadOnDemand(addonName)
+        if(not schema) then return end
+
+        ModuleQueue[#ModuleQueue+1] = schema
+        Modules[#Modules+1] = schema
+
+        local infoString = SetPluginString(addonName)
+        local oldString = PluginString
+
+        PluginList[addonName] = infoString
+        PluginString = ("%s%s\n"):format(oldString, infoString)
+
+        AddonCore[schema] = SetExternalModule(obj, schema, addonName, header, lod)
+
+        if(AddonCore.AddonLaunched and AddonCore[schema].Load) then
+            AddonCore[schema]:Load()
+            --print(schema)
+        end
+    end
+end
+
+function lib:NewAddon(addonName, schema, header)
+    LoadOnDemand[addonName] = schema;
+
+    AddonCore.Options.args.plugins.args.pluginOptions.args[schema] = {
+        type = "group",
+        name = header,
+        childGroups = "tree",
+        args = {
+            enable = {
+                order = 1,
+                type = "execute",
+                width = "full",
+                name = function()
+                    local nameString = "Disable"
+                    if(not IsAddOnLoaded(addonName)) then
+                        nameString = "Enable"
+                    end
+                    return nameString
+                end,
+                func = function()
+                    if(not IsAddOnLoaded(addonName)) then
+                        local loaded, reason = LoadAddOn(addonName)
+                        AddonCore:UpdateDatabase()
+                        AddonCore.db[schema].enable = true
+                        self:LoadPackages()
+                    else
+                        AddonCore.db[schema].enable = false
+                        AddonCore:StaticPopup_Show("RL_CLIENT")
+                    end
+                end,
+            }
+        }
+    }
+end
+
+function lib:FindAddons()
+    local addonCount = GetNumAddOns()
+    for i = 1, addonCount do
+        local addonName, _, _, _, _, reason = GetAddOnInfo(i)
+        local lod = IsAddOnLoadOnDemand(i)
+        local header = GetAddOnMetadata(i, "X-SVUI-Header")
+        local schema = GetAddOnMetadata(i, "X-SVUI-Schema")
+
+        if(lod and schema) then
+            self:NewAddon(addonName, schema, header)
+        end
+    end
+end
+
+function lib:RunCallbacks()
+    for i=1, #Callbacks do
+        local fn = Callbacks[i]
+        if(fn and type(fn) == "function") then
+            fn()
+        end
+    end
+end
+
+function lib:Update(name, dataOnly)
+    local obj = AddonCore[name]
+    if obj then
+        if AddonCore.db[name] then
+            obj.db = AddonCore.db[name]
+        end
+        if obj.ReLoad and not dataOnly then
+            obj:ReLoad()
+        end
+    end
+end
+
+function lib:UpdateAll()
+    for _,name in pairs(Modules) do
+        local obj = AddonCore[name]
+
+        if AddonCore.db[name] then
+            obj.db = AddonCore.db[name]
+        end
+
+        if obj and obj.ReLoad then
+            obj:ReLoad()
+        end
+    end
+end
+
+function lib:LoadRegisteredAddons()
+    for name,schema in pairs(LoadOnDemand) do
+        local config = AddonCore.db[schema]
+        if(config and (config.enable or config.enable ~= false)) then
+            if(not IsAddOnLoaded(name)) then
+                local loaded, reason = LoadAddOn(name)
+            end
+            EnableAddOn(name)
+        end
+    end
+end
+
+function lib:LoadPackages()
+    if not ModuleQueue then return end
+
+    for i=1,#ModuleQueue do
+        local name = ModuleQueue[i]
+        local obj = AddonCore[name]
+        if obj and not obj.initialized then
+            if AddonCore.db[name] then
+                obj.db = AddonCore.db[name]
+            end
+
+            if obj.Load then
+                local halt = false
+                if(obj.db.incompatible) then
+                    for addon,_ in pairs(obj.db.incompatible) do
+                        if IsAddOnLoaded(addon) then halt = true end
+                    end
+                end
+                if(not halt) then
+                    obj:Load()
+                    obj.Load = nil
+                    --print(name)
+                end
+            end
+            obj.initialized = true;
+        end
+    end
+
+    twipe(ModuleQueue)
+
+    if not ScriptQueue then return end
+    for i=1, #ScriptQueue do
+        local fn = ScriptQueue[i]
+        if(fn and type(fn) == "function") then
+            fn()
+        end
+    end
+
+    ScriptQueue = nil
+end
+
+function lib:NewPrototype(name)
+    local version = GetAddOnMetadata(name, "Version")
+    local schema = GetAddOnMetadata(name, schemaHeader)
+
+    AddonCore.private[schema] = {["enable"] = false}
+
+    local obj = {
+        ___addonName = name,
+        ___version = version,
+        ___schema = schema
+    }
+
+    local mt = {}
+    local old = getmetatable(obj)
+    if old then
+        for k, v in pairs(old) do mt[k] = v end
+    end
+    mt.__tostring = rootstring
+    setmetatable(obj, mt)
+    return obj
+end
+
+function lib:GetPlugins(tableList)
+    if(tableList and tableList ~= false) then
+        return PluginList
+    end
+    return PluginString
+end
+
+--[[ CONSTRUCTORS ]]--
+
+local Core_DeadFunction = function() return end
+
+local Core_StaticPopup_Show = function(self, arg)
+    if arg == "ADDON_ACTION_FORBIDDEN" then
+        StaticPopup_Hide(arg)
+    end
+end
+
+local function _sendmessage(msg, prefix)
+    if(type(msg) == "table") then
+        msg = tostring(msg)
+    end
+
+    if(not msg) then return end
+
+    if(prefix) then
+        local outbound = ("%s %s"):format(prefix, msg);
+        print(outbound)
+    else
+        print(msg)
+    end
+end
+
+local Core_Debugger = function(self, msg)
+    if(not self.___debugging) then return end
+    local outbound = (debugPattern):format(self.___addonName, "DEBUG")
+    _sendmessage(msg, outbound)
+end
+
+local Core_AddonMessage = function(self, msg)
+    local outbound = (messagePattern):format(self.___addonName)
+    _sendmessage(msg, outbound)
+end
+
+function lib:InitializeCore()
+    local obj = {};
+    --internals
+    AddonCore.___addonName        = AddonName;
+    AddonCore.___version          = AddonVersion;
+    AddonCore.___interface        = tonumber(uiVersion);
+    AddonCore.___debugging        = false;
+    --tables
+    AddonCore.db                  = {};
+    AddonCore.private             = {};
+    AddonCore.public              = { profiles = {}, profileKeys = {} };
+    --functions
+    AddonCore.fubar               = Core_DeadFunction;
+    AddonCore.AddonMessage        = Core_AddonMessage;
+    AddonCore.Debugger            = Core_Debugger;
+    AddonCore.StaticPopup_Show    = Core_StaticPopup_Show;
+
+    local mt = {};
+    local old = getmetatable(AddonCore);
+    if old then
+        for k, v in pairs(old) do mt[k] = v end
+    end
+    mt.__tostring = rootstring;
+    setmetatable(AddonCore, mt);
+
+    --set global
+    _G[AddonName] = AddonCore;
+
+    return AddonCore
+end
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/libs.xml b/Interface/AddOns/SVUI/libs/libs.xml
new file mode 100644
index 0000000..0e8898e
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/libs.xml
@@ -0,0 +1,9 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<Script file="LibStub\LibStub.lua"/>
+	<Script file="LibLocale-1.0\LibLocale-1.0.lua"/>
+	<Script file="LibSystemRegistry-1.0\LibSystemRegistry-1.0.lua"/>
+    <Script file="CallbackHandler-1.0\CallbackHandler-1.0.lua"/>
+    <Script file="LibSharedMedia-3.0\LibSharedMedia-3.0.lua"/>
+    <Script file="LibActionButton-1.0\LibActionButton-1.0.lua"/>
+    <Include file="oUF_Villain\oUF_Villain.xml"/>
+</Ui>
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF/LICENSE b/Interface/AddOns/SVUI/libs/oUF/LICENSE
deleted file mode 100644
index f67ac68..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2006-2012 Trond A Ekseth <troeks@gmail.com>
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Interface/AddOns/SVUI/libs/oUF/blizzard.lua b/Interface/AddOns/SVUI/libs/oUF/blizzard.lua
deleted file mode 100644
index 9da0ae4..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/blizzard.lua
+++ /dev/null
@@ -1,101 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local hiddenParent = CreateFrame("Frame")
-hiddenParent:Hide()
-
-local HandleFrame = function(baseName)
-	local frame
-	if(type(baseName) == 'string') then
-		frame = _G[baseName]
-	else
-		frame = baseName
-	end
-
-	if(frame) then
-		frame:UnregisterAllEvents()
-		frame:Hide()
-
-		-- Keep frame hidden without causing taint
-		frame:SetParent(hiddenParent)
-
-		local health = frame.healthbar
-		if(health) then
-			health:UnregisterAllEvents()
-		end
-
-		local power = frame.manabar
-		if(power) then
-			power:UnregisterAllEvents()
-		end
-
-		local spell = frame.spellbar
-		if(spell) then
-			spell:UnregisterAllEvents()
-		end
-
-		local altpowerbar = frame.powerBarAlt
-		if(altpowerbar) then
-			altpowerbar:UnregisterAllEvents()
-		end
-	end
-end
-
-function oUF:DisableBlizzard(unit)
-	if(not unit) or InCombatLockdown() then return end
-
-	if(unit == 'player') then
-		HandleFrame(PlayerFrame)
-
-		-- For the damn vehicle support:
-		PlayerFrame:RegisterUnitEvent('UNIT_ENTERING_VEHICLE', "player")
-		PlayerFrame:RegisterUnitEvent('UNIT_ENTERED_VEHICLE', "player")
-		PlayerFrame:RegisterUnitEvent('UNIT_EXITING_VEHICLE', "player")
-		PlayerFrame:RegisterUnitEvent('UNIT_EXITED_VEHICLE', "player")
-
-		-- User placed frames don't animate
-		PlayerFrame:SetUserPlaced(true)
-		PlayerFrame:SetDontSavePosition(true)
-	elseif(unit == 'pet') then
-		HandleFrame(PetFrame)
-	elseif(unit == 'target') then
-		HandleFrame(TargetFrame)
-		HandleFrame(ComboFrame)
-	elseif(unit == 'focus') then
-		HandleFrame(FocusFrame)
-		HandleFrame(TargetofFocusFrame)
-	elseif(unit == 'targettarget') then
-		HandleFrame(TargetFrameToT)
-	elseif(unit:match'(boss)%d?$' == 'boss') then
-		local id = unit:match'boss(%d)'
-		if(id) then
-			HandleFrame('Boss' .. id .. 'TargetFrame')
-		else
-			for i=1, 4 do
-				HandleFrame(('Boss%dTargetFrame'):format(i))
-			end
-		end
-	elseif(unit:match'(party)%d?$' == 'party') then
-		local id = unit:match'party(%d)'
-		if(id) then
-			HandleFrame('PartyMemberFrame' .. id)
-		else
-			for i=1, 4 do
-				HandleFrame(('PartyMemberFrame%d'):format(i))
-			end
-		end
-	elseif(unit:match'(arena)%d?$' == 'arena') then
-		local id = unit:match'arena(%d)'
-		if(id) then
-			HandleFrame('ArenaEnemyFrame' .. id)
-		else
-			for i=1, 4 do
-				HandleFrame(('ArenaEnemyFrame%d'):format(i))
-			end
-		end
-
-		-- Blizzard_ArenaUI should not be loaded
-		Arena_LoadUI = function() end
-		SetCVar('showArenaEnemyFrames', '0', 'SHOW_ARENA_ENEMY_FRAMES_TEXT')
-	end
-end
diff --git a/Interface/AddOns/SVUI/libs/oUF/colors.lua b/Interface/AddOns/SVUI/libs/oUF/colors.lua
deleted file mode 100644
index 5a64636..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/colors.lua
+++ /dev/null
@@ -1,160 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-local Private = oUF.Private
-
-local frame_metatable = Private.frame_metatable
-
-local colors = {
-	smooth = {
-		1, 0, 0,
-		1, 1, 0,
-		0, 1, 0
-	},
-	disconnected = {.6, .6, .6},
-	tapped = {.6,.6,.6},
-	class = {},
-	reaction = {},
-}
-
--- We do this because people edit the vars directly, and changing the default
--- globals makes SPICE FLOW!
-local customClassColors = function()
-	if(SVUI_CLASS_COLORS) then
-		local updateColors = function()
-			for eclass, color in next, SVUI_CLASS_COLORS do
-				colors.class[eclass] = {color.r, color.g, color.b}
-			end
-
-			for _, obj in next, oUF.objects do
-				obj:UpdateAllElements("SVUI_CLASS_COLORS")
-			end
-		end
-
-		updateColors()
-		SVUI_CLASS_COLORS:RegisterCallback(updateColors)
-
-		return true
-	end
-end
-if not customClassColors() then
-	for eclass, color in next, RAID_CLASS_COLORS do
-		colors.class[eclass] = {color.r, color.g, color.b}
-	end
-
-	local f = CreateFrame("Frame")
-	f:RegisterEvent("ADDON_LOADED")
-	f:SetScript("OnEvent", function()
-		if customClassColors() then
-			f:UnregisterEvent("ADDON_LOADED")
-			f:SetScript("OnEvent", nil)
-		end
-	end)
-end
-
-for eclass, color in next, FACTION_BAR_COLORS do
-	colors.reaction[eclass] = {color.r, color.g, color.b}
-end
-
-local function ColorsAndPercent(a, b, ...)
-	if a <= 0 or b == 0 then
-		return nil, ...
-	elseif a >= b then
-		return nil, select(select('#', ...) - 2, ...)
-	end
-
-	local num = select('#', ...) / 3
-	local segment, relperc = math.modf((a/b)*(num-1))
-	return relperc, select((segment*3)+1, ...)
-end
-
--- http://www.wowwiki.com/ColorGradient
-local RGBColorGradient = function(...)
-	local relperc, r1, g1, b1, r2, g2, b2 = ColorsAndPercent(...)
-	if relperc then
-		return r1 + (r2-r1)*relperc, g1 + (g2-g1)*relperc, b1 + (b2-b1)*relperc
-	else
-		return r1, g1, b1
-	end
-end
-
-
-local function GetY(r, g, b)
-	return 0.3 * r + 0.59 * g + 0.11 * b
-end
-
-local function RGBToHCY(r, g, b)
-	local min, max = min(r, g, b), max(r, g, b)
-	local chroma = max - min
-	local hue
-	if chroma > 0 then
-		if r == max then
-			hue = ((g - b) / chroma) % 6
-		elseif g == max then
-			hue = (b - r) / chroma + 2
-		elseif b == max then
-			hue = (r - g) / chroma + 4
-		end
-		hue = hue / 6
-	end
-	return hue, chroma, GetY(r, g, b)
-end
-
-local abs = math.abs
-local function HCYtoRGB(hue, chroma, luma)
-	local r, g, b = 0, 0, 0
-	if hue then
-		local h2 = hue * 6
-		local x = chroma * (1 - abs(h2 % 2 - 1))
-		if h2 < 1 then
-			r, g, b = chroma, x, 0
-		elseif h2 < 2 then
-			r, g, b = x, chroma, 0
-		elseif h2 < 3 then
-			r, g, b = 0, chroma, x
-		elseif h2 < 4 then
-			r, g, b = 0, x, chroma
-		elseif h2 < 5 then
-			r, g, b = x, 0, chroma
-		else
-			r, g, b = chroma, 0, x
-		end
-	end
-	local m = luma - GetY(r, g, b)
-	return r + m, g + m, b + m
-end
-
-local HCYColorGradient = function(...)
-	local relperc, r1, g1, b1, r2, g2, b2 = ColorsAndPercent(...)
-	if not relperc then return r1, g1, b1 end
-	local h1, c1, y1 = RGBToHCY(r1, g1, b1)
-	local h2, c2, y2 = RGBToHCY(r2, g2, b2)
-	local c = c1 + (c2-c1) * relperc
-	local y = y1 + (y2-y1) * relperc
-	if h1 and h2 then
-		local dh = h2 - h1
-		if dh < -0.5  then
-			dh = dh + 1
-		elseif dh > 0.5 then
-			dh = dh - 1
-		end
-		return HCYtoRGB((h1 + dh * relperc) % 1, c, y)
-	else
-		return HCYtoRGB(h1 or h2, c, y)
-	end
-
-end
-
-local ColorGradient = function(...)
-	return (oUF.useHCYColorGradient and HCYColorGradient or RGBColorGradient)(...)
-end
-
-Private.colors = colors
-
-oUF.colors = colors
-oUF.ColorGradient = ColorGradient
-oUF.RGBColorGradient = RGBColorGradient
-oUF.HCYColorGradient = HCYColorGradient
-oUF.useHCYColorGradient = false
-
-frame_metatable.__index.colors = colors
-frame_metatable.__index.ColorGradient = ColorGradient
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/altpowerbar.lua b/Interface/AddOns/SVUI/libs/oUF/elements/altpowerbar.lua
deleted file mode 100644
index ed2141c..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/altpowerbar.lua
+++ /dev/null
@@ -1,86 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local ALTERNATE_POWER_INDEX = ALTERNATE_POWER_INDEX
-
-local UpdatePower = function(self, event, unit, powerType)
-	if(self.unit ~= unit or powerType ~= 'ALTERNATE') or not unit then return end
-
-	local altpowerbar = self.AltPowerBar
-
-	if(altpowerbar.PreUpdate) then
-		altpowerbar:PreUpdate()
-	end
-
-	local barType, min = UnitAlternatePowerInfo(unit)
-	local cur = UnitPower(unit, ALTERNATE_POWER_INDEX)
-	local max = UnitPowerMax(unit, ALTERNATE_POWER_INDEX)
-
-	altpowerbar.barType = barType
-	altpowerbar:SetMinMaxValues(min, max)
-	altpowerbar:SetValue(cur)
-
-	if(altpowerbar.PostUpdate) then
-		return altpowerbar:PostUpdate(min, cur, max)
-	end
-end
-
-local ForceUpdate = function(element)
-	return UpdatePower(element.__owner, 'ForceUpdate', element.__owner.unit, 'ALTERNATE')
-end
-
-local Toggler = function(self, event, unit)
-	if(unit ~= self.unit) or not unit then return end
-	local altpowerbar = self.AltPowerBar
-
-	local barType, minPower, _, _, _, hideFromOthers = UnitAlternatePowerInfo(unit)
-	if(barType and (not hideFromOthers or unit == 'player' or self.realUnit == 'player')) then
-		self:RegisterEvent('UNIT_POWER', UpdatePower)
-		self:RegisterEvent('UNIT_MAXPOWER', UpdatePower)
-
-		ForceUpdate(altpowerbar)
-		altpowerbar:Show()
-	else
-		self:UnregisterEvent('UNIT_POWER', UpdatePower)
-		self:UnregisterEvent('UNIT_MAXPOWER', UpdatePower)
-
-		altpowerbar:Hide()
-	end
-end
-
-local Enable = function(self, unit)
-	local altpowerbar = self.AltPowerBar
-	if(altpowerbar) then
-		altpowerbar.__owner = self
-		altpowerbar.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('UNIT_POWER_BAR_SHOW', Toggler)
-		self:RegisterEvent('UNIT_POWER_BAR_HIDE', Toggler)
-
-		altpowerbar:Hide()
-
-		if(unit == 'player') then
-			PlayerPowerBarAlt:UnregisterEvent'UNIT_POWER_BAR_SHOW'
-			PlayerPowerBarAlt:UnregisterEvent'UNIT_POWER_BAR_HIDE'
-			PlayerPowerBarAlt:UnregisterEvent'PLAYER_ENTERING_WORLD'
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self, unit)
-	local altpowerbar = self.AltPowerBar
-	if(altpowerbar) then
-		self:UnregisterEvent('UNIT_POWER_BAR_SHOW', Toggler)
-		self:UnregisterEvent('UNIT_POWER_BAR_HIDE', Toggler)
-
-		if(unit == 'player') then
-			PlayerPowerBarAlt:RegisterEvent'UNIT_POWER_BAR_SHOW'
-			PlayerPowerBarAlt:RegisterEvent'UNIT_POWER_BAR_HIDE'
-			PlayerPowerBarAlt:RegisterEvent'PLAYER_ENTERING_WORLD'
-		end
-	end
-end
-
-oUF:AddElement('AltPowerBar', Toggler, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/assistant.lua b/Interface/AddOns/SVUI/libs/oUF/elements/assistant.lua
deleted file mode 100644
index 1d485d7..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/assistant.lua
+++ /dev/null
@@ -1,56 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local Update = function(self, event)
-	if not self.unit then return; end
-	local assistant = self.Assistant
-
-	if(assistant.PreUpdate) then
-		assistant:PreUpdate()
-	end
-
-	local unit = self.unit
-	local isAssistant = UnitInRaid(unit) and UnitIsRaidOfficer(unit) and not UnitIsGroupLeader(unit)
-	if(isAssistant) then
-		assistant:Show()
-	else
-		assistant:Hide()
-	end
-
-	if(assistant.PostUpdate) then
-		return assistant:PostUpdate(isAssistant)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.Assistant.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate')
-end
-
-local Enable = function(self)
-	local assistant = self.Assistant
-	if(assistant) then
-		self:RegisterEvent("GROUP_ROSTER_UPDATE", Path, true)
-
-		if(assistant:IsObjectType"Texture" and not assistant:GetTexture()) then
-			assistant:SetTexture[[Interface\GroupFrame\UI-Group-AssistantIcon]]
-		end
-
-		assistant.__owner = self
-		assistant.ForceUpdate = ForceUpdate
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local assistant = self.Assistant
-	if(assistant) then
-		self:UnregisterEvent("GROUP_ROSTER_UPDATE", Path)
-	end
-end
-
-oUF:AddElement('Assistant', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/aura.lua b/Interface/AddOns/SVUI/libs/oUF/elements/aura.lua
deleted file mode 100644
index ccaba42..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/aura.lua
+++ /dev/null
@@ -1,319 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local VISIBLE = 1
-local HIDDEN = 0
-
-local floor = math.floor
-local tinsert = table.insert
-
-local UpdateTooltip = function(self)
-	GameTooltip:SetUnitAura(self.parent.__owner.unit, self:GetID(), self.filter)
-end
-
-local OnEnter = function(self)
-	if(not self:IsVisible()) then return end
-
-	GameTooltip:SetOwner(self, "ANCHOR_BOTTOMRIGHT")
-	self:UpdateTooltip()
-end
-
-local OnLeave = function()
-	GameTooltip:Hide()
-end
-
-local createAuraIcon = function(icons, index)
-	local button = CreateFrame("Button", nil, icons)
-	button:EnableMouse(true)
-	button:RegisterForClicks'RightButtonUp'
-
-	button:SetWidth(icons.size or 16)
-	button:SetHeight(icons.size or 16)
-
-	local cd = CreateFrame("Cooldown", nil, button)
-	cd:SetPoint("TOPLEFT", button, "TOPLEFT", 1, -1)
-	cd:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -1, 1)
-
-	local text = cd:CreateFontString(nil, "OVERLAY")
-	text:SetFont(icons.textFont or [[Fonts\FRIZQT__.TTF]], icons.textSize or 10, icons.textOutline or "NONE")
-	text:SetPoint("CENTER", 1, 1)
-	text:SetJustifyH("CENTER")
-
-	local icon = button:CreateTexture(nil, "ARTWORK")
-	icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
-	icon:SetPoint("TOPLEFT", button, "TOPLEFT", 1, -1)
-	icon:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -1, 1)
-
-	local count = button:CreateFontString(nil, "OVERLAY")
-	count:SetFont(icons.textFont or [[Fonts\FRIZQT__.TTF]], icons.textSize or 10, icons.textOutline or "NONE")
-	count:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -1, 0)
-	count:SetJustifyH("RIGHT")
-
-	local overlay = button:CreateTexture(nil, "OVERLAY")
-	overlay:SetTexture"Interface\\Buttons\\UI-Debuff-Overlays"
-	overlay:SetAllPoints(button)
-	overlay:SetTexCoord(.296875, .5703125, 0, .515625)
-	button.overlay = overlay
-
-	local stealable = button:CreateTexture(nil, 'OVERLAY')
-	stealable:SetTexture[[Interface\TargetingFrame\UI-TargetingFrame-Stealable]]
-	stealable:SetPoint('TOPLEFT', -3, 3)
-	stealable:SetPoint('BOTTOMRIGHT', 3, -3)
-	stealable:SetBlendMode'ADD'
-	button.stealable = stealable
-
-	button.UpdateTooltip = UpdateTooltip
-	button:SetScript("OnEnter", OnEnter)
-	button:SetScript("OnLeave", OnLeave)
-
-	tinsert(icons, button)
-
-	button.parent = icons
-	button.icon = icon
-	button.count = count
-	button.cd = cd
-	button.text = text
-
-	if(icons.PostCreateIcon) then icons:PostCreateIcon(button) end
-
-	return button
-end
-
-local customFilter = function(icons, unit, icon, name, rank, texture, count, dtype, duration, timeLeft, caster)
-	local isPlayer
-
-	if(caster == 'player' or caster == 'vehicle') then
-		isPlayer = true
-	end
-
-	if((icons.onlyShowPlayer and isPlayer) or (not icons.onlyShowPlayer and name)) then
-		icon.isPlayer = isPlayer
-		icon.owner = caster
-		return true
-	end
-end
-
-local updateIcon = function(unit, icons, index, offset, filter, isDebuff, visible)
-	if not unit then return; end
-	local name, rank, texture, count, dtype, duration, timeLeft, caster, isStealable, shouldConsolidate, spellID, canApplyAura, isBossDebuff = UnitAura(unit, index, filter)
-
-	if icons.forceShow then
-		spellID = 47540
-		name, rank, texture = GetSpellInfo(spellID)
-		count, dtype, duration, timeLeft, caster, isStealable, shouldConsolidate, canApplyAura, isBossDebuff = 5, 'Magic', 0, 60, 'player', nil, nil, nil, nil
-	end
-
-	if(name) then
-		local n = visible + offset + 1
-		local icon = icons[n]
-		if(not icon) then
-			icon = (icons.CreateIcon or createAuraIcon) (icons, n)
-		end
-
-		local show = true
-		if not icons.forceShow then
-			show = (icons.CustomFilter or customFilter) (icons, unit, icon, name, rank, texture, count, dtype, duration, timeLeft, caster, isStealable, shouldConsolidate, spellID, canApplyAura, isBossDebuff)
-		end
-		if(show) then
-			-- We might want to consider delaying the creation of an actual cooldown
-			-- object to this point, but I think that will just make things needlessly
-			-- complicated.
-			local cd = icon.cd
-			if(cd and not icons.disableCooldown) then
-				if(duration and duration > 0) then
-					cd:SetCooldown(timeLeft - duration, duration)
-					cd:Show()
-				else
-					cd:Hide()
-				end
-			end
-
-			if((isDebuff and icons.showDebuffType) or (not isDebuff and icons.showBuffType) or icons.showType) then
-				local color = DebuffTypeColor[dtype] or DebuffTypeColor.none
-
-				icon.overlay:SetVertexColor(color.r, color.g, color.b)
-				icon.overlay:Show()
-			else
-				icon.overlay:Hide()
-			end
-
-			-- XXX: Avoid popping errors on layouts without icon.stealable.
-			if(icon.stealable) then
-				local stealable = not isDebuff and isStealable
-				if(stealable and icons.showStealableBuffs and not UnitIsUnit('player', unit)) then
-					icon.stealable:Show()
-				else
-					icon.stealable:Hide()
-				end
-			end
-
-			icon.icon:SetTexture(texture)
-			icon.count:SetText((count > 1 and count))
-
-			icon.filter = filter
-			icon.isDebuff = isDebuff
-
-			icon:SetID(index)
-			icon:Show()
-
-			if(icons.PostUpdateIcon) then
-				icons:PostUpdateIcon(unit, icon, index, offset)
-			end
-
-			return VISIBLE
-		else
-			return HIDDEN
-		end
-	end
-end
-
-local SetPosition = function(icons, x)
-	if(icons and x > 0) then
-		local col = 0
-		local row = 0
-		local gap = icons.gap
-		local sizex = (icons.size or 16) + (icons['spacing-x'] or icons.spacing or 0)
-		local sizey = (icons.size or 16) + (icons['spacing-y'] or icons.spacing or 0)
-		local anchor = icons.initialAnchor or "BOTTOMLEFT"
-		local growthx = (icons["growth-x"] == "LEFT" and -1) or 1
-		local growthy = (icons["growth-y"] == "DOWN" and -1) or 1
-		local cols = floor(icons:GetWidth() / sizex + .5)
-		local rows = floor(icons:GetHeight() / sizey + .5)
-
-		for i = 1, #icons do
-			local button = icons[i]
-			if(button and button:IsShown()) then
-				if(gap and button.debuff) then
-					if(col > 0) then
-						col = col + 1
-					end
-
-					gap = false
-				end
-
-				if(col >= cols) then
-					col = 0
-					row = row + 1
-				end
-				button:ClearAllPoints()
-				button:SetPoint(anchor, icons, anchor, col * sizex * growthx, row * sizey * growthy)
-
-				col = col + 1
-			elseif(not button) then
-				break
-			end
-		end
-	end
-end
-
-local filterIcons = function(unit, icons, filter, limit, isDebuff, offset, dontHide)
-	if(not offset) then offset = 0 end
-	local index = 1
-	local visible = 0
-	while(visible < limit) do
-		local result = updateIcon(unit, icons, index, offset, filter, isDebuff, visible)
-		if(not result) then
-			break
-		elseif(result == VISIBLE) then
-			visible = visible + 1
-		end
-
-		index = index + 1
-	end
-
-	if(not dontHide) then
-		for i = visible + offset + 1, #icons do
-			icons[i]:Hide()
-		end
-	end
-
-	return visible
-end
-
-local Update = function(self, event, unit)
-	if(self.unit ~= unit) or not unit then return end
-
-	local auras = self.Auras
-	if(auras) then
-		if(auras.PreUpdate) then auras:PreUpdate(unit) end
-
-		local numBuffs = auras.numBuffs or 32
-		local numDebuffs = auras.numDebuffs or 40
-		local max = numBuffs + numDebuffs
-
-		local visibleBuffs = filterIcons(unit, auras, auras.buffFilter or auras.filter or 'HELPFUL', numBuffs, nil, 0, true)
-		auras.visibleBuffs = visibleBuffs
-
-		auras.visibleDebuffs = filterIcons(unit, auras, auras.debuffFilter or auras.filter or 'HARMFUL', numDebuffs, true, visibleBuffs)
-		auras.visibleAuras = auras.visibleBuffs + auras.visibleDebuffs
-
-		if(auras.PreSetPosition) then auras:PreSetPosition(max) end
-		(auras.SetPosition or SetPosition) (auras, max)
-
-		if(auras.PostUpdate) then auras:PostUpdate(unit) end
-	end
-
-	local buffs = self.Buffs
-	if(buffs) then
-		if(buffs.PreUpdate) then buffs:PreUpdate(unit) end
-
-		local numBuffs = buffs.num or 32
-		buffs.visibleBuffs = filterIcons(unit, buffs, buffs.filter or 'HELPFUL', numBuffs)
-
-		if(buffs.PreSetPosition) then buffs:PreSetPosition(numBuffs) end
-		(buffs.SetPosition or SetPosition) (buffs, numBuffs)
-
-		if(buffs.PostUpdate) then buffs:PostUpdate(unit) end
-	end
-
-	local debuffs = self.Debuffs
-	if(debuffs) then
-		if(debuffs.PreUpdate) then debuffs:PreUpdate(unit) end
-
-		local numDebuffs = debuffs.num or 40
-		debuffs.visibleDebuffs = filterIcons(unit, debuffs, debuffs.filter or 'HARMFUL', numDebuffs, true)
-
-		if(debuffs.PreSetPosition) then debuffs:PreSetPosition(numDebuffs) end
-		(debuffs.SetPosition or SetPosition) (debuffs, numDebuffs)
-
-		if(debuffs.PostUpdate) then debuffs:PostUpdate(unit) end
-	end
-end
-
-local ForceUpdate = function(element)
-	return Update(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-local Enable = function(self)
-	if(self.Buffs or self.Debuffs or self.Auras) then
-		self:RegisterEvent("UNIT_AURA", Update)
-
-		local buffs = self.Buffs
-		if(buffs) then
-			buffs.__owner = self
-			buffs.ForceUpdate = ForceUpdate
-		end
-
-		local debuffs = self.Debuffs
-		if(debuffs) then
-			debuffs.__owner = self
-			debuffs.ForceUpdate = ForceUpdate
-		end
-
-		local auras = self.Auras
-		if(auras) then
-			auras.__owner = self
-			auras.ForceUpdate = ForceUpdate
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	if(self.Buffs or self.Debuffs or self.Auras) then
-		self:UnregisterEvent("UNIT_AURA", Update)
-	end
-end
-
-oUF:AddElement('Aura', Update, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/castbar.lua b/Interface/AddOns/SVUI/libs/oUF/elements/castbar.lua
deleted file mode 100644
index bf553fb..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/castbar.lua
+++ /dev/null
@@ -1,487 +0,0 @@
---[[ Element: Cast Bar
-
-	THIS FILE HEAVILY MODIFIED FOR USE WITH SUPERVILLAIN UI
-
-]]
-local parent, ns = ...
-local oUF = ns.oUF
-
-local updateSafeZone = function(self)
-	local sz = self.SafeZone
-	local width = self:GetWidth()
-	local _, _, _, ms = GetNetStats()
-
-	-- Guard against GetNetStats returning latencies of 0.
-	if(ms ~= 0) then
-		-- MADNESS!
-		local safeZonePercent = (width / self.max) * (ms / 1e5)
-		if(safeZonePercent > 1) then safeZonePercent = 1 end
-		sz:SetWidth(width * safeZonePercent)
-		sz:Show()
-	else
-		sz:Hide()
-	end
-end
-
-local UNIT_SPELLCAST_SENT = function (self, event, unit, spell, rank, target)
-	local castbar = self.Castbar
-	castbar.curTarget = (target and target ~= "") and target or nil
-end
-
-local UNIT_SPELLCAST_START = function(self, event, unit, spell)
-	if(self.unit ~= unit) or not unit then return end
-
-	local castbar = self.Castbar
-	local name, _, text, texture, startTime, endTime, tradeskill, castid, interrupt = UnitCastingInfo(unit)
-	if(not name) then
-		castbar:Hide()
-		return
-	end
-
-	endTime = endTime / 1e3
-	startTime = startTime / 1e3
-
-	local repeatCount = GetTradeskillRepeatCount() or 1
-	local start = GetTime() - startTime
-
-	if(tradeskill and repeatCount >= 1) then
-		if(castbar.previous ~= name) then
-			castbar.recipecount = 1
-			castbar.maxrecipe = repeatCount
-			castbar.duration = start
-		else
-			castbar.recipecount = castbar.recipecount or 1
-			castbar.maxrecipe = castbar.maxrecipe or repeatCount
-			castbar.duration = castbar.duration or start
-		end
-	else
-		castbar.recipecount = nil
-		castbar.maxrecipe = 1
-		castbar.duration = start
-	end
-
-	castbar.previous = name
-	castbar.tradeskill = tradeskill
-	castbar.castid = castid
-
-	local max = (endTime - startTime) * castbar.maxrecipe
-
-	castbar.max = max
-	castbar.delay = 0
-	castbar.casting = true
-	castbar.interrupt = interrupt
-
-	castbar:SetMinMaxValues(0, max)
-	castbar:SetValue(0)
-
-	if(castbar.Text) then castbar.Text:SetText(text) end
-	if(castbar.Icon) then castbar.Icon:SetTexture(texture) end
-	if(castbar.Time) then castbar.Time:SetText() end
-
-	local shield = castbar.Shield
-	if(shield and interrupt) then
-		shield:Show()
-	elseif(shield) then
-		shield:Hide()
-	end
-
-	local sf = castbar.SafeZone
-	if(sf) then
-		sf:ClearAllPoints()
-		sf:SetPoint'RIGHT'
-		sf:SetPoint'TOP'
-		sf:SetPoint'BOTTOM'
-		updateSafeZone(castbar)
-	end
-
-	if(castbar.PostCastStart) then
-		castbar:PostCastStart(unit, name, castid)
-	end
-
-	castbar:Show()
-end
-
-local UNIT_SPELLCAST_FAILED = function(self, event, unit, spellname, _, castid)
-	if (self.unit ~= unit) or not unit then return end
-
-	local castbar = self.Castbar
-	if (castbar.castid ~= castid) then	return end
-
-	castbar.previous = nil
-	castbar.casting = nil
-	castbar.tradeskill = nil
-	castbar.recipecount = nil
-	castbar.maxrecipe = 1
-	castbar.interrupt = nil
-	castbar:SetValue(0)
-	castbar:Hide()
-
-	if(castbar.PostCastFailed) then
-		return castbar:PostCastFailed(unit, spellname, castid)
-	end
-end
-
-local UNIT_SPELLCAST_INTERRUPTED = function(self, event, unit, spellname, _, castid)
-	if(self.unit ~= unit) or not unit then return end
-
-	local castbar = self.Castbar
-	if (castbar.castid ~= castid) then	return end
-
-	castbar.previous = nil
-	castbar.casting = nil
-	castbar.tradeskill = nil
-	castbar.recipecount = nil
-	castbar.maxrecipe = 1
-	castbar.channeling = nil
-
-	castbar:SetValue(0)
-	castbar:Hide()
-
-	if(castbar.PostCastInterrupted) then
-		return castbar:PostCastInterrupted(unit, spellname, castid)
-	end
-end
-
-local UNIT_SPELLCAST_INTERRUPTIBLE = function(self, event, unit)
-	if(self.unit ~= unit) or not unit then return end
-
-	local shield = self.Castbar.Shield
-	if(shield) then
-		shield:Hide()
-	end
-
-	local castbar = self.Castbar
-	if(castbar.PostCastInterruptible) then
-		return castbar:PostCastInterruptible(unit)
-	end
-end
-
-local UNIT_SPELLCAST_NOT_INTERRUPTIBLE = function(self, event, unit)
-	if(self.unit ~= unit) or not unit then return end
-
-	local shield = self.Castbar.Shield
-	if(shield) then
-		shield:Show()
-	end
-
-	local castbar = self.Castbar
-	if(castbar.PostCastNotInterruptible) then
-		return castbar:PostCastNotInterruptible(unit)
-	end
-end
-
-local UNIT_SPELLCAST_DELAYED = function(self, event, unit, spellname, _, castid)
-	if(self.unit ~= unit) or not unit then return end
-
-	local castbar = self.Castbar
-	local name, _, text, texture, startTime, endTime = UnitCastingInfo(unit)
-	if(not startTime or not castbar:IsShown()) then return end
-
-	local duration = GetTime() - (startTime / 1000)
-	if(duration < 0) then duration = 0 end
-	castbar.previous = name
-	castbar.delay = castbar.delay + castbar.duration - duration
-	castbar.duration = duration
-
-	castbar:SetValue(duration)
-
-	if(castbar.PostCastDelayed) then
-		return castbar:PostCastDelayed(unit, name, castid)
-	end
-end
-
-local UNIT_SPELLCAST_STOP = function(self, event, unit, spellname, _, castid)
-	if (self.unit ~= unit) or not unit then return end
-	local castbar = self.Castbar
-	if (castbar.castid ~= castid) then return end
-
-	if(castbar.tradeskill and castbar.recipecount and castbar.recipecount >= 0) then
-		castbar.recipecount = castbar.recipecount + 1
-	else
-		castbar.previous = nil
-		castbar.casting = nil
-		castbar.interrupt = nil
-		castbar.tradeskill = nil
-		castbar.recipecount = nil
-		castbar.maxrecipe = 1
-		castbar:SetValue(0)
-	end
-
-	castbar:Hide()
-
-	if(castbar.PostCastStop) then
-		return castbar:PostCastStop(unit, spellname, castid)
-	end
-end
-
-local UNIT_SPELLCAST_CHANNEL_START = function(self, event, unit, spellname)
-	if (self.unit ~= unit) or not unit then return end
-
-	local castbar = self.Castbar
-	local name, _, text, texture, startTime, endTime, isTrade, interrupt = UnitChannelInfo(unit)
-	if (not name) then return end
-
-	endTime = endTime / 1e3
-	startTime = startTime / 1e3
-	local max = (endTime - startTime)
-	local duration = endTime - GetTime()
-
-	castbar.previous = name
-	castbar.duration = duration
-	castbar.max = max
-	castbar.delay = 0
-	castbar.startTime = startTime
-	castbar.endTime = endTime
-	castbar.extraTickRatio = 0
-	castbar.channeling = true
-	castbar.interrupt = interrupt
-
-	-- We have to do this, as it's possible for spell casts to never have _STOP
-	-- executed or be fully completed by the OnUpdate handler before CHANNEL_START
-	-- is called.
-	castbar.casting = nil
-	castbar.tradeskill = nil
-	castbar.recipecount = nil
-	castbar.maxrecipe = 1
-	castbar.castid = nil
-
-	castbar:SetMinMaxValues(0, max)
-	castbar:SetValue(duration)
-
-	if(castbar.Text) then castbar.Text:SetText(name) end
-	if(castbar.Icon) then castbar.Icon:SetTexture(texture) end
-	if(castbar.Time) then castbar.Time:SetText() end
-
-	local shield = castbar.Shield
-	if(shield and interrupt) then
-		shield:Show()
-	elseif(shield) then
-		shield:Hide()
-	end
-
-	local sf = castbar.SafeZone
-	if(sf) then
-		sf:ClearAllPoints()
-		sf:SetPoint'LEFT'
-		sf:SetPoint'TOP'
-		sf:SetPoint'BOTTOM'
-		updateSafeZone(castbar)
-	end
-
-	if(castbar.PostChannelStart) then castbar:PostChannelStart(unit, name) end
-	castbar:Show()
-end
-
-local UNIT_SPELLCAST_CHANNEL_UPDATE = function(self, event, unit, spellname)
-	if(self.unit ~= unit) or not unit then return end
-
-	local castbar = self.Castbar
-	local name, _, text, texture, startTime, endTime, oldStart = UnitChannelInfo(unit)
-	if(not name or not castbar:IsShown()) then
-		return
-	end
-
-	castbar.previous = name
-	local duration = (endTime / 1000) - GetTime()
-	local startDelay = castbar.startTime - startTime / 1000
-	castbar.startTime = startTime / 1000
-	castbar.endTime = endTime / 1000
-	castbar.delay = castbar.delay + startDelay
-
-	castbar.duration = duration
-	castbar.max = (endTime - startTime) / 1000
-
-	castbar:SetMinMaxValues(0, castbar.max)
-	castbar:SetValue(duration)
-
-	if(castbar.PostChannelUpdate) then
-		return castbar:PostChannelUpdate(unit, name)
-	end
-end
-
-local UNIT_SPELLCAST_CHANNEL_STOP = function(self, event, unit, spellname)
-	if(self.unit ~= unit) or not unit then return end
-
-	local castbar = self.Castbar
-	if(castbar:IsShown()) then
-		castbar.channeling = nil
-		castbar.interrupt = nil
-
-		castbar:SetValue(castbar.max)
-		castbar:Hide()
-
-		if(castbar.PostChannelStop) then
-			return castbar:PostChannelStop(unit, spellname)
-		end
-	end
-end
-
-local UpdateCastingTimeInfo = function(self, duration)
-	if(self.Time) then
-		if(self.delay ~= 0) then
-			if(self.CustomDelayText) then
-				self:CustomDelayText(duration)
-			else
-				self.Time:SetFormattedText("%.1f|cffff0000-%.1f|r", duration, self.delay)
-			end
-		elseif(self.recipecount and self.recipecount > 0 and self.maxrecipe and self.maxrecipe > 1) then
-			self.Time:SetText(self.recipecount .. "/" .. self.maxrecipe)
-		else
-			if(self.CustomTimeText) then
-				self:CustomTimeText(duration)
-			else
-				self.Time:SetFormattedText("%.1f", duration)
-			end
-		end
-	end
-	if(self.Spark) then
-		self.Spark:SetPoint("CENTER", self, "LEFT", (duration / self.max) * self:GetWidth(), 0)
-	end
-end
-
-local onUpdate = function(self, elapsed)
-	self.lastUpdate = (self.lastUpdate or 0) + elapsed
-
-	if not (self.casting or self.channeling) then
-		self.unitName = nil
-		self.previous = nil
-		self.casting = nil
-		self.tradeskill = nil
-		self.recipecount = nil
-		self.maxrecipe = 1
-		self.castid = nil
-		self.channeling = nil
-
-		self:SetValue(1)
-		self:Hide()
-		return
-	end
-
-	if(self.casting) then
-		local duration = self.duration + self.lastUpdate
-		if(duration >= self.max) then
-			self.previous = nil
-			self.casting = nil
-			self.tradeskill = nil
-			self.recipecount = nil
-			self.maxrecipe = 1
-			self:Hide()
-
-			if(self.PostCastStop) then self:PostCastStop(self.__owner.unit) end
-			return
-		end
-
-		UpdateCastingTimeInfo(self, duration)
-
-		self.duration = duration
-		self:SetValue(duration)
-	elseif(self.channeling) then
-		local duration = self.duration - self.lastUpdate
-
-		if(duration <= 0) then
-			self.channeling = nil
-			self:Hide()
-
-			if(self.PostChannelStop) then self:PostChannelStop(self.__owner.unit) end
-			return
-		end
-
-		UpdateCastingTimeInfo(self, duration)
-
-		self.duration = duration
-		self:SetValue(duration)
-	end
-
-	self.lastUpdate = 0
-end
-
-local Update = function(self, ...)
-	UNIT_SPELLCAST_START(self, ...)
-	return UNIT_SPELLCAST_CHANNEL_START(self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Update(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-local Enable = function(object, unit)
-	local castbar = object.Castbar
-
-	if(castbar) then
-		castbar.__owner = object
-		castbar.ForceUpdate = ForceUpdate
-
-		if(not (unit and unit:match'%wtarget$')) then
-			object:RegisterEvent("UNIT_SPELLCAST_SENT", UNIT_SPELLCAST_SENT)
-			object:RegisterEvent("UNIT_SPELLCAST_START", UNIT_SPELLCAST_START)
-			object:RegisterEvent("UNIT_SPELLCAST_FAILED", UNIT_SPELLCAST_FAILED)
-			object:RegisterEvent("UNIT_SPELLCAST_STOP", UNIT_SPELLCAST_STOP)
-			object:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED", UNIT_SPELLCAST_INTERRUPTED)
-			object:RegisterEvent("UNIT_SPELLCAST_INTERRUPTIBLE", UNIT_SPELLCAST_INTERRUPTIBLE)
-			object:RegisterEvent("UNIT_SPELLCAST_NOT_INTERRUPTIBLE", UNIT_SPELLCAST_NOT_INTERRUPTIBLE)
-			object:RegisterEvent("UNIT_SPELLCAST_DELAYED", UNIT_SPELLCAST_DELAYED)
-			object:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START", UNIT_SPELLCAST_CHANNEL_START)
-			object:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE", UNIT_SPELLCAST_CHANNEL_UPDATE)
-			object:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP", UNIT_SPELLCAST_CHANNEL_STOP)
-			--object:RegisterEvent("UPDATE_TRADESKILL_RECAST", UPDATE_TRADESKILL_RECAST)
-		end
-
-		castbar:SetScript("OnUpdate", castbar.OnUpdate or onUpdate)
-
-		if(object.unit == "player") then
-			CastingBarFrame:UnregisterAllEvents()
-			CastingBarFrame.Show = CastingBarFrame.Hide
-			CastingBarFrame:Hide()
-		elseif(object.unit == 'pet') then
-			PetCastingBarFrame:UnregisterAllEvents()
-			PetCastingBarFrame.Show = PetCastingBarFrame.Hide
-			PetCastingBarFrame:Hide()
-		end
-
-		if(castbar:IsObjectType'StatusBar' and not castbar:GetStatusBarTexture()) then
-			castbar:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
-		end
-
-		local spark = castbar.Spark
-		if(spark and spark:IsObjectType'Texture' and not spark:GetTexture()) then
-			spark:SetTexture[[Interface\CastingBar\UI-CastingBar-Spark]]
-		end
-
-		local shield = castbar.Shield
-		if(shield and shield:IsObjectType'Texture' and not shield:GetTexture()) then
-			shield:SetTexture[[Interface\CastingBar\UI-CastingBar-Small-Shield]]
-		end
-
-		local sz = castbar.SafeZone
-		if(sz and sz:IsObjectType'Texture' and not sz:GetTexture()) then
-			sz:SetTexture(1, 0, 0)
-		end
-
-		castbar:Hide()
-
-		return true
-	end
-end
-
-local Disable = function(object, unit)
-	local castbar = object.Castbar
-
-	if(castbar) then
-		object:UnregisterEvent("UNIT_SPELLCAST_SENT", UNIT_SPELLCAST_SENT)
-		object:UnregisterEvent("UNIT_SPELLCAST_START", UNIT_SPELLCAST_START)
-		object:UnregisterEvent("UNIT_SPELLCAST_FAILED", UNIT_SPELLCAST_FAILED)
-		object:UnregisterEvent("UNIT_SPELLCAST_STOP", UNIT_SPELLCAST_STOP)
-		object:UnregisterEvent("UNIT_SPELLCAST_INTERRUPTED", UNIT_SPELLCAST_INTERRUPTED)
-		object:UnregisterEvent("UNIT_SPELLCAST_INTERRUPTIBLE", UNIT_SPELLCAST_INTERRUPTIBLE)
-		object:UnregisterEvent("UNIT_SPELLCAST_NOT_INTERRUPTIBLE", UNIT_SPELLCAST_NOT_INTERRUPTIBLE)
-		object:UnregisterEvent("UNIT_SPELLCAST_DELAYED", UNIT_SPELLCAST_DELAYED)
-		object:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_START", UNIT_SPELLCAST_CHANNEL_START)
-		object:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE", UNIT_SPELLCAST_CHANNEL_UPDATE)
-		object:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_STOP", UNIT_SPELLCAST_CHANNEL_STOP)
-		--object:UnregisterEvent("UPDATE_TRADESKILL_RECAST", UPDATE_TRADESKILL_RECAST)
-
-		castbar:SetScript("OnUpdate", nil)
-	end
-end
-
-oUF:AddElement('Castbar', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/combat.lua b/Interface/AddOns/SVUI/libs/oUF/elements/combat.lua
deleted file mode 100644
index cd8c478..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/combat.lua
+++ /dev/null
@@ -1,56 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local Update = function(self, event)
-	local combat = self.Combat
-	if(combat.PreUpdate) then
-		combat:PreUpdate()
-	end
-
-	local inCombat = UnitAffectingCombat('player')
-	if(inCombat) then
-		combat:Show()
-	else
-		combat:Hide()
-	end
-
-	if(combat.PostUpdate) then
-		return combat:PostUpdate(inCombat)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.Combat.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate')
-end
-
-local Enable = function(self, unit)
-	local combat = self.Combat
-	if(combat and unit == 'player') then
-		combat.__owner = self
-		combat.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent("PLAYER_REGEN_DISABLED", Path, true)
-		self:RegisterEvent("PLAYER_REGEN_ENABLED", Path, true)
-
-		if(combat:IsObjectType"Texture" and not combat:GetTexture()) then
-			combat:SetTexture[[Interface\CharacterFrame\UI-StateIcon]]
-			combat:SetTexCoord(.5, 1, 0, .49)
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	if(self.Combat) then
-		self.Combat:Hide()
-		self:UnregisterEvent("PLAYER_REGEN_DISABLED", Path)
-		self:UnregisterEvent("PLAYER_REGEN_ENABLED", Path)
-	end
-end
-
-oUF:AddElement('Combat', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/cpoints.lua b/Interface/AddOns/SVUI/libs/oUF/elements/cpoints.lua
deleted file mode 100644
index ee12aec..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/cpoints.lua
+++ /dev/null
@@ -1,77 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local GetComboPoints = GetComboPoints
-local MAX_COMBO_POINTS = MAX_COMBO_POINTS
-
-local Update = function(self, event, unit)
-	if(unit == 'pet') then return end
-
-	local cpoints = self.CPoints
-	if(cpoints.PreUpdate) then
-		cpoints:PreUpdate()
-	end
-
-	local cp
-	if(UnitHasVehicleUI'player') then
-		cp = GetComboPoints('vehicle', 'target')
-	else
-		cp = GetComboPoints('player', 'target')
-	end
-
-	for i=1, MAX_COMBO_POINTS do
-		if(i <= cp) then
-			cpoints[i]:Show()
-		else
-			cpoints[i]:Hide()
-		end
-	end
-
-	if(cpoints.PostUpdate) then
-		return cpoints:PostUpdate(cp)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.CPoints.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-local Enable = function(self)
-	local cpoints = self.CPoints
-	if(cpoints) then
-		cpoints.__owner = self
-		cpoints.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('UNIT_COMBO_POINTS', Path, true)
-		self:RegisterEvent('PLAYER_TARGET_CHANGED', Path, true)
-		self:RegisterEvent('UNIT_AURA', Path, true)
-
-		for index = 1, MAX_COMBO_POINTS do
-			local cpoint = cpoints[index]
-			if(cpoint:IsObjectType'Texture' and not cpoint:GetTexture()) then
-				cpoint:SetTexture[[Interface\ComboFrame\ComboPoint]]
-				cpoint:SetTexCoord(0, 0.375, 0, 1)
-			end
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local cpoints = self.CPoints
-	if(cpoints) then
-		for index = 1, MAX_COMBO_POINTS do
-			cpoints[index]:Hide()
-		end
-		self:UnregisterEvent('UNIT_COMBO_POINTS', Path)
-		self:UnregisterEvent('PLAYER_TARGET_CHANGED', Path)
-		self:UnregisterEvent('UNIT_AURA', Path)
-	end
-end
-
-oUF:AddElement('CPoints', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/druidmana.lua b/Interface/AddOns/SVUI/libs/oUF/elements/druidmana.lua
deleted file mode 100644
index 2dc1673..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/druidmana.lua
+++ /dev/null
@@ -1,114 +0,0 @@
--- Druid Mana Bar for Cat and Bear forms
--- Authors: Califpornia aka Ennie // some code taken from oUF`s EclipseBar element
-if(select(2, UnitClass('player')) ~= 'DRUID') then return end
-
-local _, ns = ...
-local oUF = ns.oUF
-
-local function Update(self, event, unit, powertype)
-	--only the player frame will have this unit enable
-	--i mainly place this check for UNIT_DISPLAYPOWER and entering a vehicle
-	if(unit ~= 'player' or (powertype and powertype ~= 'MANA')) then return end
-
-	local druidmana = self.DruidMana
-	if(druidmana.PreUpdate) then druidmana:PreUpdate(unit) end
-
-	--check form
-	if(UnitPowerType('player') == SPELL_POWER_MANA) then
-		return druidmana:Hide()
-	else
-		druidmana:Show()
-	end
-
-	local min, max = UnitPower('player', SPELL_POWER_MANA), UnitPowerMax('player', SPELL_POWER_MANA)
-	druidmana:SetMinMaxValues(0, max)
-	druidmana:SetValue(min)
-
-	local r, g, b, t
-	if(druidmana.colorClass) then
-		t = self.colors.class['DRUID']
-	elseif(druidmana.colorSmooth) then
-		r, g, b = self.ColorGradient(min, max, unpack(druidmana.smoothGradient or self.colors.smooth))
-	elseif(druidmana.colorPower) then
-		t = self.colors.power['MANA']
-	end
-
-	if(t) then
-		r, g, b = t[1], t[2], t[3]
-	end
-
-	if(b) then
-		druidmana:SetStatusBarColor(r, g, b)
-
-		local bg = druidmana.bg
-		if(bg) then
-			local mu = bg.multiplier or 1
-			bg:SetVertexColor(r * mu, g * mu, b * mu)
-		end
-	end
-
-	if(druidmana.PostUpdate) then
-		return druidmana:PostUpdate(unit, min, max)
-	end
-end
-
-local function Path(self, ...)
-	return (self.DruidMana.Override or Update) (self, ...)
-end
-
-local function ForceUpdate(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-local OnDruidManaUpdate
-do
-	local UnitPower = UnitPower
-	OnDruidManaUpdate = function(self)
-		local unit = self.__owner.unit
-		local mana = UnitPower(unit, SPELL_POWER_MANA)
-
-		if(mana ~= self.min) then
-			self.min = mana
-			return Path(self.__owner, 'OnDruidManaUpdate', unit)
-		end
-	end
-end
-
-local Enable = function(self, unit)
-	local druidmana = self.DruidMana
-	if(druidmana and unit == 'player') then
-		druidmana.__owner = self
-		druidmana.ForceUpdate = ForceUpdate
-
-		if(druidmana.frequentUpdates) then
-			druidmana:SetScript('OnUpdate', OnDruidManaUpdate)
-		else
-			self:RegisterEvent('UNIT_POWER', Path)
-		end
-
-		self:RegisterEvent('UNIT_DISPLAYPOWER', Path)
-		self:RegisterEvent('UNIT_MAXPOWER', Path)
-
-		if(druidmana:IsObjectType'StatusBar' and not druidmana:GetStatusBarTexture()) then
-			druidmana:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local druidmana = self.DruidMana
-	if(druidmana) then
-		if(druidmana:GetScript'OnUpdate') then
-			druidmana:SetScript("OnUpdate", nil)
-		else
-			self:UnregisterEvent('UNIT_POWER', Path)
-		end
-
-		self:UnregisterEvent('UNIT_DISPLAYPOWER', Path)
-		self:UnregisterEvent('UNIT_MAXPOWER', Path)
-	end
-end
-
-oUF:AddElement('DruidMana', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/eclipsebar.lua b/Interface/AddOns/SVUI/libs/oUF/elements/eclipsebar.lua
deleted file mode 100644
index 648aa06..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/eclipsebar.lua
+++ /dev/null
@@ -1,141 +0,0 @@
-if(select(2, UnitClass('player')) ~= 'DRUID') then return end
-
-local parent, ns = ...
-local oUF = ns.oUF
-
-local ECLIPSE_BAR_SOLAR_BUFF_ID = ECLIPSE_BAR_SOLAR_BUFF_ID
-local ECLIPSE_BAR_LUNAR_BUFF_ID = ECLIPSE_BAR_LUNAR_BUFF_ID
-local SPELL_POWER_ECLIPSE = SPELL_POWER_ECLIPSE
-local MOONKIN_FORM = MOONKIN_FORM
-
-local UNIT_POWER = function(self, event, unit, powerType)
-	if(self.unit ~= unit or (event == 'UNIT_POWER' and powerType ~= 'ECLIPSE')) then return end
-
-	local eb = self.EclipseBar
-
-	local power = UnitPower('player', SPELL_POWER_ECLIPSE)
-	local maxPower = UnitPowerMax('player', SPELL_POWER_ECLIPSE)
-
-	if(eb.LunarBar) then
-		eb.LunarBar:SetMinMaxValues(-maxPower, maxPower)
-		eb.LunarBar:SetValue(power)
-	end
-
-	if(eb.SolarBar) then
-		eb.SolarBar:SetMinMaxValues(-maxPower, maxPower)
-		eb.SolarBar:SetValue(power * -1)
-	end
-
-	if(eb.PostUpdatePower) then
-		return eb:PostUpdatePower(unit)
-	end
-end
-
-local UPDATE_VISIBILITY = function(self, event)
-	local eb = self.EclipseBar
-
-	-- check form/mastery
-	local showBar
-	local form = GetShapeshiftFormID()
-	if(not form) then
-		local ptt = GetSpecialization()
-		if(ptt and ptt == 1) then -- player has balance spec
-			showBar = true
-		end
-	elseif(form == MOONKIN_FORM) then
-		showBar = true
-	end
-
-	if(showBar) then
-		eb:Show()
-	else
-		eb:Hide()
-	end
-
-	if(eb.PostUpdateVisibility) then
-		return eb:PostUpdateVisibility(self.unit)
-	end
-end
-
-local UNIT_AURA = function(self, event, unit)
-	if(self.unit ~= unit) or not unit then return end
-
-	local i = 1
-	local hasSolarEclipse, hasLunarEclipse
-	repeat
-		local _, _, _, _, _, _, _, _, _, _, spellID = UnitAura(unit, i, 'HELPFUL')
-
-		if(spellID == ECLIPSE_BAR_SOLAR_BUFF_ID) then
-			hasSolarEclipse = true
-		elseif(spellID == ECLIPSE_BAR_LUNAR_BUFF_ID) then
-			hasLunarEclipse = true
-		end
-
-		i = i + 1
-	until not spellID
-
-	local eb = self.EclipseBar
-	eb.hasSolarEclipse = hasSolarEclipse
-	eb.hasLunarEclipse = hasLunarEclipse
-
-	if(eb.PostUnitAura) then
-		return eb:PostUnitAura(unit)
-	end
-end
-
-local ECLIPSE_DIRECTION_CHANGE = function(self, event, isLunar)
-	local eb = self.EclipseBar
-
-	eb.directionIsLunar = isLunar
-
-	if(eb.PostDirectionChange) then
-		return eb:PostDirectionChange(self.unit)
-	end
-end
-
-local Update = function(self, ...)
-	UNIT_POWER(self, ...)
-	UNIT_AURA(self, ...)
-	return UPDATE_VISIBILITY(self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Update(element.__owner, 'ForceUpdate', element.__owner.unit, 'ECLIPSE')
-end
-
-local function Enable(self)
-	local eb = self.EclipseBar
-	if(eb) then
-		eb.__owner = self
-		eb.ForceUpdate = ForceUpdate
-
-		if(eb.LunarBar and eb.LunarBar:IsObjectType'StatusBar' and not eb.LunarBar:GetStatusBarTexture()) then
-			eb.LunarBar:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
-		end
-		if(eb.SolarBar and eb.SolarBar:IsObjectType'StatusBar' and not eb.SolarBar:GetStatusBarTexture()) then
-			eb.SolarBar:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
-		end
-
-		self:RegisterEvent('ECLIPSE_DIRECTION_CHANGE', ECLIPSE_DIRECTION_CHANGE, true)
-		self:RegisterEvent('PLAYER_TALENT_UPDATE', UPDATE_VISIBILITY, true)
-		self:RegisterEvent('UNIT_AURA', UNIT_AURA)
-		self:RegisterEvent('UNIT_POWER', UNIT_POWER)
-		self:RegisterEvent('UPDATE_SHAPESHIFT_FORM', UPDATE_VISIBILITY, true)
-
-		return true
-	end
-end
-
-local function Disable(self)
-	local eb = self.EclipseBar
-	if(eb) then
-		eb:Hide()
-		self:UnregisterEvent('ECLIPSE_DIRECTION_CHANGE', ECLIPSE_DIRECTION_CHANGE)
-		self:UnregisterEvent('PLAYER_TALENT_UPDATE', UPDATE_VISIBILITY)
-		self:UnregisterEvent('UNIT_AURA', UNIT_AURA)
-		self:UnregisterEvent('UNIT_POWER', UNIT_POWER)
-		self:UnregisterEvent('UPDATE_SHAPESHIFT_FORM', UPDATE_VISIBILITY)
-	end
-end
-
-oUF:AddElement('EclipseBar', Update, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/healprediction.lua b/Interface/AddOns/SVUI/libs/oUF/elements/healprediction.lua
deleted file mode 100644
index a1f5a94..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/healprediction.lua
+++ /dev/null
@@ -1,168 +0,0 @@
-local _, ns = ...
-local oUF = ns.oUF
-
-local function Update(self, event, unit)
-	if(self.unit ~= unit) or not unit then return end
-
-	local hp = self.HealPrediction
-	hp.parent = self
-	if(hp.PreUpdate) then hp:PreUpdate(unit) end
-
-	local myIncomingHeal = UnitGetIncomingHeals(unit, 'player') or 0
-	local allIncomingHeal = UnitGetIncomingHeals(unit) or 0
-	local totalAbsorb = UnitGetTotalAbsorbs(unit) or 0
-	local myCurrentHealAbsorb = UnitGetTotalHealAbsorbs(unit) or 0
-	local health, maxHealth = UnitHealth(unit), UnitHealthMax(unit)
-
-	local overHealAbsorb = false
-	if(health < myCurrentHealAbsorb) then
-		overHealAbsorb = true
-		myCurrentHealAbsorb = health
-	end
-
-	if(health - myCurrentHealAbsorb + allIncomingHeal > maxHealth * hp.maxOverflow) then
-		allIncomingHeal = maxHealth * hp.maxOverflow - health + myCurrentHealAbsorb
-	end
-
-	local otherIncomingHeal = 0
-	if(allIncomingHeal < myIncomingHeal) then
-		myIncomingHeal = allIncomingHeal
-	else
-		otherIncomingHeal = allIncomingHeal - myIncomingHeal
-	end
-
-	local overAbsorb = false
-	if(health - myCurrentHealAbsorb + allIncomingHeal + totalAbsorb >= maxHealth or health + totalAbsorb >= maxHealth) then
-		if(totalAbsorb > 0) then
-			overAbsorb = true
-		end
-
-		if(allIncomingHeal > myCurrentHealAbsorb) then
-			totalAbsorb = max(0, maxHealth - (health - myCurrentHealAbsorb + allIncomingHeal))
-		else
-			totalAbsorb = max(0, maxHealth - health)
-		end
-	end
-
-	if(myCurrentHealAbsorb > allIncomingHeal) then
-		myCurrentHealAbsorb = myCurrentHealAbsorb - allIncomingHeal
-	else
-		myCurrentHealAbsorb = 0
-	end
-
-	if(hp.myBar) then
-		hp.myBar:SetMinMaxValues(0, maxHealth)
-		hp.myBar:SetValue(myIncomingHeal)
-		hp.myBar:Show()
-	end
-
-	if(hp.otherBar) then
-		hp.otherBar:SetMinMaxValues(0, maxHealth)
-		hp.otherBar:SetValue(otherIncomingHeal)
-		hp.otherBar:Show()
-	end
-
-	if(hp.absorbBar) then
-		hp.absorbBar:SetMinMaxValues(0, maxHealth)
-		hp.absorbBar:SetValue(totalAbsorb)
-		hp.absorbBar:Show()
-	end
-
-	if(hp.healAbsorbBar) then
-		hp.healAbsorbBar:SetMinMaxValues(0, maxHealth)
-		hp.healAbsorbBar:SetValue(myCurrentHealAbsorb)
-		hp.healAbsorbBar:Show()
-	end
-
-	if(hp.PostUpdate) then
-		return hp:PostUpdate(unit, overAbsorb, overHealAbsorb)
-	end
-end
-
-local function Path(self, ...)
-	return (self.HealPrediction.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-local function Enable(self)
-	local hp = self.HealPrediction
-	if(hp) then
-		hp.__owner = self
-		hp.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('UNIT_HEAL_PREDICTION', Path)
-		self:RegisterEvent('UNIT_MAXHEALTH', Path)
-		if(hp.frequentUpdates) then
-			self:RegisterEvent('UNIT_HEALTH_FREQUENT', Path)
-		else
-			self:RegisterEvent('UNIT_HEALTH', Path)
-		end
-		self:RegisterEvent('UNIT_ABSORB_AMOUNT_CHANGED', Path)
-		self:RegisterEvent('UNIT_HEAL_ABSORB_AMOUNT_CHANGED', Path)
-
-		if(not hp.maxOverflow) then
-			hp.maxOverflow = 1.05
-		end
-
-		if(hp.myBar) then
-			if(hp.myBar:IsObjectType'StatusBar' and not hp.myBar:GetStatusBarTexture()) then
-				hp.myBar:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
-			end
-
-			hp.myBar:Show()
-		end
-		if(hp.otherBar) then
-			if(hp.otherBar:IsObjectType'StatusBar' and not hp.otherBar:GetStatusBarTexture()) then
-				hp.otherBar:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
-			end
-
-			hp.otherBar:Show()
-		end
-		if(hp.absorbBar) then
-			if(hp.absorbBar:IsObjectType'StatusBar' and not hp.absorbBar:GetStatusBarTexture()) then
-				hp.absorbBar:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
-			end
-
-			hp.absorbBar:Show()
-		end
-		if(hp.healAbsorbBar) then
-			if(hp.healAbsorbBar:IsObjectType'StatusBar' and not hp.healAbsorbBar:GetStatusBarTexture()) then
-				hp.healAbsorbBar:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
-			end
-
-			hp.healAbsorbBar:Show()
-		end
-
-		return true
-	end
-end
-
-local function Disable(self)
-	local hp = self.HealPrediction
-	if(hp) then
-		if(hp.myBar) then
-			hp.myBar:Hide()
-		end
-		if(hp.otherBar) then
-			hp.otherBar:Hide()
-		end
-		if(hp.absorbBar) then
-			hp.absorbBar:Hide()
-		end
-		if(hp.healAbsorbBar) then
-			hp.healAbsorbBar:Hide()
-		end
-
-		self:UnregisterEvent('UNIT_HEAL_PREDICTION', Path)
-		self:UnregisterEvent('UNIT_MAXHEALTH', Path)
-		self:UnregisterEvent('UNIT_HEALTH', Path)
-		self:UnregisterEvent('UNIT_HEALTH_FREQUENT', Path)
-		self:UnregisterEvent('UNIT_ABSORB_AMOUNT_CHANGED', Path)
-		self:UnregisterEvent('UNIT_HEAL_ABSORB_AMOUNT_CHANGED', Path)
-	end
-end
-
-oUF:AddElement('HealPrediction', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/health.lua b/Interface/AddOns/SVUI/libs/oUF/elements/health.lua
deleted file mode 100644
index 3019292..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/health.lua
+++ /dev/null
@@ -1,262 +0,0 @@
---[[ Element: Health Bar
-
-	THIS FILE HEAVILY MODIFIED FOR USE WITH SUPERVILLAIN UI
-
-]]
-local parent, ns = ...
-local oUF = ns.oUF
-local updateFrequentUpdates
-local random = math.random
-oUF.colors.health = {49/255, 207/255, 37/255}
-
-local Update = function(self, event, unit)
-	if(self.unit ~= unit) or not unit then return end
-	local health = self.Health
-
-	local min, max = UnitHealth(unit), UnitHealthMax(unit)
-	local disconnected = not UnitIsConnected(unit)
-	local invisible = ((min == max) or UnitIsDeadOrGhost(unit) or disconnected)
-	if invisible then health.lowAlerted = false end
-
-	if health.fillInverted then
-		health:SetReverseFill(true)
-	end
-
-	health:SetMinMaxValues(0, max)
-
-	local percent = 100
-	if(disconnected) then
-		health:SetValue(max)
-		percent = 100
-	else
-		health:SetValue(min)
-		percent = (min / max) * 100
-	end
-
-	percent = invisible and 100 or ((min / max) * 100)
-
-	health.percent = percent
-	health.disconnected = disconnected
-
-	if health.frequentUpdates ~= health.__frequentUpdates then
-		health.__frequentUpdates = health.frequentUpdates
-		updateFrequentUpdates(self)
-	end
-
-	local bg = health.bg;
-	local db = oUF.SVConfigs;
-	local r, g, b, t, t2;
-
-	if(health.colorTapping and not UnitPlayerControlled(unit) and UnitIsTapped(unit) and not UnitIsTappedByPlayer(unit) and not UnitIsTappedByAllThreatList(unit)) then
-		t = oUF.colors.tapped
-	elseif(health.colorDisconnected and not UnitIsConnected(unit)) then
-		t = oUF.colors.disconnected
-	elseif(health.colorClass and UnitIsPlayer(unit)) or
-		(health.colorClassNPC and not UnitIsPlayer(unit)) or
-		(health.colorClassPet and UnitPlayerControlled(unit) and not UnitIsPlayer(unit)) then
-		local _, class = UnitClass(unit)
-		local tmp = oUF.colors.class[class] or oUF.colors.health
-		t = {(tmp[1] * 0.75),(tmp[2] * 0.75),(tmp[3] * 0.75)}
-		if(bg and (db and db.classbackdrop) and UnitIsPlayer(unit)) then
-			t2 = t
-		end
-	elseif(health.colorReaction and UnitReaction(unit, 'player')) then
-		t = oUF.colors.reaction[UnitReaction(unit, "player")]
-		if(bg and (db and db.classbackdrop) and not UnitIsPlayer(unit) and UnitReaction(unit, "player")) then
-			t2 = t
-		end
-	elseif(health.colorSmooth) then
-		r, g, b = oUF.ColorGradient(min, max, unpack(health.smoothGradient or oUF.colors.smooth))
-	elseif(health.colorHealth) then
-		t = oUF.colors.health
-	end
-
-	if(t) then
-		r, g, b = t[1], t[2], t[3]
-	end
-
-	if(b) then
-		if(db and db.healthclass == true and db.colorhealthbyvalue == true or db.colorhealthbyvalue and self.isForced and not(UnitIsTapped(unit) and not UnitIsTappedByPlayer(unit))) then
-			r, g, b = self.ColorGradient(min,max,1,0,0,1,1,0,r,g,b)
-		end
-		health:SetStatusBarColor(r, g, b)
-		if(bg) then
-			local mu = bg.multiplier or 1
-			if(t2) then
-				r, g, b = t2[1], t2[2], t2[3]
-			end
-			bg:SetVertexColor(r * mu, g * mu, b * mu)
-		end
-	end
-
-	if self.ResurrectIcon then
-		self.ResurrectIcon:SetAlpha(min == 0 and 1 or 0)
-	end
-
-	if self.isForced then
-		min = random(1,max)
-		health:SetValue(min)
-	end
-
-	if(health.gridMode) then
-		health:SetOrientation("VERTICAL")
-	end
-
-	if(health.LowAlertFunc and UnitIsPlayer("target") and health.percent < 6 and UnitIsEnemy("target", "player") and not health.lowAlerted) then
-		health.lowAlerted = true
-		health.LowAlertFunc(self)
-	end
-
-	if(health.PostUpdate) then
-		return health.PostUpdate(self, health.percent)
-	end
-end
-
-local CustomUpdate = function(self, event, unit)
-	if(self.unit ~= unit) or not unit then return end
-	local health = self.Health
-
-	local min, max = UnitHealth(unit), UnitHealthMax(unit)
-	local disconnected = not UnitIsConnected(unit)
-	local invisible = ((min == max) or UnitIsDeadOrGhost(unit) or disconnected);
-	local tapped = (UnitIsTapped(unit) and (not UnitIsTappedByPlayer(unit)));
-	if invisible then health.lowAlerted = false end
-
-	if health.fillInverted then
-		health:SetReverseFill(true)
-	end
-
-	health:SetMinMaxValues(-max, 0)
-	health:SetValue(-min)
-
-	health.percent = invisible and 100 or ((min / max) * 100)
-
-	health.disconnected = disconnected
-
-	if health.frequentUpdates ~= health.__frequentUpdates then
-		health.__frequentUpdates = health.frequentUpdates
-		updateFrequentUpdates(self)
-	end
-
-	local bg = health.bg;
-	local mu
-	if(max == 0) then
-		mu = 0
-	else
-		mu = (min / max)
-	end
-
-	if(invisible or not health.overlayAnimation) then
-		health.animation[1].anim:Stop()
-		health.animation[1]:SetAlpha(0)
-	end
-
-	if(invisible) then
-		health:SetStatusBarColor(0.6,0.4,1,0.5)
-		health.animation[1]:SetVertexColor(0.8,0.3,1,0.4)
-	elseif(health.colorOverlay) then
-		local t = oUF_Villain.colors.health
-		health:SetStatusBarColor(t[1], t[2], t[3], 0.9)
-	else
-		health:SetStatusBarColor(1, 0.25 * mu, 0, 0.85)
-		health.animation[1]:SetVertexColor(1, 0.1 * mu, 0, 0.5)
-	end
-
-	if(bg) then
-		bg:SetVertexColor(0,0,0,0)
-	end
-
-	if(health.overlayAnimation and not invisible) then
-		if(mu <= 0.25) then
-			health.animation[1]:SetAlpha(1)
-			health.animation[1].anim:Play()
-		else
-			health.animation[1].anim:Stop()
-			health.animation[1]:SetAlpha(0)
-		end
-	end
-
-	if self.ResurrectIcon then
-		self.ResurrectIcon:SetAlpha(min == 0 and 1 or 0)
-	end
-
-	if self.isForced then
-		local current = random(1,max)
-		health:SetValue(-current)
-	end
-
-	if(health.LowAlertFunc and UnitIsPlayer("target") and health.percent < 6 and UnitIsEnemy("target", "player") and not health.lowAlerted) then
-		health.lowAlerted = true
-		health.LowAlertFunc(self)
-	end
-
-	if(health.PostUpdate) then
-		return health.PostUpdate(self, health.percent)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.Health.Override and CustomUpdate or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-function updateFrequentUpdates(self)
-	local health = self.Health
-	if health.frequentUpdates and not self:IsEventRegistered("UNIT_HEALTH_FREQUENT") then
-		if GetCVarBool("predictedHealth") ~= 1 then
-			SetCVar("predictedHealth", 1)
-		end
-
-		self:RegisterEvent('UNIT_HEALTH_FREQUENT', Path)
-
-		if self:IsEventRegistered("UNIT_HEALTH") then
-			self:UnregisterEvent("UNIT_HEALTH", Path)
-		end
-	elseif not self:IsEventRegistered("UNIT_HEALTH") then
-		self:RegisterEvent('UNIT_HEALTH', Path)
-
-		if self:IsEventRegistered("UNIT_HEALTH_FREQUENT") then
-			self:UnregisterEvent("UNIT_HEALTH_FREQUENT", Path)
-		end
-	end
-end
-
-local Enable = function(self, unit)
-	local health = self.Health
-	if(health) then
-		health.__owner = self
-		health.ForceUpdate = ForceUpdate
-		health.__frequentUpdates = health.frequentUpdates
-		updateFrequentUpdates(self)
-
-		self:RegisterEvent("UNIT_MAXHEALTH", Path)
-		self:RegisterEvent('UNIT_CONNECTION', Path)
-
-		-- For tapping.
-		self:RegisterEvent('UNIT_FACTION', Path)
-
-		if(health:IsObjectType'StatusBar' and not health:GetStatusBarTexture()) then
-			health:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local health = self.Health
-	if(health) then
-		health:Hide()
-		self:UnregisterEvent('UNIT_HEALTH_FREQUENT', Path)
-		self:UnregisterEvent('UNIT_HEALTH', Path)
-		self:UnregisterEvent('UNIT_MAXHEALTH', Path)
-		self:UnregisterEvent('UNIT_CONNECTION', Path)
-
-		self:UnregisterEvent('UNIT_FACTION', Path)
-	end
-end
-
-oUF:AddElement('Health', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/leader.lua b/Interface/AddOns/SVUI/libs/oUF/elements/leader.lua
deleted file mode 100644
index 5246716..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/leader.lua
+++ /dev/null
@@ -1,56 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local Update = function(self, event)
-	local leader = self.Leader
-	if(leader.PreUpdate) then
-		leader:PreUpdate()
-	end
-
-	local unit = self.unit
-	local isLeader = (UnitInParty(unit) or UnitInRaid(unit)) and UnitIsGroupLeader(unit)
-	if(isLeader) then
-		leader:Show()
-	else
-		leader:Hide()
-	end
-
-	if(leader.PostUpdate) then
-		return leader:PostUpdate(isLeader)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.Leader.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate')
-end
-
-local Enable = function(self)
-	local leader = self.Leader
-	if(leader) then
-		leader.__owner = self
-		leader.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent("PARTY_LEADER_CHANGED", Path, true)
-		self:RegisterEvent("GROUP_ROSTER_UPDATE", Path, true)
-
-		if(leader:IsObjectType"Texture" and not leader:GetTexture()) then
-			leader:SetTexture[[Interface\GroupFrame\UI-Group-LeaderIcon]]
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local leader = self.Leader
-	if(leader) then
-		self:UnregisterEvent("PARTY_LEADER_CHANGED", Path)
-		self:UnregisterEvent("GROUP_ROSTER_UPDATE", Path)
-	end
-end
-
-oUF:AddElement('Leader', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/lfdrole.lua b/Interface/AddOns/SVUI/libs/oUF/elements/lfdrole.lua
deleted file mode 100644
index b5ad1bc..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/lfdrole.lua
+++ /dev/null
@@ -1,59 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local Update = function(self, event)
-	local lfdrole = self.LFDRole
-	if(lfdrole.PreUpdate) then
-		lfdrole:PreUpdate()
-	end
-
-	local role = UnitGroupRolesAssigned(self.unit)
-	if(role == 'TANK' or role == 'HEALER' or role == 'DAMAGER') then
-		lfdrole:SetTexCoord(GetTexCoordsForRoleSmallCircle(role))
-		lfdrole:Show()
-	else
-		lfdrole:Hide()
-	end
-
-	if(lfdrole.PostUpdate) then
-		return lfdrole:PostUpdate(role)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.LFDRole.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate')
-end
-
-local Enable = function(self)
-	local lfdrole = self.LFDRole
-	if(lfdrole) then
-		lfdrole.__owner = self
-		lfdrole.ForceUpdate = ForceUpdate
-
-		if(self.unit == "player") then
-			self:RegisterEvent("PLAYER_ROLES_ASSIGNED", Path, true)
-		else
-			self:RegisterEvent("GROUP_ROSTER_UPDATE", Path, true)
-		end
-
-		if(lfdrole:IsObjectType"Texture" and not lfdrole:GetTexture()) then
-			lfdrole:SetTexture[[Interface\LFGFrame\UI-LFG-ICON-PORTRAITROLES]]
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local lfdrole = self.LFDRole
-	if(lfdrole) then
-		self:UnregisterEvent("PLAYER_ROLES_ASSIGNED", Path)
-		self:UnregisterEvent("GROUP_ROSTER_UPDATE", Path)
-	end
-end
-
-oUF:AddElement('LFDRole', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/masterlooter.lua b/Interface/AddOns/SVUI/libs/oUF/elements/masterlooter.lua
deleted file mode 100644
index 3299fab..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/masterlooter.lua
+++ /dev/null
@@ -1,74 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local Update = function(self, event)
-	local unit = self.unit
-	local masterlooter = self.MasterLooter
-	if(not (UnitInParty(unit) or UnitInRaid(unit))) then
-		return masterlooter:Hide()
-	end
-
-	if(masterlooter.PreUpdate) then
-		masterlooter:PreUpdate()
-	end
-
-	local method, pid, rid = GetLootMethod()
-	if(method == 'master') then
-		local mlUnit
-		if(pid) then
-			if(pid == 0) then
-				mlUnit = 'player'
-			else
-				mlUnit = 'party'..pid
-			end
-		elseif(rid) then
-			mlUnit = 'raid'..rid
-		end
-
-		if(UnitIsUnit(unit, mlUnit)) then
-			masterlooter:Show()
-		elseif(masterlooter:IsShown()) then
-			masterlooter:Hide()
-		end
-	else
-		masterlooter:Hide()
-	end
-
-	if(masterlooter.PostUpdate) then
-		return masterlooter:PostUpdate(masterlooter:IsShown())
-	end
-end
-
-local Path = function(self, ...)
-	return (self.MasterLooter.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate')
-end
-
-local function Enable(self, unit)
-	local masterlooter = self.MasterLooter
-	if(masterlooter) then
-		masterlooter.__owner = self
-		masterlooter.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('PARTY_LOOT_METHOD_CHANGED', Path, true)
-		self:RegisterEvent('GROUP_ROSTER_UPDATE', Path, true)
-
-		if(masterlooter:IsObjectType('Texture') and not masterlooter:GetTexture()) then
-			masterlooter:SetTexture([[Interface\GroupFrame\UI-Group-MasterLooter]])
-		end
-
-		return true
-	end
-end
-
-local function Disable(self)
-	if(self.MasterLooter) then
-		self:UnregisterEvent('PARTY_LOOT_METHOD_CHANGED', Path)
-		self:UnregisterEvent('GROUP_ROSTER_UPDATE', Path)
-	end
-end
-
-oUF:AddElement('MasterLooter', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/picon.lua b/Interface/AddOns/SVUI/libs/oUF/elements/picon.lua
deleted file mode 100644
index ecfaefa..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/picon.lua
+++ /dev/null
@@ -1,53 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local Update = function(self, event)
-	local picon = self.PhaseIcon
-	if(picon.PreUpdate) then
-		picon:PreUpdate()
-	end
-
-	local inPhase = UnitInPhase(self.unit)
-	if(inPhase) then
-		picon:Hide()
-	else
-		picon:Show()
-	end
-
-	if(picon.PostUpdate) then
-		return picon:PostUpdate(inPhase)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.PhaseIcon.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate')
-end
-
-local Enable = function(self)
-	local picon = self.PhaseIcon
-	if(picon) then
-		picon.__owner = self
-		picon.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('UNIT_PHASE', Path, true)
-
-		if(picon:IsObjectType'Texture' and not picon:GetTexture()) then
-			picon:SetTexture[[Interface\TargetingFrame\UI-PhasingIcon]]
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local picon = self.PhaseIcon
-	if(picon) then
-		self:UnregisterEvent('UNIT_PHASE', Path)
-	end
-end
-
-oUF:AddElement('PhaseIcon', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/portraits.lua b/Interface/AddOns/SVUI/libs/oUF/elements/portraits.lua
deleted file mode 100644
index 66b810b..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/portraits.lua
+++ /dev/null
@@ -1,114 +0,0 @@
---[[ Element: Portraits
-
-	THIS FILE HEAVILY MODIFIED FOR USE WITH SUPERVILLAIN UI
-
-]]
-local parent, ns = ...
-local oUF = ns.oUF
-
-local Update = function(self, event, unit)
-	if(not unit or not UnitIsUnit(self.unit, unit)) then return end
-
-	local portrait = self.Portrait
-	if(portrait.PreUpdate) then portrait:PreUpdate(unit) end
-
-	if(portrait:IsObjectType'Model') then
-		local guid = UnitGUID(unit)
-		local camera = portrait.UserCamDistance or 1
-		local rotate = portrait.UserRotation
-		if(not UnitExists(unit) or not UnitIsConnected(unit) or not UnitIsVisible(unit)) then
-			portrait:SetCamDistanceScale(1)
-			portrait:SetPortraitZoom(0)
-			portrait:SetPosition(4,-1,1)
-			portrait:ClearModel()
-			portrait:SetModel([[Spells\Monk_travelingmist_missile.m2]])
-			portrait.guid = nil
-			portrait:SetBackdropColor(0.25,0.25,0.25)
-			if portrait.UpdateColor then
-				portrait:UpdateColor(0.25,0.25,0.25)
-			end
-		elseif(portrait.guid ~= guid or event == 'UNIT_MODEL_CHANGED') then
-			portrait:SetCamDistanceScale(camera)
-			portrait:SetPortraitZoom(1)
-			portrait:SetPosition(0,0,0)
-			portrait:ClearModel()
-			portrait:SetUnit(unit)
-			portrait.guid = guid
-
-			if(rotate and portrait:GetFacing() ~= rotate / 60) then
-				portrait:SetFacing(rotate / 60)
-			end
-
-			local r, g, b, color = 0.25, 0.25, 0.25
-			if not UnitIsPlayer(unit)then
-				color = self.colors.reaction[UnitReaction(unit,"player")]
-				if(color ~= nil) then
-					r,g,b = color[1], color[2], color[3]
-				end
-			else
-				local _,unitClass = UnitClass(unit)
-				if unitClass then
-					color = self.colors.class[unitClass]
-					r,g,b = color[1], color[2], color[3]
-				end
-			end
-			portrait:SetBackdropColor(r,g,b)
-			if portrait.UpdateColor then
-				portrait:UpdateColor(r,g,b)
-			end
-		end
-	else
-		SetPortraitTexture(portrait, unit)
-	end
-
-	if(portrait.PostUpdate) then
-		return portrait:PostUpdate(unit)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.Portrait.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-local Enable = function(self, unit)
-	local portrait = self.Portrait
-	if(portrait) then
-		portrait.__owner = self
-		portrait.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent("UNIT_PORTRAIT_UPDATE", Path)
-		self:RegisterEvent("UNIT_MODEL_CHANGED", Path)
-		self:RegisterEvent('UNIT_CONNECTION', Path)
-		if(unit == 'target' or unit == 'targettarget') then
-			self:RegisterEvent('PLAYER_TARGET_CHANGED', Path)
-		end
-		-- The quest log uses PARTY_MEMBER_{ENABLE,DISABLE} to handle updating of
-		-- party members overlapping quests. This will probably be enough to handle
-		-- model updating.
-		--
-		-- DISABLE isn't used as it fires when we most likely don't have the
-		-- information we want.
-		if(unit == 'party') then
-			self:RegisterEvent('PARTY_MEMBER_ENABLE', Path)
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local portrait = self.Portrait
-	if(portrait) then
-		self:UnregisterEvent("UNIT_PORTRAIT_UPDATE", Path)
-		self:UnregisterEvent("UNIT_MODEL_CHANGED", Path)
-		self:UnregisterEvent('PARTY_MEMBER_ENABLE', Path)
-		self:UnregisterEvent('UNIT_CONNECTION', Path)
-		self:UnregisterEvent('PLAYER_TARGET_CHANGED', Path)
-	end
-end
-
-oUF:AddElement('Portrait', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/power.lua b/Interface/AddOns/SVUI/libs/oUF/elements/power.lua
deleted file mode 100644
index 9275a54..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/power.lua
+++ /dev/null
@@ -1,153 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local updateFrequentUpdates
-oUF.colors.power = {}
-for power, color in next, PowerBarColor do
-	if(type(power) == 'string') then
-		oUF.colors.power[power] = {color.r, color.g, color.b}
-	end
-end
-local GetDisplayPower = function(power, unit)
-	if not unit then return; end
-	local _, _, _, _, _, _, showOnRaid = UnitAlternatePowerInfo(unit)
-	if(power.displayAltPower and showOnRaid) then
-		return ALTERNATE_POWER_INDEX
-	else
-		return (UnitPowerType(unit))
-	end
-end
-
-local Update = function(self, event, unit)
-	if(self.unit ~= unit) or not unit then return end
-	local power = self.Power
-
-	if(power.PreUpdate) then power:PreUpdate(unit) end
-
-	local displayType = GetDisplayPower(power, unit)
-	local min, max = UnitPower(unit, displayType), UnitPowerMax(unit, displayType)
-	local disconnected = not UnitIsConnected(unit)
-	if max == 0 then
-		max = 1
-	end
-	power:SetMinMaxValues(0, max)
-
-	if(disconnected) then
-		power:SetValue(max)
-	else
-		power:SetValue(min)
-	end
-
-	power.disconnected = disconnected
-	if power.frequentUpdates ~= power.__frequentUpdates then
-		power.__frequentUpdates = power.frequentUpdates
-		updateFrequentUpdates(self)
-	end
-
-	local r, g, b, t
-	if(power.colorTapping and not UnitPlayerControlled(unit) and UnitIsTapped(unit) and not UnitIsTappedByPlayer(unit) and not UnitIsTappedByAllThreatList(unit)) then
-		t = self.colors.tapped
-	elseif(power.colorDisconnected and not UnitIsConnected(unit)) then
-		t = self.colors.disconnected
-	elseif(power.colorPower) then
-		local ptype, ptoken, altR, altG, altB = UnitPowerType(unit)
-		t = self.colors.power[ptoken]
-		if(not t and altR) then
-			r, g, b = altR, altG, altB
-		end
-	elseif(power.colorClass and UnitIsPlayer(unit)) or
-		(power.colorClassNPC and not UnitIsPlayer(unit)) or
-		(power.colorClassPet and UnitPlayerControlled(unit) and not UnitIsPlayer(unit)) then
-		local _, class = UnitClass(unit)
-		t = self.colors.class[class]
-	elseif(power.colorReaction and UnitReaction(unit, 'player')) then
-		t = self.colors.reaction[UnitReaction(unit, "player")]
-	elseif(power.colorSmooth) then
-		r, g, b = self.ColorGradient(min, max, unpack(power.smoothGradient or self.colors.smooth))
-	end
-
-	if(t) then
-		r, g, b = t[1], t[2], t[3]
-	end
-
-	if(b) then
-		power:SetStatusBarColor(r, g, b)
-
-		local bg = power.bg
-		if(bg) then
-			local mu = bg.multiplier or 1
-			bg:SetVertexColor(r * mu, g * mu, b * mu)
-		end
-	end
-
-	if(power.PostUpdate) then
-		return power:PostUpdate(unit, min, max)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.Power.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-function updateFrequentUpdates(self)
-	local power = self.Power
-	if power.frequentUpdates and not self:IsEventRegistered('UNIT_POWER_FREQUENT') then
-		self:RegisterEvent('UNIT_POWER_FREQUENT', Path)
-
-		if self:IsEventRegistered('UNIT_POWER') then
-			self:UnregisterEvent('UNIT_POWER', Path)
-		end
-	elseif not self:IsEventRegistered('UNIT_POWER') then
-		self:RegisterEvent('UNIT_POWER', Path)
-
-		if self:IsEventRegistered('UNIT_POWER_FREQUENT') then
-			self:UnregisterEvent('UNIT_POWER_FREQUENT', Path)
-		end
-	end
-end
-
-local Enable = function(self, unit)
-	local power = self.Power
-	if(power) then
-		power.__owner = self
-		power.ForceUpdate = ForceUpdate
-
-		power.__frequentUpdates = power.frequentUpdates
-		updateFrequentUpdates(self)
-
-		self:RegisterEvent('UNIT_POWER_BAR_SHOW', Path)
-		self:RegisterEvent('UNIT_POWER_BAR_HIDE', Path)
-		self:RegisterEvent('UNIT_DISPLAYPOWER', Path)
-		self:RegisterEvent('UNIT_CONNECTION', Path)
-		self:RegisterEvent('UNIT_MAXPOWER', Path)
-
-		-- For tapping.
-		self:RegisterEvent('UNIT_FACTION', Path)
-
-		if(power:IsObjectType'StatusBar' and not power:GetStatusBarTexture()) then
-			power:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local power = self.Power
-	if(power) then
-		self:UnregisterEvent('UNIT_POWER_FREQUENT', Path)
-		self:UnregisterEvent('UNIT_POWER', Path)
-		self:UnregisterEvent('UNIT_POWER_BAR_SHOW', Path)
-		self:UnregisterEvent('UNIT_POWER_BAR_HIDE', Path)
-		self:UnregisterEvent('UNIT_DISPLAYPOWER', Path)
-		self:UnregisterEvent('UNIT_CONNECTION', Path)
-		self:UnregisterEvent('UNIT_MAXPOWER', Path)
-		self:UnregisterEvent('UNIT_FACTION', Path)
-	end
-end
-
-oUF:AddElement('Power', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/pvp.lua b/Interface/AddOns/SVUI/libs/oUF/elements/pvp.lua
deleted file mode 100644
index 27d7d74..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/pvp.lua
+++ /dev/null
@@ -1,61 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local Update = function(self, event, unit)
-	if(unit ~= self.unit) then return end
-
-	local pvp = self.PvP
-	if(pvp.PreUpdate) then
-		pvp:PreUpdate()
-	end
-
-	local status
-	local factionGroup = UnitFactionGroup(unit)
-	if(UnitIsPVPFreeForAll(unit)) then
-		pvp:SetTexture[[Interface\TargetingFrame\UI-PVP-FFA]]
-		status = 'ffa'
-	elseif(factionGroup and factionGroup ~= 'Neutral' and UnitIsPVP(unit)) then
-		pvp:SetTexture([[Interface\TargetingFrame\UI-PVP-]]..factionGroup)
-		status = factionGroup
-	end
-
-	if(status) then
-		pvp:Show()
-	else
-		pvp:Hide()
-	end
-
-	if(pvp.PostUpdate) then
-		return pvp:PostUpdate(status)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.PvP.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-local Enable = function(self)
-	local pvp = self.PvP
-	if(pvp) then
-		pvp.__owner = self
-		pvp.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent("UNIT_FACTION", Path)
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local pvp = self.PvP
-	if(pvp) then
-		pvp:Hide()
-		self:UnregisterEvent("UNIT_FACTION", Path)
-	end
-end
-
-oUF:AddElement('PvP', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/qicon.lua b/Interface/AddOns/SVUI/libs/oUF/elements/qicon.lua
deleted file mode 100644
index cc2e4a6..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/qicon.lua
+++ /dev/null
@@ -1,54 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local Update = function(self, event, unit)
-	if(unit ~= self.unit) then return end
-
-	local qicon = self.QuestIcon
-	if(qicon.PreUpdate) then
-		qicon:PreUpdate()
-	end
-
-	local isQuestBoss = UnitIsQuestBoss(unit)
-	if(isQuestBoss) then
-		qicon:Show()
-	else
-		qicon:Hide()
-	end
-
-	if(qicon.PostUpdate) then
-		return qicon:PostUpdate(isQuestBoss)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.QuestIcon.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-local Enable = function(self)
-	local qicon = self.QuestIcon
-	if(qicon) then
-		qicon.__owner = self
-		qicon.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('UNIT_CLASSIFICATION_CHANGED', Path)
-
-		if(qicon:IsObjectType'Texture' and not qicon:GetTexture()) then
-			qicon:SetTexture[[Interface\TargetingFrame\PortraitQuestBadge]]
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	if(self.QuestIcon) then
-		self:UnregisterEvent('UNIT_CLASSIFICATION_CHANGED', Path)
-	end
-end
-
-oUF:AddElement('QuestIcon', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/range.lua b/Interface/AddOns/SVUI/libs/oUF/elements/range.lua
deleted file mode 100644
index 5978aac..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/range.lua
+++ /dev/null
@@ -1,250 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local _FRAMES = {}
-local OnRangeFrame
-
-local UnitIsConnected = UnitIsConnected
-local tinsert, tremove, twipe = table.insert, table.remove, table.wipe
-
-local friendlySpells, resSpells, longEnemySpells, enemySpells, petSpells = {}, {}, {}, {}, {}
-
-local function AddSpell(table, spellID)
-	local name = GetSpellInfo(spellID)
-	if name then
-		local usable, nomana = IsUsableSpell(name)
-		if usable or nomana then
-			table[#table + 1] = name
-		end
-	end
-end
-
-local _,class = UnitClass("player")
-local function UpdateSpellList()
-	twipe(friendlySpells)
-	twipe(resSpells)
-	twipe(longEnemySpells)
-	twipe(enemySpells)
-	twipe(petSpells)
-
-	if class == "PRIEST" then
-		AddSpell(enemySpells, 585) -- Smite
-		AddSpell(longEnemySpells, 589) -- Shadow Word: Pain
-		AddSpell(friendlySpells, 2061) -- Flash Heal
-		AddSpell(resSpells, 2006) -- Resurrection
-	elseif class == "DRUID" then
-		AddSpell(enemySpells, 33786) -- Cyclone
-		AddSpell(longEnemySpells, 5176) -- Wrath
-		AddSpell(friendlySpells, 774) -- Rejuvenation
-		AddSpell(resSpells, 50769) -- Revive
-		AddSpell(resSpells, 20484) -- Rebirth
-	elseif class == "PALADIN" then
-		AddSpell(enemySpells, 20271) -- Judgement
-		AddSpell(friendlySpells, 85673) -- Word of Glory
-		AddSpell(resSpells, 7328) -- Redemption
-		AddSpell(longEnemySpells, 114165) -- Holy Prism
-		AddSpell(longEnemySpells, 114157) -- Execution Sentence
-	elseif class == "SHAMAN" then
-		AddSpell(enemySpells, 8042) -- Earth Shock
-		AddSpell(longEnemySpells, 403) -- Lightning Bolt
-		AddSpell(friendlySpells, 8004) -- Healing Surge
-		AddSpell(resSpells, 2008) -- Ancestral Spirit
-	elseif class == "WARLOCK" then
-		AddSpell(enemySpells, 5782) -- Fear
-		AddSpell(longEnemySpells, 172) -- Corruption
-		AddSpell(longEnemySpells, 686) -- Shadow Bolt
-		AddSpell(longEnemySpells, 17962) -- Conflag
-		AddSpell(petSpells, 755) -- Health Funnel
-		AddSpell(friendlySpells, 5697) -- Unending Breath
-	elseif class == "MAGE" then
-		AddSpell(enemySpells, 118) -- Polymorph
-		AddSpell(longEnemySpells, 44614) -- Frostfire Bolt
-		AddSpell(friendlySpells, 475) -- Remove Curse
-	elseif class == "HUNTER" then
-		AddSpell(petSpells, 136) -- Mend Pet
-		AddSpell(enemySpells, 75) -- Auto Shot
-	elseif class == "DEATHKNIGHT" then
-		AddSpell(enemySpells, 49576) -- Death Grip
-		AddSpell(friendlySpells, 47541) -- Death Coil
-		AddSpell(resSpells, 61999) -- Raise Ally
-	elseif class == "ROGUE" then
-		AddSpell(enemySpells, 2094) -- Blind
-		AddSpell(longEnemySpells, 1725) -- Distract
-		AddSpell(friendlySpells, 57934) -- Tricks of the Trade
-	elseif class == "WARRIOR" then
-		AddSpell(enemySpells, 5246) -- Intimidating Shout
-		AddSpell(enemySpells, 100) -- Charge
-		AddSpell(longEnemySpells, 355) -- Taunt
-		AddSpell(friendlySpells, 3411) -- Intervene
-	elseif class == "MONK" then
-		AddSpell(enemySpells, 115546) -- Provoke
-		AddSpell(friendlySpells, 115450) -- Detox
-		AddSpell(resSpells, 115178) -- Resuscitate
-	end
-end
-
-local function getUnit(unit)
-	if not unit:find("party") or not unit:find("raid") then
-		for i=1, 4 do
-			if UnitIsUnit(unit, "party"..i) then
-				return "party"..i
-			end
-		end
-
-		for i=1, 40 do
-			if UnitIsUnit(unit, "raid"..i) then
-				return "raid"..i
-			end
-		end
-	else
-		return unit
-	end
-end
-
-local function friendlyIsInRange(unit)
-	if CheckInteractDistance(unit, 1) then
-		return true
-	end
-
-	if UnitIsDeadOrGhost(unit) and #resSpells > 0 then
-		for _, name in ipairs(resSpells) do
-			if IsSpellInRange(name, unit) == 1 then
-				return true
-			end
-		end
-
-		return false
-	end
-
-	if #friendlySpells == 0 and (UnitInRaid(unit) or UnitInParty(unit)) then
-		unit = getUnit(unit)
-		return unit and UnitInRange(unit)
-	else
-		for _, name in ipairs(friendlySpells) do
-			if IsSpellInRange(name, unit) == 1 then
-				return true
-			end
-		end
-	end
-
-	return false
-end
-
-local function petIsInRange(unit)
-	if CheckInteractDistance(unit, 2) then
-		return true
-	end
-
-	for _, name in ipairs(friendlySpells) do
-		if IsSpellInRange(name, unit) == 1 then
-			return true
-		end
-	end
-	for _, name in ipairs(petSpells) do
-		if IsSpellInRange(name, unit) == 1 then
-			return true
-		end
-	end
-
-	return false
-end
-
-local function enemyIsInRange(unit)
-	for _, name in ipairs(enemySpells) do
-		if IsSpellInRange(name, unit) == 1 then
-			return true
-		end
-	end
-
-	return false
-end
-
-local function enemyIsInLongRange(unit)
-	for _, name in ipairs(longEnemySpells) do
-		if IsSpellInRange(name, unit) == 1 then
-			return true
-		end
-	end
-
-	return false
-end
-
--- updating of range.
-local timer = 0
-local OnRangeUpdate = function(self, elapsed)
-	timer = timer + elapsed
-
-	if(timer >= .20) then
-		for _, object in next, _FRAMES do
-			if(object:IsShown()) then
-				local range = object.Range
-				local unit = object.unit
-				if(unit) then
-					if UnitCanAttack("player", unit) then
-						if enemyIsInRange(unit) then
-							object:SetAlpha(range.insideAlpha)
-						elseif enemyIsInLongRange(unit) then
-							object:SetAlpha(range.insideAlpha)
-						else
-							object:SetAlpha(range.outsideAlpha)
-						end
-					elseif UnitIsUnit(unit, "pet") then
-						if petIsInRange(unit) then
-							object:SetAlpha(range.insideAlpha)
-						else
-							object:SetAlpha(range.outsideAlpha)
-						end
-					else
-						if friendlyIsInRange(unit) and UnitIsConnected(unit) then
-							object:SetAlpha(range.insideAlpha)
-						else
-							object:SetAlpha(range.outsideAlpha)
-						end
-					end
-				else
-					object:SetAlpha(range.insideAlpha)
-				end
-			end
-		end
-
-		timer = 0
-	end
-end
-
-local Enable = function(self)
-	local range = self.Range
-	if(range and range.insideAlpha and range.outsideAlpha) then
-		tinsert(_FRAMES, self)
-
-		if(not OnRangeFrame) then
-			OnRangeFrame = CreateFrame"Frame"
-			OnRangeFrame:RegisterEvent("LEARNED_SPELL_IN_TAB");
-			OnRangeFrame:RegisterEvent("PLAYER_ENTERING_WORLD");
-			OnRangeFrame:SetScript("OnUpdate", OnRangeUpdate)
-			OnRangeFrame:SetScript("OnEvent", UpdateSpellList)
-		end
-
-		OnRangeFrame:Show()
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local range = self.Range
-	if(range) then
-		for k, frame in next, _FRAMES do
-			if(frame == self) then
-				tremove(_FRAMES, k)
-				frame:SetAlpha(1)
-				break
-			end
-		end
-
-		if(#_FRAMES == 0) then
-			OnRangeFrame:Hide()
-		end
-	end
-end
-
-oUF:AddElement('Range', nil, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/readycheck.lua b/Interface/AddOns/SVUI/libs/oUF/elements/readycheck.lua
deleted file mode 100644
index 1326eb8..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/readycheck.lua
+++ /dev/null
@@ -1,130 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local _TIMERS = {}
-local ReadyCheckFrame
-
-local removeEntry = function(icon)
-	_TIMERS[icon] = nil
-	if(not next(_TIMERS)) then
-		return ReadyCheckFrame:Hide()
-	end
-end
-
-local Start = function(self)
-	removeEntry(self)
-
-	self:SetTexture(READY_CHECK_WAITING_TEXTURE)
-	self.state = 'waiting'
-	self:SetAlpha(1)
-	self:Show()
-end
-
-local Confirm = function(self, ready)
-	removeEntry(self)
-
-	if(ready) then
-		self:SetTexture(READY_CHECK_READY_TEXTURE)
-		self.state = 'ready'
-	else
-		self:SetTexture(READY_CHECK_NOT_READY_TEXTURE)
-		self.state = 'notready'
-	end
-
-	self:SetAlpha(1)
-	self:Show()
-end
-
-local Finish = function(self)
-	if(self.state == 'waiting') then
-		self:SetTexture(READY_CHECK_AFK_TEXTURE)
-		self.state = 'afk'
-	end
-
-	self.finishedTimer = self.finishedTime or 10
-	self.fadeTimer = self.fadeTime or 1.5
-
-	_TIMERS[self] = true
-	ReadyCheckFrame:Show()
-end
-
-local OnUpdate = function(self, elapsed)
-	self.elapsed = (self.elapsed or 0) + elapsed
-	if self.elapsed < .25 then return end
-
-	for icon in next, _TIMERS do
-		if(icon.finishedTimer) then
-			icon.finishedTimer = icon.finishedTimer - self.elapsed
-			if(icon.finishedTimer <= 0) then
-				icon.finishedTimer = nil
-			end
-		elseif(icon.fadeTimer) then
-			icon.fadeTimer = icon.fadeTimer - self.elapsed
-			icon:SetAlpha(icon.fadeTimer / (icon.fadeTime or 1.5))
-
-			if(icon.fadeTimer <= 0) then
-				icon:Hide()
-				removeEntry(icon)
-			end
-		end
-	end
-
-	self.elapsed = 0
-end
-
-local Update = function(self, event)
-	local unit = self.unit
-	local readyCheck = self.ReadyCheck
-	if(event == 'READY_CHECK_FINISHED') then
-		Finish(readyCheck)
-	else
-		local status = GetReadyCheckStatus(unit)
-		if(UnitExists(unit) and status) then
-			if(status == 'ready') then
-				Confirm(readyCheck, 1)
-			elseif(status == 'notready') then
-				Confirm(readyCheck)
-			else
-				Start(readyCheck)
-			end
-		end
-	end
-end
-
-local Path = function(self, ...)
-	return (self.ReadyCheck.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate')
-end
-
-local Enable = function(self, unit)
-	local readyCheck = self.ReadyCheck
-	if(readyCheck and (unit and (unit:sub(1, 5) == 'party' or unit:sub(1,4) == 'raid'))) then
-		readyCheck.__owner = self
-		readyCheck.ForceUpdate = ForceUpdate
-
-		if(not ReadyCheckFrame) then
-			ReadyCheckFrame = CreateFrame'Frame'
-			ReadyCheckFrame:SetScript('OnUpdate', OnUpdate)
-		end
-
-		self:RegisterEvent('READY_CHECK', Path, true)
-		self:RegisterEvent('READY_CHECK_CONFIRM', Path, true)
-		self:RegisterEvent('READY_CHECK_FINISHED', Path, true)
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local readyCheck = self.ReadyCheck
-	if(readyCheck) then
-		self:UnregisterEvent('READY_CHECK', Path)
-		self:UnregisterEvent('READY_CHECK_CONFIRM', Path)
-		self:UnregisterEvent('READY_CHECK_FINISHED', Path)
-	end
-end
-
-oUF:AddElement('ReadyCheck', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/resting.lua b/Interface/AddOns/SVUI/libs/oUF/elements/resting.lua
deleted file mode 100644
index ab1de54..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/resting.lua
+++ /dev/null
@@ -1,54 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local Update = function(self, event)
-	local resting = self.Resting
-	if(resting.PreUpdate) then
-		resting:PreUpdate()
-	end
-
-	local isResting = IsResting()
-	if(isResting) then
-		resting:Show()
-	else
-		resting:Hide()
-	end
-
-	if(resting.PostUpdate) then
-		return resting:PostUpdate(isResting)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.Resting.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate')
-end
-
-local Enable = function(self, unit)
-	local resting = self.Resting
-	if(resting and unit == 'player') then
-		resting.__owner = self
-		resting.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent("PLAYER_UPDATE_RESTING", Path, true)
-
-		if(resting:IsObjectType"Texture" and not resting:GetTexture()) then
-			resting:SetTexture[[Interface\CharacterFrame\UI-StateIcon]]
-			resting:SetTexCoord(0, .5, 0, .421875)
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local resting = self.Resting
-	if(resting) then
-		self:UnregisterEvent("PLAYER_UPDATE_RESTING", Path)
-	end
-end
-
-oUF:AddElement('Resting', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/resurrect.lua b/Interface/AddOns/SVUI/libs/oUF/elements/resurrect.lua
deleted file mode 100644
index e6fc1ab..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/resurrect.lua
+++ /dev/null
@@ -1,54 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local Update = function(self, event)
-	if not self.unit then return; end
-	local resurrect = self.ResurrectIcon
-	if(resurrect.PreUpdate) then
-		resurrect:PreUpdate()
-	end
-
-	local incomingResurrect = UnitHasIncomingResurrection(self.unit)
-	if(incomingResurrect) then
-		resurrect:Show()
-	else
-		resurrect:Hide()
-	end
-
-	if(resurrect.PostUpdate) then
-		return resurrect:PostUpdate(incomingResurrect)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.ResurrectIcon.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate')
-end
-
-local Enable = function(self)
-	local resurrect = self.ResurrectIcon
-	if(resurrect) then
-		resurrect.__owner = self
-		resurrect.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('INCOMING_RESURRECT_CHANGED', Path, true)
-
-		if(resurrect:IsObjectType('Texture') and not resurrect:GetTexture()) then
-			resurrect:SetTexture[[Interface\RaidFrame\Raid-Icon-Rez]]
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local resurrect = self.ResurrectIcon
-	if(resurrect) then
-		self:UnregisterEvent('INCOMING_RESURRECT_CHANGED', Path)
-	end
-end
-
-oUF:AddElement('ResurrectIcon', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/ricons.lua b/Interface/AddOns/SVUI/libs/oUF/elements/ricons.lua
deleted file mode 100644
index d990b62..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/ricons.lua
+++ /dev/null
@@ -1,59 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local GetRaidTargetIndex = GetRaidTargetIndex
-local SetRaidTargetIconTexture = SetRaidTargetIconTexture
-
-local Update = function(self, event)
-	if not self.unit then return end
-	local icon = self.RaidIcon
-	if(icon.PreUpdate) then
-		icon:PreUpdate()
-	end
-
-	local index = GetRaidTargetIndex(self.unit)
-	if(index) then
-		SetRaidTargetIconTexture(icon, index)
-		icon:Show()
-	else
-		icon:Hide()
-	end
-
-	if(icon.PostUpdate) then
-		return icon:PostUpdate(index)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.RaidIcon.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	if(not element.__owner.unit) then return end
-	return Path(element.__owner, 'ForceUpdate')
-end
-
-local Enable = function(self)
-	local ricon = self.RaidIcon
-	if(ricon) then
-		ricon.__owner = self
-		ricon.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent("RAID_TARGET_UPDATE", Path, true)
-
-		if(ricon:IsObjectType"Texture" and not ricon:GetTexture()) then
-			ricon:SetTexture[[Interface\TargetingFrame\UI-RaidTargetingIcons]]
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local ricon = self.RaidIcon
-	if(ricon) then
-		self:UnregisterEvent("RAID_TARGET_UPDATE", Path)
-	end
-end
-
-oUF:AddElement('RaidIcon', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/runebar.lua b/Interface/AddOns/SVUI/libs/oUF/elements/runebar.lua
deleted file mode 100644
index 45f02cb..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/runebar.lua
+++ /dev/null
@@ -1,168 +0,0 @@
---[[ Element: Runes Bar
-
- Handle updating and visibility of the Death Knight's Rune indicators.
-
- Widget
-
- Runes - An array holding six StatusBar's.
-
- Sub-Widgets
-
- .bg - A Texture which functions as a background. It will inherit the color of
-       the main StatusBar.
-
- Notes
-
- The default StatusBar texture will be applied if the UI widget doesn't have a
-             status bar texture or color defined.
-
- Sub-Widgets Options
-
- .multiplier - Defines a multiplier, which is used to tint the background based
-               on the main widgets R, G and B values. Defaults to 1 if not
-               present.
-
- Examples
-
-   local Runes = {}
-   for index = 1, 6 do
-      -- Position and size of the rune bar indicators
-      local Rune = CreateFrame('StatusBar', nil, self)
-      Rune:SetSize(120 / 6, 20)
-      Rune:SetPoint('TOPLEFT', self, 'BOTTOMLEFT', index * 120 / 6, 0)
-
-      Runes[index] = Rune
-   end
-
-   -- Register with oUF
-   self.Runes = Runes
-]]
-
-if select(2, UnitClass("player")) ~= "DEATHKNIGHT" then return end
-
-
-local parent, ns = ...
-local oUF = ns.oUF
-local floor = math.floor
-
-oUF.colors.Runes = {
-	{1, 0, 0},   -- blood
-	{0, .5, 0},  -- unholy
-	{0, 1, 1},   -- frost
-	{.9, .1, 1}, -- death
-}
-
-local runemap = { 1, 2, 5, 6, 3, 4 }
-local BLOOD_OF_THE_NORTH = 54637
-local OnUpdate = function(self, elapsed)
-	local duration = self.duration + elapsed
-	if(duration >= self.max) then
-		return self:SetScript("OnUpdate", nil)
-	else
-		self.duration = duration
-		return self:SetValue(duration)
-	end
-end
-
-local spellName = GetSpellInfo(54637)
-local UpdateType = function(self, event, rid, alt)
-	local isUsable = IsUsableSpell(spellName)
-	local rune = self.Runes[runemap[rid]]
-	local runeType = GetRuneType(rid) or alt
-	if isUsable and runeType == 1 then runeType = 4; end
-	if not runeType then return; end
-	local colors = oUF.colors.Runes[runeType]
-	local r, g, b = colors[1], colors[2], colors[3]
-	rune:SetStatusBarColor(r, g, b)
-
-	if(rune.bg) then
-		local mu = rune.bg.multiplier or 1
-		rune.bg:SetVertexColor(r * mu, g * mu, b * mu)
-	end
-end
-
-local UpdateRune = function(self, event, rid)
-	local rune = self.Runes[runemap[rid]]
-	if(rune) then
-		local start, duration, runeReady = GetRuneCooldown(rid)
-		if(runeReady) then
-			rune:SetMinMaxValues(0, 1)
-			rune:SetValue(1)
-			rune:SetScript("OnUpdate", nil)
-		else
-			rune.duration = GetTime() - start
-			rune.max = duration
-			rune:SetMinMaxValues(1, duration)
-			rune:SetScript("OnUpdate", OnUpdate)
-		end
-	end
-end
-
-local Update = function(self, event)
-	for i=1, 6 do
-		UpdateRune(self, event, i)
-	end
-end
-
-local function UpdateAllRuneTypes(self)
-	if(self) then
-		for i=1, 6 do
-			UpdateType(self, nil, i)
-		end
-	end
-end
-
-local ForceUpdate = function(element)
-	return Update(element.__owner, 'ForceUpdate')
-end
-
-local Enable = function(self, unit)
-	local runes = self.Runes
-	if(runes and unit == 'player') then
-		runes.__owner = self
-		runes.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent("RUNE_POWER_UPDATE", UpdateRune, true)
-		self:RegisterEvent("RUNE_TYPE_UPDATE", UpdateType, true)	--I have no idea why this won't fire on initial login.
-		self:RegisterEvent("PLAYER_ENTERING_WORLD", UpdateAllRuneTypes)
-
-		if not runes.UpdateAllRuneTypes then runes.UpdateAllRuneTypes = UpdateAllRuneTypes end
-
-		for i=1, 6 do
-			local rune = runes[runemap[i]]
-			if(rune:IsObjectType'StatusBar' and not rune:GetStatusBarTexture()) then
-				rune:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
-			end
-
-			-- From my minor testing this is a okey solution. A full login always remove
-			-- the death runes, or at least the clients knowledge about them.
-			UpdateType(self, nil, i, floor((runemap[i]+1)/2))
-		end
-
-		-- oUF leaves the vehicle events registered on the player frame, so
-		-- buffs and such are correctly updated when entering/exiting vehicles.
-		--
-		-- This however makes the code also show/hide the RuneFrame.
-		RuneFrame.Show = RuneFrame.Hide
-		RuneFrame:Hide()
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	RuneFrame.Show = nil
-	RuneFrame:Show()
-
-
-	local runes = self.Runes
-	if(runes) then
-		runes:SetScript('OnUpdate', nil)
-
-		self:UnregisterEvent("RUNE_POWER_UPDATE", UpdateRune)
-		self:UnregisterEvent("RUNE_TYPE_UPDATE", UpdateType)
-		self:UnregisterEvent("PLAYER_ENTERING_WORLD", UpdateAllRuneTypes)
-	end
-end
-
-oUF:AddElement("Runes", Update, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/stagger.lua b/Interface/AddOns/SVUI/libs/oUF/elements/stagger.lua
deleted file mode 100644
index 6cc7dc9..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/stagger.lua
+++ /dev/null
@@ -1,140 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
--- percentages at which the bar should change color
-local STAGGER_YELLOW_TRANSITION = STAGGER_YELLOW_TRANSITION
-local STAGGER_RED_TRANSITION = STAGGER_RED_TRANSITION
-
--- table indices of bar colors
-local GREEN_INDEX = 1;
-local YELLOW_INDEX = 2;
-local RED_INDEX = 3;
-
-local STANCE_OF_THE_STURY_OX_ID = 23
-
-local UnitHealthMax = UnitHealthMax
-local UnitStagger = UnitStagger
-
-local _, playerClass = UnitClass("player")
-
--- TODO: fix color in the power element
-oUF.colors.power[BREWMASTER_POWER_BAR_NAME] = {
-	{0.52, 1.0, 0.52},
-	{1.0, 0.98, 0.72},
-	{1.0, 0.42, 0.42},
-}
-local color = oUF.colors.power[BREWMASTER_POWER_BAR_NAME]
-
-local function UpdateMaxValues(self)
-	local stagger = self.Stagger
-	if(stagger) then
-		local maxhealth = UnitHealthMax("player");
-		stagger:SetMinMaxValues(0, maxhealth);
-	end
-end
-
-local Update = function(self, event, unit)
-	if unit and unit ~= self.unit then return end
-	local element = self.Stagger
-
-	if(element.PreUpdate) then
-		element:PreUpdate()
-	end
-
-	local maxHealth = UnitHealthMax("player")
-	local stagger = UnitStagger("player")
-	local staggerPercent = stagger / maxHealth
-
-	element:SetMinMaxValues(0, maxHealth)
-	element:SetValue(stagger)
-
-	local rgb
-	if(staggerPercent >= STAGGER_RED_TRANSITION) then
-		rgb = color[RED_INDEX]
-	elseif(staggerPercent > STAGGER_YELLOW_TRANSITION) then
-		rgb = color[YELLOW_INDEX]
-	else
-		rgb = color[GREEN_INDEX]
-	end
-
-	local r, g, b = rgb[1], rgb[2], rgb[3]
-	element:SetStatusBarColor(r, g, b)
-
-	local bg = element.bg
-	if(bg) then
-		local mu = bg.multiplier or 1
-		bg:SetVertexColor(r * mu, g * mu, b * mu)
-	end
-
-	if(element.PostUpdate) then
-		element:PostUpdate(maxHealth, stagger, staggerPercent, r, g, b)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.Stagger.Override or Update)(self, ...)
-end
-
-local Visibility = function(self, event, unit)
-	if(STANCE_OF_THE_STURY_OX_ID ~= GetShapeshiftFormID() or UnitHasVehiclePlayerFrameUI("player")) then
-		if self.Stagger:IsShown() then
-			self.Stagger:Hide()
-			self:UnregisterEvent('UNIT_AURA', Path)
-		end
-	elseif not self.Stagger:IsShown() then
-		self.Stagger:Show()
-		self:RegisterEvent('UNIT_AURA', Path)
-		return Path(self, event, unit)
-	end
-end
-
-local VisibilityPath = function(self, ...)
-	return (self.Stagger.OverrideVisibility or Visibility)(self, ...)
-end
-
-local ForceUpdate = function(element)
-	return VisibilityPath(element.__owner, "ForceUpdate", element.__owner.unit)
-end
-
-local Enable = function(self, unit)
-	if(playerClass ~= "MONK" or unit ~= 'player') then return end
-
-	local element = self.Stagger
-	if(element) then
-		element.__owner = self
-		element.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('UNIT_DISPLAYPOWER', VisibilityPath)
-		self:RegisterEvent('UPDATE_SHAPESHIFT_FORM', VisibilityPath)
-
-		if(element:IsObjectType'StatusBar' and not element:GetStatusBarTexture()) then
-			element:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
-		end
-
-		MonkStaggerBar.Hide = MonkStaggerBar.Show
-		MonkStaggerBar:UnregisterEvent'PLAYER_ENTERING_WORLD'
-		MonkStaggerBar:UnregisterEvent'PLAYER_SPECIALIZATION_CHANGED'
-		MonkStaggerBar:UnregisterEvent'UNIT_DISPLAYPOWER'
-		MonkStaggerBar:UnregisterEvent'UPDATE_VEHICLE_ACTION_BAR'
-		return true
-	end
-end
-
-local Disable = function(self)
-	local element = self.Stagger
-	if(element) then
-		element:Hide()
-		self:UnregisterEvent('UNIT_AURA', Path)
-		self:UnregisterEvent('UNIT_DISPLAYPOWER', VisibilityPath)
-		self:UnregisterEvent('UPDATE_SHAPESHIFT_FORM', VisibilityPath)
-
-		MonkStaggerBar.Show = nil
-		MonkStaggerBar:Show()
-		MonkStaggerBar:UnregisterEvent'PLAYER_ENTERING_WORLD'
-		MonkStaggerBar:UnregisterEvent'PLAYER_SPECIALIZATION_CHANGED'
-		MonkStaggerBar:UnregisterEvent'UNIT_DISPLAYPOWER'
-		MonkStaggerBar:UnregisterEvent'UPDATE_VEHICLE_ACTION_BAR'
-	end
-end
-
-oUF:AddElement("Stagger", VisibilityPath, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/tags.lua b/Interface/AddOns/SVUI/libs/oUF/elements/tags.lua
deleted file mode 100644
index c7b6304..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/tags.lua
+++ /dev/null
@@ -1,761 +0,0 @@
---[[
--- Credits: Vika, Cladhaire, Tekkub
-]]
-
-local parent, ns = ...
-local oUF = ns.oUF
-
-local format = string.format
-local tinsert, tremove = table.insert, table.remove
-local _PATTERN = '%[..-%]+'
-
-local _ENV = {
-	Hex = function(r, g, b)
-		if type(r) == "table" then
-			if r.r then r, g, b = r.r, r.g, r.b else r, g, b = unpack(r) end
-		end
-		return format("|cff%02x%02x%02x", r*255, g*255, b*255)
-	end,
-	ColorGradient = oUF.ColorGradient,
-}
-local _PROXY = setmetatable(_ENV, {__index = _G})
-
-local tagStrings = {
-	["creature"] = [[function(u)
-		return UnitCreatureFamily(u) or UnitCreatureType(u)
-	end]],
-
-	["dead"] = [[function(u)
-		if(UnitIsDead(u)) then
-			return 'Dead'
-		elseif(UnitIsGhost(u)) then
-			return 'Ghost'
-		end
-	end]],
-
-	["difficulty"] = [[function(u)
-		if UnitCanAttack("player", u) then
-			local l = UnitLevel(u)
-			return Hex(GetQuestDifficultyColor((l > 0) and l or 99))
-		end
-	end]],
-
-	["leader"] = [[function(u)
-		if(UnitIsGroupLeader(u)) then
-			return 'L'
-		end
-	end]],
-
-	["leaderlong"]  = [[function(u)
-		if(UnitIsGroupLeader(u)) then
-			return 'Leader'
-		end
-	end]],
-
-	["level"] = [[function(u)
-		local l = UnitLevel(u)
-		if ( UnitIsWildBattlePet(u) or UnitIsBattlePetCompanion(u) ) then
-			l = UnitBattlePetLevel(u)
-		end
-
-		if(l > 0) then
-			return l
-		else
-			return '??'
-		end
-	end]],
-
-	["missinghp"] = [[function(u)
-		local current = UnitHealthMax(u) - UnitHealth(u)
-		if(current > 0) then
-			return current
-		end
-	end]],
-
-	["missingpp"] = [[function(u)
-		local current = UnitPowerMax(u) - UnitPower(u)
-		if(current > 0) then
-			return current
-		end
-	end]],
-
-	["name"] = [[function(u, r)
-		return UnitName(r or u)
-	end]],
-
-	["offline"] = [[function(u)
-		if(not UnitIsConnected(u)) then
-			return 'Offline'
-		end
-	end]],
-
-	["perhp"] = [[function(u)
-		local m = UnitHealthMax(u)
-		if(m == 0) then
-			return 0
-		else
-			return math.floor(UnitHealth(u)/m*100+.5)
-		end
-	end]],
-
-	["perpp"] = [[function(u)
-		local m = UnitPowerMax(u)
-		if(m == 0) then
-			return 0
-		else
-			return math.floor(UnitPower(u)/m*100+.5)
-		end
-	end]],
-
-	["plus"] = [[function(u)
-		local c = UnitClassification(u)
-		if(c == 'elite' or c == 'rareelite') then
-			return '+'
-		end
-	end]],
-
-	["pvp"] = [[function(u)
-		if(UnitIsPVP(u)) then
-			return 'PvP'
-		end
-	end]],
-
-	["raidcolor"] = [[function(u)
-		local _, x = UnitClass(u)
-		if(x) then
-			return Hex(_COLORS.class[x])
-		end
-	end]],
-
-	["rare"] = [[function(u)
-		local c = UnitClassification(u)
-		if(c == 'rare' or c == 'rareelite') then
-			return 'Rare'
-		end
-	end]],
-
-	["resting"] = [[function(u)
-		if(u == 'player' and IsResting()) then
-			return 'zzz'
-		end
-	end]],
-
-	["sex"] = [[function(u)
-		local s = UnitSex(u)
-		if(s == 2) then
-			return 'Male'
-		elseif(s == 3) then
-			return 'Female'
-		end
-	end]],
-
-	["smartclass"] = [[function(u)
-		if(UnitIsPlayer(u)) then
-			return _TAGS['class'](u)
-		end
-
-		return _TAGS['creature'](u)
-	end]],
-
-	["status"] = [[function(u)
-		if(UnitIsDead(u)) then
-			return 'Dead'
-		elseif(UnitIsGhost(u)) then
-			return 'Ghost'
-		elseif(not UnitIsConnected(u)) then
-			return 'Offline'
-		else
-			return _TAGS['resting'](u)
-		end
-	end]],
-
-	["threat"] = [[function(u)
-		local s = UnitThreatSituation(u)
-		if(s == 1) then
-			return '++'
-		elseif(s == 2) then
-			return '--'
-		elseif(s == 3) then
-			return 'Aggro'
-		end
-	end]],
-
-	["threatcolor"] = [[function(u)
-		return Hex(GetThreatStatusColor(UnitThreatSituation(u)))
-	end]],
-
-	["cpoints"] = [[function(u)
-		local cp
-		if(UnitHasVehicleUI'player') then
-			cp = GetComboPoints('vehicle', 'target')
-		else
-			cp = GetComboPoints('player', 'target')
-		end
-
-		if(cp > 0) then
-			return cp
-		end
-	end]],
-
-	['smartlevel'] = [[function(u)
-		local c = UnitClassification(u)
-		if(c == 'worldboss') then
-			return 'Boss'
-		else
-			local plus = _TAGS['plus'](u)
-			local level = _TAGS['level'](u)
-			if(plus) then
-				return level .. plus
-			else
-				return level
-			end
-		end
-	end]],
-
-	["classification"] = [[function(u)
-		local c = UnitClassification(u)
-		if(c == 'rare') then
-			return 'Rare'
-		elseif(c == 'rareelite') then
-			return 'Rare Elite'
-		elseif(c == 'elite') then
-			return 'Elite'
-		elseif(c == 'worldboss') then
-			return 'Boss'
-		elseif(c == 'minus') then
-			return 'Affix'
-		end
-	end]],
-
-	["shortclassification"] = [[function(u)
-		local c = UnitClassification(u)
-		if(c == 'rare') then
-			return 'R'
-		elseif(c == 'rareelite') then
-			return 'R+'
-		elseif(c == 'elite') then
-			return '+'
-		elseif(c == 'worldboss') then
-			return 'B'
-		elseif(c == 'minus') then
-			return '-'
-		end
-	end]],
-
-	["group"] = [[function(unit)
-		local name, server = UnitName(unit)
-		if(server and server ~= "") then
-			name = format("%s-%s", name, server)
-		end
-
-		for i=1, GetNumGroupMembers() do
-			local raidName, _, group = GetRaidRosterInfo(i)
-			if( raidName == name ) then
-				return group
-			end
-		end
-	end]],
-
-	["deficit:name"] = [[function(u)
-		local missinghp = _TAGS['missinghp'](u)
-		if(missinghp) then
-			return '-' .. missinghp
-		else
-			return _TAGS['name'](u)
-		end
-	end]],
-
-	['pereclipse'] = [[function(u)
-		local m = UnitPowerMax('player', SPELL_POWER_ECLIPSE)
-		if(m == 0) then
-			return 0
-		else
-			return math.abs(UnitPower('player', SPELL_POWER_ECLIPSE)/m*100)
-		end
-	end]],
-
-	['curmana'] = [[function(unit)
-		return UnitPower(unit, SPELL_POWER_MANA)
-	end]],
-
-	['maxmana'] = [[function(unit)
-		return UnitPowerMax(unit, SPELL_POWER_MANA)
-	end]],
-
-	['soulshards'] = [[function()
-		local num = UnitPower('player', SPELL_POWER_SOUL_SHARDS)
-		if(num > 0) then
-			return num
-		end
-	end]],
-
-	['holypower'] = [[function()
-		local num = UnitPower('player', SPELL_POWER_HOLY_POWER)
-		if(num > 0) then
-			return num
-		end
-	end]],
-
-	['chi'] = [[function()
-		local num = UnitPower('player', SPELL_POWER_CHI)
-		if(num > 0) then
-			return num
-		end
-	end]],
-
-	['shadoworbs'] = [[function()
-		local num = UnitPower('player', SPELL_POWER_SHADOW_ORBS)
-		if(num > 0) then
-			return num
-		end
-	end]],
-
-	['affix'] = [[function(u)
-		local c = UnitClassification(u)
-		if(c == 'minus') then
-			return 'Affix'
-		end
-	end]],
-}
-
-local tags = setmetatable(
-	{
-		curhp = UnitHealth,
-		curpp = UnitPower,
-		maxhp = UnitHealthMax,
-		maxpp = UnitPowerMax,
-		class = UnitClass,
-		faction = UnitFactionGroup,
-		race = UnitRace,
-	},
-
-	{
-		__index = function(self, key)
-			local tagFunc = tagStrings[key]
-			if(tagFunc) then
-				local func, err = loadstring('return ' .. tagFunc)
-				if(func) then
-					func = func()
-
-					-- Want to trigger __newindex, so no rawset.
-					self[key] = func
-					tagStrings[key] = nil
-
-					return func
-				else
-					error(err, 3)
-				end
-			end
-		end,
-		__newindex = function(self, key, val)
-			if(type(val) == 'string') then
-				tagStrings[key] = val
-			elseif(type(val) == 'function') then
-				-- So we don't clash with any custom envs.
-				if(getfenv(val) == _G) then
-					setfenv(val, _PROXY)
-				end
-
-				rawset(self, key, val)
-			end
-		end,
-	}
-)
-
-_ENV._TAGS = tags
-
-local onUpdateDelay = {}
-local tagEvents = {
-	["curhp"]               = "UNIT_HEALTH",
-	["dead"]                = "UNIT_HEALTH",
-	["leader"]              = "PARTY_LEADER_CHANGED",
-	["leaderlong"]          = "PARTY_LEADER_CHANGED",
-	["level"]               = "UNIT_LEVEL PLAYER_LEVEL_UP",
-	["maxhp"]               = "UNIT_MAXHEALTH",
-	["missinghp"]           = "UNIT_HEALTH UNIT_MAXHEALTH",
-	["name"]                = "UNIT_NAME_UPDATE",
-	["perhp"]               = "UNIT_HEALTH UNIT_MAXHEALTH",
-	["pvp"]                 = "UNIT_FACTION",
-	["resting"]             = "PLAYER_UPDATE_RESTING",
-	["smartlevel"]          = "UNIT_LEVEL PLAYER_LEVEL_UP UNIT_CLASSIFICATION_CHANGED",
-	["threat"]              = "UNIT_THREAT_SITUATION_UPDATE",
-	["threatcolor"]         = "UNIT_THREAT_SITUATION_UPDATE",
-	['cpoints']             = 'UNIT_COMBO_POINTS PLAYER_TARGET_CHANGED',
-	['affix']				= 'UNIT_CLASSIFICATION_CHANGED',
-	['plus']				= 'UNIT_CLASSIFICATION_CHANGED',
-	['rare']                = 'UNIT_CLASSIFICATION_CHANGED',
-	['classification']      = 'UNIT_CLASSIFICATION_CHANGED',
-	['shortclassification'] = 'UNIT_CLASSIFICATION_CHANGED',
-	["group"]               = "GROUP_ROSTER_UPDATE",
-	["curpp"]               = 'UNIT_POWER',
-	["maxpp"]               = 'UNIT_MAXPOWER',
-	["missingpp"]           = 'UNIT_MAXPOWER UNIT_POWER',
-	["perpp"]               = 'UNIT_MAXPOWER UNIT_POWER',
-	["offline"]             = "UNIT_HEALTH UNIT_CONNECTION",
-	["status"]              = "UNIT_HEALTH PLAYER_UPDATE_RESTING UNIT_CONNECTION",
-	["pereclipse"]          = 'UNIT_POWER',
-	['curmana']             = 'UNIT_POWER UNIT_MAXPOWER',
-	['maxmana']             = 'UNIT_POWER UNIT_MAXPOWER',
-	['soulshards']          = 'UNIT_POWER',
-	['holypower']           = 'UNIT_POWER',
-	['chi']                 = 'UNIT_POWER',
-	['shadoworbs']          = 'UNIT_POWER',
-}
-
-local unitlessEvents = {
-	PLAYER_LEVEL_UP = true,
-	PLAYER_UPDATE_RESTING = true,
-	PLAYER_TARGET_CHANGED = true,
-
-	PARTY_LEADER_CHANGED = true,
-
-	GROUP_ROSTER_UPDATE = true,
-
-	UNIT_COMBO_POINTS = true
-}
-
-local events = {}
-local frame = CreateFrame"Frame"
-frame:SetScript('OnEvent', function(self, event, unit)
-	local strings = events[event]
-	if(strings) then
-		for k, fontstring in next, strings do
-			if(fontstring:IsVisible() and (unitlessEvents[event] or fontstring.parent.unit == unit)) then
-				fontstring:UpdateTag()
-			end
-		end
-	end
-end)
-
-local OnUpdates = {}
-local eventlessUnits = {}
-
-local createOnUpdate = function(timer)
-	local OnUpdate = OnUpdates[timer]
-
-	if(not OnUpdate) then
-		local total = timer
-		local frame = CreateFrame'Frame'
-		local strings = eventlessUnits[timer]
-
-		frame:SetScript('OnUpdate', function(self, elapsed)
-			if(total >= timer) then
-				for k, fs in next, strings do
-					if(fs.parent:IsShown() and UnitExists(fs.parent.unit)) then
-						fs:UpdateTag()
-					end
-				end
-
-				total = 0
-			end
-
-			total = total + elapsed
-		end)
-
-		OnUpdates[timer] = frame
-	end
-end
-
-local OnShow = function(self)
-	for _, fs in next, self.__tags do
-		fs:UpdateTag()
-	end
-end
-
-local getTagName = function(tag)
-	local s = (tag:match('>+()') or 2)
-	local e = tag:match('.*()<+')
-	e = (e and e - 1) or -2
-
-	return tag:sub(s, e), s, e
-end
-
-local RegisterEvent = function(fontstr, event)
-	if(not events[event]) then events[event] = {} end
-
-	frame:RegisterEvent(event)
-	tinsert(events[event], fontstr)
-end
-
-local RegisterEvents = function(fontstr, tagstr)
-	for tag in tagstr:gmatch(_PATTERN) do
-		tag = getTagName(tag)
-		local tagevents = tagEvents[tag]
-		if(tagevents) then
-			for event in tagevents:gmatch'%S+' do
-				RegisterEvent(fontstr, event)
-			end
-		end
-	end
-end
-
-local UnregisterEvents = function(fontstr)
-	for event, data in pairs(events) do
-		for k, tagfsstr in pairs(data) do
-			if(tagfsstr == fontstr) then
-				if(#data == 1) then
-					frame:UnregisterEvent(event)
-				end
-
-				tremove(data, k)
-			end
-		end
-	end
-end
-
-local OnEnter = function(self)
-	for _, fs in pairs(self.__mousetags) do
-		fs:SetAlpha(1)
-	end
-end
-
-local OnLeave = function(self)
-	for _, fs in pairs(self.__mousetags) do
-		fs:SetAlpha(0)
-	end
-end
-
-local tagPool = {}
-local funcPool = {}
-local tmp = {}
-local escapeSequences = {
-	["||c"] = "|c",
-	["||r"] = "|r",
-	["||T"] = "|T",
-	["||t"] = "|t",
-}
-
-local Tag = function(self, fs, tagstr)
-	if(not fs or not tagstr) then return end
-
-	if(not self.__tags) then
-		self.__tags = {}
-		self.__mousetags = {}
-		tinsert(self.__elements, OnShow)
-	else
-		-- Since people ignore everything that's good practice - unregister the tag
-		-- if it already exists.
-		for _, tag in pairs(self.__tags) do
-			if(fs == tag) then
-				-- We don't need to remove it from the __tags table as Untag handles
-				-- that for us.
-				self:Untag(fs)
-			end
-		end
-	end
-
-	fs.parent = self
-
-	for escapeSequence, replacement in pairs(escapeSequences) do
-		while tagstr:find(escapeSequence) do
-			tagstr = tagstr:gsub(escapeSequence, replacement)
-		end
-	end
-
-	if tagstr:find('%[mouseover%]') then
-		tinsert(self.__mousetags, fs)
-		fs:SetAlpha(0)
-		if not self.__HookFunc then
-			self:HookScript('OnEnter', OnEnter)
-			self:HookScript('OnLeave', OnLeave)
-			self.__HookFunc = true;
-		end
-		tagstr = tagstr:gsub('%[mouseover%]', '')
-	else
-		for index, fontString in pairs(self.__mousetags) do
-			if fontString == fs then
-				self.__mousetags[index] = nil;
-				fs:SetAlpha(1)
-			end
-		end
-	end
-
-	local containsOnUpdate
-	for tag in tagstr:gmatch(_PATTERN) do
-		if not tagEvents[tag:sub(2, -2)] then
-			containsOnUpdate = onUpdateDelay[tag:sub(2, -2)] or 0.15;
-		end
-	end
-
-	local func = tagPool[tagstr]
-	if(not func) then
-		local format, numTags = tagstr:gsub('%%', '%%%%'):gsub(_PATTERN, '%%s')
-		local args = {}
-
-		for bracket in tagstr:gmatch(_PATTERN) do
-			local tagFunc = funcPool[bracket] or tags[bracket:sub(2, -2)]
-
-			if(not tagFunc) then
-				local tagName, s, e = getTagName(bracket)
-				local tag = tags[tagName]
-				if(tag) then
-					s = s - 2
-					e = e + 2
-
-					if(s ~= 0 and e ~= 0) then
-						local pre = bracket:sub(2, s)
-						local ap = bracket:sub(e, -2)
-
-						tagFunc = function(u,r)
-							local str = tag(u,r)
-							if(str) then
-								return pre..str..ap
-							end
-						end
-					elseif(s ~= 0) then
-						local pre = bracket:sub(2, s)
-
-						tagFunc = function(u,r)
-							local str = tag(u,r)
-							if(str) then
-								return pre..str
-							end
-						end
-					elseif(e ~= 0) then
-						local ap = bracket:sub(e, -2)
-
-						tagFunc = function(u,r)
-							local str = tag(u,r)
-							if(str) then
-								return str..ap
-							end
-						end
-					end
-
-					funcPool[bracket] = tagFunc
-				end
-			end
-
-			if(tagFunc) then
-				tinsert(args, tagFunc)
-			else
-				numTags = -1
-				func = function(self)
-					return self:SetFormattedText('[error]')
-				end
-			end
-		end
-
-		if(numTags == 1) then
-			func = function(self)
-				local parent = self.parent
-				local realUnit
-				if(self.overrideUnit) then
-					realUnit = parent.realUnit
-				end
-
-				_ENV._COLORS = parent.colors
-				return self:SetFormattedText(
-					format,
-					args[1](parent.unit, realUnit) or ''
-				)
-			end
-		elseif(numTags == 2) then
-			func = function(self)
-				local parent = self.parent
-				local unit = parent.unit
-				local realUnit
-				if(self.overrideUnit) then
-					realUnit = parent.realUnit
-				end
-
-				_ENV._COLORS = parent.colors
-				return self:SetFormattedText(
-					format,
-					args[1](unit, realUnit) or '',
-					args[2](unit, realUnit) or ''
-				)
-			end
-		elseif(numTags == 3) then
-			func = function(self)
-				local parent = self.parent
-				local unit = parent.unit
-				local realUnit
-				if(self.overrideUnit) then
-					realUnit = parent.realUnit
-				end
-
-				_ENV._COLORS = parent.colors
-				return self:SetFormattedText(
-					format,
-					args[1](unit, realUnit) or '',
-					args[2](unit, realUnit) or '',
-					args[3](unit, realUnit) or ''
-				)
-			end
-		elseif numTags ~= -1 then
-			func = function(self)
-				local parent = self.parent
-				local unit = parent.unit
-				local realUnit
-				if(self.overrideUnit) then
-					realUnit = parent.realUnit
-				end
-
-				_ENV._COLORS = parent.colors
-				for i, func in next, args do
-					tmp[i] = func(unit, realUnit) or ''
-				end
-
-				-- We do 1, numTags because tmp can hold several unneeded variables.
-				return self:SetFormattedText(format, unpack(tmp, 1, numTags))
-			end
-		end
-
-		if numTags ~= -1 then
-			tagPool[tagstr] = func
-		end
-	end
-	fs.UpdateTag = func
-
-	local unit = self.unit
-	if((unit and unit:match'%w+target') or fs.frequentUpdates) or containsOnUpdate then
-		local timer
-		if(type(fs.frequentUpdates) == 'number') then
-			timer = fs.frequentUpdates
-		elseif containsOnUpdate then
-			timer = containsOnUpdate
-		else
-			timer = .5
-		end
-
-		if(not eventlessUnits[timer]) then eventlessUnits[timer] = {} end
-		tinsert(eventlessUnits[timer], fs)
-
-		createOnUpdate(timer)
-	else
-		RegisterEvents(fs, tagstr)
-	end
-
-	tinsert(self.__tags, fs)
-end
-
-local Untag = function(self, fs)
-	if(not fs) then return end
-
-	UnregisterEvents(fs)
-	for _, timers in next, eventlessUnits do
-		for k, fontstr in next, timers do
-			if(fs == fontstr) then
-				tremove(timers, k)
-			end
-		end
-	end
-
-	for k, fontstr in next, self.__tags do
-		if(fontstr == fs) then
-			tremove(self.__tags, k)
-		end
-	end
-
-	fs.UpdateTag = nil
-end
-
-oUF.Tags = {
-	Methods = tags,
-	Events = tagEvents,
-	SharedEvents = unitlessEvents,
-	OnUpdateThrottle = onUpdateDelay,
-}
-oUF:RegisterMetaFunction('Tag', Tag)
-oUF:RegisterMetaFunction('Untag', Untag)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/threat.lua b/Interface/AddOns/SVUI/libs/oUF/elements/threat.lua
deleted file mode 100644
index 2a7f4cb..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/threat.lua
+++ /dev/null
@@ -1,65 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local Update = function(self, event, unit)
-	if(unit ~= self.unit) or not unit or not IsLoggedIn() then return end
-
-	local threat = self.Threat
-	if(threat.PreUpdate) then threat:PreUpdate(unit) end
-
-	local status = UnitThreatSituation(unit)
-
-	local r, g, b
-	if(status and status > 0) then
-		r, g, b = GetThreatStatusColor(status)
-
-		if threat:IsObjectType"Texture" then
-			threat:SetVertexColor(r, g, b)
-		end
-		threat:Show()
-	else
-		threat:Hide()
-	end
-
-	if(threat.PostUpdate) then
-		return threat:PostUpdate(unit, status, r, g, b)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.Threat.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-local Enable = function(self)
-	local threat = self.Threat
-	if(threat) then
-		threat.__owner = self
-		threat.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent("UNIT_THREAT_SITUATION_UPDATE", Path)
-		self:RegisterEvent("UNIT_THREAT_LIST_UPDATE", Path)
-		threat:Hide()
-
-		if(threat:IsObjectType"Texture" and not threat:GetTexture()) then
-			threat:SetTexture[[Interface\Minimap\ObjectIcons]]
-			threat:SetTexCoord(1/4, 3/8, 0, 1/4)
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local threat = self.Threat
-	if(threat) then
-		self:UnregisterEvent("UNIT_THREAT_SITUATION_UPDATE", Path)
-		self:UnregisterEvent("UNIT_THREAT_LIST_UPDATE", Path)
-		threat:Hide()
-	end
-end
-
-oUF:AddElement('Threat', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/elements/totems.lua b/Interface/AddOns/SVUI/libs/oUF/elements/totems.lua
deleted file mode 100644
index c504fd4..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/elements/totems.lua
+++ /dev/null
@@ -1,133 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-oUF.colors.totems = {
-	[FIRE_TOTEM_SLOT] = { 181/255, 073/255, 033/255 },
-	[EARTH_TOTEM_SLOT] = { 074/255, 142/255, 041/255 },
-	[WATER_TOTEM_SLOT] = { 057/255, 146/255, 181/255 },
-	[AIR_TOTEM_SLOT] = { 132/255, 056/255, 231/255 }
-}
-
-local priorities = STANDARD_TOTEM_PRIORITIES
-if(select(2, UnitClass'player') == 'SHAMAN') then
-	priorities = SHAMAN_TOTEM_PRIORITIES
-end
-
-local OnClick = function(self)
-	DestroyTotem(self:GetID())
-end
-
-local UpdateTooltip = function(self)
-	GameTooltip:SetTotem(self:GetID())
-end
-
-local OnEnter = function(self)
-	if(not self:IsVisible()) then return end
-	GameTooltip:SetOwner(self, 'ANCHOR_BOTTOMRIGHT')
-	self:UpdateTooltip()
-end
-
-local OnLeave = function()
-	GameTooltip:Hide()
-end
-
-local UpdateTotem = function(self, event, slot)
-	if(slot > MAX_TOTEMS) then return end
-	local totems = self.Totems
-
-	if(totems.PreUpdate) then totems:PreUpdate(priorities[slot]) end
-
-	local totem = totems[priorities[slot]]
-	local haveTotem, name, start, duration, icon = GetTotemInfo(slot)
-	if(duration > 0) then
-		if(totem.Icon) then
-			totem.Icon:SetTexture(icon)
-		end
-
-		if(totem.Cooldown) then
-			totem.Cooldown:SetCooldown(start, duration)
-		end
-
-		totem:Show()
-	else
-		totem:Hide()
-	end
-
-	if(totems.PostUpdate) then
-		return totems:PostUpdate(priorities[slot], haveTotem, name, start, duration, icon)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.Totems.Override or UpdateTotem) (self, ...)
-end
-
-local Update = function(self, event)
-	for i = 1, MAX_TOTEMS do
-		Path(self, event, i)
-	end
-end
-
-local ForceUpdate = function(element)
-	return Update(element.__owner, 'ForceUpdate')
-end
-
-local Enable = function(self)
-	local totems = self.Totems
-
-	if(totems) then
-		totems.__owner = self
-		totems.__map = { unpack(priorities) }
-		totems.ForceUpdate = ForceUpdate
-
-		for i = 1, MAX_TOTEMS do
-			local totem = totems[i]
-
-			totem:SetID(priorities[i])
-
-			if(totem:HasScript'OnClick') then
-				totem:SetScript('OnClick', OnClick)
-			end
-
-			if(totem:IsMouseEnabled()) then
-				totem:SetScript('OnEnter', OnEnter)
-				totem:SetScript('OnLeave', OnLeave)
-
-				if(not totem.UpdateTooltip) then
-					totem.UpdateTooltip = UpdateTooltip
-				end
-			end
-		end
-
-		self:RegisterEvent('PLAYER_TOTEM_UPDATE', Path, true)
-
-		TotemFrame.Show = TotemFrame.Hide
-		TotemFrame:Hide()
-
-		TotemFrame:UnregisterEvent"PLAYER_TOTEM_UPDATE"
-		TotemFrame:UnregisterEvent"PLAYER_ENTERING_WORLD"
-		TotemFrame:UnregisterEvent"UPDATE_SHAPESHIFT_FORM"
-		TotemFrame:UnregisterEvent"PLAYER_TALENT_UPDATE"
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	if(self.Totems) then
-		for i = 1, MAX_TOTEMS do
-			self.Totems[i]:Hide()
-		end
-		TotemFrame.Show = nil
-		TotemFrame:Show()
-
-		TotemFrame:RegisterEvent"PLAYER_TOTEM_UPDATE"
-		TotemFrame:RegisterEvent"PLAYER_ENTERING_WORLD"
-		TotemFrame:RegisterEvent"UPDATE_SHAPESHIFT_FORM"
-		TotemFrame:RegisterEvent"PLAYER_TALENT_UPDATE"
-
-		self:UnregisterEvent('PLAYER_TOTEM_UPDATE', Path)
-	end
-end
-
-oUF:AddElement("Totems", Update, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF/events.lua b/Interface/AddOns/SVUI/libs/oUF/events.lua
deleted file mode 100644
index 51385cb..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/events.lua
+++ /dev/null
@@ -1,193 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-local Private = oUF.Private
-
-local argcheck = Private.argcheck
-local error = Private.error
-local frame_metatable = Private.frame_metatable
-
-local tinsert, tremove = table.insert, table.remove
-
--- Events
-local RegisterEvent, UnregisterEvent, IsEventRegistered
-
-do
-	local eventFrame = CreateFrame("Frame")
-	local registry = {}
-	local framesForUnit = {}
-	local alternativeUnits = {
-		['player'] = 'vehicle',
-		['pet'] = 'player',
-		['party1'] = 'partypet1',
-		['party2'] = 'partypet2',
-		['party3'] = 'partypet3',
-		['party4'] = 'partypet4',
-	}
-
-	local RegisterFrameForUnit = function(frame, unit)
-		if not unit then return end
-		if framesForUnit[unit] then
-			framesForUnit[unit][frame] = true
-		else
-			framesForUnit[unit] = { [frame] = true }
-		end
-	end
-
-	local UnregisterFrameForUnit = function(frame, unit)
-		if not unit then return end
-		local frames = framesForUnit[unit]
-		if frames and frames[frame] then
-			frames[frame] = nil
-			if not next(frames) then
-				framesForUnit[unit] = nil
-			end
-		end
-	end
-
-	Private.UpdateUnits = function(frame, unit, realUnit)
-		if unit == realUnit then
-			realUnit = nil
-		end
-		if frame.unit ~= unit or frame.realUnit ~= realUnit then
-			if not frame:GetScript('OnUpdate') then
-				UnregisterFrameForUnit(frame, frame.unit)
-				UnregisterFrameForUnit(frame, frame.realUnit)
-				RegisterFrameForUnit(frame, unit)
-				RegisterFrameForUnit(frame, realUnit)
-			end
-
-			frame.alternativeUnit = alternativeUnits[unit]
-			frame.unit = unit
-			frame.realUnit = realUnit
-			frame.id = unit:match'^.-(%d+)'
-			return true
-		end
-	end
-
-	-- Holds true for every event, where the first (unit) argument should be ignored.
-	local sharedUnitEvents = {
-		UNIT_ENTERED_VEHICLE = true,
-		UNIT_EXITED_VEHICLE = true,
-		UNIT_PET = true,
-	}
-
-	eventFrame:SetScript('OnEvent', function(_, event, arg1, ...)
-		local listeners = registry[event]
-		if arg1 and not sharedUnitEvents[event] then
-			local frames = framesForUnit[arg1]
-			if frames then
-				for frame in next, frames do
-					if listeners[frame] and frame:IsVisible() then
-						frame[event](frame, event, arg1, ...)
-					end
-				end
-			end
-		else
-			for frame in next, listeners do
-				if frame:IsVisible() then
-					frame[event](frame, event, arg1, ...)
-				end
-			end
-		end
-	end)
-
-	function RegisterEvent(self, event, unitless)
-		if(unitless) then
-			sharedUnitEvents[event] = true
-		end
-
-		if not registry[event] then
-			registry[event] = { [self] = true }
-			eventFrame:RegisterEvent(event)
-		else
-			registry[event][self] = true
-		end
-	end
-
-	function UnregisterEvent(self, event)
-		if registry[event] then
-			registry[event][self] = nil
-			if not next(registry[event]) then
-				registry[event] = nil
-				eventFrame:UnregisterEvent(event)
-			end
-		end
-	end
-
-	function IsEventRegistered(self, event)
-		return registry[event] and registry[event][self]
-	end
-end
-
-local event_metatable = {
-	__call = function(funcs, self, ...)
-		for _, func in next, funcs do
-			func(self, ...)
-		end
-	end,
-}
-
-function frame_metatable.__index:RegisterEvent(event, func, unitless)
-	-- Block OnUpdate polled frames from registering events.
-	if(self.__eventless) then return end
-
-	argcheck(event, 2, 'string')
-
-	if(type(func) == 'string' and type(self[func]) == 'function') then
-		func = self[func]
-	end
-
-	local curev = self[event]
-	local kind = type(curev)
-	if(curev and func) then
-		if(kind == 'function' and curev ~= func) then
-			self[event] = setmetatable({curev, func}, event_metatable)
-		elseif(kind == 'table') then
-			for _, infunc in next, curev do
-				if(infunc == func) then return end
-			end
-
-			tinsert(curev, func)
-		end
-	elseif(IsEventRegistered(self, event)) then
-		return
-	else
-		if(type(func) == 'function') then
-			self[event] = func
-		elseif(not self[event]) then
-			return error("Style [%s] attempted to register event [%s] on unit [%s] with a handler that doesn't exist.", self.style, event, self.unit or 'unknown')
-		end
-
-		RegisterEvent(self, event, unitless)
-	end
-end
-
-function frame_metatable.__index:UnregisterEvent(event, func)
-	argcheck(event, 2, 'string')
-
-	local curev = self[event]
-	if(type(curev) == 'table' and func) then
-		for k, infunc in next, curev do
-			if(infunc == func) then
-				tremove(curev, k)
-
-				local n = #curev
-				if(n == 1) then
-					local _, handler = next(curev)
-					self[event] = handler
-				elseif(n == 0) then
-					UnregisterEvent(self, event)
-				end
-
-				break
-			end
-		end
-	elseif(curev == func) then
-		self[event] = nil
-		UnregisterEvent(self, event)
-	end
-end
-
-function frame_metatable.__index:IsEventRegistered(event)
-	return IsEventRegistered(self, event)
-end
diff --git a/Interface/AddOns/SVUI/libs/oUF/factory.lua b/Interface/AddOns/SVUI/libs/oUF/factory.lua
deleted file mode 100644
index 2e2f4cc..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/factory.lua
+++ /dev/null
@@ -1,49 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-local Private = oUF.Private
-
-local argcheck = Private.argcheck
-local tinsert = table.insert
-
-local _QUEUE = {}
-local _FACTORY = CreateFrame'Frame'
-_FACTORY:SetScript('OnEvent', function(self, event, ...)
-	return self[event](self, event, ...)
-end)
-
-_FACTORY:RegisterEvent'PLAYER_LOGIN'
-_FACTORY.active = true
-
-function _FACTORY:PLAYER_LOGIN()
-	if(not self.active) then return end
-
-	for _, func in next, _QUEUE do
-		func(oUF)
-	end
-
-	-- Avoid creating dupes.
-	wipe(_QUEUE)
-end
-
-function oUF:Factory(func)
-	argcheck(func, 2, 'function')
-
-	-- Call the function directly if we're active and logged in.
-	if(IsLoggedIn() and _FACTORY.active) then
-		return func(self)
-	else
-		tinsert(_QUEUE, func)
-	end
-end
-
-function oUF:EnableFactory()
-	_FACTORY.active = true
-end
-
-function oUF:DisableFactory()
-	_FACTORY.active = nil
-end
-
-function oUF:RunFactoryQueue()
-	_FACTORY:PLAYER_LOGIN()
-end
diff --git a/Interface/AddOns/SVUI/libs/oUF/finalize.lua b/Interface/AddOns/SVUI/libs/oUF/finalize.lua
deleted file mode 100644
index 9355d19..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/finalize.lua
+++ /dev/null
@@ -1,4 +0,0 @@
-local parent, ns = ...
-
--- It's named Private for a reason!
-ns.oUF.Private = nil
diff --git a/Interface/AddOns/SVUI/libs/oUF/init.lua b/Interface/AddOns/SVUI/libs/oUF/init.lua
deleted file mode 100644
index 46aef44..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/init.lua
+++ /dev/null
@@ -1,3 +0,0 @@
-local parent, ns = ...
-ns.oUF = {}
-ns.oUF.Private = {}
diff --git a/Interface/AddOns/SVUI/libs/oUF/oUF.toc b/Interface/AddOns/SVUI/libs/oUF/oUF.toc
deleted file mode 100644
index 5b76e6f..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/oUF.toc
+++ /dev/null
@@ -1,10 +0,0 @@
-## Interface: 40300
-## Title: oUF
-## Author: Haste
-## Version: 1.6.0
-## OptionalDeps: !ClassColors, Clique
-## X-eMail: troeks@gmail.com
-## X-oUF: oUF
-## Notes: Unit frame framework. Does nothing by itself.
-
-oUF.xml
diff --git a/Interface/AddOns/SVUI/libs/oUF/oUF.xml b/Interface/AddOns/SVUI/libs/oUF/oUF.xml
deleted file mode 100644
index 371a621..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/oUF.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<Ui xmlns="http://www.blizzard.com/wow/ui/">
-	<Script file='init.lua' />
-	<Script file='private.lua' />
-	<Script file='ouf.lua' />
-	<Script file='events.lua'/>
-	<Script file='factory.lua' />
-	<Script file='blizzard.lua' />
-	<Script file='units.lua' />
-	<Script file='colors.lua' />
-	<Script file='finalize.lua' />
-
-	<Script file='elements\power.lua' />
-	<Script file='elements\aura.lua' />
-	<Script file='elements\health.lua' />
-	<Script file='elements\cpoints.lua' />
-	<Script file='elements\ricons.lua' />
-	<Script file='elements\leader.lua' />
-	<Script file='elements\combat.lua' />
-	<Script file='elements\resting.lua' />
-	<Script file='elements\pvp.lua' />
-	<Script file='elements\portraits.lua' />
-	<Script file='elements\range.lua' />
-	<Script file='elements\castbar.lua' />
-	<Script file='elements\threat.lua' />
-	<Script file='elements\tags.lua' />
-	<Script file='elements\masterlooter.lua' />
-	<Script file='elements\assistant.lua' />
-	<Script file='elements\runebar.lua' />
-	<Script file='elements\lfdrole.lua' />
-	<Script file='elements\healprediction.lua' />
-	<Script file='elements\picon.lua' />
-	<Script file='elements\readycheck.lua' />
-	<Script file='elements\qicon.lua' />
-	<Script file='elements\eclipsebar.lua' />
-	<Script file='elements\altpowerbar.lua' />
-	<Script file='elements\totems.lua' />
-	<Script file='elements\resurrect.lua' />
-	<Script file='elements\druidmana.lua' />
-	<Script file='elements\stagger.lua' />
-
-	<!-- Clique support -->
-	<Button name="oUF_ClickCastUnitTemplate" virtual="true" inherits="SecureUnitButtonTemplate,SecureHandlerEnterLeaveTemplate">
-		<Attributes>
-			<Attribute name="_onenter" type="string" value="local snippet = self:GetAttribute('clickcast_onenter'); if snippet then self:Run(snippet) end"/>
-			<Attribute name="_onleave" type="string" value="local snippet = self:GetAttribute('clickcast_onleave'); if snippet then self:Run(snippet) end"/>
-		</Attributes>
-	</Button>
-
-	<!-- Pet Battle Hider Frame -->
-	<Frame name="oUF_PetBattleFrameHider" inherits="SecureHandlerStateTemplate" parent="UIParent" setAllPoints="true">
-		<Scripts>
-			<OnLoad>
-				RegisterStateDriver(self, "visibility", "[petbattle] hide; show")
-			</OnLoad>
-		</Scripts>
-	</Frame>
-	<!--
-		Sub-object as a child of the parent unit frame:
-	<Button name="oUF_HeaderTargetTemplate" inherits="SecureUnitButtonTemplate" hidden="true" virtual="true">
-		<Frames>
-			<Button name="$parentTarget" inherits="SecureUnitButtonTemplate">
-				<Attributes>
-					<Attribute name="unitsuffix" type="string" value="target"/>
-					<Attribute name="useparent-unit" type="boolean" value="true"/>
-				</Attributes>
-			</Button>
-		</Frames>
-	</Button>
-
-		Separate unit template example:
-	<Button name="oUF_HeaderSeparateSubOjectsTemplate" inherits="SecureUnitButtonTemplate" hidden="true" virtual="true">
-		<Attributes>
-			<Attribute name="oUF-onlyProcessChildren" type="boolean" value="true"/>
-		</Attributes>
-
-		<Frames>
-			<Button name="$parentUnit" inherits="SecureUnitButtonTemplate">
-				<Attributes>
-					<Attribute name="useparent-unit" type="boolean" value="true"/>
-				</Attributes>
-			</Button>
-
-			<Button name="$parentPet" inherits="SecureUnitButtonTemplate">
-				<Attributes>
-					<Attribute name="unitsuffix" type="string" value="pet"/>
-					<Attribute name="useparent-unit" type="boolean" value="true"/>
-				</Attributes>
-			</Button>
-
-			<Button name="$parentTarget" inherits="SecureUnitButtonTemplate">
-				<Attributes>
-					<Attribute name="unitsuffix" type="string" value="target"/>
-					<Attribute name="useparent-unit" type="boolean" value="true"/>
-				</Attributes>
-			</Button>
-		</Frames>
-	</Button>
-	-->
-</Ui>
diff --git a/Interface/AddOns/SVUI/libs/oUF/ouf.lua b/Interface/AddOns/SVUI/libs/oUF/ouf.lua
deleted file mode 100644
index e25715e..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/ouf.lua
+++ /dev/null
@@ -1,600 +0,0 @@
-local parent, ns = ...
-local global = GetAddOnMetadata(parent, 'X-oUF')
-local _VERSION = GetAddOnMetadata(parent, 'version')
-
-local oUF = ns.oUF
-local Private = oUF.Private
-
-local argcheck = Private.argcheck
-
-local print = Private.print
-local error = Private.error
-
-local upper = string.upper
-local split = string.split
-local tinsert, tremove = table.insert, table.remove
-
-local styles, style = {}
-local callback, objects = {}, {}
-
-local elements = {}
-local activeElements = {}
-
--- updating of "invalid" units.
-local enableTargetUpdate = function(object)
-	object.onUpdateFrequency = object.onUpdateFrequency or .5
-	object.__eventless = true
-
-	local total = 0
-	object:SetScript('OnUpdate', function(self, elapsed)
-		if(not self.unit) then
-			return
-		elseif(total > self.onUpdateFrequency) then
-			self:UpdateAllElements'OnUpdate'
-			total = 0
-		end
-
-		total = total + elapsed
-	end)
-end
-Private.enableTargetUpdate = enableTargetUpdate
-
-local updateActiveUnit = function(self, event, unit)
-	-- Calculate units to work with
-	local realUnit, modUnit = SecureButton_GetUnit(self), SecureButton_GetModifiedUnit(self)
-
-	-- _GetUnit() doesn't rewrite playerpet -> pet like _GetModifiedUnit does.
-	if(realUnit == 'playerpet') then
-		realUnit = 'pet'
-	elseif(realUnit == 'playertarget') then
-		realUnit = 'target'
-	end
-
-	if(modUnit == "pet" and realUnit ~= "pet") then
-		modUnit = "vehicle"
-	end
-
-	-- Drop out if the event unit doesn't match any of the frame units.
-	if(not UnitExists(modUnit) or unit and unit ~= realUnit and unit ~= modUnit) then return end
-
-	-- Change the active unit and run a full update.
-	if Private.UpdateUnits(self, modUnit, realUnit) then
-		self:UpdateAllElements('RefreshUnit')
-
-		return true
-	end
-end
-
-local iterateChildren = function(...)
-	for l = 1, select("#", ...) do
-		local obj = select(l, ...)
-
-		if(type(obj) == 'table' and obj.isChild) then
-			updateActiveUnit(obj, "iterateChildren")
-		end
-	end
-end
-
-local OnAttributeChanged = function(self, name, value)
-	if(name == "unit" and value) then
-		if(self.hasChildren) then
-			iterateChildren(self:GetChildren())
-		end
-
-		if(not self:GetAttribute'oUF-onlyProcessChildren') then
-			updateActiveUnit(self, "OnAttributeChanged")
-		end
-	end
-end
-
-local frame_metatable = {
-	__index = CreateFrame"Button"
-}
-Private.frame_metatable = frame_metatable
-
-for k, v in pairs{
-	UpdateElement = function(self, name)
-		local unit = self.unit
-		if(not unit or not UnitExists(unit)) then return end
-
-		local element = elements[name]
-		if(not element or not self:IsElementEnabled(name) or not activeElements[self]) then return end
-		if(element.update) then
-			element.update(self, 'OnShow', unit)
-		end
-	end,
-
-	EnableElement = function(self, name, unit)
-		argcheck(name, 2, 'string')
-		argcheck(unit, 3, 'string', 'nil')
-
-		local element = elements[name]
-
-
-		if(not element or self:IsElementEnabled(name) or not activeElements[self]) then return end
-
-		if(element.enable(self, unit or self.unit)) then
-			activeElements[self][name] = true
-
-			if(element.update) then
-				tinsert(self.__elements, element.update)
-			end
-		end
-	end,
-
-	DisableElement = function(self, name)
-		argcheck(name, 2, 'string')
-
-		local enable = self:IsElementEnabled(name)
-		if(not enable) then return end
-
-		local update = elements[name].update
-		for k, func in next, self.__elements do
-			if(func == update) then
-				tremove(self.__elements, k)
-				break
-			end
-		end
-
-		activeElements[self][name] = nil
-
-		-- We need to run a new update cycle in-case we knocked ourself out of sync.
-		-- The main reason we do this is to make sure the full update is completed
-		-- if an element for some reason removes itself _during_ the update
-		-- progress.
-		self:UpdateAllElements('DisableElement', name)
-
-		return elements[name].disable(self)
-	end,
-
-	IsElementEnabled = function(self, name)
-		argcheck(name, 2, 'string')
-
-		local element = elements[name]
-		if(not element) then return end
-
-		local active = activeElements[self]
-		return active and active[name]
-	end,
-
-	Enable = RegisterUnitWatch,
-	Disable = function(self)
-		UnregisterUnitWatch(self)
-		self:Hide()
-	end,
-
-	UpdateAllElements = function(self, event)
-		local unit = self.unit
-		if(not unit or not UnitExists(unit)) then return end
-
-		if(self.PreUpdate) then
-			self:PreUpdate(event)
-		end
-
-		for _, func in next, self.__elements do
-			func(self, event, unit)
-		end
-
-		if(self.PostUpdate) then
-			self:PostUpdate(event)
-		end
-	end,
-} do
-	frame_metatable.__index[k] = v
-end
-
-local OnShow = function(self)
-	if(not updateActiveUnit(self, 'OnShow')) then
-		return self:UpdateAllElements'OnShow'
-	end
-end
-
-local UpdatePet = function(self, event, unit)
-	local petUnit
-	if(unit == 'target') then
-		return
-	elseif(unit == 'player') then
-		petUnit = 'pet'
-	else
-		-- Convert raid26 -> raidpet26
-		petUnit = unit:gsub('^(%a+)(%d+)', '%1pet%2')
-	end
-
-	if(self.unit ~= petUnit) then return end
-	if(not updateActiveUnit(self, event)) then
-		return self:UpdateAllElements(event)
-	end
-end
-
-local initObject = function(unit, style, styleFunc, header, ...)
-	local num = select('#', ...)
-	for i=1, num do
-		local object = select(i, ...)
-		local objectUnit = object:GetAttribute'oUF-guessUnit' or unit
-		local suffix = object:GetAttribute'unitsuffix'
-
-		object.__elements = {}
-		object.style = style
-		object = setmetatable(object, frame_metatable)
-
-		-- Expose the frame through oUF.objects.
-		tinsert(objects, object)
-
-		-- We have to force update the frames when PEW fires.
-		object:RegisterEvent("PLAYER_ENTERING_WORLD", object.UpdateAllElements)
-
-		-- Handle the case where someone has modified the unitsuffix attribute in
-		-- oUF-initialConfigFunction.
-		if(suffix and objectUnit and not objectUnit:match(suffix)) then
-			objectUnit = objectUnit .. suffix
-		end
-
-		if(not (suffix == 'target' or objectUnit and objectUnit:match'target')) then
-			object:RegisterEvent('UNIT_ENTERED_VEHICLE', updateActiveUnit)
-			object:RegisterEvent('UNIT_EXITED_VEHICLE', updateActiveUnit)
-
-			-- We don't need to register UNIT_PET for the player unit. We register it
-			-- mainly because UNIT_EXITED_VEHICLE and UNIT_ENTERED_VEHICLE doesn't always
-			-- have pet information when they fire for party and raid units.
-			if(objectUnit ~= 'player') then
-				object:RegisterEvent('UNIT_PET', UpdatePet)
-			end
-		end
-
-		if(not header) then
-			-- No header means it's a frame created through :Spawn().
-			object:SetAttribute("*type1", "target")
-			object:SetAttribute('*type2', 'togglemenu')
-
-			-- No need to enable this for *target frames.
-			if(not (unit:match'target' or suffix == 'target')) then
-				object:SetAttribute('toggleForVehicle', true)
-			end
-
-			-- Other boss and target units are handled by :HandleUnit().
-			if(suffix == 'target') then
-				enableTargetUpdate(object)
-			else
-				oUF:HandleUnit(object)
-			end
-		else
-			-- Used to update frames when they change position in a group.
-			object:RegisterEvent('GROUP_ROSTER_UPDATE', object.UpdateAllElements)
-
-			if(num > 1) then
-				if(object:GetParent() == header) then
-					object.hasChildren = true
-				else
-					object.isChild = true
-				end
-			end
-
-			if(suffix == 'target') then
-				enableTargetUpdate(object)
-			end
-		end
-
-		Private.UpdateUnits(object, objectUnit)
-
-		styleFunc(object, objectUnit, not header)
-
-		object:SetScript("OnAttributeChanged", OnAttributeChanged)
-		object:SetScript("OnShow", OnShow)
-
-		activeElements[object] = {}
-		for element in next, elements do
-			object:EnableElement(element, objectUnit)
-		end
-
-		for _, func in next, callback do
-			func(object)
-		end
-
-		-- Make Clique happy
-		_G.ClickCastFrames = ClickCastFrames or {}
-		ClickCastFrames[object] = true
-	end
-end
-
-local walkObject = function(object, unit)
-	local parent = object:GetParent()
-	local style = parent.style or style
-	local styleFunc = styles[style]
-
-	local header = parent:GetAttribute'oUF-headerType' and parent
-
-	-- Check if we should leave the main frame blank.
-	if(object:GetAttribute'oUF-onlyProcessChildren') then
-		object.hasChildren = true
-		object:SetScript('OnAttributeChanged', OnAttributeChanged)
-		return initObject(unit, style, styleFunc, header, object:GetChildren())
-	end
-
-	return initObject(unit, style, styleFunc, header, object, object:GetChildren())
-end
-
-function oUF:RegisterInitCallback(func)
-	tinsert(callback, func)
-end
-
-function oUF:RegisterMetaFunction(name, func)
-	argcheck(name, 2, 'string')
-	argcheck(func, 3, 'function', 'table')
-
-	if(frame_metatable.__index[name]) then
-		return
-	end
-
-	frame_metatable.__index[name] = func
-end
-
-function oUF:RegisterStyle(name, func)
-	argcheck(name, 2, 'string')
-	argcheck(func, 3, 'function', 'table')
-
-	if(styles[name]) then return error("Style [%s] already registered.", name) end
-	if(not style) then style = name end
-
-	styles[name] = func
-end
-
-function oUF:SetActiveStyle(name)
-	argcheck(name, 2, 'string')
-	if(not styles[name]) then return error("Style [%s] does not exist.", name) end
-
-	style = name
-end
-
-do
-	local function iter(_, n)
-		-- don't expose the style functions.
-		return (next(styles, n))
-	end
-
-	function oUF.IterateStyles()
-		return iter, nil, nil
-	end
-end
-
-local getCondition
-do
-	local conditions = {
-		raid40 = '[@raid26,exists] show;',
-		raid25 = '[@raid11,exists] show;',
-		raid10 = '[@raid6,exists] show;',
-		raid = '[group:raid] show;',
-		party = '[group:party,nogroup:raid] show;',
-		solo = '[@player,exists,nogroup:party] show;',
-	}
-
-	function getCondition(...)
-		local cond = ''
-
-		for i=1, select('#', ...) do
-			local short = select(i, ...)
-
-			local condition = conditions[short]
-			if(condition) then
-				cond = cond .. condition
-			end
-		end
-
-		return cond .. 'hide'
-	end
-end
-
-local generateName = function(unit, ...)
-	local name = 'oUF_' .. style:gsub('[^%a%d_]+', '')
-
-	local raid, party, groupFilter
-	for i=1, select('#', ...), 2 do
-		local att, val = select(i, ...)
-		if(att == 'showRaid') then
-			raid = true
-		elseif(att == 'showParty') then
-			party = true
-		elseif(att == 'groupFilter') then
-			groupFilter = val
-		end
-	end
-
-	local append
-	if(raid) then
-		if(groupFilter) then
-			if(type(groupFilter) == 'number' and groupFilter > 0) then
-				append = groupFilter
-			elseif(groupFilter:match'TANK') then
-				append = 'MainTank'
-			elseif(groupFilter:match'ASSIST') then
-				append = 'MainAssist'
-			else
-				local _, count = groupFilter:gsub(',', '')
-				if(count == 0) then
-					append = 'Raid' .. groupFilter
-				else
-					append = 'Raid'
-				end
-			end
-		else
-			append = 'Raid'
-		end
-	elseif(party) then
-		append = 'Party'
-	elseif(unit) then
-		append = unit:gsub("^%l", upper)
-	end
-
-	if(append) then
-		name = name .. append
-	end
-
-	-- Change oUF_LilyRaidRaid into oUF_LilyRaid
-	name = name:gsub('(%u%l+)([%u%l]*)%1', '%1')
-	-- Change oUF_LilyTargettarget into oUF_LilyTargetTarget
-	name = name:gsub('t(arget)', 'T%1')
-
-	local base = name
-	local i = 2
-	while(_G[name]) do
-		name = base .. i
-		i = i + 1
-	end
-
-	return name
-end
-
-do
-	local styleProxy = function(self, frame, ...)
-		return walkObject(_G[frame])
-	end
-
-	-- There has to be an easier way to do this.
-	local initialConfigFunction = [[
-		local header = self:GetParent()
-		local frames = table.new()
-		table.insert(frames, self)
-		self:GetChildList(frames)
-		for i=1, #frames do
-			local frame = frames[i]
-			local unit
-			-- There's no need to do anything on frames with onlyProcessChildren
-			if(not frame:GetAttribute'oUF-onlyProcessChildren') then
-				RegisterUnitWatch(frame)
-
-				-- Attempt to guess what the header is set to spawn.
-				local groupFilter = header:GetAttribute'groupFilter'
-
-				if(type(groupFilter) == 'string' and groupFilter:match('MAIN[AT]')) then
-					local role = groupFilter:match('MAIN([AT])')
-					if(role == 'T') then
-						unit = 'maintank'
-					else
-						unit = 'mainassist'
-					end
-				elseif(header:GetAttribute'showRaid') then
-					unit = 'raid'
-				elseif(header:GetAttribute'showParty') then
-					unit = 'party'
-				end
-
-				local headerType = header:GetAttribute'oUF-headerType'
-				local suffix = frame:GetAttribute'unitsuffix'
-				if(unit and suffix) then
-					if(headerType == 'pet' and suffix == 'target') then
-						unit = unit .. headerType .. suffix
-					else
-						unit = unit .. suffix
-					end
-				elseif(unit and headerType == 'pet') then
-					unit = unit .. headerType
-				end
-
-				frame:SetAttribute('*type1', 'target')
-				frame:SetAttribute('*type2', 'togglemenu')
-				frame:SetAttribute('toggleForVehicle', true)
-				frame:SetAttribute('oUF-guessUnit', unit)
-			end
-
-			local body = header:GetAttribute'oUF-initialConfigFunction'
-			if(body) then
-				frame:Run(body, unit)
-			end
-		end
-
-		header:CallMethod('styleFunction', self:GetName())
-
-		local clique = header:GetFrameRef("clickcast_header")
-		if(clique) then
-			clique:SetAttribute("clickcast_button", self)
-			clique:RunAttribute("clickcast_register")
-		end
-	]]
-
-	function oUF:SpawnHeader(overrideName, template, visibility, ...)
-		if(not style) then return error("Unable to create frame. No styles have been registered.") end
-
-		template = (template or 'SecureGroupHeaderTemplate')
-
-		local isPetHeader = template:match'PetHeader'
-		local name = overrideName or generateName(nil, ...)
-		local header = CreateFrame('Frame', name, UIParent, template)
-
-		header:SetAttribute("template", "oUF_ClickCastUnitTemplate")
-		for i=1, select("#", ...), 2 do
-			local att, val = select(i, ...)
-			if(not att) then break end
-			header:SetAttribute(att, val)
-		end
-
-		header.style = style
-		header.styleFunction = styleProxy
-
-		-- We set it here so layouts can't directly override it.
-		header:SetAttribute('initialConfigFunction', initialConfigFunction)
-		header:SetAttribute('oUF-headerType', isPetHeader and 'pet' or 'group')
-
-		if(Clique) then
-			SecureHandlerSetFrameRef(header, 'clickcast_header', Clique.header)
-		end
-
-		if(header:GetAttribute'showParty') then
-			self:DisableBlizzard'party'
-		end
-
-		if(visibility) then
-			local type, list = split(' ', visibility, 2)
-			if(list and type == 'custom') then
-				RegisterAttributeDriver(header, 'state-visibility', list)
-			else
-				local condition = getCondition(split(',', visibility))
-				RegisterAttributeDriver(header, 'state-visibility', condition)
-			end
-		end
-
-		return header
-	end
-end
-
-function oUF:Spawn(unit, overrideName, overrideTemplate)
-	argcheck(unit, 2, 'string')
-	if(not style) then return error("Unable to create frame. No styles have been registered.") end
-
-	unit = unit:lower()
-
-	local name = overrideName or generateName(unit)
-	local object = CreateFrame("Button", name, UIParent, overrideTemplate or "SecureUnitButtonTemplate")
-	Private.UpdateUnits(object, unit)
-
-	self:DisableBlizzard(unit)
-	walkObject(object, unit)
-
-	object:SetAttribute("unit", unit)
-	RegisterUnitWatch(object)
-
-	return object
-end
-
-function oUF:AddElement(name, update, enable, disable)
-	argcheck(name, 2, 'string')
-	argcheck(update, 3, 'function', 'nil')
-	argcheck(enable, 4, 'function', 'nil')
-	argcheck(disable, 5, 'function', 'nil')
-
-	if(elements[name]) then return error('Element [%s] is already registered.', name) end
-	elements[name] = {
-		update = update;
-		enable = enable;
-		disable = disable;
-	}
-end
-
-oUF.version = _VERSION
-oUF.objects = objects
-
-if(global) then
-	if(parent ~= 'oUF' and global == 'oUF') then
-		error("%s is doing it wrong and setting its global to oUF.", parent)
-	else
-		_G[global] = oUF
-	end
-end
diff --git a/Interface/AddOns/SVUI/libs/oUF/private.lua b/Interface/AddOns/SVUI/libs/oUF/private.lua
deleted file mode 100644
index 2cb4814..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/private.lua
+++ /dev/null
@@ -1,25 +0,0 @@
-local parent, ns = ...
-local Private = ns.oUF.Private
-
-local match = string.match
-local format = string.format
-
-function Private.argcheck(value, num, ...)
-	assert(type(num) == 'number', "Bad argument #2 to 'argcheck' (number expected, got "..type(num)..")")
-
-	for i=1,select("#", ...) do
-		if type(value) == select(i, ...) then return end
-	end
-
-	local types = strjoin(", ", ...)
-	local name = match(debugstack(2,2,0), ": in function [`<](.-)['>]")
-	error(("Bad argument #%d to '%s' (%s expected, got %s"):format(num, name, types, type(value)), 3)
-end
-
-function Private.print(...)
-	print("|cff33ff99oUF:|r", ...)
-end
-
-function Private.error(...)
-	Private.print("|cffff0000Error:|r "..format(...))
-end
diff --git a/Interface/AddOns/SVUI/libs/oUF/units.lua b/Interface/AddOns/SVUI/libs/oUF/units.lua
deleted file mode 100644
index f90361a..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/units.lua
+++ /dev/null
@@ -1,23 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-local Private = oUF.Private
-
-local enableTargetUpdate = Private.enableTargetUpdate
-
--- Handles unit specific actions.
-function oUF:HandleUnit(object, unit)
-	local unit = object.unit or unit
-
-	if(unit == 'target') then
-		object:RegisterEvent('PLAYER_TARGET_CHANGED', object.UpdateAllElements)
-	elseif(unit == 'mouseover') then
-		object:RegisterEvent('UPDATE_MOUSEOVER_UNIT', object.UpdateAllElements)
-	elseif(unit == 'focus') then
-		object:RegisterEvent('PLAYER_FOCUS_CHANGED', object.UpdateAllElements)
-	elseif(unit:match'(boss)%d?$' == 'boss') then
-		object:RegisterEvent('INSTANCE_ENCOUNTER_ENGAGE_UNIT', object.UpdateAllElements, true)
-		object:RegisterEvent('UNIT_TARGETABLE_CHANGED', object.UpdateAllElements)
-	elseif(unit:match'%w+target') then
-		enableTargetUpdate(object)
-	end
-end
diff --git a/Interface/AddOns/SVUI/libs/oUF/utils/changelog b/Interface/AddOns/SVUI/libs/oUF/utils/changelog
deleted file mode 100644
index fdafa94..0000000
--- a/Interface/AddOns/SVUI/libs/oUF/utils/changelog
+++ /dev/null
@@ -1,84 +0,0 @@
-#!/usr/bin/env lua
-
-local tags = {}
-do
-	for tag in io.popen('git tag'):lines() do
-		local split = tag:gmatch('[^.]+')
-		local release, api, bugfix = split(), split(), split() or 0
-		table.insert(
-			tags,
-			{
-				string = tag,
-				release = release,
-				api = api,
-				bugfix = bugfix,
-			}
-		)
-	end
-
-	table.sort(tags, function(a,b)
-		a = a.release * 1e4 + a.api * 100 + a.bugfix
-		b = b.release * 1e4 + b.api * 100 + b.bugfix
-
-		return a > b
-	end)
-end
-
-local generateLog = function(prevTag, currentTag)
-	local ti = table.insert
-	local sf = string.format
-
-	local out = {}
-
-	ti(out, sf('[b]Changes in %s:[/b]', currentTag))
-	ti(out, '[list]')
-
-	for line in io.popen(sf('git shortlog %s..%s', prevTag, currentTag)):lines() do
-		if(line:sub(1, 6) == '      ') then
-			local offset = line:match('()     ', 7)
-			if(offset) then
-				line = line:sub(7, offset - 1)
-			else
-				line = line:sub(7)
-			end
-
-			ti(out, sf('   [*] %s', line))
-		elseif(#line == 0) then
-			ti(out, '  [/list]')
-		else
-			ti(out, sf(' [*][i]%s[/i]', line))
-			ti(out, '  [list=1]')
-		end
-	end
-
-	ti(out, '[/list]')
-
-	local p = assert(io.popen(sf('git diff --shortstat %s..%s', prevTag, currentTag)))
-	local stat = p:read'*a'
-	p:close()
-
-	ti(out, sf('[indent]%s[/indent]', stat:sub(2, -2)))
-
-	return table.concat(out, '\n')
-end
-
-local stop
-local to = ...
-if(to) then
-	for i=1, #tags do
-		if(tags[i].string == to) then
-			stop = i + 1
-		end
-	end
-
-	if(not stop) then stop = #tags end
-else
-	stop = #tags
-end
-
-for i=2, stop do
-	local current, prev = tags[i -1], tags[i]
-	print(generateLog(prev.string, current.string))
-end
-
--- vim: set filetype=lua :
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ActionPanel/oUF_ActionPanel.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ActionPanel/oUF_ActionPanel.lua
deleted file mode 100644
index ac98666..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ActionPanel/oUF_ActionPanel.lua
+++ /dev/null
@@ -1,106 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local Update = function(self, event, unit)
-	if(self.unit ~= unit) or not unit then return end
-	local action = self.ActionPanel
-	local border = action.border
-	local special = action.special
-	local showSpecial = false
-	local r,g,b = 0,0,0;
-	local category = UnitClassification(unit)
-
-	if(category == "elite") then
-		r,g,b = 1,0.75,0,0.7;
-		showSpecial = true
-	elseif(category == "rare" or category == "rareelite") then
-		r,g,b = 0.59,0.79,1,0.7;
-		showSpecial = true
-	end
-	if(UnitIsDeadOrGhost(unit)) then
-		r,g,b = 0,0,0
-	end
-	border[1]:SetTexture(r,g,b)
-	border[2]:SetTexture(r,g,b)
-	border[3]:SetTexture(r,g,b)
-	border[4]:SetTexture(r,g,b)
-	if(special) then
-		if(showSpecial) then
-			special[1]:SetVertexColor(r,g,b)
-			special[2]:SetVertexColor(r,g,b)
-			special[3]:SetVertexColor(r,g,b)
-			special:Show()
-		else
-			special:Hide()
-		end
-	end
-
-	local status = self.StatusPanel
-	if(status) then
-		local texture = status.texture
-		local media = status.media
-
-		if(not UnitIsConnected(unit)) then
-			texture:SetAlpha(1)
-			texture:SetTexture(media[1])
-			texture:SetGradient("VERTICAL",0,1,1,1,1,0)
-		elseif(UnitIsDeadOrGhost(unit)) then
-			texture:SetAlpha(1)
-			texture:SetTexture(media[2])
-			texture:SetGradient("VERTICAL",0,0,1,0,1,0)
-		elseif(unit ~= "player" and (unit ~= "vehicle" and (not UnitIsFriend(unit, "player")) and (not UnitIsPlayer(unit)) and UnitIsTapped(unit) and (not UnitIsTappedByPlayer(unit)))) then
-			texture:SetAlpha(1)
-			texture:SetTexture(media[3])
-			texture:SetGradient("VERTICAL",1,1,0,1,0,0)
-		else
-			texture:SetTexture(0,0,0,0)
-		end
-	end
-end
-
-local Path = function(self, ...)
-	return (self.ActionPanel.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-local Enable = function(self, unit)
-	local action = self.ActionPanel
-	if(action) then
-		action.__owner = self
-		action.ForceUpdate = ForceUpdate
-		local status = self.StatusPanel
-		if(status and status.texture) then
-			self:RegisterEvent('UNIT_FLAGS', Path)
-			self:RegisterEvent('UNIT_FACTION', Path)
-		end
-		self:RegisterEvent("UNIT_TARGET", Path, true)
-		self:RegisterEvent("PLAYER_TARGET_CHANGED", Path, true)
-		return true
-	end
-end
-
-local Disable = function(self)
-	local action = self.ActionPanel
-	if(action) then
-		local status = self.StatusPanel
-		if(status) then
-			if(self:IsEventRegistered("UNIT_FLAGS")) then
-				self:UnregisterEvent("UNIT_FLAGS", Path)
-			end
-			if(self:IsEventRegistered("UNIT_FACTION")) then
-				self:UnregisterEvent("UNIT_FACTION", Path)
-			end
-		end
-		if(self:IsEventRegistered("PLAYER_TARGET_CHANGED")) then
-			self:UnregisterEvent("PLAYER_TARGET_CHANGED", Path)
-		end
-		if(self:IsEventRegistered("UNIT_TARGET")) then
-			self:UnregisterEvent("UNIT_TARGET", Path)
-		end
-	end
-end
-
-oUF:AddElement('ActionPanel', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ActionPanel/oUF_ActionPanel.toc b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ActionPanel/oUF_ActionPanel.toc
deleted file mode 100644
index 28b273d..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ActionPanel/oUF_ActionPanel.toc
+++ /dev/null
@@ -1,9 +0,0 @@
-## Interface: 50001
-## Title: oUF ActionPanel
-## Notes: Adds a backing to all unit frames that provides many utilities.
-## Author: Munglunch
-## Version: 4.4
-## X-Category: oUF
-## Dependencies: oUF
-
-oUF_ActionPanel.lua
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Afflicted/oUF_Afflicted.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Afflicted/oUF_Afflicted.lua
deleted file mode 100644
index fdfaa1c..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Afflicted/oUF_Afflicted.lua
+++ /dev/null
@@ -1,137 +0,0 @@
-local _, ns = ...
-local oUF = oUF or ns.oUF
-if not oUF then return end
-
-local playerClass = select(2,UnitClass("player"))
-local CanDispel = {
-	PRIEST = { Magic = true, Disease = true },
-	SHAMAN = { Magic = false, Curse = true },
-	PALADIN = { Magic = false, Poison = true, Disease = true },
-	MAGE = { Curse = true },
-	DRUID = { Magic = false, Curse = true, Poison = true, Disease = false },
-	MONK = { Magic = false, Poison = true, Disease = true }
-}
-
-local AfflictedColor = { };
-AfflictedColor["none"] = { r = 1, g = 0, b = 0 };
-AfflictedColor["Magic"]    = { r = 0, g = 0.4, b = 1 };
-AfflictedColor["Curse"]    = { r = 0.4, g = 0, b = 1 };
-AfflictedColor["Disease"]  = { r = 1, g = 0.4, b = 0 };
-AfflictedColor["Poison"]   = { r = 0.4, g = 1, b = 0 };
-AfflictedColor[""] = AfflictedColor["none"];
-
-local SymbiosisName = GetSpellInfo(110309)
-local CleanseName = GetSpellInfo(4987)
-local dispellist = CanDispel[playerClass] or {}
-local blackList = {
-	[GetSpellInfo(140546)] = true, --Fully Mutated
-	[GetSpellInfo(136184)] = true, --Thick Bones
-	[GetSpellInfo(136186)] = true, --Clear mind
-	[GetSpellInfo(136182)] = true, --Improved Synapses
-	[GetSpellInfo(136180)] = true, --Keen Eyesight
-}
-local function GetDebuffType(unit, filter)
-	if not unit or not UnitCanAssist("player", unit) then return nil end
-	local i = 1
-	while true do
-		local name, _, texture, _, debufftype = UnitAura(unit, i, "HARMFUL")
-		if not texture then break end
-		if debufftype and (not filter or (filter and dispellist[debufftype])) and not blackList[name] then
-			return debufftype, texture
-		end
-		i = i + 1
-	end
-end
-
-local function CheckTalentTree(tree)
-	local activeGroup = GetActiveSpecGroup()
-	if activeGroup and GetSpecialization(false, false, activeGroup) then
-		return tree == GetSpecialization(false, false, activeGroup)
-	end
-end
-
-local function CheckSpec(self, event, levels)
-	if event == "CHARACTER_POINTS_CHANGED" and levels > 0 then return end
-	if playerClass == "PRIEST" then
-		if CheckTalentTree(3) then
-			dispellist.Disease = false
-		else
-			dispellist.Disease = true
-		end
-	elseif playerClass == "PALADIN" then
-		if CheckTalentTree(1) then
-			dispellist.Magic = true
-		else
-			dispellist.Magic = false
-		end
-	elseif playerClass == "SHAMAN" then
-		if CheckTalentTree(3) then
-			dispellist.Magic = true
-		else
-			dispellist.Magic = false
-		end
-	elseif playerClass == "DRUID" then
-		if CheckTalentTree(4) then
-			dispellist.Magic = true
-		else
-			dispellist.Magic = false
-		end
-	elseif playerClass == "MONK" then
-		if CheckTalentTree(2) then
-			dispellist.Magic = true
-		else
-			dispellist.Magic = false
-		end
-	end
-end
-
-local function CheckSymbiosis()
-	if GetSpellInfo(SymbiosisName) == CleanseName then
-		dispellist.Disease = true
-	else
-		dispellist.Disease = false
-	end
-end
-
-local function Update(object, event, unit)
-	if unit ~= object.unit then return; end
-	local debuffType, texture  = GetDebuffType(unit, object.AfflictedFilter)
-	if debuffType then
-		local color = AfflictedColor[debuffType]
-		object.Afflicted:SetVertexColor(color.r, color.g, color.b, object.AfflictedAlpha or .5)
-	else
-		object.Afflicted:SetVertexColor(0,0,0,0)
-	end
-end
-
-local function Enable(object)
-	if not object.Afflicted then
-		return
-	end
-	if object.AfflictedFilter and not CanDispel[playerClass] then
-		return
-	end
-	object:RegisterEvent("UNIT_AURA", Update)
-	object:RegisterEvent("PLAYER_TALENT_UPDATE", CheckSpec)
-	object:RegisterEvent("CHARACTER_POINTS_CHANGED", CheckSpec)
-	CheckSpec(object)
-
-	object:RegisterUnitEvent("UNIT_AURA", object.unit)
-	if playerClass == "DRUID" then
-		object:RegisterEvent("SPELLS_CHANGED", CheckSymbiosis)
-	end
-	return true
-end
-
-local function Disable(object)
-	object:UnregisterEvent("UNIT_AURA", Update)
-	object:UnregisterEvent("PLAYER_TALENT_UPDATE", CheckSpec)
-	object:UnregisterEvent("CHARACTER_POINTS_CHANGED", CheckSpec)
-
-	if playerClass == "DRUID" then
-		object:UnregisterEvent("SPELLS_CHANGED", CheckSymbiosis)
-	end
-	object.Afflicted:SetVertexColor(0,0,0,0)
-end
-
-oUF:AddElement('Afflicted', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Afflicted/oUF_Afflicted.toc b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Afflicted/oUF_Afflicted.toc
deleted file mode 100644
index c8b4d84..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Afflicted/oUF_Afflicted.toc
+++ /dev/null
@@ -1,9 +0,0 @@
-## Interface: 50001
-## Title: oUF Afflicted
-## Notes: Adds Custom Debuff Highlighting to oUF.
-## Author: Munglunch
-## Version: 4.4
-## X-Category: oUF
-## Dependencies: oUF
-
-oUF_ActionPanel.lua
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.lua
deleted file mode 100644
index 55456bd..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.lua
+++ /dev/null
@@ -1,119 +0,0 @@
-if select(2, UnitClass('player')) ~= "MAGE" then return end
-
-local _, ns = ...
-local oUF = oUF or ns.oUF
-if not oUF then return end
-
-local function UpdateBar(self, elapsed)
-	if not self.expirationTime then return end
-	self.elapsed = (self.elapsed or 0) + elapsed
-	if self.elapsed >= 0.5 then
-		local timeLeft = self.expirationTime - GetTime()
-		if timeLeft > 0 then
-			self:SetValue(timeLeft)
-		else
-			self:SetScript("OnUpdate", nil)
-		end
-	end
-end
-
-local Update = function(self, event)
-	local unit = self.unit or 'player'
-	local bar = self.ArcaneChargeBar
-	if(bar.PreUpdate) then bar:PreUpdate(event) end
-
-	local talentSpecialization = GetSpecialization()
-
-	if talentSpecialization == 1 then
-		bar:Show()
-	else
-		bar:Hide()
-	end
-
-	local arcaneCharges, maxCharges, duration, expirationTime = 0, 4
-	if bar:IsShown() then
-		for index=1, 30 do
-			local _, _, _, count, _, start, timeLeft, _, _, _, spellID = UnitDebuff(unit, index)
-			if spellID == 36032 then
-				arcaneCharges = count or 0
-				duration = start
-				expirationTime = timeLeft
-				break
-			end
-		end
-
-		for i = 1, maxCharges do
-			if duration and expirationTime then
-				bar[i]:SetMinMaxValues(0, duration)
-				bar[i].duration = duration
-				bar[i].expirationTime = expirationTime
-			end
-			if i <= arcaneCharges then
-				bar[i]:Show()
-				bar[i]:SetValue(duration)
-				bar[i]:SetScript('OnUpdate', UpdateBar)
-			else
-				bar[i]:SetValue(0)
-				bar[i]:SetScript('OnUpdate', nil)
-				bar[i]:Hide()
-			end
-		end
-	end
-
-	if(bar.PostUpdate) then
-		return bar:PostUpdate(event, arcaneCharges, maxCharges)
-	end
-end
-
-
-local Path = function(self, ...)
-	return (self.ArcaneChargeBar.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-local function Enable(self, unit)
-	local bar = self.ArcaneChargeBar
-
-	if(bar) then
-		self:RegisterEvent("UNIT_AURA", Path)
-		self:RegisterEvent("PLAYER_TALENT_UPDATE", Path)
-		self:RegisterEvent("PLAYER_ENTERING_WORLD", Path)
-		bar.__owner = self
-		bar.ForceUpdate = ForceUpdate
-
-		for i = 1, 4 do
-			if not bar[i]:GetStatusBarTexture() then
-				bar[i]:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
-			end
-
-			bar[i]:SetFrameLevel(bar:GetFrameLevel() + 1)
-			bar[i]:GetStatusBarTexture():SetHorizTile(false)
-
-			if bar[i].bg then
-				bar[i]:SetMinMaxValues(0, 1)
-				bar[i]:SetValue(0)
-				bar[i].bg:SetAlpha(0.4)
-				bar[i].bg:SetAllPoints()
-				bar[i]:Hide()
-			end
-		end
-
-		return true;
-	end
-end
-
-local function Disable(self,unit)
-	local bar = self.ArcaneChargeBar
-
-	if(bar) then
-		self:UnregisterEvent("UNIT_AURA", Path)
-		self:UnregisterEvent("PLAYER_TALENT_UPDATE", Path)
-		self:UnregisterEvent("PLAYER_ENTERING_WORLD", Path)
-		bar:Hide()
-	end
-end
-
-oUF:AddElement("ArcaneChargeBar",Path,Enable,Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.toc b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.toc
deleted file mode 100644
index 8d226c3..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.toc
+++ /dev/null
@@ -1,8 +0,0 @@
-## Interface: 50001
-## Title: oUF Arcane Charge
-## Notes: Adds support for arcane charge indicators to oUF.
-## Author: Munglunch
-## Version: 4.4
-## Dependencies: oUF
-
-oUF_ArcaneCharge.lua
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_AuraBars/oUF_AuraBars.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_AuraBars/oUF_AuraBars.lua
deleted file mode 100644
index 65c3e76..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_AuraBars/oUF_AuraBars.lua
+++ /dev/null
@@ -1,378 +0,0 @@
---[[ MODIFIED FOR SVUI BY MUNGLUNCH ]]--
-local _, ns = ...
-local oUF = oUF or ns.oUF
-assert(oUF, 'oUF_AuraBars was unable to locate oUF install.')
-
-local format = string.format
-local floor, huge, min = math.floor, math.huge, math.min
-local tsort = table.sort
-
-local function Round(number, decimalPlaces)
-	if decimalPlaces and decimalPlaces > 0 then
-		local mult = 10^decimalPlaces
-		return floor(number * mult + .5) / mult
-	end
-	return floor(num + .5)
-end
-
-local DAY, HOUR, MINUTE = 86400, 3600, 60
-local function FormatTime(s)
-	if s < MINUTE then
-		return ("%.1fs"):format(s)
-	elseif s < HOUR then
-		return ("%dm %ds"):format(s/60%60, s%60)
-	elseif s < DAY then
-		return ("%dh %dm"):format(s/(60*60), s/60%60)
-	else
-		return ("%dd %dh"):format(s/DAY, (s / HOUR) - (floor(s/DAY) * 24))
-	end
-end
-
-local function UpdateTooltip(self)
-	GameTooltip:SetUnitAura(self.__unit, self:GetParent().aura.name, self:GetParent().aura.rank, self:GetParent().aura.filter)
-end
-
-local function OnEnter(self)
-	if(not self:IsVisible()) then return end
-	GameTooltip:SetOwner(self, "ANCHOR_BOTTOMRIGHT")
-	self:UpdateTooltip()
-end
-
-local function OnLeave(self)
-	GameTooltip:Hide()
-end
-
-local function SetAnchors(self)
-	local bars = self.bars
-
-	for index = 1, #bars do
-		local frame = bars[index]
-		local anchor = frame.anchor
-		frame:SetHeight(self.auraBarHeight or 20)
-		frame.statusBar.iconHolder:Size(frame:GetHeight())
-		frame:SetWidth((self.auraBarWidth or self:GetWidth()) - (frame:GetHeight() + (self.gap or 0)))
-		frame:ClearAllPoints()
-		if self.down == true then
-			if self == anchor then -- Root frame so indent for icon
-				frame:SetPoint('TOPLEFT', anchor, 'TOPLEFT', (frame:GetHeight() + (self.gap or 0) ), -1)
-			else
-				frame:SetPoint('TOPLEFT', anchor, 'BOTTOMLEFT', 0, (-self.spacing or 0))
-			end
-		else
-			if self == anchor then -- Root frame so indent for icon
-				frame:SetPoint('BOTTOMLEFT', anchor, 'BOTTOMLEFT', (frame:GetHeight() + (self.gap or 0)), 1)
-			else
-				frame:SetPoint('BOTTOMLEFT', anchor, 'TOPLEFT', 0, (self.spacing or 0))
-			end
-		end
-	end
-end
-
-local function SetBackground(frame)
-	local btop = frame:CreateTexture(nil, "OVERLAY")
-	btop:SetTexture(0, 0, 0)
-	btop:SetPoint("TOPLEFT")
-	btop:SetPoint("TOPRIGHT")
-	btop:SetHeight(1)
-	local bbottom = frame:CreateTexture(nil, "OVERLAY")
-	bbottom:SetTexture(0, 0, 0)
-	bbottom:SetPoint("BOTTOMLEFT")
-	bbottom:SetPoint("BOTTOMRIGHT")
-	bbottom:SetHeight(1)
-	local bright = frame:CreateTexture(nil, "OVERLAY")
-	bright:SetTexture(0, 0, 0)
-	bright:SetPoint("TOPRIGHT")
-	bright:SetPoint("BOTTOMRIGHT")
-	bright:SetWidth(1)
-	local bleft = frame:CreateTexture(nil, "OVERLAY")
-	bleft:SetTexture(0, 0, 0)
-	bleft:SetPoint("TOPLEFT")
-	bleft:SetPoint("BOTTOMLEFT")
-	bleft:SetWidth(1)
-    frame:SetBackdrop({
-        bgFile = [[Interface\BUTTONS\WHITE8X8]],
-        edgeFile = [[Interface\BUTTONS\WHITE8X8]],
-        tile = false,
-        tileSize = 0,
-        edgeSize = 1,
-        insets =
-        {
-            left = 0,
-            right = 0,
-            top = 0,
-            bottom = 0,
-        },
-    })
-    frame:SetBackdropColor(0,0,0,0.25)
-    frame:SetBackdropBorderColor(0,0,0)
-end
-
-local function CreateAuraBar(oUF, anchor)
-	local auraBarParent = oUF.AuraBars
-
-	local frame = CreateFrame("Frame", nil, auraBarParent)
-	frame:SetHeight(auraBarParent.auraBarHeight or 20)
-	frame:SetWidth((auraBarParent.auraBarWidth or auraBarParent:GetWidth()) - (frame:GetHeight() + (auraBarParent.gap or 0)))
-	frame.anchor = anchor
-	SetBackground(frame)
-
-	-- the main bar
-	local statusBar = CreateFrame("StatusBar", nil, frame)
-	statusBar:SetStatusBarTexture(auraBarParent.barTexture or [[Interface\TargetingFrame\UI-StatusBar]])
-	statusBar:SetAlpha(auraBarParent.fgalpha or 1)
-	statusBar:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, -1)
-	statusBar:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -1, 1)
-	frame.statusBar = statusBar
-
-	if auraBarParent.down == true then
-		if auraBarParent == anchor then -- Root frame so indent for icon
-			frame:SetPoint('TOPLEFT', anchor, 'TOPLEFT', (frame:GetHeight() + (auraBarParent.gap or 0) ), -1)
-		else
-			frame:SetPoint('TOPLEFT', anchor, 'BOTTOMLEFT', 0, (-auraBarParent.spacing or 0))
-		end
-	else
-		if auraBarParent == anchor then -- Root frame so indent for icon
-			frame:SetPoint('BOTTOMLEFT', anchor, 'BOTTOMLEFT', (frame:GetHeight() + (auraBarParent.gap or 0)), 1)
-		else
-			frame:SetPoint('BOTTOMLEFT', anchor, 'TOPLEFT', 0, (auraBarParent.spacing or 0))
-		end
-	end
-
-	local spark = statusBar:CreateTexture(nil, "OVERLAY", nil);
-	spark:SetTexture([[Interface\CastingBar\UI-CastingBar-Spark]]);
-	spark:SetWidth(12);
-	spark:SetBlendMode("ADD");
-	spark:SetPoint('CENTER', statusBar:GetStatusBarTexture(), 'RIGHT')
-	statusBar.spark = spark
-
-	local holder = CreateFrame('Button', nil, statusBar)
-	holder:SetHeight(frame:GetHeight())
-	holder:SetWidth(frame:GetHeight())
-	holder:SetPoint('BOTTOMRIGHT', frame, 'BOTTOMLEFT', -auraBarParent.gap, 0)
-	SetBackground(holder)
-	holder.__unit = oUF.unit
-	holder:SetScript('OnEnter', OnEnter)
-	holder:SetScript('OnLeave', OnLeave)
-	holder.UpdateTooltip = UpdateTooltip
-	statusBar.iconHolder = holder
-
-	statusBar.icon = statusBar.iconHolder:CreateTexture(nil, 'OVERLAY')
-	statusBar.icon:SetTexCoord(.1, .9, .1, .9)
-	statusBar.icon:SetPoint("TOPLEFT", statusBar.iconHolder, "TOPLEFT", 1, -1)
-	statusBar.icon:SetPoint("BOTTOMRIGHT", statusBar.iconHolder, "BOTTOMRIGHT", -1, 1)
-
-	statusBar.spelltime = statusBar:CreateFontString(nil, 'ARTWORK')
-	statusBar.spelltime:SetFont(auraBarParent.timeFont or [[Fonts\FRIZQT__.TTF]], auraBarParent.textSize or 10, auraBarParent.textOutline or "NONE")
-	statusBar.spelltime:SetTextColor(1 ,1, 1)
-	statusBar.spelltime:SetShadowOffset(1, -1)
-  	statusBar.spelltime:SetShadowColor(0, 0, 0)
-	statusBar.spelltime:SetJustifyH'RIGHT'
-	statusBar.spelltime:SetJustifyV'CENTER'
-	statusBar.spelltime:SetPoint'RIGHT'
-
-	statusBar.spellname = statusBar:CreateFontString(nil, 'ARTWORK')
-	statusBar.spellname:SetFont(auraBarParent.textFont or [[Fonts\FRIZQT__.TTF]], auraBarParent.textSize or 10, auraBarParent.textOutline or "NONE")
-	statusBar.spellname:SetTextColor(1, 1, 1)
-	statusBar.spellname:SetShadowOffset(1, -1)
-  	statusBar.spellname:SetShadowColor(0, 0, 0)
-	statusBar.spellname:SetJustifyH'LEFT'
-	statusBar.spellname:SetJustifyV'CENTER'
-	statusBar.spellname:SetPoint'LEFT'
-	statusBar.spellname:SetPoint('RIGHT', statusBar.spelltime, 'LEFT')
-
-	if auraBarParent.PostCreateBar then
-		auraBarParent.PostCreateBar(statusBar)
-	end
-
-	return frame
-end
-
-local function UpdateBars(auraBars)
-	local bars = auraBars.bars
-	local timenow = GetTime()
-
-	for index = 1, #bars do
-		local frame = bars[index]
-		local bar = frame.statusBar
-		if not frame:IsVisible() then
-			break
-		end
-		if bar.aura.noTime then
-			bar.spelltime:SetText()
-			bar.spark:Hide()
-		else
-			local timeleft = bar.aura.expirationTime - timenow
-			bar:SetValue(timeleft)
-			bar.spelltime:SetText(FormatTime(timeleft))
-			if auraBars.spark == true then
-				bar.spark:Show()
-			end
-		end
-	end
-end
-
-local function DefaultFilter(self, unit, name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate)
-	if unitCaster == 'player' and not shouldConsolidate then
-		return true
-	end
-end
-
-local sort = function(a, b)
-	local compa, compb = a.noTime and huge or a.expirationTime, b.noTime and huge or b.expirationTime
-	return compa > compb
-end
-
-
-local function Update(self, event, unit)
-	if self.unit ~= unit then return end
-	local auraBars = self.AuraBars
-	local helpOrHarm
-	local isFriend = UnitIsFriend('player', unit)
-
-	if auraBars.friendlyAuraType and auraBars.enemyAuraType then
-		if isFriend then
-			helpOrHarm = auraBars.friendlyAuraType
-		else
-			helpOrHarm = auraBars.enemyAuraType
-		end
-	else
-		helpOrHarm = isFriend and 'HELPFUL' or 'HARMFUL'
-	end
-
-	-- Create a table of auras to display
-	local auras = {}
-	local lastAuraIndex = 0
-	for index = 1, 40 do
-		local name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellID = UnitAura(unit, index, helpOrHarm)
-		if not name then break end
-
-		if (auraBars.filter or DefaultFilter)(self, unit, name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellID) then
-			lastAuraIndex = lastAuraIndex + 1
-			auras[lastAuraIndex] = {}
-			auras[lastAuraIndex].spellID = spellID
-			auras[lastAuraIndex].name = name
-			auras[lastAuraIndex].rank = rank
-			auras[lastAuraIndex].icon = icon
-			auras[lastAuraIndex].count = count
-			auras[lastAuraIndex].debuffType = debuffType
-			auras[lastAuraIndex].duration = duration
-			auras[lastAuraIndex].expirationTime = expirationTime
-			auras[lastAuraIndex].unitCaster = unitCaster
-			auras[lastAuraIndex].isStealable = isStealable
-			auras[lastAuraIndex].noTime = (duration == 0 and expirationTime == 0)
-			auras[lastAuraIndex].filter = helpOrHarm
-			auras[lastAuraIndex].shouldConsolidate = shouldConsolidate
-		end
-	end
-
-	if auraBars.sort then
-		tsort(auras, type(auraBars.sort) == 'function' and auraBars.sort or sort)
-	end
-
-	-- Show and configure bars for buffs/debuffs.
-	local bars = auraBars.bars
-	if lastAuraIndex == 0 then
-		self.AuraBars:SetHeight(1)
-	end
-
-	for index = 1 , lastAuraIndex do
-		if auraBars:GetWidth() == 0 then break; end
-		local aura = auras[index]
-		local frame = bars[index]
-
-		if not frame then
-			frame = CreateAuraBar(self, index == 1 and auraBars or bars[index - 1])
-			bars[index] = frame
-		end
-
-		if index == lastAuraIndex then
-			if self.AuraBars.down then
-				self.AuraBars:SetHeight(self.AuraBars:GetTop() - frame:GetBottom())
-			elseif frame:GetTop() and self.AuraBars:GetBottom() then
-				self.AuraBars:SetHeight(frame:GetTop() - self.AuraBars:GetBottom())
-			else
-				self.AuraBars:Height(20)
-			end
-		end
-
-		local bar = frame.statusBar
-		frame.index = index
-
-		-- Backup the details of the aura onto the bar, so the OnUpdate function can use it
-		bar.aura = aura
-
-		-- Configure
-		if bar.aura.noTime then
-			bar:SetMinMaxValues(0, 1)
-			bar:SetValue(1)
-		else
-			if auraBars.scaleTime then
-				local maxvalue = min(auraBars.scaleTime, bar.aura.duration)
-				bar:SetMinMaxValues(0, maxvalue)
-				bar:SetWidth(
-					( maxvalue / auraBars.scaleTime ) *
-					(	( auraBars.auraBarWidth or auraBars:GetWidth() ) -
-						( bar:GetHeight() + (auraBars.gap or 0) ) ) ) 				-- icon size + gap
-			else
-				bar:SetMinMaxValues(0, bar.aura.duration)
-			end
-			bar:SetValue(bar.aura.expirationTime - GetTime())
-		end
-
-		bar.icon:SetTexture(bar.aura.icon)
-
-		bar.spellname:SetText(bar.aura.count > 1 and format("%s [%d]", bar.aura.name, bar.aura.count) or bar.aura.name)
-		bar.spelltime:SetText(not bar.noTime and FormatTime(bar.aura.expirationTime-GetTime()))
-
-		-- Colour bars
-		local r, g, b = .2, .6, 1 -- Colour for buffs
-		if auraBars.buffColor then
-			r, g, b = unpack(auraBars.buffColor)
-		end
-
-		if helpOrHarm == 'HARMFUL' then
-			local debuffType = bar.aura.debuffType and bar.aura.debuffType or 'none'
-
-			r, g, b = DebuffTypeColor[debuffType].r, DebuffTypeColor[debuffType].g, DebuffTypeColor[debuffType].b
-			if auraBars.debuffColor then
-				r, g, b = unpack(auraBars.debuffColor)
-			else
-				if debuffType == 'none' and auraBars.defaultDebuffColor then
-					r, g, b = unpack(auraBars.defaultDebuffColor)
-				end
-			end
-		end
-		bar:SetStatusBarColor(r, g, b)
-		frame:Show()
-	end
-
-	-- Hide unused bars.
-	for index = lastAuraIndex + 1, #bars do
-		bars[index]:Hide()
-	end
-
-	if auraBars.PostUpdate then
-		auraBars:PostUpdate(event, unit)
-	end
-end
-
-local function Enable(self)
-	if self.AuraBars then
-		self:RegisterEvent('UNIT_AURA', Update)
-		self.AuraBars:SetHeight(1)
-		self.AuraBars.bars = self.AuraBars.bars or {}
-		self.AuraBars.SetAnchors = SetAnchors
-		self.AuraBars:SetScript('OnUpdate', UpdateBars)
-		return true
-	end
-end
-
-local function Disable(self)
-	local auraFrame = self.AuraBars
-	if auraFrame then
-		self:UnregisterEvent('UNIT_AURA', Update)
-		auraFrame:SetScript('OnUpdate', nil)
-	end
-end
-
-oUF:AddElement('AuraBars', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_AuraWatch/oUF_AuraWatch.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_AuraWatch/oUF_AuraWatch.lua
deleted file mode 100644
index b011926..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_AuraWatch/oUF_AuraWatch.lua
+++ /dev/null
@@ -1,378 +0,0 @@
---[[------------------------------------------------------------------------------------------------------
-oUF_AuraWatch by Astromech
-Please leave comments, suggestions, and bug reports on this addon's WoWInterface page
-
-To setup, create a table named AuraWatch in your unit frame. There are several options
-you can specify, as explained below.
-
-	icons
-		Mandatory!
-		A table of frames to be used as icons. oUF_Aurawatch does not position
-		these frames, so you must do so yourself. Each icon needs a spellID entry,
-		which is the spell ID of the aura to watch. Table should be set up
-		such that values are icon frames, but the keys can be anything.
-
-		Note each icon can have several options set as well. See below.
-	strictMatching
-		Default: false
-		If true, AuraWatch will only show an icon if the specific aura
-		with the specified spell id is on the unit. If false, AuraWatch
-		will show the icon if any aura with the same name and icon texture
-		is on the unit. Strict matching can be undesireable because most
-		ranks of an aura have different spell ids.
-	missingAlpha
-		Default 0.75
-		The alpha value for icons of auras which have faded from the unit.
-	presentAlpha
-		Default 1
-		The alpha value for icons or auras present on the unit.
-	onlyShowMissing
-		Default false
-		If this is true, oUF_AW will hide icons if they are present on the unit.
-	onlyShowPresent
-		Default false
-		If this is true, oUF_AW will hide icons if they have expired from the unit.
-	hideCooldown
-		Default false
-		If this is true, oUF_AW will not create a cooldown frame
-	hideCount
-		Default false
-		If this is true, oUF_AW will not create a count fontstring
-	fromUnits
-		Default {["player"] = true, ["pet"] = true, ["vehicle"] = true}
-		A table of units from which auras can originate. Have the units be the keys
-		and "true" be the values.
-	anyUnit
-		Default false
-		Set to true for oUF_AW to to show an aura no matter what unit it
-		originates from. This will override any fromUnits setting.
-	PostCreateIcon
-		Default nil
-		A function to call when an icon is created to modify it, such as adding
-		a border or repositioning the count fontstring. Leave as nil to ignore.
-		The arguements are: AuraWatch table, icon, auraSpellID, auraName, unitFrame
-
-Below are options set on a per icon basis. Set these as fields in the icon frames.
-
-The following settings can be overridden from the AuraWatch table on a per-aura basis:
-	onlyShowMissing
-	onlyShowPresent
-	hideCooldown
-	hideCount
-	fromUnits
-	anyUnit
-
-The following settings are unique to icons:
-
-	spellID
-		Mandatory!
-		The spell id of the aura, as explained above.
-	icon
-		Default aura texture
-		A texture value for this icon.
-	overlay
-		Default Blizzard aura overlay
-		An overlay for the icon. This is not created if a custom icon texture is created.
-	count
-		Default A fontstring
-		An fontstring to show the stack count of an aura.
-
-Here is an example of how to set oUF_AW up:
-
-	local createAuraWatch = function(self, unit)
-		local auras = {}
-
-		-- A table of spellIDs to create icons for
-		-- To find spellIDs, look up a spell on www.wowhead.com and look at the URL
-		-- http://www.wowhead.com/?spell=SPELL_ID
-		local spellIDs = { ... }
-
-		auras.presentAlpha = 1
-		auras.missingAlpha = .7
-		auras.PostCreateIcon = myCustomIconSkinnerFunction
-		-- Set any other AuraWatch settings
-		auras.icons = {}
-		for i, sid in pairs(spellIDs) do
-			local icon = CreateFrame("Frame", nil, auras)
-			icon.spellID = sid
-			-- set the dimensions and positions
-			icon:SetWidth(24)
-			icon:SetHeight(24)
-			icon:SetPoint("BOTTOM", self, "BOTTOM", 0, 28 * i)
-			auras.icons[sid] = icon
-			-- Set any other AuraWatch icon settings
-		end
-		self.AuraWatch = auras
-	end
------------------------------------------------------------------------------------------------------------]]
-
-local _, ns = ...
-local oUF = oUF or ns.oUF
-assert(oUF, "oUF_AuraWatch cannot find an instance of oUF. If your oUF is embedded into a layout, it may not be embedded properly.")
-
-local UnitBuff, UnitDebuff, UnitGUID = UnitBuff, UnitDebuff, UnitGUID
-local GUIDs = {}
-
-local PLAYER_UNITS = {
-	player = true,
-	vehicle = true,
-	pet = true,
-}
-
-local setupGUID
-do
-	local cache = setmetatable({}, {__type = "k"})
-
-	local frame = CreateFrame"Frame"
-	frame:SetScript("OnEvent", function(self, event)
-		for k,t in pairs(GUIDs) do
-			GUIDs[k] = nil
-			for a in pairs(t) do
-				t[a] = nil
-			end
-			cache[t] = true
-		end
-	end)
-	frame:RegisterEvent"PLAYER_REGEN_ENABLED"
-	frame:RegisterEvent"PLAYER_ENTERING_WORLD"
-
-	function setupGUID(guid)
-		local t = next(cache)
-		if t then
-			cache[t] = nil
-		else
-			t = {}
-		end
-		GUIDs[guid] = t
-	end
-end
-
-local day, hour, minute, second = 86400, 3600, 60, 1
-function formatTime(s)
-	if s >= day then
-		return format("%dd", ceil(s / hour))
-	elseif s >= hour then
-		return format("%dh", ceil(s / hour))
-	elseif s >= minute then
-		return format("%dm", ceil(s / minute))
-	elseif s >= minute / 12 then
-		return floor(s)
-	end
-
-	return format("%.1f", s)
-end
-
-local function updateText(self, elapsed)
-	if self.timeLeft then
-		self.elapsed = (self.elapsed or 0) + elapsed
-		if self.elapsed >= 0.1 then
-			if not self.first then
-				self.timeLeft = self.timeLeft - self.elapsed
-			else
-				self.timeLeft = self.timeLeft - GetTime()
-				self.first = false
-			end
-			if self.timeLeft > 0 and ((self.timeLeft <= self.textThreshold) or self.textThreshold == -1) then
-				local time = formatTime(self.timeLeft)
-				self.text:SetText(time)
-			else
-				self.text:SetText('')
-				self:SetScript("OnUpdate", nil)
-			end
-			self.elapsed = 0
-		end
-	end
-end
-
-
-local function resetIcon(icon, frame, count, duration, remaining)
-	if icon.onlyShowMissing then
-		icon:Hide()
-	else
-		icon:Show()
-		if icon.cd then
-			if duration and duration > 0 and icon.style ~= 'NONE' then
-				icon.cd:SetCooldown(remaining - duration, duration)
-				icon.cd:Show()
-			else
-				icon.cd:Hide()
-			end
-		end
-
-		if icon.displayText then
-			icon.timeLeft = remaining
-			icon.first = true;
-			icon:SetScript('OnUpdate', updateText)
-		end
-
-		if icon.count then
-			icon.count:SetText((count > 1 and count))
-		end
-		if icon.overlay then
-			icon.overlay:Hide()
-		end
-		icon:SetAlpha(icon.presentAlpha)
-	end
-end
-
-local function expireIcon(icon, frame)
-	if icon.onlyShowPresent then
-		icon:Hide()
-	else
-		if (icon.cd) then icon.cd:Hide() end
-		if (icon.count) then icon.count:SetText() end
-		icon:SetAlpha(icon.missingAlpha)
-		if icon.overlay then
-			icon.overlay:Show()
-		end
-		icon:Show()
-	end
-end
-
-local found = {}
-local function Update(frame, event, unit)
-	if frame.unit ~= unit or not unit then return end
-	local watch = frame.AuraWatch
-	local index, icons = 1, watch.watched
-	local _, name, texture, count, duration, remaining, caster, key, icon, spellID
-	local filter = "HELPFUL"
-	local guid = UnitGUID(unit)
-	if not guid then return end
-	if not GUIDs[guid] then setupGUID(guid) end
-
-	for key, icon in pairs(icons) do
-		if not icon.onlyShowMissing then
-			icon:Hide()
-		end
-	end
-
-	while true do
-		name, _, texture, count, _, duration, remaining, caster, _, _, spellID = UnitAura(unit, index, filter)
-		if not name then
-			if filter == "HELPFUL" then
-				filter = "HARMFUL"
-				index = 1
-			else
-				break
-			end
-		else
-			if watch.strictMatching then
-				key = spellID
-			else
-				key = name..texture
-			end
-			icon = icons[key]
-
-			if icon and (icon.anyUnit or (caster and icon.fromUnits and icon.fromUnits[caster])) then
-				resetIcon(icon, watch, count, duration, remaining)
-				GUIDs[guid][key] = true
-				found[key] = true
-			end
-			index = index + 1
-		end
-	end
-
-	for key in pairs(GUIDs[guid]) do
-		if icons[key] and not found[key] then
-			expireIcon(icons[key], watch)
-		end
-	end
-
-	for k in pairs(found) do
-		found[k] = nil
-	end
-end
-
-local function setupIcons(self)
-
-	local watch = self.AuraWatch
-	local icons = watch.icons
-	watch.watched = {}
-
-	for _,icon in pairs(icons) do
-
-		local name, _, image = GetSpellInfo(icon.spellID)
-
-		if name then
-			icon.name = name
-
-			if not icon.cd and not (watch.hideCooldown or icon.hideCooldown) then
-				local cd = CreateFrame("Cooldown", nil, icon)
-				cd:SetAllPoints(icon)
-				icon.cd = cd
-			end
-
-			if not icon.icon then
-				local tex = icon:CreateTexture(nil, "BACKGROUND")
-				tex:SetAllPoints(icon)
-				tex:SetTexture(image)
-				icon.icon = tex
-				if not icon.overlay then
-					local overlay = icon:CreateTexture(nil, "OVERLAY")
-					overlay:SetTexture"Interface\\Buttons\\UI-Debuff-Overlays"
-					overlay:SetAllPoints(icon)
-					overlay:SetTexCoord(.296875, .5703125, 0, .515625)
-					overlay:SetVertexColor(1, 0, 0)
-					icon.overlay = overlay
-				end
-			end
-
-			if not icon.count and not (watch.hideCount or icon.hideCount) then
-				local count = icon:CreateFontString(nil, "OVERLAY")
-				count:SetFontObject(NumberFontNormal)
-				count:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT", -1, 0)
-				icon.count = count
-			end
-
-			if icon.onlyShowMissing == nil then
-				icon.onlyShowMissing = watch.onlyShowMissing
-			end
-			if icon.onlyShowPresent == nil then
-				icon.onlyShowPresent = watch.onlyShowPresent
-			end
-			if icon.presentAlpha == nil then
-				icon.presentAlpha = watch.presentAlpha
-			end
-			if icon.missingAlpha == nil then
-				icon.missingAlpha = watch.missingAlpha
-			end
-			if icon.fromUnits == nil then
-				icon.fromUnits = watch.fromUnits or PLAYER_UNITS
-			end
-			if icon.anyUnit == nil then
-				icon.anyUnit = watch.anyUnit
-			end
-
-			if watch.strictMatching then
-				watch.watched[icon.spellID] = icon
-			else
-				watch.watched[name..image] = icon
-			end
-
-			if watch.PostCreateIcon then watch:PostCreateIcon(icon, icon.spellID, name, self) end
-		else
-			print("oUF_AuraWatch error: no spell with "..tostring(icon.spellID).." spell ID exists")
-		end
-	end
-end
-
-local function Enable(self)
-	if self.AuraWatch then
-		self.AuraWatch.Update = setupIcons
-		self:RegisterEvent("UNIT_AURA", Update)
-		setupIcons(self)
-		return true
-	else
-		return false
-	end
-end
-
-local function Disable(self)
-	if self.AuraWatch then
-		self:UnregisterEvent("UNIT_AURA", Update)
-		for _,icon in pairs(self.AuraWatch.icons) do
-			icon:Hide()
-		end
-	end
-end
-oUF:AddElement("AuraWatch", Update, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_AuraWatch/oUF_AuraWatch.toc b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_AuraWatch/oUF_AuraWatch.toc
deleted file mode 100644
index 5c0d75c..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_AuraWatch/oUF_AuraWatch.toc
+++ /dev/null
@@ -1,9 +0,0 @@
-## Interface: 30300
-## Title: oUF AuraWatch
-## Author: Astromech
-## Version: 1.3.28-6
-## Notes: Adds aura timers to oUF
-## OptionalDeps: oUF
-## X-oUF: oUF
-
-oUF_AuraWatch.lua
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_CombatFader/oUF_CombatFader.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_CombatFader/oUF_CombatFader.lua
deleted file mode 100644
index f299d09..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_CombatFader/oUF_CombatFader.lua
+++ /dev/null
@@ -1,128 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-local frames, allFrames = {}, {}
-local showStatus
-local CORE;
-
-local CheckForReset = function()
-	for frame, unit in pairs(allFrames) do
-		if frame._secureFade and frame._secureFade.reset then
-			frame:SetAlpha(1)
-			frame._secureFade.reset = nil
-		end
-	end
-end
-
-local FadeFramesInOut = function(fade, unit)
-	if(not CORE) then return end
-	for frame, unit in pairs(frames) do
-		if not UnitExists(unit) then return end
-		if fade then
-			if(frame:GetAlpha() ~= 1 or (frame._secureFade and frame._secureFade.endAlpha == 0)) then
-				CORE:SecureFadeIn(frame, 0.15)
-			end
-		else
-			if frame:GetAlpha() ~= 0 then
-				CORE:SecureFadeOut(frame, 0.15)
-				frame._secureFade.finishedFunc = CheckForReset
-			else
-				showStatus = false;
-				return
-			end
-		end
-	end
-
-	if unit == 'player' then
-		showStatus = fade
-	end
-end
-
-local Update = function(self, arg1, arg2)
-	if(not CORE) then return end
-	if arg1 == "UNIT_HEALTH" and self and self.unit ~= arg2 then return end
-	if type(arg1) == 'boolean' and not frames[self] then return end
-
-	if(not frames[self]) then
-		if(CORE) then
-			CORE:SecureFadeIn(self, 0.15)
-			self._secureFade.reset = true
-		end
-		return
-	end
-
-	local combat = InCombatLockdown()
-	local cur, max = UnitHealth("player"), UnitHealthMax("player")
-	local cast, channel = UnitCastingInfo("player"), UnitChannelInfo("player")
-	local target, focus = UnitExists("target"), UnitExists("focus")
-
-	if (cast or channel) and showStatus ~= true then
-		FadeFramesInOut(true, frames[self])
-	elseif cur ~= max and showStatus ~= true then
-		FadeFramesInOut(true, frames[self])
-	elseif (target or focus) and showStatus ~= true then
-		FadeFramesInOut(true, frames[self])
-	elseif arg1 == true and showStatus ~= true then
-		FadeFramesInOut(true, frames[self])
-	else
-		if combat and showStatus ~= true then
-			FadeFramesInOut(true, frames[self])
-		elseif not target and not combat and not focus and (cur == max) and not (cast or channel) then
-			FadeFramesInOut(false, frames[self])
-		end
-	end
-end
-
-local Enable = function(self, unit)
-	if(not CORE) then CORE = SVUI[1] end
-
-	if self.CombatFade then
-		frames[self] = self.unit
-		allFrames[self] = self.unit
-
-		if unit == 'player' then
-			showStatus = false;
-		end
-
-		self:RegisterEvent("PLAYER_ENTERING_WORLD", Update)
-		self:RegisterEvent("PLAYER_REGEN_ENABLED", Update)
-		self:RegisterEvent("PLAYER_REGEN_DISABLED", Update)
-		self:RegisterEvent("PLAYER_TARGET_CHANGED", Update)
-		self:RegisterEvent("PLAYER_FOCUS_CHANGED", Update)
-		self:RegisterEvent("UNIT_HEALTH", Update)
-		self:RegisterEvent("UNIT_SPELLCAST_START", Update)
-		self:RegisterEvent("UNIT_SPELLCAST_STOP", Update)
-		self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START", Update)
-		self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP", Update)
-		self:RegisterEvent("UNIT_PORTRAIT_UPDATE", Update)
-		self:RegisterEvent("UNIT_MODEL_CHANGED", Update)
-
-		if not self.CombatFadeHooked then
-			self:HookScript("OnEnter", function(self) Update(self, true) end)
-			self:HookScript("OnLeave", function(self) Update(self, false) end)
-			self.CombatFadeHooked = true
-		end
-		return true
-	end
-end
-
-local Disable = function(self)
-	if(self.CombatFade) then
-		frames[self] = nil
-		Update(self)
-
-		self:UnregisterEvent("PLAYER_ENTERING_WORLD", Update)
-		self:UnregisterEvent("PLAYER_REGEN_ENABLED", Update)
-		self:UnregisterEvent("PLAYER_REGEN_DISABLED", Update)
-		self:UnregisterEvent("PLAYER_TARGET_CHANGED", Update)
-		self:UnregisterEvent("PLAYER_FOCUS_CHANGED", Update)
-		self:UnregisterEvent("UNIT_HEALTH", Update)
-		self:UnregisterEvent("UNIT_SPELLCAST_START", Update)
-		self:UnregisterEvent("UNIT_SPELLCAST_STOP", Update)
-		self:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_START", Update)
-		self:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_STOP", Update)
-		self:UnregisterEvent("UNIT_PORTRAIT_UPDATE", Update)
-		self:UnregisterEvent("UNIT_MODEL_CHANGED", Update)
-	end
-end
-
-oUF:AddElement('CombatFade', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_CombatFader/oUF_CombatFader.toc b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_CombatFader/oUF_CombatFader.toc
deleted file mode 100644
index fc4d705..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_CombatFader/oUF_CombatFader.toc
+++ /dev/null
@@ -1,8 +0,0 @@
-## Interface: 40200
-## Title: oUF Combat Fader
-## Notes: Adds combat fade ability to oUF
-## Author: SV
-## Version: 1.0.0
-## Dependencies: oUF
-
-oUF_CombatFader.lua
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Combatant/oUF_Combatant.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Combatant/oUF_Combatant.lua
deleted file mode 100644
index 48cd364..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Combatant/oUF_Combatant.lua
+++ /dev/null
@@ -1,158 +0,0 @@
-local _, ns = ...
-local oUF = ns.oUF
-
-local trinketSpells = {
-	[59752] = 120,
-	[42292] = 120,
-	[7744] = 45,
-}
-
-local timeLeft = 0
-local Trinket_OnUpdate = function(self, elapsed)
-	local expires = (self.duration - (GetTime() - self.start));
-	if(expires == 0) then
-		local parent = self:GetParent()
-		parent.Icon:SetDesaturated(false)
-		parent.Unavailable:Hide()
-		self:SetScript("OnUpdate", nil)
-	end
-end
-
-local function GetPVPIcons(unit, frameID)
-	local _, trinket, badge
-	local unitFactionGroup = UnitFactionGroup(unit)
-	if unitFactionGroup == "Horde" then
-		trinket, badge = [[Interface\Icons\INV_Jewelry_TrinketPVP_02]], [[Interface\Icons\INV_BannerPVP_01]]
-	elseif unitFactionGroup == "Alliance" then
-		trinket, badge = [[Interface\Icons\INV_Jewelry_TrinketPVP_01]], [[Interface\Icons\INV_BannerPVP_02]]
-	else
-		trinket, badge = [[Interface\Icons\INV_MISC_QUESTIONMARK]], [[Interface\Icons\INV_MISC_QUESTIONMARK]]
-	end
-	if(frameID) then
-		local numOpps = GetNumArenaOpponentSpecs()
-		local specID = GetArenaOpponentSpec(frameID)
-		if((numOpps > 0) and specID) then
-			_, _, _, badge = GetSpecializationInfoByID(specID)
-		end
-	end
-	return trinket, badge
-end
-
-local function LogUpdate(self, event, ...)
-	local arenaMatch = IsActiveBattlefieldArena()
-	local element = self.Combatant
-	local trinket = element.Trinket
-	local alert = element.Alert
-	if not arenaMatch then trinket:Hide() return end
-	trinket:Show()
-	if(event == "COMBAT_LOG_EVENT_UNFILTERED") then
-		local _, eventType, _, sourceGUID, _, _, _, _, _, _, _, spellID = ...
-		if eventType == "SPELL_CAST_SUCCESS" and sourceGUID == UnitGUID(self.unit) and trinketSpells[spellID] then
-			local startTime = GetTime()
-			local duration = trinketSpells[spellID]
-			trinket.CD.start = startTime
-			trinket.CD.duration = duration
-			trinket.CD.nextUpdate = 0
-			trinket.CD:SetScript("OnUpdate", Trinket_OnUpdate)
-			trinket.Icon:SetDesaturated(true)
-			trinket.Unavailable:Show()
-			CooldownFrame_SetTimer(trinket.CD, startTime, duration, 1)
-		end
-	elseif(alert and event == "UNIT_SPELLCAST_SUCCEEDED") then
-		local unitID, spellName, _, _, spellID = ...
-		if UnitIsEnemy("player", unitID) and (spellID == 118358 or spellID == 104270 or spellName:find("Drink")) then
-			SendChatMessage(UnitName(unit)..L[" is drinking."], "RAID_WARNING")
-		end
-	end
-end
-
-local Update = function(self, event, ...)
-	local unit, unitType = ...
-	if(event == "COMBAT_LOG_EVENT_UNFILTERED" or event == "UNIT_SPELLCAST_SUCCEEDED") then return LogUpdate(self, event, ...) end
-	if(not unit or unit ~= self.unit) then return end
-	local element = self.Combatant
-	local trinket = element.Trinket
-	local badge = element.Badge
-	local arenaMatch = IsActiveBattlefieldArena()
-	local frameID = arenaMatch and self:GetID()
-	local tIcon, bIcon = GetPVPIcons(unit, frameID)
-	if(badge) then badge.Icon:SetTexture(bIcon) end
-	if(trinket) then
-		if(not arenaMatch) then trinket:Hide() return end
-		trinket.Icon:SetTexture(tIcon)
-		trinket:Show()
-		if event == 'PLAYER_ENTERING_WORLD' then
-			CooldownFrame_SetTimer(trinket.CD, 1, 1, 1)
-		end
-	end
-end
-
-local Enable = function(self, unit)
-	--if(not unit:match("arena%d")) then return end
-	local element = self.Combatant
-
-	if(element) then
-		local trinket = element.Trinket
-		local badge = element.Badge
-		self:RegisterEvent("ARENA_OPPONENT_UPDATE", Update)
-		self:RegisterEvent("PLAYER_ENTERING_WORLD", Update)
-
-		if(trinket) then
-			self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED", Update)
-			self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED", Update)
-			if not trinket.CD then
-				trinket.CD = CreateFrame("Cooldown", nil, trinket)
-				trinket.CD:SetAllPoints(trinket)
-			end
-
-			if not trinket.Icon then
-				trinket.Icon = trinket:CreateTexture(nil, "BORDER")
-				trinket.Icon:SetAllPoints(trinket)
-				trinket.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
-				trinket.Icon:SetTexture([[INTERFACE\ICONS\INV_MISC_QUESTIONMARK]])
-			end
-
-			if not trinket.Unavailable then
-				trinket.Unavailable = trinket:CreateTexture(nil, "OVERLAY")
-				trinket.Unavailable:SetAllPoints(trinket)
-				trinket.Unavailable:SetTexCoord(0.1, 0.9, 0.1, 0.9)
-				trinket.Unavailable:SetTexture([[Interface\BUTTONS\UI-GroupLoot-Pass-Up]])
-			end
-			trinket:Show()
-		end
-
-		if(badge) then
-			self:RegisterEvent("ARENA_PREP_OPPONENT_SPECIALIZATIONS", Update)
-			if not badge.Icon then
-				badge.Icon = badge:CreateTexture(nil, "OVERLAY")
-				badge.Icon:SetAllPoints(badge)
-				badge.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
-				badge.Icon:SetTexture([[INTERFACE\ICONS\INV_MISC_QUESTIONMARK]])
-			end
-			badge:Show()
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local element = self.Combatant
-	local trinket = element.Trinket
-	local badge = element.Badge
-	if(trinket or badge) then
-		self:UnregisterEvent("ARENA_OPPONENT_UPDATE", Update)
-		self:UnregisterEvent("PLAYER_ENTERING_WORLD", Update)
-		if trinket then
-			self:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED", Update)
-			self:UnregisterEvent("UNIT_SPELLCAST_SUCCEEDED", Update)
-			trinket:Hide()
-		end
-		if badge then
-			self:UnregisterEvent("ARENA_PREP_OPPONENT_SPECIALIZATIONS", Update)
-			badge:Hide()
-		end
-	end
-end
-
-oUF:AddElement('Combatant', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Combatant/oUF_Combatant.toc b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Combatant/oUF_Combatant.toc
deleted file mode 100644
index 10740d3..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Combatant/oUF_Combatant.toc
+++ /dev/null
@@ -1,9 +0,0 @@
-## Interface: 50001
-## Title: oUF Combatant
-## Notes: Adds PvP trinket status and spec icons to oUF frames.
-## Author: Munglunch
-## Version: 4.40
-## X-Category: oUF
-## Dependencies: oUF
-
-oUF_Combatant.lua
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_DruidMana/oUF_DruidMana.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_DruidMana/oUF_DruidMana.lua
deleted file mode 100644
index f650376..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_DruidMana/oUF_DruidMana.lua
+++ /dev/null
@@ -1,106 +0,0 @@
-if(select(2, UnitClass('player')) ~= 'DRUID') then return end
-
-local _, ns = ...
-local oUF = ns.oUF or oUF
-
-local UPDATE_VISIBILITY = function(self, event)
-	local druidmana = self.DruidAltMana
-	-- check form
-	local form = GetShapeshiftFormID()
-	local min, max = druidmana.ManaBar:GetMinMaxValues()
-
-	if druidmana.ManaBar:GetValue() == max then
-		druidmana:Hide()
-	elseif (form == BEAR_FORM or form == CAT_FORM) then
-		druidmana:Show()
-	else
-		druidmana:Hide()
-	end
-
-	if(druidmana.PostUpdateVisibility) then
-		return druidmana:PostUpdateVisibility(self.unit)
-	end
-end
-
-local UNIT_POWER = function(self, event, unit, powerType)
-	if(self.unit ~= unit) then return end
-	local druidmana = self.DruidAltMana
-
-	if not (druidmana.ManaBar) then return end
-
-	if(druidmana.PreUpdate) then
-		druidmana:PreUpdate(unit)
-	end
-	local min, max = UnitPower('player', SPELL_POWER_MANA), UnitPowerMax('player', SPELL_POWER_MANA)
-
-	druidmana.ManaBar:SetMinMaxValues(0, max)
-	druidmana.ManaBar:SetValue(min)
-
-	local r, g, b, t
-	if(druidmana.colorPower) then
-		t = self.colors.power["MANA"]
-	elseif(druidmana.colorClass and UnitIsPlayer(unit)) or
-		(druidmana.colorClassNPC and not UnitIsPlayer(unit)) or
-		(druidmana.colorClassPet and UnitPlayerControlled(unit) and not UnitIsPlayer(unit)) then
-		local _, class = UnitClass(unit)
-		t = self.colors.class[class]
-	elseif(druidmana.colorReaction and UnitReaction(unit, 'player')) then
-		t = self.colors.reaction[UnitReaction(unit, "player")]
-	elseif(druidmana.colorSmooth) then
-		r, g, b = self.ColorGradient(min / max, unpack(druidmana.smoothGradient or self.colors.smooth))
-	end
-
-	if(t) then
-		r, g, b = t[1], t[2], t[3]
-	end
-
-	if(b) then
-		druidmana.ManaBar:SetStatusBarColor(r, g, b)
-
-		local bg = druidmana.bg
-		if(bg) then
-			local mu = bg.multiplier or 1
-			bg:SetVertexColor(r * mu, g * mu, b * mu)
-		end
-	end
-
-	UPDATE_VISIBILITY(self)
-
-	if(druidmana.PostUpdatePower) then
-		return druidmana:PostUpdatePower(unit, min, max)
-	end
-end
-
-local Update = function(self, ...)
-	UNIT_POWER(self, ...)
-	return UPDATE_VISIBILITY(self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Update(element.__owner, 'ForceUpdate')
-end
-
-local Enable = function(self, unit)
-	local druidmana = self.DruidAltMana
-	if(druidmana and unit == 'player') then
-		druidmana.__owner = self
-		druidmana.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('UNIT_POWER', UNIT_POWER)
-		self:RegisterEvent('UNIT_MAXPOWER', UNIT_POWER)
-		self:RegisterEvent('UPDATE_SHAPESHIFT_FORM', UPDATE_VISIBILITY)
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local druidmana = self.DruidAltMana
-	if(druidmana) then
-		self:UnregisterEvent('UNIT_POWER', UNIT_POWER)
-		self:UnregisterEvent('UNIT_MAXPOWER', UNIT_POWER)
-		self:UnregisterEvent('UPDATE_SHAPESHIFT_FORM', UPDATE_VISIBILITY)
-	end
-end
-
-oUF:AddElement("DruidAltMana", Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_DruidMana/oUF_DruidMana.toc b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_DruidMana/oUF_DruidMana.toc
deleted file mode 100644
index 744e176..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_DruidMana/oUF_DruidMana.toc
+++ /dev/null
@@ -1,10 +0,0 @@
-## Interface: 40100
-## Title: oUF Druid Mana
-## Notes: Adds Druid Mana Bar to oUF.
-## Author: SV
-## Version: 1.0
-## X-Category: UnitFrame
-## Dependencies: oUF
-
-oUF_DruidMana.lua
-
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_DrunkenMaster/oUF_DrunkenMaster.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_DrunkenMaster/oUF_DrunkenMaster.lua
deleted file mode 100644
index d4b8950..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_DrunkenMaster/oUF_DrunkenMaster.lua
+++ /dev/null
@@ -1,183 +0,0 @@
-if select(2, UnitClass('player')) ~= "MONK" then return end
-
-local parent, ns = ...
-local oUF = ns.oUF
-local floor = math.floor;
-local DM_L = {};
-
-if GetLocale() == "enUS" then
-	DM_L["Stagger"] = "Stagger"
-	DM_L["Light Stagger"] = "Light Stagger"
-	DM_L["Moderate Stagger"] = "Moderate Stagger"
-	DM_L["Heavy Stagger"] = "Heavy Stagger"
-
-elseif GetLocale() == "frFR" then
-	DM_L["Stagger"] = "Report"
-	DM_L["Light Stagger"] = "Report mineur"
-	DM_L["Moderate Stagger"] = "Report mod??"
-	DM_L["Heavy Stagger"] = "Report majeur"
-
-elseif GetLocale() == "itIT" then
-	DM_L["Stagger"] = "Noncuranza"
-	DM_L["Light Stagger"] = "Noncuranza Parziale"
-	DM_L["Moderate Stagger"] = "Noncuranza Moderata"
-	DM_L["Heavy Stagger"] = "Noncuranza Totale"
-
-elseif GetLocale() == "deDE" then
-	DM_L["Stagger"] = "Staffelung"
-	DM_L["Light Stagger"] = "Leichte Staffelung"
-	DM_L["Moderate Stagger"] = "Moderate Staffelung"
-	DM_L["Heavy Stagger"] = "Schwere Staffelung"
-
-elseif GetLocale() == "zhCN" then
-	DM_L["Stagger"] = "醉拳"
-	DM_L["Light Stagger"] = "轻度醉拳"
-	DM_L["Moderate Stagger"] = "中度醉拳"
-	DM_L["Heavy Stagger"] = "重度醉拳"
-
-elseif GetLocale() == "ruRU" then
-	DM_L["Stagger"] = "Пошатывание"
-	DM_L["Light Stagger"] = "Легкое пошатывание"
-	DM_L["Moderate Stagger"] = "Умеренное пошатывание"
-	DM_L["Heavy Stagger"] = "Сильное пошатывание"
-
-else
-	DM_L["Stagger"] = "Stagger"
-	DM_L["Light Stagger"] = "Light Stagger"
-	DM_L["Moderate Stagger"] = "Moderate Stagger"
-	DM_L["Heavy Stagger"] = "Heavy Stagger"
-end
-
-local STANCE_OF_THE_STURY_OX_ID = 23
-
-local UnitHealthMax = UnitHealthMax
-local UnitStagger = UnitStagger
-local BREW_COLORS = {
-	[124275] = {0, 1, 0, 1}, -- Light
-	[124274] = {1, 0.5, 0, 1}, -- Moderate
-	[124273] = {1, 0, 0, 1}, -- Heavy
-};
-local STAGGER_COLORS = {
-	[124275] = {0.2, 0.8, 0.2, 1}, -- Light
-	[124274] = {1.0, 0.8, 0.2, 1}, -- Moderate
-	[124273] = {1.0, 0.4, 0.2, 1}, -- Heavy
-};
-local staggerColor = {1, 1, 1, 0.5};
-local brewColor = {0.91, 0.75, 0.25, 0.5};
-
-local function ScanForDrunkenMaster()
-	local name, _, icon, _, _, duration, _, _, _, _, spellID, _, _, value2, value1 = UnitAura("player", DM_L["Light Stagger"], "", "HARMFUL")
-	if (not name) then
-		name, _, icon, _, _, duration, _, _, _, _, spellID, _, _, value2, value1 = UnitAura("player", DM_L["Moderate Stagger"], "", "HARMFUL")
-		if (not name) then
-			name, _, icon, _, _, duration, _, _, _, _, spellID, _, _, value2, value1 = UnitAura("player", DM_L["Heavy Stagger"], "", "HARMFUL")
-		end
-	end
-	if (spellID) then
-		staggerColor = STAGGER_COLORS[spellID]
-		brewColor = STAGGER_COLORS[spellID]
-	else
-		staggerColor = {1, 1, 1, 0.5}
-		brewColor = {0.91, 0.75, 0.25, 0.5}
-	end
-	if(value1 and (value1 > 0) and duration) then
-		return (value1 * floor(duration))
-	else
-		return 0
-	end
-end
-
-local Update = function(self, event, unit)
-	if unit and unit ~= self.unit then return; end
-	local staggerTotal = ScanForDrunkenMaster()
-
-	local stagger = self.DrunkenMaster
-
-	if(stagger.PreUpdate) then
-		stagger:PreUpdate()
-	end
-
-	local maxHealth = UnitHealthMax("player")
-	local staggerPercent = staggerTotal / maxHealth
-	local currentStagger = floor(staggerPercent * 100)
-
-	stagger:SetMinMaxValues(0, 50)
-	stagger:SetStatusBarColor(unpack(brewColor))
-	if currentStagger <= 50 then
-		stagger:SetValue(currentStagger)
-	else
-		stagger:SetValue(50)
-	end
-
-	local icon = stagger.icon
-	if(icon) then
-		icon:SetVertexColor(unpack(staggerColor))
-	end
-
-	if(stagger.PostUpdate) then
-		stagger:PostUpdate(maxHealth, currentStagger, staggerPercent)
-	end
-end
-
-local Visibility = function(self, event, unit)
-	if(STANCE_OF_THE_STURY_OX_ID ~= GetShapeshiftFormID() or UnitHasVehiclePlayerFrameUI("player")) then
-		if self.DrunkenMaster:IsShown() then
-			self.DrunkenMaster:Hide()
-			self:UnregisterEvent('UNIT_AURA', Update)
-		end
-	else
-		self.DrunkenMaster:Show()
-		self:RegisterEvent('UNIT_AURA', Update)
-		return Update(self, event, unit)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.DrunkenMaster.Override or Visibility)(self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, "ForceUpdate", element.__owner.unit)
-end
-
-local function Enable(self, unit)
-	if(unit ~= 'player') then return end
-	local element = self.DrunkenMaster
-	if(element) then
-		element.__owner = self
-		element.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('UNIT_DISPLAYPOWER', Path)
-		self:RegisterEvent('UPDATE_SHAPESHIFT_FORM', Path)
-
-		if(element:IsObjectType'StatusBar' and not element:GetStatusBarTexture()) then
-			element:SetStatusBarTexture(0.91, 0.75, 0.25)
-		end
-
-		MonkStaggerBar.Hide = MonkStaggerBar.Show
-		MonkStaggerBar:UnregisterEvent'PLAYER_ENTERING_WORLD'
-		MonkStaggerBar:UnregisterEvent'PLAYER_SPECIALIZATION_CHANGED'
-		MonkStaggerBar:UnregisterEvent'UNIT_DISPLAYPOWER'
-		MonkStaggerBar:UnregisterEvent'UPDATE_VEHICLE_ACTION_BAR'
-		return true
-	end
-end
-
-local function Disable(self)
-	local element = self.DrunkenMaster
-	if(element) then
-		element:Hide()
-		self:UnregisterEvent('UNIT_AURA', Update)
-		self:UnregisterEvent('UNIT_DISPLAYPOWER', Path)
-		self:UnregisterEvent('UPDATE_SHAPESHIFT_FORM', Path)
-
-		MonkStaggerBar.Show = nil
-		MonkStaggerBar:Show()
-		MonkStaggerBar:UnregisterEvent'PLAYER_ENTERING_WORLD'
-		MonkStaggerBar:UnregisterEvent'PLAYER_SPECIALIZATION_CHANGED'
-		MonkStaggerBar:UnregisterEvent'UNIT_DISPLAYPOWER'
-		MonkStaggerBar:UnregisterEvent'UPDATE_VEHICLE_ACTION_BAR'
-	end
-end
-
-oUF:AddElement("DrunkenMaster", Path, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Experience/oUF_Experience.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Experience/oUF_Experience.lua
deleted file mode 100644
index 2c5573a..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Experience/oUF_Experience.lua
+++ /dev/null
@@ -1,103 +0,0 @@
-local __, ns = ...
-local oUF = ns.oUF or oUF
-assert(oUF, 'oUF Experience was unable to locate oUF install')
-
-for tag, func in pairs({
-	['curxp'] = function(unit)
-		return UnitXP(unit)
-	end,
-	['maxxp'] = function(unit)
-		return UnitXPMax(unit)
-	end,
-	['perxp'] = function(unit)
-		return math.floor(UnitXP(unit) / UnitXPMax(unit) * 100 + 0.5)
-	end,
-	['currested'] = function()
-		return GetXPExhaustion()
-	end,
-	['perrested'] = function(unit)
-		local rested = GetXPExhaustion()
-		if(rested and rested > 0) then
-			return math.floor(rested / UnitXPMax(unit) * 100 + 0.5)
-		end
-	end,
-}) do
-	oUF.Tags.Methods[tag] = func
-	oUF.Tags.Events[tag] = 'PLAYER_XP_UPDATE PLAYER_LEVEL_UP UPDATE_EXHAUSTION'
-end
-
-local function Update(self, event, unit)
-	if(self.unit ~= unit) then return end
-
-	local experience = self.Experience
-	if(experience.PreUpdate) then experience:PreUpdate(unit) end
-
-	if(UnitLevel(unit) == MAX_PLAYER_LEVEL or UnitHasVehicleUI('player')) then
-		return experience:Hide()
-	else
-		experience:Show()
-	end
-
-	local min, max = UnitXP(unit), UnitXPMax(unit)
-	experience:SetMinMaxValues(0, max)
-	experience:SetValue(min)
-
-	if(experience.Rested) then
-		local exhaustion = GetXPExhaustion() or 0
-		experience.Rested:SetMinMaxValues(0, max)
-		experience.Rested:SetValue(math.min(min + exhaustion, max))
-	end
-
-	if(experience.PostUpdate) then
-		return experience:PostUpdate(unit, min, max)
-	end
-end
-
-local function Path(self, ...)
-	return (self.Experience.Override or Update) (self, ...)
-end
-
-local function ForceUpdate(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-local function Enable(self, unit)
-	local experience = self.Experience
-	if(experience) then
-		experience.__owner = self
-		experience.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('PLAYER_XP_UPDATE', Path)
-		self:RegisterEvent('PLAYER_LEVEL_UP', Path)
-
-		local rested = experience.Rested
-		if(rested) then
-			self:RegisterEvent('UPDATE_EXHAUSTION', Path)
-			rested:SetFrameLevel(experience:GetFrameLevel() - 1)
-
-			if(not rested:GetStatusBarTexture()) then
-				rested:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
-			end
-		end
-
-		if(not experience:GetStatusBarTexture()) then
-			experience:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
-		end
-
-		return true
-	end
-end
-
-local function Disable(self)
-	local experience = self.Experience
-	if(experience) then
-		self:UnregisterEvent('PLAYER_XP_UPDATE', Path)
-		self:UnregisterEvent('PLAYER_LEVEL_UP', Path)
-
-		if(experience.Rested) then
-			self:UnregisterEvent('UPDATE_EXHAUSTION', Path)
-		end
-	end
-end
-
-oUF:AddElement('Experience', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Experience/oUF_Experience.toc b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Experience/oUF_Experience.toc
deleted file mode 100644
index 003d7cf..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Experience/oUF_Experience.toc
+++ /dev/null
@@ -1,8 +0,0 @@
-## Interface: 50001
-## Author: p3lim
-## Version: 50001.12-Release
-## Title: oUF Experience
-## Notes: Experience Bar support for oUF layouts.
-## RequiredDeps: oUF
-
-oUF_Experience.lua
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Friendship/oUF_Friendship.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Friendship/oUF_Friendship.lua
deleted file mode 100644
index f381dd2..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Friendship/oUF_Friendship.lua
+++ /dev/null
@@ -1,142 +0,0 @@
-local _, ns = ...
-local oUF = ns.oUF or oUF
-assert(oUF, 'oUF Friendship was unable to locate oUF install')
-
---[[
- If you find an npc with reputation that is not shown,
- please let me (p3lim) know by PM/comment on the download site.
- The list is currently generated with the following:
-
- for index = 1100, 1500 do
-	if(GetFriendshipReputation(index)) then
-		friendships[GetFactionInfoByID(index)] = index
-	end
- end
---]]
-local friendships = {
-	[GetFactionInfoByID(1273)] = 1273,
-	[GetFactionInfoByID(1275)] = 1275,
-	[GetFactionInfoByID(1276)] = 1276,
-	[GetFactionInfoByID(1277)] = 1277,
-	[GetFactionInfoByID(1278)] = 1278,
-	[GetFactionInfoByID(1279)] = 1279,
-	[GetFactionInfoByID(1280)] = 1280,
-	[GetFactionInfoByID(1281)] = 1281,
-	[GetFactionInfoByID(1282)] = 1282,
-	[GetFactionInfoByID(1283)] = 1283,
-	-- [GetFactionInfoByID(1357)] = 1357,
-	[GetFactionInfoByID(1358)] = 1358,
-}
-
-local function GetFriendshipID()
-	if(not UnitExists('target')) then return end
-	if(UnitIsPlayer('target')) then return end
-
-	return friendships[UnitName('target')]
-end
-
-for tag, func in pairs({
-	['curfriendship'] = function()
-		local id = GetFriendshipID()
-		if(id) then
-			local _, cur, _, name, details, _, standing, threshold, maximum = GetFriendshipReputation(id)
-			return cur - threshold
-		end
-	end,
-	['currawfriendship'] = function()
-		local id = GetFriendshipID()
-		if(id) then
-			local _, cur = GetFriendshipReputation(id)
-			return cur
-		end
-	end,
-	['perfriendship'] = function()
-		local id = GetFriendshipID()
-		if(id) then
-			local _, cur, _, name, details, _, standing, threshold, maximum = GetFriendshipReputation(id)
-			return math.floor((cur - threshold) / 8400 * 100)
-		end
-	end,
-	['perfullfriendship'] = function()
-		local id = GetFriendshipID()
-		if(id) then
-			local _, cur = GetFriendshipReputation(id)
-			return math.floor(cur / 42999 * 100)
-		end
-	end,
-	['friendshipstanding'] = function()
-		local id = GetFriendshipID()
-		if(id) then
-			local _, cur, _, name, details, _, standing, threshold, maximum = GetFriendshipReputation(id)
-			return standing
-		end
-	end,
-}) do
-	oUF.Tags.Methods[tag] = func
-	oUF.Tags.Events[tag] = 'PLAYER_TARGET_CHANGED'
-end
-
-local function OnEnter(self)
-	local _, cur, _, name, details, _, standing, threshold, maximum = GetFriendshipReputation(GetFriendshipID())
-	GameTooltip:SetOwner(self, 'ANCHOR_BOTTOMRIGHT')
-	GameTooltip:SetText(UnitName('target'), 1, 1, 1)
-	GameTooltip:AddLine(details, nil, nil, nil, true)
-	GameTooltip:AddLine((cur - threshold) .. ' / 8400 (' .. standing .. ')', 1, 1, 1, true)
-	GameTooltip:Show()
-end
-
-local function Update(self)
-	local friendship = self.Friendship
-
-	local id = GetFriendshipID()
-	if(id) then
-		local _, cur, _, name, details, _, standing, threshold, maximum = GetFriendshipReputation(id)
-		friendship:SetMinMaxValues(0, 8400)
-		friendship:SetValue(cur - threshold)
-		friendship:Show()
-	else
-		friendship:Hide()
-	end
-
-	if(friendship.PostUpdate) then
-		return friendship:PostUpdate(id)
-	end
-end
-
-local function Path(self, ...)
-	return (self.Friendship.Override or Update) (self, ...)
-end
-
-local function ForceUpdate(element)
-	return Path(element.__owner, 'ForceUpdate')
-end
-
-local function Enable(self, unit)
-	local friendship = self.Friendship
-	if(friendship) then
-		friendship.__owner = self
-		friendship.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('PLAYER_TARGET_CHANGED', Path)
-
-		if(friendship.Tooltip) then
-			friendship:EnableMouse(true)
-			friendship:HookScript('OnEnter', OnEnter)
-			friendship:HookScript('OnLeave', GameTooltip_Hide)
-		end
-
-		if(not friendship:GetStatusBarTexture()) then
-			friendship:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
-		end
-
-		return true
-	end
-end
-
-local function Disable(self)
-	if(self.Friendship) then
-		self:UnregisterEvent('PLAYER_TARGET_CHANGED', Path)
-	end
-end
-
-oUF:AddElement('Friendship', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Friendship/oUF_Friendship.toc b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Friendship/oUF_Friendship.toc
deleted file mode 100644
index d4debe9..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Friendship/oUF_Friendship.toc
+++ /dev/null
@@ -1,8 +0,0 @@
-## Interface: 50001
-## Author: p3lim
-## Version: 50001.3-Beta
-## Title: oUF Friendship
-## Notes: NPC Friendship Bar support for oUF layouts.
-## RequiredDeps: oUF
-
-oUF_Friendship.lua
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_HyperCombo/oUF_HyperCombo.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_HyperCombo/oUF_HyperCombo.lua
deleted file mode 100644
index 696ed53..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_HyperCombo/oUF_HyperCombo.lua
+++ /dev/null
@@ -1,197 +0,0 @@
-local class = select(2, UnitClass("player"));
-if(class ~= "ROGUE" and class ~= "DRUID") then return end
-
-local parent, ns = ...
-local oUF = ns.oUF
-
-local GetComboPoints = GetComboPoints
-local MAX_COMBO_POINTS = MAX_COMBO_POINTS
-local GUILE1 = GetSpellInfo(84745)
-local GUILE2 = GetSpellInfo(84746)
-local GUILE3 = GetSpellInfo(84747)
-local ANTICIPATION = GetSpellInfo(115189)
-local ALERTED = false
-local TextColors = {
-	[1]={1,0.1,0.1},
-	[2]={1,0.5,0.1},
-	[3]={1,1,0.1},
-	[4]={0.5,1,0.1},
-	[5]={0.1,1,0.1}
-};
-
-local function UpdateGuile()
-	local _, _, _, one = UnitBuff("player", GUILE1, nil, "HELPFUL")
-	local _, _, _, two = UnitBuff("player", GUILE2, nil, "HELPFUL")
-	local _, _, _, three = UnitBuff("player", GUILE3, nil, "HELPFUL")
-	if one or two or three then
-		if one then return 1; end
-		if two then return 2; end
-		if three then return 3; end
-	else
-		return 0;
-	end
-end
-
-local function FivePointsAlarm(frame, points)
-	if not CombatText_AddMessage then return end
-	if(points == 5 and not frame.ALERTED) then
-		CombatText_AddMessage("5 Points", CombatText_StandardScroll, 0.1, 0.5, 1, "crit")
-		frame.ALERTED = true
-	elseif(frame.ALERTED and points < 5) then
-		frame.ALERTED = false
-	end
-end
-
-local Update = function(self, event, unit)
-	if(unit == 'pet') then return end
-	local bar = self.HyperCombo;
-	local cpoints = bar.CPoints;
-	local tracker = bar.Tracking;
-
-	if(bar.PreUpdate) then
-		bar:PreUpdate()
-	end
-
-	local current = 0
-	if(UnitHasVehicleUI'player') then
-		current = GetComboPoints('vehicle', 'target')
-	else
-		current = GetComboPoints('player', 'target')
-	end
-
-	if(cpoints) then
-		for i=1, MAX_COMBO_POINTS do
-			if(i <= current) then
-				cpoints[i]:Show()
-				if(bar.PointShow) then
-					bar.PointShow(cpoints[i])
-				end
-			else
-				cpoints[i]:Hide()
-				if(bar.PointHide) then
-					bar.PointHide(cpoints[i])
-				end
-			end
-		end
-	end
-
-	if(class == "ROGUE") then
-		if(tracker) then
-			if(current > 0) then
-				tracker.Text:SetText(current)
-				tracker.Text:SetTextColor(unpack(TextColors[current]))
-				FivePointsAlarm(tracker, current)
-			elseif(bar.LAST_COMBO_POINTS > 0) then
-				tracker.Text:SetText(bar.LAST_COMBO_POINTS)
-				tracker.Text:SetTextColor(0.5,0.5,1)
-			else
-				tracker.Text:SetText("0")
-				tracker.Text:SetTextColor(0.3,0.3,0.3)
-			end
-		end
-
-		local anticipation = bar.Anticipation;
-		if(anticipation) then
-			local anti = select(4, UnitBuff("player", ANTICIPATION)) -- Anticipation stacks
-			if(anti and anti > 0) then
-				anticipation.Text:SetText(anti)
-				anticipation.Text:SetTextColor(unpack(TextColors[anti]))
-			else
-				anticipation.Text:SetText("")
-			end
-		end
-		local guile = bar.Guile;
-		if(guile) then
-			local insight = UpdateGuile()
-			if(insight and insight > 0) then
-				guile.Text:SetText(insight)
-				guile.Text:SetTextColor(unpack(TextColors[insight]))
-			else
-				guile.Text:SetText("")
-			end
-		end
-	else
-		if(tracker) then
-			if(GetShapeshiftForm() == 3) then
-				if(current > 0) then
-					tracker.Text:SetText(current)
-					tracker.Text:SetTextColor(unpack(TextColors[current]))
-					FivePointsAlarm(tracker, current)
-				elseif(bar.LAST_COMBO_POINTS > 0) then
-					tracker.Text:SetText(bar.LAST_COMBO_POINTS)
-					tracker.Text:SetTextColor(0.5,0.5,1)
-				else
-					tracker.Text:SetText("0")
-					tracker.Text:SetTextColor(0.3,0.3,0.3)
-				end
-			else
-				tracker.Text:SetText("")
-			end
-		end
-	end
-
-	if(bar.PostUpdate) then
-		return bar:PostUpdate(cp)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.HyperCombo.Override or Update) (self, ...)
-end
-
-local Tracker = function(self, ...)
-	local bar = self.HyperCombo
-	if(UnitHasVehicleUI'player') then
-		bar.LAST_COMBO_POINTS = GetComboPoints('vehicle', 'target')
-	else
-		bar.LAST_COMBO_POINTS = GetComboPoints('player', 'target')
-	end
-	return Path(self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-local Enable = function(self)
-	local bar = self.HyperCombo
-	if(bar) then
-		bar.__owner = self
-		bar.ForceUpdate = ForceUpdate
-		bar.EXISTING_COMBO_POINTS = 0
-		bar.LAST_COMBO_POINTS = 0
-
-		self:RegisterEvent('UNIT_COMBO_POINTS', Tracker, true)
-		self:RegisterEvent('PLAYER_TARGET_CHANGED', Path, true)
-		self:RegisterEvent('UNIT_AURA', Path, true)
-
-		local cpoints = bar.CPoints;
-		if(cpoints) then
-			for index = 1, MAX_COMBO_POINTS do
-				local cpoint = cpoints[index]
-				if(cpoint:IsObjectType'Texture' and not cpoint:GetTexture()) then
-					cpoint:SetTexture[[Interface\ComboFrame\ComboPoint]]
-					cpoint:SetTexCoord(0, 0.375, 0, 1)
-				end
-			end
-		end
-		return true
-	end
-end
-
-local Disable = function(self)
-	local bar = self.HyperCombo
-	if(bar) then
-		local cpoints = bar.CPoints;
-		if(cpoints) then
-			for index = 1, MAX_COMBO_POINTS do
-				cpoints[index]:Hide()
-			end
-		end
-		self:UnregisterEvent('UNIT_COMBO_POINTS', Tracker)
-		self:UnregisterEvent('PLAYER_TARGET_CHANGED', Path)
-		self:UnregisterEvent('UNIT_AURA', Path)
-	end
-end
-
-oUF:AddElement('HyperCombo', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_MainTank/oUF_MainTank.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_MainTank/oUF_MainTank.lua
deleted file mode 100644
index 51293af..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_MainTank/oUF_MainTank.lua
+++ /dev/null
@@ -1,58 +0,0 @@
-local parent, ns = ...
-local oUF = ns.oUF
-
-local Update = function(self, event)
-	local raidID = UnitInRaid(self.unit)
-	if(not raidID) then return end
-
-	local maintank = self.MainTank
-	if(maintank.PreUpdate) then
-		maintank:PreUpdate()
-	end
-
-	local _, _, _, _, _, _, _, _, _, rinfo = GetRaidRosterInfo(raidID)
-	if(rinfo == 'MAINTANK' and not UnitHasVehicleUI(self.unit)) then
-		self.MainTank:Show()
-	else
-		self.MainTank:Hide()
-	end
-
-	if(maintank.PostUpdate) then
-		return maintank:PostUpdate(rinfo)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.MainTank.Override or Update)(self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate')
-end
-
-local Enable = function(self)
-	local mt = self.MainTank
-
-	if(mt) then
-		mt.__owner = self
-		mt.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('GROUP_ROSTER_UPDATE', Path, true)
-
-		if(mt:IsObjectType'Texture' and not mt:GetTexture()) then
-			mt:SetTexture[[Interface\GROUPFRAME\UI-GROUP-MAINTANKICON]]
-		end
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	local mt = self.MainTank
-
-	if (mt) then
-		self:UnregisterEvent('GROUP_ROSTER_UPDATE', Path)
-	end
-end
-
-oUF:AddElement('MainTank', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_MonkHarmony/oUF_MonkHarmony.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_MonkHarmony/oUF_MonkHarmony.lua
deleted file mode 100644
index f5874c6..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_MonkHarmony/oUF_MonkHarmony.lua
+++ /dev/null
@@ -1,85 +0,0 @@
-if select(2, UnitClass('player')) ~= "MONK" then return end
-
-local _, ns = ...
-local oUF = ns.oUF or oUF
-
-local SPELL_POWER_CHI = SPELL_POWER_CHI
-
-oUF.colors.MonkHarmony = {
-	[1] = {.57, .63, .35, 1},
-	[2] = {.47, .63, .35, 1},
-	[3] = {.37, .63, .35, 1},
-	[4] = {.27, .63, .33, 1},
-	[5] = {.17, .63, .33, 1},
-}
-
-local function Update(self, event, unit)
-	local hb = self.MonkHarmony
-	if(hb.PreUpdate) then hb:PreUpdate(event) end
-	local light = UnitPower("player", SPELL_POWER_CHI)
-
-	-- if max light changed, show/hide the 5th and update anchors
-	local numPoints = UnitPowerMax("player", SPELL_POWER_CHI)
-
-	for i = 1, numPoints do
-		if i <= light then
-			hb[i]:Show()
-		else
-			hb[i]:Hide()
-		end
-	end
-
-	if UnitHasVehicleUI("player") then
-		hb:Hide()
-	else
-		hb:Show()
-	end
-
-	if hb.numPoints ~= numPoints then
-		if numPoints == 4 then
-			hb[5]:Hide()
-		else
-			hb[5]:Show()
-		end
-	end
-
-	hb.numPoints = numPoints
-
-	if(hb.PostUpdate) then hb:PostUpdate(event) end
-end
-
-local function Enable(self, unit)
-	if(unit ~= 'player') then return end
-	local hb = self.MonkHarmony
-	if hb then
-		self:RegisterEvent("PLAYER_ENTERING_WORLD", Update)
-		self:RegisterEvent("UNIT_POWER", Update)
-		self:RegisterEvent("UNIT_DISPLAYPOWER", Update)
-		self:RegisterEvent("PLAYER_LEVEL_UP", Update)
-
-		for i = 1, 5 do
-			if not hb[i]:GetStatusBarTexture() then
-				hb[i]:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
-			end
-
-			hb[i]:SetStatusBarColor(unpack(oUF.colors.MonkHarmony[i]))
-			hb[i]:SetFrameLevel(hb:GetFrameLevel() + 1)
-			hb[i]:GetStatusBarTexture():SetHorizTile(false)
-		end
-
-		hb.numPoints = 5
-
-		return true
-	end
-end
-
-local function Disable(self)
-	if self.MonkHarmony then
-		self:UnregisterEvent("PLAYER_ENTERING_WORLD", Update)
-		self:UnregisterEvent("UNIT_POWER", Update)
-		self:UnregisterEvent("UNIT_DISPLAYPOWER", Update)
-		self:UnregisterEvent("PLAYER_LEVEL_UP", Update)
-	end
-end
-
-oUF:AddElement('MonkHarmony', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_PallyPower/oUF_PallyPower.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_PallyPower/oUF_PallyPower.lua
deleted file mode 100644
index f6867c2..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_PallyPower/oUF_PallyPower.lua
+++ /dev/null
@@ -1,58 +0,0 @@
-if(select(2, UnitClass('player')) ~= 'PALADIN') then return end
-
-local parent, ns = ...
-local oUF = ns.oUF
-
-local SPELL_POWER_HOLY_POWER = SPELL_POWER_HOLY_POWER
-local MAX_HOLY_POWER = MAX_HOLY_POWER
-
-local Update = function(self, event, unit, powerType)
-	if(self.unit ~= unit or (powerType and powerType ~= 'HOLY_POWER')) then return end
-
-	local hp = self.HolyPower
-	if(hp.PreUpdate) then hp:PreUpdate() end
-
-	local num = UnitPower('player', SPELL_POWER_HOLY_POWER)
-	local MAX_HOLY_POWER = UnitPowerMax('player', SPELL_POWER_HOLY_POWER);
-	for i = 1, MAX_HOLY_POWER do
-		if(i <= num) then
-			hp[i]:Show()
-		else
-			hp[i]:Hide()
-		end
-	end
-
-	if(hp.PostUpdate) then
-		return hp:PostUpdate(num)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.HolyPower.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit, 'HOLY_POWER')
-end
-
-local function Enable(self, unit)
-	if(unit ~= 'player') then return end
-	local hp = self.HolyPower
-	if(hp) then
-		hp.__owner = self
-		hp.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('UNIT_POWER', Path)
-
-		return true
-	end
-end
-
-local function Disable(self)
-	local hp = self.HolyPower
-	if(hp) then
-		self:UnregisterEvent('UNIT_POWER', Path)
-	end
-end
-
-oUF:AddElement('HolyPower', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Plugins.xml b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Plugins.xml
deleted file mode 100644
index 98378e7..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Plugins.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<Ui xmlns="http://www.blizzard.com/wow/ui/">
-	<Script file="oUF_AuraWatch\oUF_AuraWatch.lua"/>
-	<Script file="oUF_AuraBars\oUF_AuraBars.lua"/>
-	<Script file="oUF_RaidDebuffs\oUF_RaidDebuffs.lua"/>
-	<Script file="oUF_Smooth\oUF_Smooth.lua"/>
-	<Script file="oUF_DruidMana\oUF_DruidMana.lua"/>
-	<Script file="oUF_CombatFader\oUF_CombatFader.lua"/>
-	<Script file='oUF_Experience\oUF_Experience.lua'/>
-	<Script file='oUF_Reputation\oUF_Reputation.lua'/>
-	<Script file='oUF_Friendship\oUF_Friendship.lua'/>
-	<Script file="oUF_ArcaneCharge\oUF_ArcaneCharge.lua"/>
-	<Script file='oUF_ActionPanel\oUF_ActionPanel.lua'/>
-	<Script file='oUF_Afflicted\oUF_Afflicted.lua'/>
-	<Script file='oUF_MainTank\oUF_MainTank.lua'/>
-	<Script file='oUF_PallyPower\oUF_PallyPower.lua'/>
-	<Script file='oUF_WarlockShards\oUF_WarlockShards.lua'/>
-	<Script file='oUF_PriestOrbs\oUF_PriestOrbs.lua'/>
-	<Script file='oUF_MonkHarmony\oUF_MonkHarmony.lua'/>
-	<Script file='oUF_DrunkenMaster\oUF_DrunkenMaster.lua'/>
-	<Script file='oUF_TotemBars\oUF_TotemBars.lua'/>
-	<Script file='oUF_HyperCombo\oUF_HyperCombo.lua'/>
-	<Script file="oUF_Combatant\oUF_Combatant.lua"/>
-</Ui>
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_PriestOrbs/oUF_PriestOrbs.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_PriestOrbs/oUF_PriestOrbs.lua
deleted file mode 100644
index 677639e..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_PriestOrbs/oUF_PriestOrbs.lua
+++ /dev/null
@@ -1,118 +0,0 @@
-if select(2, UnitClass('player')) ~= "PRIEST" then return end
-
-local _, ns = ...
-local oUF = ns.oUF or oUF
-
-local SPEC_PRIEST_DISC = 1
-local SPEC_PRIEST_HOLY = 2
-local SPEC_PRIEST_SHADOW = 3
-
-local SHADOW_ORBS_SHOW_LEVEL = SHADOW_ORBS_SHOW_LEVEL
-local HOLY_ORBS_SHOW_LEVEL = 44
-local DISC_ORBS_SHOW_LEVEL = 44
-
-local EVANGELISM = GetSpellInfo(81662) or GetSpellInfo(81661) or GetSpellInfo(81660)
-local DARK_EVANGELISM = GetSpellInfo(87118) or GetSpellInfo(87117)
-local SERENDIPITY = GetSpellInfo(63733)
-
-local OrbColors = {
-	[1] = {1, 1, 0},
-	[2] = {0.1, 0.4, 1},
-	[3] = {0.6, 0.06, 1}
-};
-
-local function Update(self, event, unit)
-	local pb = self.PriestOrbs
-
-	local numOrbs, invalid = 0, false
-	local spec = GetSpecialization()
-	local level = UnitLevel("player")
-	local color = OrbColors[spec]
-	local name, _, icon, count
-	if(spec == SPEC_PRIEST_SHADOW and level >= SHADOW_ORBS_SHOW_LEVEL) then
-		numOrbs = UnitPower("player", SPELL_POWER_SHADOW_ORBS)
-		pb:Show()
-	elseif(spec == SPEC_PRIEST_DISC and level >= DISC_ORBS_SHOW_LEVEL) then
-		name, _, icon, count = UnitBuff("player", EVANGELISM)
-		numOrbs = count or 0
-		pb:Show()
-	elseif(spec == SPEC_PRIEST_HOLY and level >= HOLY_ORBS_SHOW_LEVEL) then
-		name, _, icon, count = UnitBuff("player", SERENDIPITY)
-		numOrbs = count or 0
-		pb:Show()
-	else
-		invalid = true;
-		pb:Hide()
-	end
-
-	if(not invalid) then
-		if(pb.PreUpdate) then
-			pb:PreUpdate(spec)
-		end
-
-		for i = 1, 5 do
-			pb[i]:SetStatusBarColor(unpack(color))
-			if i <= numOrbs then
-				pb[i]:Show()
-			else
-				pb[i]:Hide()
-			end
-		end
-		self:RegisterEvent("UNIT_DISPLAYPOWER", Update)
-		self:RegisterEvent("UNIT_POWER_FREQUENT", Update)
-		self:RegisterEvent("UNIT_AURA", Update)
-
-		if(pb.PostUpdate) then
-			pb:PostUpdate(spec)
-		end
-	else
-		for i = 1, 5 do
-			pb[i]:Hide()
-		end
-		self:UnregisterEvent("UNIT_DISPLAYPOWER", Update)
-		self:UnregisterEvent("UNIT_POWER_FREQUENT", Update)
-		self:UnregisterEvent("UNIT_AURA", Update)
-	end
-end
-
-local ForceUpdate = function(element)
-	return Update(element.__owner, "ForceUpdate")
-end
-
-local function Enable(self, unit)
-	if(unit ~= 'player') then return end
-	local pb = self.PriestOrbs
-	if pb then
-		pb.__owner = self
-		pb.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent("PLAYER_LEVEL_UP", Update)
-		self:RegisterEvent("PLAYER_TALENT_UPDATE", Update)
-		self:RegisterEvent("UNIT_DISPLAYPOWER", Update)
-		self:RegisterEvent("UNIT_POWER_FREQUENT", Update)
-		self:RegisterEvent("UNIT_AURA", Update)
-
-		for i = 1, 5 do
-			if not pb[i]:GetStatusBarTexture() then
-				pb[i]:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
-			end
-
-			pb[i]:SetFrameLevel(pb:GetFrameLevel() + 1)
-			pb[i]:GetStatusBarTexture():SetHorizTile(false)
-		end
-
-		return true
-	end
-end
-
-local function Disable(self)
-	if self.PriestOrbs then
-		self:UnregisterEvent("PLAYER_LEVEL_UP", Update)
-		self:UnregisterEvent("PLAYER_TALENT_UPDATE", Update)
-		self:UnregisterEvent("UNIT_DISPLAYPOWER", Update)
-		self:UnregisterEvent("UNIT_POWER_FREQUENT", Update)
-		self:UnregisterEvent("UNIT_AURA", Update)
-	end
-end
-
-oUF:AddElement('PriestOrbs', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.lua
deleted file mode 100644
index 4564487..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.lua
+++ /dev/null
@@ -1,315 +0,0 @@
-local _, ns = ...
-local oUF = ns.oUF or oUF
-
-local SymbiosisName = GetSpellInfo(110309)
-local CleanseName = GetSpellInfo(4987)
-
-local addon = {}
-ns.oUF_RaidDebuffs = addon
-oUF_RaidDebuffs = ns.oUF_RaidDebuffs
-if not _G.oUF_RaidDebuffs then
-	_G.oUF_RaidDebuffs = addon
-end
-
-local debuff_data = {}
-addon.DebuffData = debuff_data
-
-
-addon.ShowDispelableDebuff = true
-addon.FilterDispellableDebuff = true
-addon.MatchBySpellName = true
-
-
-addon.priority = 10
-
-local function add(spell, priority)
-	if addon.MatchBySpellName and type(spell) == 'number' then
-		spell = GetSpellInfo(spell)
-	end
-
-	debuff_data[spell] = addon.priority + priority
-end
-
-function addon:RegisterDebuffs(t)
-	for spell, value in pairs(t) do
-		if type(t[spell]) == 'boolean' then
-			local oldValue = t[spell]
-			t[spell] = {
-				['enable'] = oldValue,
-				['priority'] = 0
-			}
-		else
-			if t[spell].enable then
-				add(spell, t[spell].priority)
-			end
-		end
-	end
-end
-
-function addon:ResetDebuffData()
-	wipe(debuff_data)
-end
-
-local DispellColor = {
-	['Magic']	= {.2, .6, 1},
-	['Curse']	= {.6, 0, 1},
-	['Disease']	= {.6, .4, 0},
-	['Poison']	= {0, .6, 0},
-	['none'] = { .23, .23, .23},
-}
-
-local DispellPriority = {
-	['Magic']	= 4,
-	['Curse']	= 3,
-	['Disease']	= 2,
-	['Poison']	= 1,
-}
-
-local DispellFilter
-do
-	local dispellClasses = {
-		['PRIEST'] = {
-			['Magic'] = true,
-			['Disease'] = true,
-		},
-		['SHAMAN'] = {
-			['Magic'] = false,
-			['Curse'] = true,
-		},
-		['PALADIN'] = {
-			['Poison'] = true,
-			['Magic'] = false,
-			['Disease'] = true,
-		},
-		['MAGE'] = {
-			['Curse'] = true,
-		},
-		['DRUID'] = {
-			['Magic'] = false,
-			['Curse'] = true,
-			['Poison'] = true,
-			['Disease'] = false,
-		},
-		['MONK'] = {
-			['Magic'] = false,
-			['Disease'] = true,
-			['Poison'] = true,
-		},
-	}
-
-	DispellFilter = dispellClasses[select(2, UnitClass('player'))] or {}
-end
-
-local function CheckTalentTree(tree)
-	local activeGroup = GetActiveSpecGroup()
-	if activeGroup and GetSpecialization(false, false, activeGroup) then
-		return tree == GetSpecialization(false, false, activeGroup)
-	end
-end
-
-local playerClass = select(2, UnitClass('player'))
-local function CheckSpec(self, event, levels)
-	-- Not interested in gained points from leveling
-	if event == "CHARACTER_POINTS_CHANGED" and levels > 0 then return end
-
-	--Check for certain talents to see if we can dispel magic or not
-	if playerClass == "PRIEST" then
-		if CheckTalentTree(3) then
-			DispellFilter.Disease = false
-		else
-			DispellFilter.Disease = true
-		end
-	elseif playerClass == "PALADIN" then
-		if CheckTalentTree(1) then
-			DispellFilter.Magic = true
-		else
-			DispellFilter.Magic = false
-		end
-	elseif playerClass == "SHAMAN" then
-		if CheckTalentTree(3) then
-			DispellFilter.Magic = true
-		else
-			DispellFilter.Magic = false
-		end
-	elseif playerClass == "DRUID" then
-		if CheckTalentTree(4) then
-			DispellFilter.Magic = true
-		else
-			DispellFilter.Magic = false
-		end
-	elseif playerClass == "MONK" then
-		if CheckTalentTree(2) then
-			DispellFilter.Magic = true
-		else
-			DispellFilter.Magic = false
-		end
-	end
-end
-
-local function CheckSymbiosis()
-	if GetSpellInfo(SymbiosisName) == CleanseName then
-		DispellFilter.Disease = true
-	else
-		DispellFilter.Disease = false
-	end
-end
-
-local function formatTime(s)
-	if s > 60 then
-		return format('%dm', s/60), s%60
-	elseif s < 1 then
-		return format("%.1f", s), s - floor(s)
-	else
-		return format('%d', s), s - floor(s)
-	end
-end
-
-local abs = math.abs
-local function OnUpdate(self, elapsed)
-	self.elapsed = (self.elapsed or 0) + elapsed
-	if self.elapsed >= 0.1 then
-		local timeLeft = self.endTime - GetTime()
-		if self.reverse then timeLeft = abs((self.endTime - GetTime()) - self.duration) end
-		if timeLeft > 0 then
-			local text = formatTime(timeLeft)
-			self.time:SetText(text)
-		else
-			self:SetScript('OnUpdate', nil)
-			self.time:Hide()
-		end
-		self.elapsed = 0
-	end
-end
-
-local function UpdateDebuff(self, name, icon, count, debuffType, duration, endTime, spellId)
-	local f = self.RaidDebuffs
-
-	if name then
-		f.icon:SetTexture(icon)
-		f.icon:Show()
-		f.duration = duration
-
-		if f.count then
-			if count and (count > 1) then
-				f.count:SetText(count)
-				f.count:Show()
-			else
-				f.count:SetText("")
-				f.count:Hide()
-			end
-		end
-
-		if f.time then
-			if duration and (duration > 0) then
-				f.endTime = endTime
-				f.nextUpdate = 0
-				f:SetScript('OnUpdate', OnUpdate)
-				f.time:Show()
-			else
-				f:SetScript('OnUpdate', nil)
-				f.time:Hide()
-			end
-		end
-
-		if f.cd then
-			if duration and (duration > 0) then
-				f.cd:SetCooldown(endTime - duration, duration)
-				f.cd:Show()
-			else
-				f.cd:Hide()
-			end
-		end
-
-		local c = DispellColor[debuffType] or DispellColor.none
-		f:SetBackdropBorderColor(c[1], c[2], c[3])
-
-		f:Show()
-	else
-		f:Hide()
-	end
-end
-
-local blackList = {
-	[105171] = true, -- Deep Corruption
-	[108220] = true, -- Deep Corruption
-	[116095] = true, -- Disable, Slow
-	[137637] = true, -- Warbringer, Slow
-}
-
-local function Update(self, event, unit)
-	if unit ~= self.unit then return end
-	local _name, _icon, _count, _dtype, _duration, _endTime, _spellId
-	local _priority, priority = 0, 0
-
-	--store if the unit its charmed, mind controlled units (Imperial Vizier Zor'lok: Convert)
-	local isCharmed = UnitIsCharmed(unit)
-
-	--store if we cand attack that unit, if its so the unit its hostile (Amber-Shaper Un'sok: Reshape Life)
-	local canAttack = UnitCanAttack("player", unit)
-
-	for i = 1, 40 do
-		local name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellId, canApplyAura, isBossDebuff = UnitAura(unit, i, 'HARMFUL')
-		if (not name) then break end
-
-		--we coudln't dispell if the unit its charmed, or its not friendly
-		if addon.ShowDispelableDebuff and debuffType and (not isCharmed) and (not canAttack) then
-
-			if addon.FilterDispellableDebuff then
-				DispellPriority[debuffType] = (DispellPriority[debuffType] or 0) + addon.priority --Make Dispell buffs on top of Boss Debuffs
-				priority = DispellFilter[debuffType] and DispellPriority[debuffType] or 0
-				if priority == 0 then
-					debuffType = nil
-				end
-			else
-				priority = DispellPriority[debuffType] or 0
-			end
-
-			if priority > _priority then
-				_priority, _name, _icon, _count, _dtype, _duration, _endTime, _spellId = priority, name, icon, count, debuffType, duration, expirationTime, spellId
-			end
-		end
-
-		priority = debuff_data[addon.MatchBySpellName and name or spellId]
-		if priority and not blackList[spellId] and (priority > _priority) then
-			_priority, _name, _icon, _count, _dtype, _duration, _endTime, _spellId = priority, name, icon, count, debuffType, duration, expirationTime, spellId
-		end
-	end
-
-	UpdateDebuff(self, _name, _icon, _count, _dtype, _duration, _endTime, _spellId)
-
-	--Reset the DispellPriority
-	DispellPriority = {
-		['Magic']	= 4,
-		['Curse']	= 3,
-		['Disease']	= 2,
-		['Poison']	= 1,
-	}
-end
-
-
-local function Enable(self)
-	if self.RaidDebuffs then
-		self:RegisterEvent('UNIT_AURA', Update)
-		return true
-	end
-	--Need to run these always
-	self:RegisterEvent("PLAYER_TALENT_UPDATE", CheckSpec)
-	self:RegisterEvent("CHARACTER_POINTS_CHANGED", CheckSpec)
-	if playerClass == "DRUID" then
-		self:RegisterEvent("SPELLS_CHANGED", CheckSymbiosis)
-	end
-end
-
-local function Disable(self)
-	if self.RaidDebuffs then
-		self:UnregisterEvent('UNIT_AURA', Update)
-		self.RaidDebuffs:Hide()
-	end
-	self:UnregisterEvent("PLAYER_TALENT_UPDATE", CheckSpec)
-	self:UnregisterEvent("CHARACTER_POINTS_CHANGED", CheckSpec)
-	if playerClass == "DRUID" then
-		self:UnregisterEvent("SPELLS_CHANGED", CheckSymbiosis)
-	end
-end
-
-oUF:AddElement('RaidDebuffs', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.toc b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.toc
deleted file mode 100644
index e42f9df..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.toc
+++ /dev/null
@@ -1,7 +0,0 @@
-## Interface: 30300
-## Title: oUF RaidDebuffs
-## Notes: Raid debuff mod for oUF
-## Version: 1.2
-## OptionalDeps: oUF
-
-oUF_RaidDebuffs.lua
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Reputation/oUF_Reputation.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Reputation/oUF_Reputation.lua
deleted file mode 100644
index cbb3fa1..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Reputation/oUF_Reputation.lua
+++ /dev/null
@@ -1,85 +0,0 @@
-local __, ns = ...
-local oUF = ns.oUF or oUF
-assert(oUF, 'oUF Reputation was unable to locate oUF install')
-
-for tag, func in pairs({
-	['currep'] = function()
-		local __, __, min, __, value = GetWatchedFactionInfo()
-		return value - min
-	end,
-	['maxrep'] = function()
-		local __, __, min, max = GetWatchedFactionInfo()
-		return max - min
-	end,
-	['perrep'] = function()
-		local __, __, min, max, value = GetWatchedFactionInfo()
-		return math.floor((value - min) / (max - min) * 100 + 0.5)
-	end,
-	['standing'] = function()
-		local __, standing = GetWatchedFactionInfo()
-		return GetText('FACTION_STANDING_LABEL' .. standing, UnitSex('player'))
-	end,
-	['reputation'] = function()
-		return GetWatchedFactionInfo()
-	end,
-}) do
-	oUF.Tags.Methods[tag] = func
-	oUF.Tags.Events[tag] = 'UPDATE_FACTION'
-end
-
-oUF.Tags.SharedEvents.UPDATE_FACTION = true
-
-local function Update(self, event, unit)
-	local reputation = self.Reputation
-
-	local name, standing, min, max, value = GetWatchedFactionInfo()
-	if(not name) then
-		return reputation:Hide()
-	else
-		reputation:Show()
-	end
-
-	reputation:SetMinMaxValues(0, max - min)
-	reputation:SetValue(value - min)
-
-	if(reputation.colorStanding) then
-		local color = FACTION_BAR_COLORS[standing]
-		reputation:SetStatusBarColor(color.r, color.g, color.b)
-	end
-
-	if(reputation.PostUpdate) then
-		return reputation:PostUpdate(unit, name, standing, min, max, value)
-	end
-end
-
-local function Path(self, ...)
-	return (self.Reputation.Override or Update) (self, ...)
-end
-
-local function ForceUpdate(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
-end
-
-local function Enable(self, unit)
-	local reputation = self.Reputation
-	if(reputation) then
-		reputation.__owner = self
-		reputation.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('UPDATE_FACTION', Path)
-
-		if(not reputation:GetStatusBarTexture()) then
-			reputation:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
-		end
-
-		return true
-	end
-end
-
-local function Disable(self)
-	if(self.Reputation) then
-		self:UnregisterEvent('UPDATE_FACTION', Path)
-	end
-end
-
-oUF:AddElement('Reputation', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Reputation/oUF_Reputation.toc b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Reputation/oUF_Reputation.toc
deleted file mode 100644
index f01a953..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Reputation/oUF_Reputation.toc
+++ /dev/null
@@ -1,8 +0,0 @@
-## Interface: 50001
-## Author: p3lim
-## Version: 50001.8-Release
-## Title: oUF Reputation
-## Notes: Reputation Bar support for oUF layouts.
-## RequiredDeps: oUF
-
-oUF_Reputation.lua
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Smooth/oUF_Smooth.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Smooth/oUF_Smooth.lua
deleted file mode 100644
index 67b59d0..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_Smooth/oUF_Smooth.lua
+++ /dev/null
@@ -1,64 +0,0 @@
-local _, ns = ...
-local oUF = ns.oUF or oUF
-if not oUF then return end
-
-local smoothing = {}
-local function Smooth(self, value)
-	if value ~= self:GetValue() or value == 0 then
-		smoothing[self] = value
-	else
-		smoothing[self] = nil
-	end
-end
-
-local function SmoothBar(bar)
-	if not bar.SetValue_ then
-		bar.SetValue_ = bar.SetValue;
-		bar.SetValue = Smooth;
-	end
-end
-
-local function ResetBar(bar)
-	if bar.SetValue_ then
-		bar.SetValue = bar.SetValue_;
-		bar.SetValue_ = nil;
-	end
-end
-
-local function hook(frame)
-	if frame.Health then
-		SmoothBar(frame.Health)
-	end
-	if frame.Power then
-		SmoothBar(frame.Power)
-	end
-	if frame.AltPowerBar then
-		SmoothBar(frame.AltPowerBar)
-	end
-end
-
-for i, frame in ipairs(oUF.objects) do hook(frame) end
-oUF:RegisterInitCallback(hook)
-
-local f, min, max = CreateFrame('Frame'), math.min, math.max
-f:SetScript('OnUpdate', function()
-	local rate = GetFramerate()
-	local limit = 30/rate
-
-	for bar, value in pairs(smoothing) do
-		local cur = bar:GetValue()
-		local new = cur + min((value-cur)/3, max(value-cur, limit))
-		if new ~= new then
-			-- Mad hax to prevent QNAN.
-			new = value
-		end
-		bar:SetValue_(new)
-		if (cur == value or abs(new - value) < 2) and bar.Smooth then
-			bar:SetValue_(value)
-			smoothing[bar] = nil
-		elseif not bar.Smooth then
-			bar:SetValue_(value)
-			smoothing[bar] = nil
-		end
-	end
-end)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_TotemBars/oUF_TotemBars.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_TotemBars/oUF_TotemBars.lua
deleted file mode 100644
index ccf7d29..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_TotemBars/oUF_TotemBars.lua
+++ /dev/null
@@ -1,124 +0,0 @@
-local class = select(2, UnitClass('player'))
-if(class ~= 'SHAMAN') then return end
-
-local parent, ns = ...
-local oUF = ns.oUF
-
-oUF.colors.totems = {
-	[FIRE_TOTEM_SLOT] = { 181/255, 073/255, 033/255 },
-	[EARTH_TOTEM_SLOT] = { 074/255, 142/255, 041/255 },
-	[WATER_TOTEM_SLOT] = { 057/255, 146/255, 181/255 },
-	[AIR_TOTEM_SLOT] = { 132/255, 056/255, 231/255 }
-}
-
-local GetTotemInfo, GetTime = GetTotemInfo, GetTime
-local priorities = SHAMAN_TOTEM_PRIORITIES or STANDARD_TOTEM_PRIORITIES
-
-local Totem_OnEnter = function(self)
-	if(not self:IsVisible()) then return end
-	GameTooltip:SetOwner(self, 'ANCHOR_BOTTOMRIGHT')
-	GameTooltip:SetTotem(self:GetID())
-end
-
-local Totem_OnLeave = function()
-	GameTooltip:Hide()
-end
-
-local Totem_OnUpdate = function(self, elapsed)
-	if not self.expirationTime then return end
-	self.elapsed = (self.elapsed or 0) + elapsed
-	if self.elapsed >= 0.5 then
-		local timeLeft = self.expirationTime - GetTime()
-		if timeLeft > 0 then
-			self:SetValue(timeLeft)
-		else
-			self:SetScript("OnUpdate", nil)
-		end
-	end
-end
-
-local Update = function(self, event)
-	local totems = self.TotemBars
-	if(totems.PreUpdate) then totems:PreUpdate() end
-	local haveTotem, name, start, duration, icon, timeLeft
-	for i = 1, MAX_TOTEMS do
-		local totem = totems[priorities[i]]
-		if(totem) then
-			haveTotem, name, start, duration, icon = GetTotemInfo(i)
-			timeLeft = (start + duration) - GetTime()
-			totem:SetMinMaxValues(0,duration)
-
-			if(timeLeft > 0) then
-				totem.expirationTime = (start + duration)
-				totem:SetValue(timeLeft)
-				totem:SetScript('OnUpdate', UpdateBar)
-			else
-				totem:SetValue(0)
-				totem:SetScript('OnUpdate', nil)
-			end
-		end
-	end
-
-	if(totems.PostUpdate) then
-		return totems:PostUpdate()
-	end
-end
-
-local Path = function(self, ...)
-	return (self.TotemBars.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate')
-end
-
-local Enable = function(self)
-	local totems = self.TotemBars
-
-	if(totems) then
-		totems.__owner = self
-		totems.__map = { unpack(priorities) }
-		totems.ForceUpdate = ForceUpdate
-
-		for i = 1, MAX_TOTEMS do
-			local totem = totems[i]
-			totem:SetID(priorities[i])
-
-			if(totem:IsMouseEnabled()) then
-				totem:SetScript('OnEnter', Totem_OnEnter)
-				totem:SetScript('OnLeave', Totem_OnLeave)
-			end
-		end
-
-		self:RegisterEvent('PLAYER_TOTEM_UPDATE', Path, true)
-
-		TotemFrame.Show = TotemFrame.Hide
-		TotemFrame:Hide()
-
-		TotemFrame:UnregisterEvent("PLAYER_TOTEM_UPDATE")
-		TotemFrame:UnregisterEvent("PLAYER_ENTERING_WORLD")
-		TotemFrame:UnregisterEvent("UPDATE_SHAPESHIFT_FORM")
-		TotemFrame:UnregisterEvent("PLAYER_TALENT_UPDATE")
-
-		return true
-	end
-end
-
-local Disable = function(self)
-	if(self.TotemBars) then
-		for i = 1, MAX_TOTEMS do
-			self.TotemBars[i]:Hide()
-		end
-		TotemFrame.Show = nil
-		TotemFrame:Show()
-
-		TotemFrame:RegisterEvent("PLAYER_TOTEM_UPDATE")
-		TotemFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
-		TotemFrame:RegisterEvent("UPDATE_SHAPESHIFT_FORM")
-		TotemFrame:RegisterEvent("PLAYER_TALENT_UPDATE")
-
-		self:UnregisterEvent('PLAYER_TOTEM_UPDATE', Path)
-	end
-end
-
-oUF:AddElement("TotemBars", Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_WarlockShards/oUF_WarlockShards.lua b/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_WarlockShards/oUF_WarlockShards.lua
deleted file mode 100644
index fd6ac91..0000000
--- a/Interface/AddOns/SVUI/libs/oUF_Plugins/oUF_WarlockShards/oUF_WarlockShards.lua
+++ /dev/null
@@ -1,147 +0,0 @@
-if select(2, UnitClass('player')) ~= "WARLOCK" then return end
-
-local _, ns = ...
-local oUF = ns.oUF or oUF
-
-assert(oUF, 'oUF_WarlockShards was unable to locate oUF install')
-
-local MAX_POWER_PER_EMBER = 10
-local SPELL_POWER_DEMONIC_FURY = SPELL_POWER_DEMONIC_FURY
-local SPELL_POWER_BURNING_EMBERS = SPELL_POWER_BURNING_EMBERS
-local SPELL_POWER_SOUL_SHARDS = SPELL_POWER_SOUL_SHARDS
-local SPEC_WARLOCK_DESTRUCTION = SPEC_WARLOCK_DESTRUCTION
-local SPEC_WARLOCK_AFFLICTION = SPEC_WARLOCK_AFFLICTION
-local SPEC_WARLOCK_DEMONOLOGY = SPEC_WARLOCK_DEMONOLOGY
-
-oUF.colors.WarlockShards = {
-	[1] = {100/255, 0/255, 255/255},
-	[2] = {180/255, 30/255, 255/255},
-	[3] = {255/255, 115/255, 10/255}
-}
-
-local Update = function(self, event, unit, powerType)
-	local wsb = self.WarlockShards
-	if(wsb.PreUpdate) then wsb:PreUpdate(unit) end
-
-	if UnitHasVehicleUI("player") then
-		wsb:Hide()
-	else
-		wsb:Show()
-	end
-
-	local spec = GetSpecialization()
-	if spec then
-		if not wsb:IsShown() then
-			wsb:Show()
-		end
-
-		for i = 1, 4 do
-			wsb[i]:Show()
-			wsb[i]:SetStatusBarColor(unpack(oUF.colors.WarlockShards[spec]))
-		end
-
-		if (spec == SPEC_WARLOCK_DESTRUCTION) then
-			local maxPower = UnitPowerMax("player", SPELL_POWER_BURNING_EMBERS, true)
-			local power = UnitPower("player", SPELL_POWER_BURNING_EMBERS, true)
-			local numEmbers = power / MAX_POWER_PER_EMBER
-			local numBars = floor(maxPower / MAX_POWER_PER_EMBER)
-			wsb.number = numBars
-
-			-- bar unavailable
-			if numBars == 3 then
-				wsb[4]:Hide()
-			else
-				wsb[4]:Show()
-			end
-
-			for i = 1, numBars do
-				wsb[i]:SetMinMaxValues((MAX_POWER_PER_EMBER * i) - MAX_POWER_PER_EMBER, MAX_POWER_PER_EMBER * i)
-				wsb[i]:SetValue(power)
-			end
-		elseif ( spec == SPEC_WARLOCK_AFFLICTION ) then
-			local numShards = UnitPower("player", SPELL_POWER_SOUL_SHARDS)
-			local maxShards = UnitPowerMax("player", SPELL_POWER_SOUL_SHARDS)
-			wsb.number = maxShards
-
-			-- bar unavailable
-			if maxShards == 3 then
-				wsb[4]:Hide()
-			else
-				wsb[4]:Show()
-			end
-
-			for i = 1, maxShards do
-				wsb[i]:SetMinMaxValues(0, 1)
-				if i <= numShards then
-					wsb[i]:SetValue(1)
-				else
-					wsb[i]:SetValue(0)
-				end
-			end
-		elseif spec == SPEC_WARLOCK_DEMONOLOGY then
-			local power = UnitPower("player", SPELL_POWER_DEMONIC_FURY)
-			local maxPower = UnitPowerMax("player", SPELL_POWER_DEMONIC_FURY)
-
-			wsb.number = 1
-			wsb[2]:Hide()
-			wsb[3]:Hide()
-			wsb[4]:Hide()
-
-			wsb[1]:SetMinMaxValues(0, maxPower)
-			wsb[1]:SetValue(power)
-		end
-	else
-		if wsb:IsShown() then
-			wsb:Hide()
-		end
-	end
-
-	if(wsb.PostUpdate) then
-		return wsb:PostUpdate(unit, spec)
-	end
-end
-
-local Path = function(self, ...)
-	return (self.WarlockShards.Override or Update) (self, ...)
-end
-
-local ForceUpdate = function(element)
-	return Path(element.__owner, 'ForceUpdate', element.__owner.unit, 'SOUL_SHARDS')
-end
-
-local function Enable(self, unit)
-	if(unit ~= 'player') then return end
-
-	local wsb = self.WarlockShards
-	if(wsb) then
-		wsb.__owner = self
-		wsb.ForceUpdate = ForceUpdate
-
-		self:RegisterEvent('UNIT_POWER', Path)
-		self:RegisterEvent("PLAYER_TALENT_UPDATE", Path)
-
-		for i = 1, 4 do
-			if not wsb[i]:GetStatusBarTexture() then
-				Point:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
-			end
-
-			wsb[i]:SetFrameLevel(wsb:GetFrameLevel() + 1)
-			wsb[i]:GetStatusBarTexture():SetHorizTile(false)
-		end
-
-		wsb.number = 4
-
-		return true
-	end
-end
-
-local function Disable(self)
-	local wsb = self.WarlockShards
-	if(wsb) then
-		self:UnregisterEvent('UNIT_POWER', Path)
-		self:UnregisterEvent("PLAYER_TALENT_UPDATE", Path)
-		wsb:Hide()
-	end
-end
-
-oUF:AddElement('WarlockShards', Path, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ActionPanel/oUF_ActionPanel.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ActionPanel/oUF_ActionPanel.lua
new file mode 100644
index 0000000..ac98666
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ActionPanel/oUF_ActionPanel.lua
@@ -0,0 +1,106 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local Update = function(self, event, unit)
+	if(self.unit ~= unit) or not unit then return end
+	local action = self.ActionPanel
+	local border = action.border
+	local special = action.special
+	local showSpecial = false
+	local r,g,b = 0,0,0;
+	local category = UnitClassification(unit)
+
+	if(category == "elite") then
+		r,g,b = 1,0.75,0,0.7;
+		showSpecial = true
+	elseif(category == "rare" or category == "rareelite") then
+		r,g,b = 0.59,0.79,1,0.7;
+		showSpecial = true
+	end
+	if(UnitIsDeadOrGhost(unit)) then
+		r,g,b = 0,0,0
+	end
+	border[1]:SetTexture(r,g,b)
+	border[2]:SetTexture(r,g,b)
+	border[3]:SetTexture(r,g,b)
+	border[4]:SetTexture(r,g,b)
+	if(special) then
+		if(showSpecial) then
+			special[1]:SetVertexColor(r,g,b)
+			special[2]:SetVertexColor(r,g,b)
+			special[3]:SetVertexColor(r,g,b)
+			special:Show()
+		else
+			special:Hide()
+		end
+	end
+
+	local status = self.StatusPanel
+	if(status) then
+		local texture = status.texture
+		local media = status.media
+
+		if(not UnitIsConnected(unit)) then
+			texture:SetAlpha(1)
+			texture:SetTexture(media[1])
+			texture:SetGradient("VERTICAL",0,1,1,1,1,0)
+		elseif(UnitIsDeadOrGhost(unit)) then
+			texture:SetAlpha(1)
+			texture:SetTexture(media[2])
+			texture:SetGradient("VERTICAL",0,0,1,0,1,0)
+		elseif(unit ~= "player" and (unit ~= "vehicle" and (not UnitIsFriend(unit, "player")) and (not UnitIsPlayer(unit)) and UnitIsTapped(unit) and (not UnitIsTappedByPlayer(unit)))) then
+			texture:SetAlpha(1)
+			texture:SetTexture(media[3])
+			texture:SetGradient("VERTICAL",1,1,0,1,0,0)
+		else
+			texture:SetTexture(0,0,0,0)
+		end
+	end
+end
+
+local Path = function(self, ...)
+	return (self.ActionPanel.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+local Enable = function(self, unit)
+	local action = self.ActionPanel
+	if(action) then
+		action.__owner = self
+		action.ForceUpdate = ForceUpdate
+		local status = self.StatusPanel
+		if(status and status.texture) then
+			self:RegisterEvent('UNIT_FLAGS', Path)
+			self:RegisterEvent('UNIT_FACTION', Path)
+		end
+		self:RegisterEvent("UNIT_TARGET", Path, true)
+		self:RegisterEvent("PLAYER_TARGET_CHANGED", Path, true)
+		return true
+	end
+end
+
+local Disable = function(self)
+	local action = self.ActionPanel
+	if(action) then
+		local status = self.StatusPanel
+		if(status) then
+			if(self:IsEventRegistered("UNIT_FLAGS")) then
+				self:UnregisterEvent("UNIT_FLAGS", Path)
+			end
+			if(self:IsEventRegistered("UNIT_FACTION")) then
+				self:UnregisterEvent("UNIT_FACTION", Path)
+			end
+		end
+		if(self:IsEventRegistered("PLAYER_TARGET_CHANGED")) then
+			self:UnregisterEvent("PLAYER_TARGET_CHANGED", Path)
+		end
+		if(self:IsEventRegistered("UNIT_TARGET")) then
+			self:UnregisterEvent("UNIT_TARGET", Path)
+		end
+	end
+end
+
+oUF:AddElement('ActionPanel', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ActionPanel/oUF_ActionPanel.toc b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ActionPanel/oUF_ActionPanel.toc
new file mode 100644
index 0000000..28b273d
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ActionPanel/oUF_ActionPanel.toc
@@ -0,0 +1,9 @@
+## Interface: 50001
+## Title: oUF ActionPanel
+## Notes: Adds a backing to all unit frames that provides many utilities.
+## Author: Munglunch
+## Version: 4.4
+## X-Category: oUF
+## Dependencies: oUF
+
+oUF_ActionPanel.lua
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Afflicted/oUF_Afflicted.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Afflicted/oUF_Afflicted.lua
new file mode 100644
index 0000000..fdfaa1c
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Afflicted/oUF_Afflicted.lua
@@ -0,0 +1,137 @@
+local _, ns = ...
+local oUF = oUF or ns.oUF
+if not oUF then return end
+
+local playerClass = select(2,UnitClass("player"))
+local CanDispel = {
+	PRIEST = { Magic = true, Disease = true },
+	SHAMAN = { Magic = false, Curse = true },
+	PALADIN = { Magic = false, Poison = true, Disease = true },
+	MAGE = { Curse = true },
+	DRUID = { Magic = false, Curse = true, Poison = true, Disease = false },
+	MONK = { Magic = false, Poison = true, Disease = true }
+}
+
+local AfflictedColor = { };
+AfflictedColor["none"] = { r = 1, g = 0, b = 0 };
+AfflictedColor["Magic"]    = { r = 0, g = 0.4, b = 1 };
+AfflictedColor["Curse"]    = { r = 0.4, g = 0, b = 1 };
+AfflictedColor["Disease"]  = { r = 1, g = 0.4, b = 0 };
+AfflictedColor["Poison"]   = { r = 0.4, g = 1, b = 0 };
+AfflictedColor[""] = AfflictedColor["none"];
+
+local SymbiosisName = GetSpellInfo(110309)
+local CleanseName = GetSpellInfo(4987)
+local dispellist = CanDispel[playerClass] or {}
+local blackList = {
+	[GetSpellInfo(140546)] = true, --Fully Mutated
+	[GetSpellInfo(136184)] = true, --Thick Bones
+	[GetSpellInfo(136186)] = true, --Clear mind
+	[GetSpellInfo(136182)] = true, --Improved Synapses
+	[GetSpellInfo(136180)] = true, --Keen Eyesight
+}
+local function GetDebuffType(unit, filter)
+	if not unit or not UnitCanAssist("player", unit) then return nil end
+	local i = 1
+	while true do
+		local name, _, texture, _, debufftype = UnitAura(unit, i, "HARMFUL")
+		if not texture then break end
+		if debufftype and (not filter or (filter and dispellist[debufftype])) and not blackList[name] then
+			return debufftype, texture
+		end
+		i = i + 1
+	end
+end
+
+local function CheckTalentTree(tree)
+	local activeGroup = GetActiveSpecGroup()
+	if activeGroup and GetSpecialization(false, false, activeGroup) then
+		return tree == GetSpecialization(false, false, activeGroup)
+	end
+end
+
+local function CheckSpec(self, event, levels)
+	if event == "CHARACTER_POINTS_CHANGED" and levels > 0 then return end
+	if playerClass == "PRIEST" then
+		if CheckTalentTree(3) then
+			dispellist.Disease = false
+		else
+			dispellist.Disease = true
+		end
+	elseif playerClass == "PALADIN" then
+		if CheckTalentTree(1) then
+			dispellist.Magic = true
+		else
+			dispellist.Magic = false
+		end
+	elseif playerClass == "SHAMAN" then
+		if CheckTalentTree(3) then
+			dispellist.Magic = true
+		else
+			dispellist.Magic = false
+		end
+	elseif playerClass == "DRUID" then
+		if CheckTalentTree(4) then
+			dispellist.Magic = true
+		else
+			dispellist.Magic = false
+		end
+	elseif playerClass == "MONK" then
+		if CheckTalentTree(2) then
+			dispellist.Magic = true
+		else
+			dispellist.Magic = false
+		end
+	end
+end
+
+local function CheckSymbiosis()
+	if GetSpellInfo(SymbiosisName) == CleanseName then
+		dispellist.Disease = true
+	else
+		dispellist.Disease = false
+	end
+end
+
+local function Update(object, event, unit)
+	if unit ~= object.unit then return; end
+	local debuffType, texture  = GetDebuffType(unit, object.AfflictedFilter)
+	if debuffType then
+		local color = AfflictedColor[debuffType]
+		object.Afflicted:SetVertexColor(color.r, color.g, color.b, object.AfflictedAlpha or .5)
+	else
+		object.Afflicted:SetVertexColor(0,0,0,0)
+	end
+end
+
+local function Enable(object)
+	if not object.Afflicted then
+		return
+	end
+	if object.AfflictedFilter and not CanDispel[playerClass] then
+		return
+	end
+	object:RegisterEvent("UNIT_AURA", Update)
+	object:RegisterEvent("PLAYER_TALENT_UPDATE", CheckSpec)
+	object:RegisterEvent("CHARACTER_POINTS_CHANGED", CheckSpec)
+	CheckSpec(object)
+
+	object:RegisterUnitEvent("UNIT_AURA", object.unit)
+	if playerClass == "DRUID" then
+		object:RegisterEvent("SPELLS_CHANGED", CheckSymbiosis)
+	end
+	return true
+end
+
+local function Disable(object)
+	object:UnregisterEvent("UNIT_AURA", Update)
+	object:UnregisterEvent("PLAYER_TALENT_UPDATE", CheckSpec)
+	object:UnregisterEvent("CHARACTER_POINTS_CHANGED", CheckSpec)
+
+	if playerClass == "DRUID" then
+		object:UnregisterEvent("SPELLS_CHANGED", CheckSymbiosis)
+	end
+	object.Afflicted:SetVertexColor(0,0,0,0)
+end
+
+oUF:AddElement('Afflicted', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Afflicted/oUF_Afflicted.toc b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Afflicted/oUF_Afflicted.toc
new file mode 100644
index 0000000..c8b4d84
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Afflicted/oUF_Afflicted.toc
@@ -0,0 +1,9 @@
+## Interface: 50001
+## Title: oUF Afflicted
+## Notes: Adds Custom Debuff Highlighting to oUF.
+## Author: Munglunch
+## Version: 4.4
+## X-Category: oUF
+## Dependencies: oUF
+
+oUF_ActionPanel.lua
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.lua
new file mode 100644
index 0000000..55456bd
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.lua
@@ -0,0 +1,119 @@
+if select(2, UnitClass('player')) ~= "MAGE" then return end
+
+local _, ns = ...
+local oUF = oUF or ns.oUF
+if not oUF then return end
+
+local function UpdateBar(self, elapsed)
+	if not self.expirationTime then return end
+	self.elapsed = (self.elapsed or 0) + elapsed
+	if self.elapsed >= 0.5 then
+		local timeLeft = self.expirationTime - GetTime()
+		if timeLeft > 0 then
+			self:SetValue(timeLeft)
+		else
+			self:SetScript("OnUpdate", nil)
+		end
+	end
+end
+
+local Update = function(self, event)
+	local unit = self.unit or 'player'
+	local bar = self.ArcaneChargeBar
+	if(bar.PreUpdate) then bar:PreUpdate(event) end
+
+	local talentSpecialization = GetSpecialization()
+
+	if talentSpecialization == 1 then
+		bar:Show()
+	else
+		bar:Hide()
+	end
+
+	local arcaneCharges, maxCharges, duration, expirationTime = 0, 4
+	if bar:IsShown() then
+		for index=1, 30 do
+			local _, _, _, count, _, start, timeLeft, _, _, _, spellID = UnitDebuff(unit, index)
+			if spellID == 36032 then
+				arcaneCharges = count or 0
+				duration = start
+				expirationTime = timeLeft
+				break
+			end
+		end
+
+		for i = 1, maxCharges do
+			if duration and expirationTime then
+				bar[i]:SetMinMaxValues(0, duration)
+				bar[i].duration = duration
+				bar[i].expirationTime = expirationTime
+			end
+			if i <= arcaneCharges then
+				bar[i]:Show()
+				bar[i]:SetValue(duration)
+				bar[i]:SetScript('OnUpdate', UpdateBar)
+			else
+				bar[i]:SetValue(0)
+				bar[i]:SetScript('OnUpdate', nil)
+				bar[i]:Hide()
+			end
+		end
+	end
+
+	if(bar.PostUpdate) then
+		return bar:PostUpdate(event, arcaneCharges, maxCharges)
+	end
+end
+
+
+local Path = function(self, ...)
+	return (self.ArcaneChargeBar.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+local function Enable(self, unit)
+	local bar = self.ArcaneChargeBar
+
+	if(bar) then
+		self:RegisterEvent("UNIT_AURA", Path)
+		self:RegisterEvent("PLAYER_TALENT_UPDATE", Path)
+		self:RegisterEvent("PLAYER_ENTERING_WORLD", Path)
+		bar.__owner = self
+		bar.ForceUpdate = ForceUpdate
+
+		for i = 1, 4 do
+			if not bar[i]:GetStatusBarTexture() then
+				bar[i]:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
+			end
+
+			bar[i]:SetFrameLevel(bar:GetFrameLevel() + 1)
+			bar[i]:GetStatusBarTexture():SetHorizTile(false)
+
+			if bar[i].bg then
+				bar[i]:SetMinMaxValues(0, 1)
+				bar[i]:SetValue(0)
+				bar[i].bg:SetAlpha(0.4)
+				bar[i].bg:SetAllPoints()
+				bar[i]:Hide()
+			end
+		end
+
+		return true;
+	end
+end
+
+local function Disable(self,unit)
+	local bar = self.ArcaneChargeBar
+
+	if(bar) then
+		self:UnregisterEvent("UNIT_AURA", Path)
+		self:UnregisterEvent("PLAYER_TALENT_UPDATE", Path)
+		self:UnregisterEvent("PLAYER_ENTERING_WORLD", Path)
+		bar:Hide()
+	end
+end
+
+oUF:AddElement("ArcaneChargeBar",Path,Enable,Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.toc b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.toc
new file mode 100644
index 0000000..8d226c3
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_ArcaneCharge/oUF_ArcaneCharge.toc
@@ -0,0 +1,8 @@
+## Interface: 50001
+## Title: oUF Arcane Charge
+## Notes: Adds support for arcane charge indicators to oUF.
+## Author: Munglunch
+## Version: 4.4
+## Dependencies: oUF
+
+oUF_ArcaneCharge.lua
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_AuraBars/oUF_AuraBars.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_AuraBars/oUF_AuraBars.lua
new file mode 100644
index 0000000..65c3e76
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_AuraBars/oUF_AuraBars.lua
@@ -0,0 +1,378 @@
+--[[ MODIFIED FOR SVUI BY MUNGLUNCH ]]--
+local _, ns = ...
+local oUF = oUF or ns.oUF
+assert(oUF, 'oUF_AuraBars was unable to locate oUF install.')
+
+local format = string.format
+local floor, huge, min = math.floor, math.huge, math.min
+local tsort = table.sort
+
+local function Round(number, decimalPlaces)
+	if decimalPlaces and decimalPlaces > 0 then
+		local mult = 10^decimalPlaces
+		return floor(number * mult + .5) / mult
+	end
+	return floor(num + .5)
+end
+
+local DAY, HOUR, MINUTE = 86400, 3600, 60
+local function FormatTime(s)
+	if s < MINUTE then
+		return ("%.1fs"):format(s)
+	elseif s < HOUR then
+		return ("%dm %ds"):format(s/60%60, s%60)
+	elseif s < DAY then
+		return ("%dh %dm"):format(s/(60*60), s/60%60)
+	else
+		return ("%dd %dh"):format(s/DAY, (s / HOUR) - (floor(s/DAY) * 24))
+	end
+end
+
+local function UpdateTooltip(self)
+	GameTooltip:SetUnitAura(self.__unit, self:GetParent().aura.name, self:GetParent().aura.rank, self:GetParent().aura.filter)
+end
+
+local function OnEnter(self)
+	if(not self:IsVisible()) then return end
+	GameTooltip:SetOwner(self, "ANCHOR_BOTTOMRIGHT")
+	self:UpdateTooltip()
+end
+
+local function OnLeave(self)
+	GameTooltip:Hide()
+end
+
+local function SetAnchors(self)
+	local bars = self.bars
+
+	for index = 1, #bars do
+		local frame = bars[index]
+		local anchor = frame.anchor
+		frame:SetHeight(self.auraBarHeight or 20)
+		frame.statusBar.iconHolder:Size(frame:GetHeight())
+		frame:SetWidth((self.auraBarWidth or self:GetWidth()) - (frame:GetHeight() + (self.gap or 0)))
+		frame:ClearAllPoints()
+		if self.down == true then
+			if self == anchor then -- Root frame so indent for icon
+				frame:SetPoint('TOPLEFT', anchor, 'TOPLEFT', (frame:GetHeight() + (self.gap or 0) ), -1)
+			else
+				frame:SetPoint('TOPLEFT', anchor, 'BOTTOMLEFT', 0, (-self.spacing or 0))
+			end
+		else
+			if self == anchor then -- Root frame so indent for icon
+				frame:SetPoint('BOTTOMLEFT', anchor, 'BOTTOMLEFT', (frame:GetHeight() + (self.gap or 0)), 1)
+			else
+				frame:SetPoint('BOTTOMLEFT', anchor, 'TOPLEFT', 0, (self.spacing or 0))
+			end
+		end
+	end
+end
+
+local function SetBackground(frame)
+	local btop = frame:CreateTexture(nil, "OVERLAY")
+	btop:SetTexture(0, 0, 0)
+	btop:SetPoint("TOPLEFT")
+	btop:SetPoint("TOPRIGHT")
+	btop:SetHeight(1)
+	local bbottom = frame:CreateTexture(nil, "OVERLAY")
+	bbottom:SetTexture(0, 0, 0)
+	bbottom:SetPoint("BOTTOMLEFT")
+	bbottom:SetPoint("BOTTOMRIGHT")
+	bbottom:SetHeight(1)
+	local bright = frame:CreateTexture(nil, "OVERLAY")
+	bright:SetTexture(0, 0, 0)
+	bright:SetPoint("TOPRIGHT")
+	bright:SetPoint("BOTTOMRIGHT")
+	bright:SetWidth(1)
+	local bleft = frame:CreateTexture(nil, "OVERLAY")
+	bleft:SetTexture(0, 0, 0)
+	bleft:SetPoint("TOPLEFT")
+	bleft:SetPoint("BOTTOMLEFT")
+	bleft:SetWidth(1)
+    frame:SetBackdrop({
+        bgFile = [[Interface\BUTTONS\WHITE8X8]],
+        edgeFile = [[Interface\BUTTONS\WHITE8X8]],
+        tile = false,
+        tileSize = 0,
+        edgeSize = 1,
+        insets =
+        {
+            left = 0,
+            right = 0,
+            top = 0,
+            bottom = 0,
+        },
+    })
+    frame:SetBackdropColor(0,0,0,0.25)
+    frame:SetBackdropBorderColor(0,0,0)
+end
+
+local function CreateAuraBar(oUF, anchor)
+	local auraBarParent = oUF.AuraBars
+
+	local frame = CreateFrame("Frame", nil, auraBarParent)
+	frame:SetHeight(auraBarParent.auraBarHeight or 20)
+	frame:SetWidth((auraBarParent.auraBarWidth or auraBarParent:GetWidth()) - (frame:GetHeight() + (auraBarParent.gap or 0)))
+	frame.anchor = anchor
+	SetBackground(frame)
+
+	-- the main bar
+	local statusBar = CreateFrame("StatusBar", nil, frame)
+	statusBar:SetStatusBarTexture(auraBarParent.barTexture or [[Interface\TargetingFrame\UI-StatusBar]])
+	statusBar:SetAlpha(auraBarParent.fgalpha or 1)
+	statusBar:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, -1)
+	statusBar:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -1, 1)
+	frame.statusBar = statusBar
+
+	if auraBarParent.down == true then
+		if auraBarParent == anchor then -- Root frame so indent for icon
+			frame:SetPoint('TOPLEFT', anchor, 'TOPLEFT', (frame:GetHeight() + (auraBarParent.gap or 0) ), -1)
+		else
+			frame:SetPoint('TOPLEFT', anchor, 'BOTTOMLEFT', 0, (-auraBarParent.spacing or 0))
+		end
+	else
+		if auraBarParent == anchor then -- Root frame so indent for icon
+			frame:SetPoint('BOTTOMLEFT', anchor, 'BOTTOMLEFT', (frame:GetHeight() + (auraBarParent.gap or 0)), 1)
+		else
+			frame:SetPoint('BOTTOMLEFT', anchor, 'TOPLEFT', 0, (auraBarParent.spacing or 0))
+		end
+	end
+
+	local spark = statusBar:CreateTexture(nil, "OVERLAY", nil);
+	spark:SetTexture([[Interface\CastingBar\UI-CastingBar-Spark]]);
+	spark:SetWidth(12);
+	spark:SetBlendMode("ADD");
+	spark:SetPoint('CENTER', statusBar:GetStatusBarTexture(), 'RIGHT')
+	statusBar.spark = spark
+
+	local holder = CreateFrame('Button', nil, statusBar)
+	holder:SetHeight(frame:GetHeight())
+	holder:SetWidth(frame:GetHeight())
+	holder:SetPoint('BOTTOMRIGHT', frame, 'BOTTOMLEFT', -auraBarParent.gap, 0)
+	SetBackground(holder)
+	holder.__unit = oUF.unit
+	holder:SetScript('OnEnter', OnEnter)
+	holder:SetScript('OnLeave', OnLeave)
+	holder.UpdateTooltip = UpdateTooltip
+	statusBar.iconHolder = holder
+
+	statusBar.icon = statusBar.iconHolder:CreateTexture(nil, 'OVERLAY')
+	statusBar.icon:SetTexCoord(.1, .9, .1, .9)
+	statusBar.icon:SetPoint("TOPLEFT", statusBar.iconHolder, "TOPLEFT", 1, -1)
+	statusBar.icon:SetPoint("BOTTOMRIGHT", statusBar.iconHolder, "BOTTOMRIGHT", -1, 1)
+
+	statusBar.spelltime = statusBar:CreateFontString(nil, 'ARTWORK')
+	statusBar.spelltime:SetFont(auraBarParent.timeFont or [[Fonts\FRIZQT__.TTF]], auraBarParent.textSize or 10, auraBarParent.textOutline or "NONE")
+	statusBar.spelltime:SetTextColor(1 ,1, 1)
+	statusBar.spelltime:SetShadowOffset(1, -1)
+  	statusBar.spelltime:SetShadowColor(0, 0, 0)
+	statusBar.spelltime:SetJustifyH'RIGHT'
+	statusBar.spelltime:SetJustifyV'CENTER'
+	statusBar.spelltime:SetPoint'RIGHT'
+
+	statusBar.spellname = statusBar:CreateFontString(nil, 'ARTWORK')
+	statusBar.spellname:SetFont(auraBarParent.textFont or [[Fonts\FRIZQT__.TTF]], auraBarParent.textSize or 10, auraBarParent.textOutline or "NONE")
+	statusBar.spellname:SetTextColor(1, 1, 1)
+	statusBar.spellname:SetShadowOffset(1, -1)
+  	statusBar.spellname:SetShadowColor(0, 0, 0)
+	statusBar.spellname:SetJustifyH'LEFT'
+	statusBar.spellname:SetJustifyV'CENTER'
+	statusBar.spellname:SetPoint'LEFT'
+	statusBar.spellname:SetPoint('RIGHT', statusBar.spelltime, 'LEFT')
+
+	if auraBarParent.PostCreateBar then
+		auraBarParent.PostCreateBar(statusBar)
+	end
+
+	return frame
+end
+
+local function UpdateBars(auraBars)
+	local bars = auraBars.bars
+	local timenow = GetTime()
+
+	for index = 1, #bars do
+		local frame = bars[index]
+		local bar = frame.statusBar
+		if not frame:IsVisible() then
+			break
+		end
+		if bar.aura.noTime then
+			bar.spelltime:SetText()
+			bar.spark:Hide()
+		else
+			local timeleft = bar.aura.expirationTime - timenow
+			bar:SetValue(timeleft)
+			bar.spelltime:SetText(FormatTime(timeleft))
+			if auraBars.spark == true then
+				bar.spark:Show()
+			end
+		end
+	end
+end
+
+local function DefaultFilter(self, unit, name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate)
+	if unitCaster == 'player' and not shouldConsolidate then
+		return true
+	end
+end
+
+local sort = function(a, b)
+	local compa, compb = a.noTime and huge or a.expirationTime, b.noTime and huge or b.expirationTime
+	return compa > compb
+end
+
+
+local function Update(self, event, unit)
+	if self.unit ~= unit then return end
+	local auraBars = self.AuraBars
+	local helpOrHarm
+	local isFriend = UnitIsFriend('player', unit)
+
+	if auraBars.friendlyAuraType and auraBars.enemyAuraType then
+		if isFriend then
+			helpOrHarm = auraBars.friendlyAuraType
+		else
+			helpOrHarm = auraBars.enemyAuraType
+		end
+	else
+		helpOrHarm = isFriend and 'HELPFUL' or 'HARMFUL'
+	end
+
+	-- Create a table of auras to display
+	local auras = {}
+	local lastAuraIndex = 0
+	for index = 1, 40 do
+		local name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellID = UnitAura(unit, index, helpOrHarm)
+		if not name then break end
+
+		if (auraBars.filter or DefaultFilter)(self, unit, name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellID) then
+			lastAuraIndex = lastAuraIndex + 1
+			auras[lastAuraIndex] = {}
+			auras[lastAuraIndex].spellID = spellID
+			auras[lastAuraIndex].name = name
+			auras[lastAuraIndex].rank = rank
+			auras[lastAuraIndex].icon = icon
+			auras[lastAuraIndex].count = count
+			auras[lastAuraIndex].debuffType = debuffType
+			auras[lastAuraIndex].duration = duration
+			auras[lastAuraIndex].expirationTime = expirationTime
+			auras[lastAuraIndex].unitCaster = unitCaster
+			auras[lastAuraIndex].isStealable = isStealable
+			auras[lastAuraIndex].noTime = (duration == 0 and expirationTime == 0)
+			auras[lastAuraIndex].filter = helpOrHarm
+			auras[lastAuraIndex].shouldConsolidate = shouldConsolidate
+		end
+	end
+
+	if auraBars.sort then
+		tsort(auras, type(auraBars.sort) == 'function' and auraBars.sort or sort)
+	end
+
+	-- Show and configure bars for buffs/debuffs.
+	local bars = auraBars.bars
+	if lastAuraIndex == 0 then
+		self.AuraBars:SetHeight(1)
+	end
+
+	for index = 1 , lastAuraIndex do
+		if auraBars:GetWidth() == 0 then break; end
+		local aura = auras[index]
+		local frame = bars[index]
+
+		if not frame then
+			frame = CreateAuraBar(self, index == 1 and auraBars or bars[index - 1])
+			bars[index] = frame
+		end
+
+		if index == lastAuraIndex then
+			if self.AuraBars.down then
+				self.AuraBars:SetHeight(self.AuraBars:GetTop() - frame:GetBottom())
+			elseif frame:GetTop() and self.AuraBars:GetBottom() then
+				self.AuraBars:SetHeight(frame:GetTop() - self.AuraBars:GetBottom())
+			else
+				self.AuraBars:Height(20)
+			end
+		end
+
+		local bar = frame.statusBar
+		frame.index = index
+
+		-- Backup the details of the aura onto the bar, so the OnUpdate function can use it
+		bar.aura = aura
+
+		-- Configure
+		if bar.aura.noTime then
+			bar:SetMinMaxValues(0, 1)
+			bar:SetValue(1)
+		else
+			if auraBars.scaleTime then
+				local maxvalue = min(auraBars.scaleTime, bar.aura.duration)
+				bar:SetMinMaxValues(0, maxvalue)
+				bar:SetWidth(
+					( maxvalue / auraBars.scaleTime ) *
+					(	( auraBars.auraBarWidth or auraBars:GetWidth() ) -
+						( bar:GetHeight() + (auraBars.gap or 0) ) ) ) 				-- icon size + gap
+			else
+				bar:SetMinMaxValues(0, bar.aura.duration)
+			end
+			bar:SetValue(bar.aura.expirationTime - GetTime())
+		end
+
+		bar.icon:SetTexture(bar.aura.icon)
+
+		bar.spellname:SetText(bar.aura.count > 1 and format("%s [%d]", bar.aura.name, bar.aura.count) or bar.aura.name)
+		bar.spelltime:SetText(not bar.noTime and FormatTime(bar.aura.expirationTime-GetTime()))
+
+		-- Colour bars
+		local r, g, b = .2, .6, 1 -- Colour for buffs
+		if auraBars.buffColor then
+			r, g, b = unpack(auraBars.buffColor)
+		end
+
+		if helpOrHarm == 'HARMFUL' then
+			local debuffType = bar.aura.debuffType and bar.aura.debuffType or 'none'
+
+			r, g, b = DebuffTypeColor[debuffType].r, DebuffTypeColor[debuffType].g, DebuffTypeColor[debuffType].b
+			if auraBars.debuffColor then
+				r, g, b = unpack(auraBars.debuffColor)
+			else
+				if debuffType == 'none' and auraBars.defaultDebuffColor then
+					r, g, b = unpack(auraBars.defaultDebuffColor)
+				end
+			end
+		end
+		bar:SetStatusBarColor(r, g, b)
+		frame:Show()
+	end
+
+	-- Hide unused bars.
+	for index = lastAuraIndex + 1, #bars do
+		bars[index]:Hide()
+	end
+
+	if auraBars.PostUpdate then
+		auraBars:PostUpdate(event, unit)
+	end
+end
+
+local function Enable(self)
+	if self.AuraBars then
+		self:RegisterEvent('UNIT_AURA', Update)
+		self.AuraBars:SetHeight(1)
+		self.AuraBars.bars = self.AuraBars.bars or {}
+		self.AuraBars.SetAnchors = SetAnchors
+		self.AuraBars:SetScript('OnUpdate', UpdateBars)
+		return true
+	end
+end
+
+local function Disable(self)
+	local auraFrame = self.AuraBars
+	if auraFrame then
+		self:UnregisterEvent('UNIT_AURA', Update)
+		auraFrame:SetScript('OnUpdate', nil)
+	end
+end
+
+oUF:AddElement('AuraBars', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_AuraWatch/oUF_AuraWatch.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_AuraWatch/oUF_AuraWatch.lua
new file mode 100644
index 0000000..b011926
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_AuraWatch/oUF_AuraWatch.lua
@@ -0,0 +1,378 @@
+--[[------------------------------------------------------------------------------------------------------
+oUF_AuraWatch by Astromech
+Please leave comments, suggestions, and bug reports on this addon's WoWInterface page
+
+To setup, create a table named AuraWatch in your unit frame. There are several options
+you can specify, as explained below.
+
+	icons
+		Mandatory!
+		A table of frames to be used as icons. oUF_Aurawatch does not position
+		these frames, so you must do so yourself. Each icon needs a spellID entry,
+		which is the spell ID of the aura to watch. Table should be set up
+		such that values are icon frames, but the keys can be anything.
+
+		Note each icon can have several options set as well. See below.
+	strictMatching
+		Default: false
+		If true, AuraWatch will only show an icon if the specific aura
+		with the specified spell id is on the unit. If false, AuraWatch
+		will show the icon if any aura with the same name and icon texture
+		is on the unit. Strict matching can be undesireable because most
+		ranks of an aura have different spell ids.
+	missingAlpha
+		Default 0.75
+		The alpha value for icons of auras which have faded from the unit.
+	presentAlpha
+		Default 1
+		The alpha value for icons or auras present on the unit.
+	onlyShowMissing
+		Default false
+		If this is true, oUF_AW will hide icons if they are present on the unit.
+	onlyShowPresent
+		Default false
+		If this is true, oUF_AW will hide icons if they have expired from the unit.
+	hideCooldown
+		Default false
+		If this is true, oUF_AW will not create a cooldown frame
+	hideCount
+		Default false
+		If this is true, oUF_AW will not create a count fontstring
+	fromUnits
+		Default {["player"] = true, ["pet"] = true, ["vehicle"] = true}
+		A table of units from which auras can originate. Have the units be the keys
+		and "true" be the values.
+	anyUnit
+		Default false
+		Set to true for oUF_AW to to show an aura no matter what unit it
+		originates from. This will override any fromUnits setting.
+	PostCreateIcon
+		Default nil
+		A function to call when an icon is created to modify it, such as adding
+		a border or repositioning the count fontstring. Leave as nil to ignore.
+		The arguements are: AuraWatch table, icon, auraSpellID, auraName, unitFrame
+
+Below are options set on a per icon basis. Set these as fields in the icon frames.
+
+The following settings can be overridden from the AuraWatch table on a per-aura basis:
+	onlyShowMissing
+	onlyShowPresent
+	hideCooldown
+	hideCount
+	fromUnits
+	anyUnit
+
+The following settings are unique to icons:
+
+	spellID
+		Mandatory!
+		The spell id of the aura, as explained above.
+	icon
+		Default aura texture
+		A texture value for this icon.
+	overlay
+		Default Blizzard aura overlay
+		An overlay for the icon. This is not created if a custom icon texture is created.
+	count
+		Default A fontstring
+		An fontstring to show the stack count of an aura.
+
+Here is an example of how to set oUF_AW up:
+
+	local createAuraWatch = function(self, unit)
+		local auras = {}
+
+		-- A table of spellIDs to create icons for
+		-- To find spellIDs, look up a spell on www.wowhead.com and look at the URL
+		-- http://www.wowhead.com/?spell=SPELL_ID
+		local spellIDs = { ... }
+
+		auras.presentAlpha = 1
+		auras.missingAlpha = .7
+		auras.PostCreateIcon = myCustomIconSkinnerFunction
+		-- Set any other AuraWatch settings
+		auras.icons = {}
+		for i, sid in pairs(spellIDs) do
+			local icon = CreateFrame("Frame", nil, auras)
+			icon.spellID = sid
+			-- set the dimensions and positions
+			icon:SetWidth(24)
+			icon:SetHeight(24)
+			icon:SetPoint("BOTTOM", self, "BOTTOM", 0, 28 * i)
+			auras.icons[sid] = icon
+			-- Set any other AuraWatch icon settings
+		end
+		self.AuraWatch = auras
+	end
+-----------------------------------------------------------------------------------------------------------]]
+
+local _, ns = ...
+local oUF = oUF or ns.oUF
+assert(oUF, "oUF_AuraWatch cannot find an instance of oUF. If your oUF is embedded into a layout, it may not be embedded properly.")
+
+local UnitBuff, UnitDebuff, UnitGUID = UnitBuff, UnitDebuff, UnitGUID
+local GUIDs = {}
+
+local PLAYER_UNITS = {
+	player = true,
+	vehicle = true,
+	pet = true,
+}
+
+local setupGUID
+do
+	local cache = setmetatable({}, {__type = "k"})
+
+	local frame = CreateFrame"Frame"
+	frame:SetScript("OnEvent", function(self, event)
+		for k,t in pairs(GUIDs) do
+			GUIDs[k] = nil
+			for a in pairs(t) do
+				t[a] = nil
+			end
+			cache[t] = true
+		end
+	end)
+	frame:RegisterEvent"PLAYER_REGEN_ENABLED"
+	frame:RegisterEvent"PLAYER_ENTERING_WORLD"
+
+	function setupGUID(guid)
+		local t = next(cache)
+		if t then
+			cache[t] = nil
+		else
+			t = {}
+		end
+		GUIDs[guid] = t
+	end
+end
+
+local day, hour, minute, second = 86400, 3600, 60, 1
+function formatTime(s)
+	if s >= day then
+		return format("%dd", ceil(s / hour))
+	elseif s >= hour then
+		return format("%dh", ceil(s / hour))
+	elseif s >= minute then
+		return format("%dm", ceil(s / minute))
+	elseif s >= minute / 12 then
+		return floor(s)
+	end
+
+	return format("%.1f", s)
+end
+
+local function updateText(self, elapsed)
+	if self.timeLeft then
+		self.elapsed = (self.elapsed or 0) + elapsed
+		if self.elapsed >= 0.1 then
+			if not self.first then
+				self.timeLeft = self.timeLeft - self.elapsed
+			else
+				self.timeLeft = self.timeLeft - GetTime()
+				self.first = false
+			end
+			if self.timeLeft > 0 and ((self.timeLeft <= self.textThreshold) or self.textThreshold == -1) then
+				local time = formatTime(self.timeLeft)
+				self.text:SetText(time)
+			else
+				self.text:SetText('')
+				self:SetScript("OnUpdate", nil)
+			end
+			self.elapsed = 0
+		end
+	end
+end
+
+
+local function resetIcon(icon, frame, count, duration, remaining)
+	if icon.onlyShowMissing then
+		icon:Hide()
+	else
+		icon:Show()
+		if icon.cd then
+			if duration and duration > 0 and icon.style ~= 'NONE' then
+				icon.cd:SetCooldown(remaining - duration, duration)
+				icon.cd:Show()
+			else
+				icon.cd:Hide()
+			end
+		end
+
+		if icon.displayText then
+			icon.timeLeft = remaining
+			icon.first = true;
+			icon:SetScript('OnUpdate', updateText)
+		end
+
+		if icon.count then
+			icon.count:SetText((count > 1 and count))
+		end
+		if icon.overlay then
+			icon.overlay:Hide()
+		end
+		icon:SetAlpha(icon.presentAlpha)
+	end
+end
+
+local function expireIcon(icon, frame)
+	if icon.onlyShowPresent then
+		icon:Hide()
+	else
+		if (icon.cd) then icon.cd:Hide() end
+		if (icon.count) then icon.count:SetText() end
+		icon:SetAlpha(icon.missingAlpha)
+		if icon.overlay then
+			icon.overlay:Show()
+		end
+		icon:Show()
+	end
+end
+
+local found = {}
+local function Update(frame, event, unit)
+	if frame.unit ~= unit or not unit then return end
+	local watch = frame.AuraWatch
+	local index, icons = 1, watch.watched
+	local _, name, texture, count, duration, remaining, caster, key, icon, spellID
+	local filter = "HELPFUL"
+	local guid = UnitGUID(unit)
+	if not guid then return end
+	if not GUIDs[guid] then setupGUID(guid) end
+
+	for key, icon in pairs(icons) do
+		if not icon.onlyShowMissing then
+			icon:Hide()
+		end
+	end
+
+	while true do
+		name, _, texture, count, _, duration, remaining, caster, _, _, spellID = UnitAura(unit, index, filter)
+		if not name then
+			if filter == "HELPFUL" then
+				filter = "HARMFUL"
+				index = 1
+			else
+				break
+			end
+		else
+			if watch.strictMatching then
+				key = spellID
+			else
+				key = name..texture
+			end
+			icon = icons[key]
+
+			if icon and (icon.anyUnit or (caster and icon.fromUnits and icon.fromUnits[caster])) then
+				resetIcon(icon, watch, count, duration, remaining)
+				GUIDs[guid][key] = true
+				found[key] = true
+			end
+			index = index + 1
+		end
+	end
+
+	for key in pairs(GUIDs[guid]) do
+		if icons[key] and not found[key] then
+			expireIcon(icons[key], watch)
+		end
+	end
+
+	for k in pairs(found) do
+		found[k] = nil
+	end
+end
+
+local function setupIcons(self)
+
+	local watch = self.AuraWatch
+	local icons = watch.icons
+	watch.watched = {}
+
+	for _,icon in pairs(icons) do
+
+		local name, _, image = GetSpellInfo(icon.spellID)
+
+		if name then
+			icon.name = name
+
+			if not icon.cd and not (watch.hideCooldown or icon.hideCooldown) then
+				local cd = CreateFrame("Cooldown", nil, icon)
+				cd:SetAllPoints(icon)
+				icon.cd = cd
+			end
+
+			if not icon.icon then
+				local tex = icon:CreateTexture(nil, "BACKGROUND")
+				tex:SetAllPoints(icon)
+				tex:SetTexture(image)
+				icon.icon = tex
+				if not icon.overlay then
+					local overlay = icon:CreateTexture(nil, "OVERLAY")
+					overlay:SetTexture"Interface\\Buttons\\UI-Debuff-Overlays"
+					overlay:SetAllPoints(icon)
+					overlay:SetTexCoord(.296875, .5703125, 0, .515625)
+					overlay:SetVertexColor(1, 0, 0)
+					icon.overlay = overlay
+				end
+			end
+
+			if not icon.count and not (watch.hideCount or icon.hideCount) then
+				local count = icon:CreateFontString(nil, "OVERLAY")
+				count:SetFontObject(NumberFontNormal)
+				count:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT", -1, 0)
+				icon.count = count
+			end
+
+			if icon.onlyShowMissing == nil then
+				icon.onlyShowMissing = watch.onlyShowMissing
+			end
+			if icon.onlyShowPresent == nil then
+				icon.onlyShowPresent = watch.onlyShowPresent
+			end
+			if icon.presentAlpha == nil then
+				icon.presentAlpha = watch.presentAlpha
+			end
+			if icon.missingAlpha == nil then
+				icon.missingAlpha = watch.missingAlpha
+			end
+			if icon.fromUnits == nil then
+				icon.fromUnits = watch.fromUnits or PLAYER_UNITS
+			end
+			if icon.anyUnit == nil then
+				icon.anyUnit = watch.anyUnit
+			end
+
+			if watch.strictMatching then
+				watch.watched[icon.spellID] = icon
+			else
+				watch.watched[name..image] = icon
+			end
+
+			if watch.PostCreateIcon then watch:PostCreateIcon(icon, icon.spellID, name, self) end
+		else
+			print("oUF_AuraWatch error: no spell with "..tostring(icon.spellID).." spell ID exists")
+		end
+	end
+end
+
+local function Enable(self)
+	if self.AuraWatch then
+		self.AuraWatch.Update = setupIcons
+		self:RegisterEvent("UNIT_AURA", Update)
+		setupIcons(self)
+		return true
+	else
+		return false
+	end
+end
+
+local function Disable(self)
+	if self.AuraWatch then
+		self:UnregisterEvent("UNIT_AURA", Update)
+		for _,icon in pairs(self.AuraWatch.icons) do
+			icon:Hide()
+		end
+	end
+end
+oUF:AddElement("AuraWatch", Update, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_AuraWatch/oUF_AuraWatch.toc b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_AuraWatch/oUF_AuraWatch.toc
new file mode 100644
index 0000000..5c0d75c
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_AuraWatch/oUF_AuraWatch.toc
@@ -0,0 +1,9 @@
+## Interface: 30300
+## Title: oUF AuraWatch
+## Author: Astromech
+## Version: 1.3.28-6
+## Notes: Adds aura timers to oUF
+## OptionalDeps: oUF
+## X-oUF: oUF
+
+oUF_AuraWatch.lua
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_CombatFader/oUF_CombatFader.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_CombatFader/oUF_CombatFader.lua
new file mode 100644
index 0000000..37dba30
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_CombatFader/oUF_CombatFader.lua
@@ -0,0 +1,128 @@
+local parent, ns = ...
+local oUF = ns.oUF
+local frames, allFrames = {}, {}
+local showStatus
+local CORE;
+
+local CheckForReset = function()
+	for frame, unit in pairs(allFrames) do
+		if frame._secureFade and frame._secureFade.reset then
+			frame:SetAlpha(1)
+			frame._secureFade.reset = nil
+		end
+	end
+end
+
+local FadeFramesInOut = function(fade, unit)
+	if(not CORE) then return end
+	for frame, unit in pairs(frames) do
+		if not UnitExists(unit) then return end
+		if fade then
+			if(frame:GetAlpha() ~= 1 or (frame._secureFade and frame._secureFade.endAlpha == 0)) then
+				CORE:SecureFadeIn(frame, 0.15)
+			end
+		else
+			if frame:GetAlpha() ~= 0 then
+				CORE:SecureFadeOut(frame, 0.15)
+				frame._secureFade.finishedFunc = CheckForReset
+			else
+				showStatus = false;
+				return
+			end
+		end
+	end
+
+	if unit == 'player' then
+		showStatus = fade
+	end
+end
+
+local Update = function(self, arg1, arg2)
+	if(not CORE) then return end
+	if arg1 == "UNIT_HEALTH" and self and self.unit ~= arg2 then return end
+	if type(arg1) == 'boolean' and not frames[self] then return end
+
+	if(not frames[self]) then
+		if(CORE) then
+			CORE:SecureFadeIn(self, 0.15)
+			self._secureFade.reset = true
+		end
+		return
+	end
+
+	local combat = InCombatLockdown()
+	local cur, max = UnitHealth("player"), UnitHealthMax("player")
+	local cast, channel = UnitCastingInfo("player"), UnitChannelInfo("player")
+	local target, focus = UnitExists("target"), UnitExists("focus")
+
+	if (cast or channel) and showStatus ~= true then
+		FadeFramesInOut(true, frames[self])
+	elseif cur ~= max and showStatus ~= true then
+		FadeFramesInOut(true, frames[self])
+	elseif (target or focus) and showStatus ~= true then
+		FadeFramesInOut(true, frames[self])
+	elseif arg1 == true and showStatus ~= true then
+		FadeFramesInOut(true, frames[self])
+	else
+		if combat and showStatus ~= true then
+			FadeFramesInOut(true, frames[self])
+		elseif not target and not combat and not focus and (cur == max) and not (cast or channel) then
+			FadeFramesInOut(false, frames[self])
+		end
+	end
+end
+
+local Enable = function(self, unit)
+	if(not CORE) then CORE = SVUI end
+
+	if self.CombatFade then
+		frames[self] = self.unit
+		allFrames[self] = self.unit
+
+		if unit == 'player' then
+			showStatus = false;
+		end
+
+		self:RegisterEvent("PLAYER_ENTERING_WORLD", Update)
+		self:RegisterEvent("PLAYER_REGEN_ENABLED", Update)
+		self:RegisterEvent("PLAYER_REGEN_DISABLED", Update)
+		self:RegisterEvent("PLAYER_TARGET_CHANGED", Update)
+		self:RegisterEvent("PLAYER_FOCUS_CHANGED", Update)
+		self:RegisterEvent("UNIT_HEALTH", Update)
+		self:RegisterEvent("UNIT_SPELLCAST_START", Update)
+		self:RegisterEvent("UNIT_SPELLCAST_STOP", Update)
+		self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START", Update)
+		self:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP", Update)
+		self:RegisterEvent("UNIT_PORTRAIT_UPDATE", Update)
+		self:RegisterEvent("UNIT_MODEL_CHANGED", Update)
+
+		if not self.CombatFadeHooked then
+			self:HookScript("OnEnter", function(self) Update(self, true) end)
+			self:HookScript("OnLeave", function(self) Update(self, false) end)
+			self.CombatFadeHooked = true
+		end
+		return true
+	end
+end
+
+local Disable = function(self)
+	if(self.CombatFade) then
+		frames[self] = nil
+		Update(self)
+
+		self:UnregisterEvent("PLAYER_ENTERING_WORLD", Update)
+		self:UnregisterEvent("PLAYER_REGEN_ENABLED", Update)
+		self:UnregisterEvent("PLAYER_REGEN_DISABLED", Update)
+		self:UnregisterEvent("PLAYER_TARGET_CHANGED", Update)
+		self:UnregisterEvent("PLAYER_FOCUS_CHANGED", Update)
+		self:UnregisterEvent("UNIT_HEALTH", Update)
+		self:UnregisterEvent("UNIT_SPELLCAST_START", Update)
+		self:UnregisterEvent("UNIT_SPELLCAST_STOP", Update)
+		self:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_START", Update)
+		self:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_STOP", Update)
+		self:UnregisterEvent("UNIT_PORTRAIT_UPDATE", Update)
+		self:UnregisterEvent("UNIT_MODEL_CHANGED", Update)
+	end
+end
+
+oUF:AddElement('CombatFade', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_CombatFader/oUF_CombatFader.toc b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_CombatFader/oUF_CombatFader.toc
new file mode 100644
index 0000000..fc4d705
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_CombatFader/oUF_CombatFader.toc
@@ -0,0 +1,8 @@
+## Interface: 40200
+## Title: oUF Combat Fader
+## Notes: Adds combat fade ability to oUF
+## Author: SV
+## Version: 1.0.0
+## Dependencies: oUF
+
+oUF_CombatFader.lua
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Combatant/oUF_Combatant.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Combatant/oUF_Combatant.lua
new file mode 100644
index 0000000..48cd364
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Combatant/oUF_Combatant.lua
@@ -0,0 +1,158 @@
+local _, ns = ...
+local oUF = ns.oUF
+
+local trinketSpells = {
+	[59752] = 120,
+	[42292] = 120,
+	[7744] = 45,
+}
+
+local timeLeft = 0
+local Trinket_OnUpdate = function(self, elapsed)
+	local expires = (self.duration - (GetTime() - self.start));
+	if(expires == 0) then
+		local parent = self:GetParent()
+		parent.Icon:SetDesaturated(false)
+		parent.Unavailable:Hide()
+		self:SetScript("OnUpdate", nil)
+	end
+end
+
+local function GetPVPIcons(unit, frameID)
+	local _, trinket, badge
+	local unitFactionGroup = UnitFactionGroup(unit)
+	if unitFactionGroup == "Horde" then
+		trinket, badge = [[Interface\Icons\INV_Jewelry_TrinketPVP_02]], [[Interface\Icons\INV_BannerPVP_01]]
+	elseif unitFactionGroup == "Alliance" then
+		trinket, badge = [[Interface\Icons\INV_Jewelry_TrinketPVP_01]], [[Interface\Icons\INV_BannerPVP_02]]
+	else
+		trinket, badge = [[Interface\Icons\INV_MISC_QUESTIONMARK]], [[Interface\Icons\INV_MISC_QUESTIONMARK]]
+	end
+	if(frameID) then
+		local numOpps = GetNumArenaOpponentSpecs()
+		local specID = GetArenaOpponentSpec(frameID)
+		if((numOpps > 0) and specID) then
+			_, _, _, badge = GetSpecializationInfoByID(specID)
+		end
+	end
+	return trinket, badge
+end
+
+local function LogUpdate(self, event, ...)
+	local arenaMatch = IsActiveBattlefieldArena()
+	local element = self.Combatant
+	local trinket = element.Trinket
+	local alert = element.Alert
+	if not arenaMatch then trinket:Hide() return end
+	trinket:Show()
+	if(event == "COMBAT_LOG_EVENT_UNFILTERED") then
+		local _, eventType, _, sourceGUID, _, _, _, _, _, _, _, spellID = ...
+		if eventType == "SPELL_CAST_SUCCESS" and sourceGUID == UnitGUID(self.unit) and trinketSpells[spellID] then
+			local startTime = GetTime()
+			local duration = trinketSpells[spellID]
+			trinket.CD.start = startTime
+			trinket.CD.duration = duration
+			trinket.CD.nextUpdate = 0
+			trinket.CD:SetScript("OnUpdate", Trinket_OnUpdate)
+			trinket.Icon:SetDesaturated(true)
+			trinket.Unavailable:Show()
+			CooldownFrame_SetTimer(trinket.CD, startTime, duration, 1)
+		end
+	elseif(alert and event == "UNIT_SPELLCAST_SUCCEEDED") then
+		local unitID, spellName, _, _, spellID = ...
+		if UnitIsEnemy("player", unitID) and (spellID == 118358 or spellID == 104270 or spellName:find("Drink")) then
+			SendChatMessage(UnitName(unit)..L[" is drinking."], "RAID_WARNING")
+		end
+	end
+end
+
+local Update = function(self, event, ...)
+	local unit, unitType = ...
+	if(event == "COMBAT_LOG_EVENT_UNFILTERED" or event == "UNIT_SPELLCAST_SUCCEEDED") then return LogUpdate(self, event, ...) end
+	if(not unit or unit ~= self.unit) then return end
+	local element = self.Combatant
+	local trinket = element.Trinket
+	local badge = element.Badge
+	local arenaMatch = IsActiveBattlefieldArena()
+	local frameID = arenaMatch and self:GetID()
+	local tIcon, bIcon = GetPVPIcons(unit, frameID)
+	if(badge) then badge.Icon:SetTexture(bIcon) end
+	if(trinket) then
+		if(not arenaMatch) then trinket:Hide() return end
+		trinket.Icon:SetTexture(tIcon)
+		trinket:Show()
+		if event == 'PLAYER_ENTERING_WORLD' then
+			CooldownFrame_SetTimer(trinket.CD, 1, 1, 1)
+		end
+	end
+end
+
+local Enable = function(self, unit)
+	--if(not unit:match("arena%d")) then return end
+	local element = self.Combatant
+
+	if(element) then
+		local trinket = element.Trinket
+		local badge = element.Badge
+		self:RegisterEvent("ARENA_OPPONENT_UPDATE", Update)
+		self:RegisterEvent("PLAYER_ENTERING_WORLD", Update)
+
+		if(trinket) then
+			self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED", Update)
+			self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED", Update)
+			if not trinket.CD then
+				trinket.CD = CreateFrame("Cooldown", nil, trinket)
+				trinket.CD:SetAllPoints(trinket)
+			end
+
+			if not trinket.Icon then
+				trinket.Icon = trinket:CreateTexture(nil, "BORDER")
+				trinket.Icon:SetAllPoints(trinket)
+				trinket.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
+				trinket.Icon:SetTexture([[INTERFACE\ICONS\INV_MISC_QUESTIONMARK]])
+			end
+
+			if not trinket.Unavailable then
+				trinket.Unavailable = trinket:CreateTexture(nil, "OVERLAY")
+				trinket.Unavailable:SetAllPoints(trinket)
+				trinket.Unavailable:SetTexCoord(0.1, 0.9, 0.1, 0.9)
+				trinket.Unavailable:SetTexture([[Interface\BUTTONS\UI-GroupLoot-Pass-Up]])
+			end
+			trinket:Show()
+		end
+
+		if(badge) then
+			self:RegisterEvent("ARENA_PREP_OPPONENT_SPECIALIZATIONS", Update)
+			if not badge.Icon then
+				badge.Icon = badge:CreateTexture(nil, "OVERLAY")
+				badge.Icon:SetAllPoints(badge)
+				badge.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
+				badge.Icon:SetTexture([[INTERFACE\ICONS\INV_MISC_QUESTIONMARK]])
+			end
+			badge:Show()
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local element = self.Combatant
+	local trinket = element.Trinket
+	local badge = element.Badge
+	if(trinket or badge) then
+		self:UnregisterEvent("ARENA_OPPONENT_UPDATE", Update)
+		self:UnregisterEvent("PLAYER_ENTERING_WORLD", Update)
+		if trinket then
+			self:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED", Update)
+			self:UnregisterEvent("UNIT_SPELLCAST_SUCCEEDED", Update)
+			trinket:Hide()
+		end
+		if badge then
+			self:UnregisterEvent("ARENA_PREP_OPPONENT_SPECIALIZATIONS", Update)
+			badge:Hide()
+		end
+	end
+end
+
+oUF:AddElement('Combatant', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Combatant/oUF_Combatant.toc b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Combatant/oUF_Combatant.toc
new file mode 100644
index 0000000..10740d3
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Combatant/oUF_Combatant.toc
@@ -0,0 +1,9 @@
+## Interface: 50001
+## Title: oUF Combatant
+## Notes: Adds PvP trinket status and spec icons to oUF frames.
+## Author: Munglunch
+## Version: 4.40
+## X-Category: oUF
+## Dependencies: oUF
+
+oUF_Combatant.lua
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_DruidMana/oUF_DruidMana.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_DruidMana/oUF_DruidMana.lua
new file mode 100644
index 0000000..f650376
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_DruidMana/oUF_DruidMana.lua
@@ -0,0 +1,106 @@
+if(select(2, UnitClass('player')) ~= 'DRUID') then return end
+
+local _, ns = ...
+local oUF = ns.oUF or oUF
+
+local UPDATE_VISIBILITY = function(self, event)
+	local druidmana = self.DruidAltMana
+	-- check form
+	local form = GetShapeshiftFormID()
+	local min, max = druidmana.ManaBar:GetMinMaxValues()
+
+	if druidmana.ManaBar:GetValue() == max then
+		druidmana:Hide()
+	elseif (form == BEAR_FORM or form == CAT_FORM) then
+		druidmana:Show()
+	else
+		druidmana:Hide()
+	end
+
+	if(druidmana.PostUpdateVisibility) then
+		return druidmana:PostUpdateVisibility(self.unit)
+	end
+end
+
+local UNIT_POWER = function(self, event, unit, powerType)
+	if(self.unit ~= unit) then return end
+	local druidmana = self.DruidAltMana
+
+	if not (druidmana.ManaBar) then return end
+
+	if(druidmana.PreUpdate) then
+		druidmana:PreUpdate(unit)
+	end
+	local min, max = UnitPower('player', SPELL_POWER_MANA), UnitPowerMax('player', SPELL_POWER_MANA)
+
+	druidmana.ManaBar:SetMinMaxValues(0, max)
+	druidmana.ManaBar:SetValue(min)
+
+	local r, g, b, t
+	if(druidmana.colorPower) then
+		t = self.colors.power["MANA"]
+	elseif(druidmana.colorClass and UnitIsPlayer(unit)) or
+		(druidmana.colorClassNPC and not UnitIsPlayer(unit)) or
+		(druidmana.colorClassPet and UnitPlayerControlled(unit) and not UnitIsPlayer(unit)) then
+		local _, class = UnitClass(unit)
+		t = self.colors.class[class]
+	elseif(druidmana.colorReaction and UnitReaction(unit, 'player')) then
+		t = self.colors.reaction[UnitReaction(unit, "player")]
+	elseif(druidmana.colorSmooth) then
+		r, g, b = self.ColorGradient(min / max, unpack(druidmana.smoothGradient or self.colors.smooth))
+	end
+
+	if(t) then
+		r, g, b = t[1], t[2], t[3]
+	end
+
+	if(b) then
+		druidmana.ManaBar:SetStatusBarColor(r, g, b)
+
+		local bg = druidmana.bg
+		if(bg) then
+			local mu = bg.multiplier or 1
+			bg:SetVertexColor(r * mu, g * mu, b * mu)
+		end
+	end
+
+	UPDATE_VISIBILITY(self)
+
+	if(druidmana.PostUpdatePower) then
+		return druidmana:PostUpdatePower(unit, min, max)
+	end
+end
+
+local Update = function(self, ...)
+	UNIT_POWER(self, ...)
+	return UPDATE_VISIBILITY(self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Update(element.__owner, 'ForceUpdate')
+end
+
+local Enable = function(self, unit)
+	local druidmana = self.DruidAltMana
+	if(druidmana and unit == 'player') then
+		druidmana.__owner = self
+		druidmana.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('UNIT_POWER', UNIT_POWER)
+		self:RegisterEvent('UNIT_MAXPOWER', UNIT_POWER)
+		self:RegisterEvent('UPDATE_SHAPESHIFT_FORM', UPDATE_VISIBILITY)
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local druidmana = self.DruidAltMana
+	if(druidmana) then
+		self:UnregisterEvent('UNIT_POWER', UNIT_POWER)
+		self:UnregisterEvent('UNIT_MAXPOWER', UNIT_POWER)
+		self:UnregisterEvent('UPDATE_SHAPESHIFT_FORM', UPDATE_VISIBILITY)
+	end
+end
+
+oUF:AddElement("DruidAltMana", Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_DruidMana/oUF_DruidMana.toc b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_DruidMana/oUF_DruidMana.toc
new file mode 100644
index 0000000..744e176
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_DruidMana/oUF_DruidMana.toc
@@ -0,0 +1,10 @@
+## Interface: 40100
+## Title: oUF Druid Mana
+## Notes: Adds Druid Mana Bar to oUF.
+## Author: SV
+## Version: 1.0
+## X-Category: UnitFrame
+## Dependencies: oUF
+
+oUF_DruidMana.lua
+
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_DrunkenMaster/oUF_DrunkenMaster.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_DrunkenMaster/oUF_DrunkenMaster.lua
new file mode 100644
index 0000000..d4b8950
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_DrunkenMaster/oUF_DrunkenMaster.lua
@@ -0,0 +1,183 @@
+if select(2, UnitClass('player')) ~= "MONK" then return end
+
+local parent, ns = ...
+local oUF = ns.oUF
+local floor = math.floor;
+local DM_L = {};
+
+if GetLocale() == "enUS" then
+	DM_L["Stagger"] = "Stagger"
+	DM_L["Light Stagger"] = "Light Stagger"
+	DM_L["Moderate Stagger"] = "Moderate Stagger"
+	DM_L["Heavy Stagger"] = "Heavy Stagger"
+
+elseif GetLocale() == "frFR" then
+	DM_L["Stagger"] = "Report"
+	DM_L["Light Stagger"] = "Report mineur"
+	DM_L["Moderate Stagger"] = "Report mod??"
+	DM_L["Heavy Stagger"] = "Report majeur"
+
+elseif GetLocale() == "itIT" then
+	DM_L["Stagger"] = "Noncuranza"
+	DM_L["Light Stagger"] = "Noncuranza Parziale"
+	DM_L["Moderate Stagger"] = "Noncuranza Moderata"
+	DM_L["Heavy Stagger"] = "Noncuranza Totale"
+
+elseif GetLocale() == "deDE" then
+	DM_L["Stagger"] = "Staffelung"
+	DM_L["Light Stagger"] = "Leichte Staffelung"
+	DM_L["Moderate Stagger"] = "Moderate Staffelung"
+	DM_L["Heavy Stagger"] = "Schwere Staffelung"
+
+elseif GetLocale() == "zhCN" then
+	DM_L["Stagger"] = "醉拳"
+	DM_L["Light Stagger"] = "轻度醉拳"
+	DM_L["Moderate Stagger"] = "中度醉拳"
+	DM_L["Heavy Stagger"] = "重度醉拳"
+
+elseif GetLocale() == "ruRU" then
+	DM_L["Stagger"] = "Пошатывание"
+	DM_L["Light Stagger"] = "Легкое пошатывание"
+	DM_L["Moderate Stagger"] = "Умеренное пошатывание"
+	DM_L["Heavy Stagger"] = "Сильное пошатывание"
+
+else
+	DM_L["Stagger"] = "Stagger"
+	DM_L["Light Stagger"] = "Light Stagger"
+	DM_L["Moderate Stagger"] = "Moderate Stagger"
+	DM_L["Heavy Stagger"] = "Heavy Stagger"
+end
+
+local STANCE_OF_THE_STURY_OX_ID = 23
+
+local UnitHealthMax = UnitHealthMax
+local UnitStagger = UnitStagger
+local BREW_COLORS = {
+	[124275] = {0, 1, 0, 1}, -- Light
+	[124274] = {1, 0.5, 0, 1}, -- Moderate
+	[124273] = {1, 0, 0, 1}, -- Heavy
+};
+local STAGGER_COLORS = {
+	[124275] = {0.2, 0.8, 0.2, 1}, -- Light
+	[124274] = {1.0, 0.8, 0.2, 1}, -- Moderate
+	[124273] = {1.0, 0.4, 0.2, 1}, -- Heavy
+};
+local staggerColor = {1, 1, 1, 0.5};
+local brewColor = {0.91, 0.75, 0.25, 0.5};
+
+local function ScanForDrunkenMaster()
+	local name, _, icon, _, _, duration, _, _, _, _, spellID, _, _, value2, value1 = UnitAura("player", DM_L["Light Stagger"], "", "HARMFUL")
+	if (not name) then
+		name, _, icon, _, _, duration, _, _, _, _, spellID, _, _, value2, value1 = UnitAura("player", DM_L["Moderate Stagger"], "", "HARMFUL")
+		if (not name) then
+			name, _, icon, _, _, duration, _, _, _, _, spellID, _, _, value2, value1 = UnitAura("player", DM_L["Heavy Stagger"], "", "HARMFUL")
+		end
+	end
+	if (spellID) then
+		staggerColor = STAGGER_COLORS[spellID]
+		brewColor = STAGGER_COLORS[spellID]
+	else
+		staggerColor = {1, 1, 1, 0.5}
+		brewColor = {0.91, 0.75, 0.25, 0.5}
+	end
+	if(value1 and (value1 > 0) and duration) then
+		return (value1 * floor(duration))
+	else
+		return 0
+	end
+end
+
+local Update = function(self, event, unit)
+	if unit and unit ~= self.unit then return; end
+	local staggerTotal = ScanForDrunkenMaster()
+
+	local stagger = self.DrunkenMaster
+
+	if(stagger.PreUpdate) then
+		stagger:PreUpdate()
+	end
+
+	local maxHealth = UnitHealthMax("player")
+	local staggerPercent = staggerTotal / maxHealth
+	local currentStagger = floor(staggerPercent * 100)
+
+	stagger:SetMinMaxValues(0, 50)
+	stagger:SetStatusBarColor(unpack(brewColor))
+	if currentStagger <= 50 then
+		stagger:SetValue(currentStagger)
+	else
+		stagger:SetValue(50)
+	end
+
+	local icon = stagger.icon
+	if(icon) then
+		icon:SetVertexColor(unpack(staggerColor))
+	end
+
+	if(stagger.PostUpdate) then
+		stagger:PostUpdate(maxHealth, currentStagger, staggerPercent)
+	end
+end
+
+local Visibility = function(self, event, unit)
+	if(STANCE_OF_THE_STURY_OX_ID ~= GetShapeshiftFormID() or UnitHasVehiclePlayerFrameUI("player")) then
+		if self.DrunkenMaster:IsShown() then
+			self.DrunkenMaster:Hide()
+			self:UnregisterEvent('UNIT_AURA', Update)
+		end
+	else
+		self.DrunkenMaster:Show()
+		self:RegisterEvent('UNIT_AURA', Update)
+		return Update(self, event, unit)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.DrunkenMaster.Override or Visibility)(self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, "ForceUpdate", element.__owner.unit)
+end
+
+local function Enable(self, unit)
+	if(unit ~= 'player') then return end
+	local element = self.DrunkenMaster
+	if(element) then
+		element.__owner = self
+		element.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('UNIT_DISPLAYPOWER', Path)
+		self:RegisterEvent('UPDATE_SHAPESHIFT_FORM', Path)
+
+		if(element:IsObjectType'StatusBar' and not element:GetStatusBarTexture()) then
+			element:SetStatusBarTexture(0.91, 0.75, 0.25)
+		end
+
+		MonkStaggerBar.Hide = MonkStaggerBar.Show
+		MonkStaggerBar:UnregisterEvent'PLAYER_ENTERING_WORLD'
+		MonkStaggerBar:UnregisterEvent'PLAYER_SPECIALIZATION_CHANGED'
+		MonkStaggerBar:UnregisterEvent'UNIT_DISPLAYPOWER'
+		MonkStaggerBar:UnregisterEvent'UPDATE_VEHICLE_ACTION_BAR'
+		return true
+	end
+end
+
+local function Disable(self)
+	local element = self.DrunkenMaster
+	if(element) then
+		element:Hide()
+		self:UnregisterEvent('UNIT_AURA', Update)
+		self:UnregisterEvent('UNIT_DISPLAYPOWER', Path)
+		self:UnregisterEvent('UPDATE_SHAPESHIFT_FORM', Path)
+
+		MonkStaggerBar.Show = nil
+		MonkStaggerBar:Show()
+		MonkStaggerBar:UnregisterEvent'PLAYER_ENTERING_WORLD'
+		MonkStaggerBar:UnregisterEvent'PLAYER_SPECIALIZATION_CHANGED'
+		MonkStaggerBar:UnregisterEvent'UNIT_DISPLAYPOWER'
+		MonkStaggerBar:UnregisterEvent'UPDATE_VEHICLE_ACTION_BAR'
+	end
+end
+
+oUF:AddElement("DrunkenMaster", Path, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Experience/oUF_Experience.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Experience/oUF_Experience.lua
new file mode 100644
index 0000000..2c5573a
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Experience/oUF_Experience.lua
@@ -0,0 +1,103 @@
+local __, ns = ...
+local oUF = ns.oUF or oUF
+assert(oUF, 'oUF Experience was unable to locate oUF install')
+
+for tag, func in pairs({
+	['curxp'] = function(unit)
+		return UnitXP(unit)
+	end,
+	['maxxp'] = function(unit)
+		return UnitXPMax(unit)
+	end,
+	['perxp'] = function(unit)
+		return math.floor(UnitXP(unit) / UnitXPMax(unit) * 100 + 0.5)
+	end,
+	['currested'] = function()
+		return GetXPExhaustion()
+	end,
+	['perrested'] = function(unit)
+		local rested = GetXPExhaustion()
+		if(rested and rested > 0) then
+			return math.floor(rested / UnitXPMax(unit) * 100 + 0.5)
+		end
+	end,
+}) do
+	oUF.Tags.Methods[tag] = func
+	oUF.Tags.Events[tag] = 'PLAYER_XP_UPDATE PLAYER_LEVEL_UP UPDATE_EXHAUSTION'
+end
+
+local function Update(self, event, unit)
+	if(self.unit ~= unit) then return end
+
+	local experience = self.Experience
+	if(experience.PreUpdate) then experience:PreUpdate(unit) end
+
+	if(UnitLevel(unit) == MAX_PLAYER_LEVEL or UnitHasVehicleUI('player')) then
+		return experience:Hide()
+	else
+		experience:Show()
+	end
+
+	local min, max = UnitXP(unit), UnitXPMax(unit)
+	experience:SetMinMaxValues(0, max)
+	experience:SetValue(min)
+
+	if(experience.Rested) then
+		local exhaustion = GetXPExhaustion() or 0
+		experience.Rested:SetMinMaxValues(0, max)
+		experience.Rested:SetValue(math.min(min + exhaustion, max))
+	end
+
+	if(experience.PostUpdate) then
+		return experience:PostUpdate(unit, min, max)
+	end
+end
+
+local function Path(self, ...)
+	return (self.Experience.Override or Update) (self, ...)
+end
+
+local function ForceUpdate(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+local function Enable(self, unit)
+	local experience = self.Experience
+	if(experience) then
+		experience.__owner = self
+		experience.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('PLAYER_XP_UPDATE', Path)
+		self:RegisterEvent('PLAYER_LEVEL_UP', Path)
+
+		local rested = experience.Rested
+		if(rested) then
+			self:RegisterEvent('UPDATE_EXHAUSTION', Path)
+			rested:SetFrameLevel(experience:GetFrameLevel() - 1)
+
+			if(not rested:GetStatusBarTexture()) then
+				rested:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
+			end
+		end
+
+		if(not experience:GetStatusBarTexture()) then
+			experience:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
+		end
+
+		return true
+	end
+end
+
+local function Disable(self)
+	local experience = self.Experience
+	if(experience) then
+		self:UnregisterEvent('PLAYER_XP_UPDATE', Path)
+		self:UnregisterEvent('PLAYER_LEVEL_UP', Path)
+
+		if(experience.Rested) then
+			self:UnregisterEvent('UPDATE_EXHAUSTION', Path)
+		end
+	end
+end
+
+oUF:AddElement('Experience', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Experience/oUF_Experience.toc b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Experience/oUF_Experience.toc
new file mode 100644
index 0000000..003d7cf
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Experience/oUF_Experience.toc
@@ -0,0 +1,8 @@
+## Interface: 50001
+## Author: p3lim
+## Version: 50001.12-Release
+## Title: oUF Experience
+## Notes: Experience Bar support for oUF layouts.
+## RequiredDeps: oUF
+
+oUF_Experience.lua
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Friendship/oUF_Friendship.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Friendship/oUF_Friendship.lua
new file mode 100644
index 0000000..f381dd2
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Friendship/oUF_Friendship.lua
@@ -0,0 +1,142 @@
+local _, ns = ...
+local oUF = ns.oUF or oUF
+assert(oUF, 'oUF Friendship was unable to locate oUF install')
+
+--[[
+ If you find an npc with reputation that is not shown,
+ please let me (p3lim) know by PM/comment on the download site.
+ The list is currently generated with the following:
+
+ for index = 1100, 1500 do
+	if(GetFriendshipReputation(index)) then
+		friendships[GetFactionInfoByID(index)] = index
+	end
+ end
+--]]
+local friendships = {
+	[GetFactionInfoByID(1273)] = 1273,
+	[GetFactionInfoByID(1275)] = 1275,
+	[GetFactionInfoByID(1276)] = 1276,
+	[GetFactionInfoByID(1277)] = 1277,
+	[GetFactionInfoByID(1278)] = 1278,
+	[GetFactionInfoByID(1279)] = 1279,
+	[GetFactionInfoByID(1280)] = 1280,
+	[GetFactionInfoByID(1281)] = 1281,
+	[GetFactionInfoByID(1282)] = 1282,
+	[GetFactionInfoByID(1283)] = 1283,
+	-- [GetFactionInfoByID(1357)] = 1357,
+	[GetFactionInfoByID(1358)] = 1358,
+}
+
+local function GetFriendshipID()
+	if(not UnitExists('target')) then return end
+	if(UnitIsPlayer('target')) then return end
+
+	return friendships[UnitName('target')]
+end
+
+for tag, func in pairs({
+	['curfriendship'] = function()
+		local id = GetFriendshipID()
+		if(id) then
+			local _, cur, _, name, details, _, standing, threshold, maximum = GetFriendshipReputation(id)
+			return cur - threshold
+		end
+	end,
+	['currawfriendship'] = function()
+		local id = GetFriendshipID()
+		if(id) then
+			local _, cur = GetFriendshipReputation(id)
+			return cur
+		end
+	end,
+	['perfriendship'] = function()
+		local id = GetFriendshipID()
+		if(id) then
+			local _, cur, _, name, details, _, standing, threshold, maximum = GetFriendshipReputation(id)
+			return math.floor((cur - threshold) / 8400 * 100)
+		end
+	end,
+	['perfullfriendship'] = function()
+		local id = GetFriendshipID()
+		if(id) then
+			local _, cur = GetFriendshipReputation(id)
+			return math.floor(cur / 42999 * 100)
+		end
+	end,
+	['friendshipstanding'] = function()
+		local id = GetFriendshipID()
+		if(id) then
+			local _, cur, _, name, details, _, standing, threshold, maximum = GetFriendshipReputation(id)
+			return standing
+		end
+	end,
+}) do
+	oUF.Tags.Methods[tag] = func
+	oUF.Tags.Events[tag] = 'PLAYER_TARGET_CHANGED'
+end
+
+local function OnEnter(self)
+	local _, cur, _, name, details, _, standing, threshold, maximum = GetFriendshipReputation(GetFriendshipID())
+	GameTooltip:SetOwner(self, 'ANCHOR_BOTTOMRIGHT')
+	GameTooltip:SetText(UnitName('target'), 1, 1, 1)
+	GameTooltip:AddLine(details, nil, nil, nil, true)
+	GameTooltip:AddLine((cur - threshold) .. ' / 8400 (' .. standing .. ')', 1, 1, 1, true)
+	GameTooltip:Show()
+end
+
+local function Update(self)
+	local friendship = self.Friendship
+
+	local id = GetFriendshipID()
+	if(id) then
+		local _, cur, _, name, details, _, standing, threshold, maximum = GetFriendshipReputation(id)
+		friendship:SetMinMaxValues(0, 8400)
+		friendship:SetValue(cur - threshold)
+		friendship:Show()
+	else
+		friendship:Hide()
+	end
+
+	if(friendship.PostUpdate) then
+		return friendship:PostUpdate(id)
+	end
+end
+
+local function Path(self, ...)
+	return (self.Friendship.Override or Update) (self, ...)
+end
+
+local function ForceUpdate(element)
+	return Path(element.__owner, 'ForceUpdate')
+end
+
+local function Enable(self, unit)
+	local friendship = self.Friendship
+	if(friendship) then
+		friendship.__owner = self
+		friendship.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('PLAYER_TARGET_CHANGED', Path)
+
+		if(friendship.Tooltip) then
+			friendship:EnableMouse(true)
+			friendship:HookScript('OnEnter', OnEnter)
+			friendship:HookScript('OnLeave', GameTooltip_Hide)
+		end
+
+		if(not friendship:GetStatusBarTexture()) then
+			friendship:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
+		end
+
+		return true
+	end
+end
+
+local function Disable(self)
+	if(self.Friendship) then
+		self:UnregisterEvent('PLAYER_TARGET_CHANGED', Path)
+	end
+end
+
+oUF:AddElement('Friendship', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Friendship/oUF_Friendship.toc b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Friendship/oUF_Friendship.toc
new file mode 100644
index 0000000..d4debe9
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Friendship/oUF_Friendship.toc
@@ -0,0 +1,8 @@
+## Interface: 50001
+## Author: p3lim
+## Version: 50001.3-Beta
+## Title: oUF Friendship
+## Notes: NPC Friendship Bar support for oUF layouts.
+## RequiredDeps: oUF
+
+oUF_Friendship.lua
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_HyperCombo/oUF_HyperCombo.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_HyperCombo/oUF_HyperCombo.lua
new file mode 100644
index 0000000..696ed53
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_HyperCombo/oUF_HyperCombo.lua
@@ -0,0 +1,197 @@
+local class = select(2, UnitClass("player"));
+if(class ~= "ROGUE" and class ~= "DRUID") then return end
+
+local parent, ns = ...
+local oUF = ns.oUF
+
+local GetComboPoints = GetComboPoints
+local MAX_COMBO_POINTS = MAX_COMBO_POINTS
+local GUILE1 = GetSpellInfo(84745)
+local GUILE2 = GetSpellInfo(84746)
+local GUILE3 = GetSpellInfo(84747)
+local ANTICIPATION = GetSpellInfo(115189)
+local ALERTED = false
+local TextColors = {
+	[1]={1,0.1,0.1},
+	[2]={1,0.5,0.1},
+	[3]={1,1,0.1},
+	[4]={0.5,1,0.1},
+	[5]={0.1,1,0.1}
+};
+
+local function UpdateGuile()
+	local _, _, _, one = UnitBuff("player", GUILE1, nil, "HELPFUL")
+	local _, _, _, two = UnitBuff("player", GUILE2, nil, "HELPFUL")
+	local _, _, _, three = UnitBuff("player", GUILE3, nil, "HELPFUL")
+	if one or two or three then
+		if one then return 1; end
+		if two then return 2; end
+		if three then return 3; end
+	else
+		return 0;
+	end
+end
+
+local function FivePointsAlarm(frame, points)
+	if not CombatText_AddMessage then return end
+	if(points == 5 and not frame.ALERTED) then
+		CombatText_AddMessage("5 Points", CombatText_StandardScroll, 0.1, 0.5, 1, "crit")
+		frame.ALERTED = true
+	elseif(frame.ALERTED and points < 5) then
+		frame.ALERTED = false
+	end
+end
+
+local Update = function(self, event, unit)
+	if(unit == 'pet') then return end
+	local bar = self.HyperCombo;
+	local cpoints = bar.CPoints;
+	local tracker = bar.Tracking;
+
+	if(bar.PreUpdate) then
+		bar:PreUpdate()
+	end
+
+	local current = 0
+	if(UnitHasVehicleUI'player') then
+		current = GetComboPoints('vehicle', 'target')
+	else
+		current = GetComboPoints('player', 'target')
+	end
+
+	if(cpoints) then
+		for i=1, MAX_COMBO_POINTS do
+			if(i <= current) then
+				cpoints[i]:Show()
+				if(bar.PointShow) then
+					bar.PointShow(cpoints[i])
+				end
+			else
+				cpoints[i]:Hide()
+				if(bar.PointHide) then
+					bar.PointHide(cpoints[i])
+				end
+			end
+		end
+	end
+
+	if(class == "ROGUE") then
+		if(tracker) then
+			if(current > 0) then
+				tracker.Text:SetText(current)
+				tracker.Text:SetTextColor(unpack(TextColors[current]))
+				FivePointsAlarm(tracker, current)
+			elseif(bar.LAST_COMBO_POINTS > 0) then
+				tracker.Text:SetText(bar.LAST_COMBO_POINTS)
+				tracker.Text:SetTextColor(0.5,0.5,1)
+			else
+				tracker.Text:SetText("0")
+				tracker.Text:SetTextColor(0.3,0.3,0.3)
+			end
+		end
+
+		local anticipation = bar.Anticipation;
+		if(anticipation) then
+			local anti = select(4, UnitBuff("player", ANTICIPATION)) -- Anticipation stacks
+			if(anti and anti > 0) then
+				anticipation.Text:SetText(anti)
+				anticipation.Text:SetTextColor(unpack(TextColors[anti]))
+			else
+				anticipation.Text:SetText("")
+			end
+		end
+		local guile = bar.Guile;
+		if(guile) then
+			local insight = UpdateGuile()
+			if(insight and insight > 0) then
+				guile.Text:SetText(insight)
+				guile.Text:SetTextColor(unpack(TextColors[insight]))
+			else
+				guile.Text:SetText("")
+			end
+		end
+	else
+		if(tracker) then
+			if(GetShapeshiftForm() == 3) then
+				if(current > 0) then
+					tracker.Text:SetText(current)
+					tracker.Text:SetTextColor(unpack(TextColors[current]))
+					FivePointsAlarm(tracker, current)
+				elseif(bar.LAST_COMBO_POINTS > 0) then
+					tracker.Text:SetText(bar.LAST_COMBO_POINTS)
+					tracker.Text:SetTextColor(0.5,0.5,1)
+				else
+					tracker.Text:SetText("0")
+					tracker.Text:SetTextColor(0.3,0.3,0.3)
+				end
+			else
+				tracker.Text:SetText("")
+			end
+		end
+	end
+
+	if(bar.PostUpdate) then
+		return bar:PostUpdate(cp)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.HyperCombo.Override or Update) (self, ...)
+end
+
+local Tracker = function(self, ...)
+	local bar = self.HyperCombo
+	if(UnitHasVehicleUI'player') then
+		bar.LAST_COMBO_POINTS = GetComboPoints('vehicle', 'target')
+	else
+		bar.LAST_COMBO_POINTS = GetComboPoints('player', 'target')
+	end
+	return Path(self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+local Enable = function(self)
+	local bar = self.HyperCombo
+	if(bar) then
+		bar.__owner = self
+		bar.ForceUpdate = ForceUpdate
+		bar.EXISTING_COMBO_POINTS = 0
+		bar.LAST_COMBO_POINTS = 0
+
+		self:RegisterEvent('UNIT_COMBO_POINTS', Tracker, true)
+		self:RegisterEvent('PLAYER_TARGET_CHANGED', Path, true)
+		self:RegisterEvent('UNIT_AURA', Path, true)
+
+		local cpoints = bar.CPoints;
+		if(cpoints) then
+			for index = 1, MAX_COMBO_POINTS do
+				local cpoint = cpoints[index]
+				if(cpoint:IsObjectType'Texture' and not cpoint:GetTexture()) then
+					cpoint:SetTexture[[Interface\ComboFrame\ComboPoint]]
+					cpoint:SetTexCoord(0, 0.375, 0, 1)
+				end
+			end
+		end
+		return true
+	end
+end
+
+local Disable = function(self)
+	local bar = self.HyperCombo
+	if(bar) then
+		local cpoints = bar.CPoints;
+		if(cpoints) then
+			for index = 1, MAX_COMBO_POINTS do
+				cpoints[index]:Hide()
+			end
+		end
+		self:UnregisterEvent('UNIT_COMBO_POINTS', Tracker)
+		self:UnregisterEvent('PLAYER_TARGET_CHANGED', Path)
+		self:UnregisterEvent('UNIT_AURA', Path)
+	end
+end
+
+oUF:AddElement('HyperCombo', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_MainTank/oUF_MainTank.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_MainTank/oUF_MainTank.lua
new file mode 100644
index 0000000..51293af
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_MainTank/oUF_MainTank.lua
@@ -0,0 +1,58 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local Update = function(self, event)
+	local raidID = UnitInRaid(self.unit)
+	if(not raidID) then return end
+
+	local maintank = self.MainTank
+	if(maintank.PreUpdate) then
+		maintank:PreUpdate()
+	end
+
+	local _, _, _, _, _, _, _, _, _, rinfo = GetRaidRosterInfo(raidID)
+	if(rinfo == 'MAINTANK' and not UnitHasVehicleUI(self.unit)) then
+		self.MainTank:Show()
+	else
+		self.MainTank:Hide()
+	end
+
+	if(maintank.PostUpdate) then
+		return maintank:PostUpdate(rinfo)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.MainTank.Override or Update)(self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate')
+end
+
+local Enable = function(self)
+	local mt = self.MainTank
+
+	if(mt) then
+		mt.__owner = self
+		mt.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('GROUP_ROSTER_UPDATE', Path, true)
+
+		if(mt:IsObjectType'Texture' and not mt:GetTexture()) then
+			mt:SetTexture[[Interface\GROUPFRAME\UI-GROUP-MAINTANKICON]]
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local mt = self.MainTank
+
+	if (mt) then
+		self:UnregisterEvent('GROUP_ROSTER_UPDATE', Path)
+	end
+end
+
+oUF:AddElement('MainTank', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_MonkHarmony/oUF_MonkHarmony.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_MonkHarmony/oUF_MonkHarmony.lua
new file mode 100644
index 0000000..f5874c6
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_MonkHarmony/oUF_MonkHarmony.lua
@@ -0,0 +1,85 @@
+if select(2, UnitClass('player')) ~= "MONK" then return end
+
+local _, ns = ...
+local oUF = ns.oUF or oUF
+
+local SPELL_POWER_CHI = SPELL_POWER_CHI
+
+oUF.colors.MonkHarmony = {
+	[1] = {.57, .63, .35, 1},
+	[2] = {.47, .63, .35, 1},
+	[3] = {.37, .63, .35, 1},
+	[4] = {.27, .63, .33, 1},
+	[5] = {.17, .63, .33, 1},
+}
+
+local function Update(self, event, unit)
+	local hb = self.MonkHarmony
+	if(hb.PreUpdate) then hb:PreUpdate(event) end
+	local light = UnitPower("player", SPELL_POWER_CHI)
+
+	-- if max light changed, show/hide the 5th and update anchors
+	local numPoints = UnitPowerMax("player", SPELL_POWER_CHI)
+
+	for i = 1, numPoints do
+		if i <= light then
+			hb[i]:Show()
+		else
+			hb[i]:Hide()
+		end
+	end
+
+	if UnitHasVehicleUI("player") then
+		hb:Hide()
+	else
+		hb:Show()
+	end
+
+	if hb.numPoints ~= numPoints then
+		if numPoints == 4 then
+			hb[5]:Hide()
+		else
+			hb[5]:Show()
+		end
+	end
+
+	hb.numPoints = numPoints
+
+	if(hb.PostUpdate) then hb:PostUpdate(event) end
+end
+
+local function Enable(self, unit)
+	if(unit ~= 'player') then return end
+	local hb = self.MonkHarmony
+	if hb then
+		self:RegisterEvent("PLAYER_ENTERING_WORLD", Update)
+		self:RegisterEvent("UNIT_POWER", Update)
+		self:RegisterEvent("UNIT_DISPLAYPOWER", Update)
+		self:RegisterEvent("PLAYER_LEVEL_UP", Update)
+
+		for i = 1, 5 do
+			if not hb[i]:GetStatusBarTexture() then
+				hb[i]:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
+			end
+
+			hb[i]:SetStatusBarColor(unpack(oUF.colors.MonkHarmony[i]))
+			hb[i]:SetFrameLevel(hb:GetFrameLevel() + 1)
+			hb[i]:GetStatusBarTexture():SetHorizTile(false)
+		end
+
+		hb.numPoints = 5
+
+		return true
+	end
+end
+
+local function Disable(self)
+	if self.MonkHarmony then
+		self:UnregisterEvent("PLAYER_ENTERING_WORLD", Update)
+		self:UnregisterEvent("UNIT_POWER", Update)
+		self:UnregisterEvent("UNIT_DISPLAYPOWER", Update)
+		self:UnregisterEvent("PLAYER_LEVEL_UP", Update)
+	end
+end
+
+oUF:AddElement('MonkHarmony', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_PallyPower/oUF_PallyPower.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_PallyPower/oUF_PallyPower.lua
new file mode 100644
index 0000000..f6867c2
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_PallyPower/oUF_PallyPower.lua
@@ -0,0 +1,58 @@
+if(select(2, UnitClass('player')) ~= 'PALADIN') then return end
+
+local parent, ns = ...
+local oUF = ns.oUF
+
+local SPELL_POWER_HOLY_POWER = SPELL_POWER_HOLY_POWER
+local MAX_HOLY_POWER = MAX_HOLY_POWER
+
+local Update = function(self, event, unit, powerType)
+	if(self.unit ~= unit or (powerType and powerType ~= 'HOLY_POWER')) then return end
+
+	local hp = self.HolyPower
+	if(hp.PreUpdate) then hp:PreUpdate() end
+
+	local num = UnitPower('player', SPELL_POWER_HOLY_POWER)
+	local MAX_HOLY_POWER = UnitPowerMax('player', SPELL_POWER_HOLY_POWER);
+	for i = 1, MAX_HOLY_POWER do
+		if(i <= num) then
+			hp[i]:Show()
+		else
+			hp[i]:Hide()
+		end
+	end
+
+	if(hp.PostUpdate) then
+		return hp:PostUpdate(num)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.HolyPower.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit, 'HOLY_POWER')
+end
+
+local function Enable(self, unit)
+	if(unit ~= 'player') then return end
+	local hp = self.HolyPower
+	if(hp) then
+		hp.__owner = self
+		hp.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('UNIT_POWER', Path)
+
+		return true
+	end
+end
+
+local function Disable(self)
+	local hp = self.HolyPower
+	if(hp) then
+		self:UnregisterEvent('UNIT_POWER', Path)
+	end
+end
+
+oUF:AddElement('HolyPower', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_PriestOrbs/oUF_PriestOrbs.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_PriestOrbs/oUF_PriestOrbs.lua
new file mode 100644
index 0000000..677639e
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_PriestOrbs/oUF_PriestOrbs.lua
@@ -0,0 +1,118 @@
+if select(2, UnitClass('player')) ~= "PRIEST" then return end
+
+local _, ns = ...
+local oUF = ns.oUF or oUF
+
+local SPEC_PRIEST_DISC = 1
+local SPEC_PRIEST_HOLY = 2
+local SPEC_PRIEST_SHADOW = 3
+
+local SHADOW_ORBS_SHOW_LEVEL = SHADOW_ORBS_SHOW_LEVEL
+local HOLY_ORBS_SHOW_LEVEL = 44
+local DISC_ORBS_SHOW_LEVEL = 44
+
+local EVANGELISM = GetSpellInfo(81662) or GetSpellInfo(81661) or GetSpellInfo(81660)
+local DARK_EVANGELISM = GetSpellInfo(87118) or GetSpellInfo(87117)
+local SERENDIPITY = GetSpellInfo(63733)
+
+local OrbColors = {
+	[1] = {1, 1, 0},
+	[2] = {0.1, 0.4, 1},
+	[3] = {0.6, 0.06, 1}
+};
+
+local function Update(self, event, unit)
+	local pb = self.PriestOrbs
+
+	local numOrbs, invalid = 0, false
+	local spec = GetSpecialization()
+	local level = UnitLevel("player")
+	local color = OrbColors[spec]
+	local name, _, icon, count
+	if(spec == SPEC_PRIEST_SHADOW and level >= SHADOW_ORBS_SHOW_LEVEL) then
+		numOrbs = UnitPower("player", SPELL_POWER_SHADOW_ORBS)
+		pb:Show()
+	elseif(spec == SPEC_PRIEST_DISC and level >= DISC_ORBS_SHOW_LEVEL) then
+		name, _, icon, count = UnitBuff("player", EVANGELISM)
+		numOrbs = count or 0
+		pb:Show()
+	elseif(spec == SPEC_PRIEST_HOLY and level >= HOLY_ORBS_SHOW_LEVEL) then
+		name, _, icon, count = UnitBuff("player", SERENDIPITY)
+		numOrbs = count or 0
+		pb:Show()
+	else
+		invalid = true;
+		pb:Hide()
+	end
+
+	if(not invalid) then
+		if(pb.PreUpdate) then
+			pb:PreUpdate(spec)
+		end
+
+		for i = 1, 5 do
+			pb[i]:SetStatusBarColor(unpack(color))
+			if i <= numOrbs then
+				pb[i]:Show()
+			else
+				pb[i]:Hide()
+			end
+		end
+		self:RegisterEvent("UNIT_DISPLAYPOWER", Update)
+		self:RegisterEvent("UNIT_POWER_FREQUENT", Update)
+		self:RegisterEvent("UNIT_AURA", Update)
+
+		if(pb.PostUpdate) then
+			pb:PostUpdate(spec)
+		end
+	else
+		for i = 1, 5 do
+			pb[i]:Hide()
+		end
+		self:UnregisterEvent("UNIT_DISPLAYPOWER", Update)
+		self:UnregisterEvent("UNIT_POWER_FREQUENT", Update)
+		self:UnregisterEvent("UNIT_AURA", Update)
+	end
+end
+
+local ForceUpdate = function(element)
+	return Update(element.__owner, "ForceUpdate")
+end
+
+local function Enable(self, unit)
+	if(unit ~= 'player') then return end
+	local pb = self.PriestOrbs
+	if pb then
+		pb.__owner = self
+		pb.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent("PLAYER_LEVEL_UP", Update)
+		self:RegisterEvent("PLAYER_TALENT_UPDATE", Update)
+		self:RegisterEvent("UNIT_DISPLAYPOWER", Update)
+		self:RegisterEvent("UNIT_POWER_FREQUENT", Update)
+		self:RegisterEvent("UNIT_AURA", Update)
+
+		for i = 1, 5 do
+			if not pb[i]:GetStatusBarTexture() then
+				pb[i]:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
+			end
+
+			pb[i]:SetFrameLevel(pb:GetFrameLevel() + 1)
+			pb[i]:GetStatusBarTexture():SetHorizTile(false)
+		end
+
+		return true
+	end
+end
+
+local function Disable(self)
+	if self.PriestOrbs then
+		self:UnregisterEvent("PLAYER_LEVEL_UP", Update)
+		self:UnregisterEvent("PLAYER_TALENT_UPDATE", Update)
+		self:UnregisterEvent("UNIT_DISPLAYPOWER", Update)
+		self:UnregisterEvent("UNIT_POWER_FREQUENT", Update)
+		self:UnregisterEvent("UNIT_AURA", Update)
+	end
+end
+
+oUF:AddElement('PriestOrbs', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.lua
new file mode 100644
index 0000000..4564487
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.lua
@@ -0,0 +1,315 @@
+local _, ns = ...
+local oUF = ns.oUF or oUF
+
+local SymbiosisName = GetSpellInfo(110309)
+local CleanseName = GetSpellInfo(4987)
+
+local addon = {}
+ns.oUF_RaidDebuffs = addon
+oUF_RaidDebuffs = ns.oUF_RaidDebuffs
+if not _G.oUF_RaidDebuffs then
+	_G.oUF_RaidDebuffs = addon
+end
+
+local debuff_data = {}
+addon.DebuffData = debuff_data
+
+
+addon.ShowDispelableDebuff = true
+addon.FilterDispellableDebuff = true
+addon.MatchBySpellName = true
+
+
+addon.priority = 10
+
+local function add(spell, priority)
+	if addon.MatchBySpellName and type(spell) == 'number' then
+		spell = GetSpellInfo(spell)
+	end
+
+	debuff_data[spell] = addon.priority + priority
+end
+
+function addon:RegisterDebuffs(t)
+	for spell, value in pairs(t) do
+		if type(t[spell]) == 'boolean' then
+			local oldValue = t[spell]
+			t[spell] = {
+				['enable'] = oldValue,
+				['priority'] = 0
+			}
+		else
+			if t[spell].enable then
+				add(spell, t[spell].priority)
+			end
+		end
+	end
+end
+
+function addon:ResetDebuffData()
+	wipe(debuff_data)
+end
+
+local DispellColor = {
+	['Magic']	= {.2, .6, 1},
+	['Curse']	= {.6, 0, 1},
+	['Disease']	= {.6, .4, 0},
+	['Poison']	= {0, .6, 0},
+	['none'] = { .23, .23, .23},
+}
+
+local DispellPriority = {
+	['Magic']	= 4,
+	['Curse']	= 3,
+	['Disease']	= 2,
+	['Poison']	= 1,
+}
+
+local DispellFilter
+do
+	local dispellClasses = {
+		['PRIEST'] = {
+			['Magic'] = true,
+			['Disease'] = true,
+		},
+		['SHAMAN'] = {
+			['Magic'] = false,
+			['Curse'] = true,
+		},
+		['PALADIN'] = {
+			['Poison'] = true,
+			['Magic'] = false,
+			['Disease'] = true,
+		},
+		['MAGE'] = {
+			['Curse'] = true,
+		},
+		['DRUID'] = {
+			['Magic'] = false,
+			['Curse'] = true,
+			['Poison'] = true,
+			['Disease'] = false,
+		},
+		['MONK'] = {
+			['Magic'] = false,
+			['Disease'] = true,
+			['Poison'] = true,
+		},
+	}
+
+	DispellFilter = dispellClasses[select(2, UnitClass('player'))] or {}
+end
+
+local function CheckTalentTree(tree)
+	local activeGroup = GetActiveSpecGroup()
+	if activeGroup and GetSpecialization(false, false, activeGroup) then
+		return tree == GetSpecialization(false, false, activeGroup)
+	end
+end
+
+local playerClass = select(2, UnitClass('player'))
+local function CheckSpec(self, event, levels)
+	-- Not interested in gained points from leveling
+	if event == "CHARACTER_POINTS_CHANGED" and levels > 0 then return end
+
+	--Check for certain talents to see if we can dispel magic or not
+	if playerClass == "PRIEST" then
+		if CheckTalentTree(3) then
+			DispellFilter.Disease = false
+		else
+			DispellFilter.Disease = true
+		end
+	elseif playerClass == "PALADIN" then
+		if CheckTalentTree(1) then
+			DispellFilter.Magic = true
+		else
+			DispellFilter.Magic = false
+		end
+	elseif playerClass == "SHAMAN" then
+		if CheckTalentTree(3) then
+			DispellFilter.Magic = true
+		else
+			DispellFilter.Magic = false
+		end
+	elseif playerClass == "DRUID" then
+		if CheckTalentTree(4) then
+			DispellFilter.Magic = true
+		else
+			DispellFilter.Magic = false
+		end
+	elseif playerClass == "MONK" then
+		if CheckTalentTree(2) then
+			DispellFilter.Magic = true
+		else
+			DispellFilter.Magic = false
+		end
+	end
+end
+
+local function CheckSymbiosis()
+	if GetSpellInfo(SymbiosisName) == CleanseName then
+		DispellFilter.Disease = true
+	else
+		DispellFilter.Disease = false
+	end
+end
+
+local function formatTime(s)
+	if s > 60 then
+		return format('%dm', s/60), s%60
+	elseif s < 1 then
+		return format("%.1f", s), s - floor(s)
+	else
+		return format('%d', s), s - floor(s)
+	end
+end
+
+local abs = math.abs
+local function OnUpdate(self, elapsed)
+	self.elapsed = (self.elapsed or 0) + elapsed
+	if self.elapsed >= 0.1 then
+		local timeLeft = self.endTime - GetTime()
+		if self.reverse then timeLeft = abs((self.endTime - GetTime()) - self.duration) end
+		if timeLeft > 0 then
+			local text = formatTime(timeLeft)
+			self.time:SetText(text)
+		else
+			self:SetScript('OnUpdate', nil)
+			self.time:Hide()
+		end
+		self.elapsed = 0
+	end
+end
+
+local function UpdateDebuff(self, name, icon, count, debuffType, duration, endTime, spellId)
+	local f = self.RaidDebuffs
+
+	if name then
+		f.icon:SetTexture(icon)
+		f.icon:Show()
+		f.duration = duration
+
+		if f.count then
+			if count and (count > 1) then
+				f.count:SetText(count)
+				f.count:Show()
+			else
+				f.count:SetText("")
+				f.count:Hide()
+			end
+		end
+
+		if f.time then
+			if duration and (duration > 0) then
+				f.endTime = endTime
+				f.nextUpdate = 0
+				f:SetScript('OnUpdate', OnUpdate)
+				f.time:Show()
+			else
+				f:SetScript('OnUpdate', nil)
+				f.time:Hide()
+			end
+		end
+
+		if f.cd then
+			if duration and (duration > 0) then
+				f.cd:SetCooldown(endTime - duration, duration)
+				f.cd:Show()
+			else
+				f.cd:Hide()
+			end
+		end
+
+		local c = DispellColor[debuffType] or DispellColor.none
+		f:SetBackdropBorderColor(c[1], c[2], c[3])
+
+		f:Show()
+	else
+		f:Hide()
+	end
+end
+
+local blackList = {
+	[105171] = true, -- Deep Corruption
+	[108220] = true, -- Deep Corruption
+	[116095] = true, -- Disable, Slow
+	[137637] = true, -- Warbringer, Slow
+}
+
+local function Update(self, event, unit)
+	if unit ~= self.unit then return end
+	local _name, _icon, _count, _dtype, _duration, _endTime, _spellId
+	local _priority, priority = 0, 0
+
+	--store if the unit its charmed, mind controlled units (Imperial Vizier Zor'lok: Convert)
+	local isCharmed = UnitIsCharmed(unit)
+
+	--store if we cand attack that unit, if its so the unit its hostile (Amber-Shaper Un'sok: Reshape Life)
+	local canAttack = UnitCanAttack("player", unit)
+
+	for i = 1, 40 do
+		local name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellId, canApplyAura, isBossDebuff = UnitAura(unit, i, 'HARMFUL')
+		if (not name) then break end
+
+		--we coudln't dispell if the unit its charmed, or its not friendly
+		if addon.ShowDispelableDebuff and debuffType and (not isCharmed) and (not canAttack) then
+
+			if addon.FilterDispellableDebuff then
+				DispellPriority[debuffType] = (DispellPriority[debuffType] or 0) + addon.priority --Make Dispell buffs on top of Boss Debuffs
+				priority = DispellFilter[debuffType] and DispellPriority[debuffType] or 0
+				if priority == 0 then
+					debuffType = nil
+				end
+			else
+				priority = DispellPriority[debuffType] or 0
+			end
+
+			if priority > _priority then
+				_priority, _name, _icon, _count, _dtype, _duration, _endTime, _spellId = priority, name, icon, count, debuffType, duration, expirationTime, spellId
+			end
+		end
+
+		priority = debuff_data[addon.MatchBySpellName and name or spellId]
+		if priority and not blackList[spellId] and (priority > _priority) then
+			_priority, _name, _icon, _count, _dtype, _duration, _endTime, _spellId = priority, name, icon, count, debuffType, duration, expirationTime, spellId
+		end
+	end
+
+	UpdateDebuff(self, _name, _icon, _count, _dtype, _duration, _endTime, _spellId)
+
+	--Reset the DispellPriority
+	DispellPriority = {
+		['Magic']	= 4,
+		['Curse']	= 3,
+		['Disease']	= 2,
+		['Poison']	= 1,
+	}
+end
+
+
+local function Enable(self)
+	if self.RaidDebuffs then
+		self:RegisterEvent('UNIT_AURA', Update)
+		return true
+	end
+	--Need to run these always
+	self:RegisterEvent("PLAYER_TALENT_UPDATE", CheckSpec)
+	self:RegisterEvent("CHARACTER_POINTS_CHANGED", CheckSpec)
+	if playerClass == "DRUID" then
+		self:RegisterEvent("SPELLS_CHANGED", CheckSymbiosis)
+	end
+end
+
+local function Disable(self)
+	if self.RaidDebuffs then
+		self:UnregisterEvent('UNIT_AURA', Update)
+		self.RaidDebuffs:Hide()
+	end
+	self:UnregisterEvent("PLAYER_TALENT_UPDATE", CheckSpec)
+	self:UnregisterEvent("CHARACTER_POINTS_CHANGED", CheckSpec)
+	if playerClass == "DRUID" then
+		self:UnregisterEvent("SPELLS_CHANGED", CheckSymbiosis)
+	end
+end
+
+oUF:AddElement('RaidDebuffs', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.toc b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.toc
new file mode 100644
index 0000000..e42f9df
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_RaidDebuffs/oUF_RaidDebuffs.toc
@@ -0,0 +1,7 @@
+## Interface: 30300
+## Title: oUF RaidDebuffs
+## Notes: Raid debuff mod for oUF
+## Version: 1.2
+## OptionalDeps: oUF
+
+oUF_RaidDebuffs.lua
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Reputation/oUF_Reputation.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Reputation/oUF_Reputation.lua
new file mode 100644
index 0000000..cbb3fa1
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Reputation/oUF_Reputation.lua
@@ -0,0 +1,85 @@
+local __, ns = ...
+local oUF = ns.oUF or oUF
+assert(oUF, 'oUF Reputation was unable to locate oUF install')
+
+for tag, func in pairs({
+	['currep'] = function()
+		local __, __, min, __, value = GetWatchedFactionInfo()
+		return value - min
+	end,
+	['maxrep'] = function()
+		local __, __, min, max = GetWatchedFactionInfo()
+		return max - min
+	end,
+	['perrep'] = function()
+		local __, __, min, max, value = GetWatchedFactionInfo()
+		return math.floor((value - min) / (max - min) * 100 + 0.5)
+	end,
+	['standing'] = function()
+		local __, standing = GetWatchedFactionInfo()
+		return GetText('FACTION_STANDING_LABEL' .. standing, UnitSex('player'))
+	end,
+	['reputation'] = function()
+		return GetWatchedFactionInfo()
+	end,
+}) do
+	oUF.Tags.Methods[tag] = func
+	oUF.Tags.Events[tag] = 'UPDATE_FACTION'
+end
+
+oUF.Tags.SharedEvents.UPDATE_FACTION = true
+
+local function Update(self, event, unit)
+	local reputation = self.Reputation
+
+	local name, standing, min, max, value = GetWatchedFactionInfo()
+	if(not name) then
+		return reputation:Hide()
+	else
+		reputation:Show()
+	end
+
+	reputation:SetMinMaxValues(0, max - min)
+	reputation:SetValue(value - min)
+
+	if(reputation.colorStanding) then
+		local color = FACTION_BAR_COLORS[standing]
+		reputation:SetStatusBarColor(color.r, color.g, color.b)
+	end
+
+	if(reputation.PostUpdate) then
+		return reputation:PostUpdate(unit, name, standing, min, max, value)
+	end
+end
+
+local function Path(self, ...)
+	return (self.Reputation.Override or Update) (self, ...)
+end
+
+local function ForceUpdate(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+local function Enable(self, unit)
+	local reputation = self.Reputation
+	if(reputation) then
+		reputation.__owner = self
+		reputation.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('UPDATE_FACTION', Path)
+
+		if(not reputation:GetStatusBarTexture()) then
+			reputation:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
+		end
+
+		return true
+	end
+end
+
+local function Disable(self)
+	if(self.Reputation) then
+		self:UnregisterEvent('UPDATE_FACTION', Path)
+	end
+end
+
+oUF:AddElement('Reputation', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Reputation/oUF_Reputation.toc b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Reputation/oUF_Reputation.toc
new file mode 100644
index 0000000..f01a953
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Reputation/oUF_Reputation.toc
@@ -0,0 +1,8 @@
+## Interface: 50001
+## Author: p3lim
+## Version: 50001.8-Release
+## Title: oUF Reputation
+## Notes: Reputation Bar support for oUF layouts.
+## RequiredDeps: oUF
+
+oUF_Reputation.lua
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Smooth/oUF_Smooth.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Smooth/oUF_Smooth.lua
new file mode 100644
index 0000000..67b59d0
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_Smooth/oUF_Smooth.lua
@@ -0,0 +1,64 @@
+local _, ns = ...
+local oUF = ns.oUF or oUF
+if not oUF then return end
+
+local smoothing = {}
+local function Smooth(self, value)
+	if value ~= self:GetValue() or value == 0 then
+		smoothing[self] = value
+	else
+		smoothing[self] = nil
+	end
+end
+
+local function SmoothBar(bar)
+	if not bar.SetValue_ then
+		bar.SetValue_ = bar.SetValue;
+		bar.SetValue = Smooth;
+	end
+end
+
+local function ResetBar(bar)
+	if bar.SetValue_ then
+		bar.SetValue = bar.SetValue_;
+		bar.SetValue_ = nil;
+	end
+end
+
+local function hook(frame)
+	if frame.Health then
+		SmoothBar(frame.Health)
+	end
+	if frame.Power then
+		SmoothBar(frame.Power)
+	end
+	if frame.AltPowerBar then
+		SmoothBar(frame.AltPowerBar)
+	end
+end
+
+for i, frame in ipairs(oUF.objects) do hook(frame) end
+oUF:RegisterInitCallback(hook)
+
+local f, min, max = CreateFrame('Frame'), math.min, math.max
+f:SetScript('OnUpdate', function()
+	local rate = GetFramerate()
+	local limit = 30/rate
+
+	for bar, value in pairs(smoothing) do
+		local cur = bar:GetValue()
+		local new = cur + min((value-cur)/3, max(value-cur, limit))
+		if new ~= new then
+			-- Mad hax to prevent QNAN.
+			new = value
+		end
+		bar:SetValue_(new)
+		if (cur == value or abs(new - value) < 2) and bar.Smooth then
+			bar:SetValue_(value)
+			smoothing[bar] = nil
+		elseif not bar.Smooth then
+			bar:SetValue_(value)
+			smoothing[bar] = nil
+		end
+	end
+end)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_TotemBars/oUF_TotemBars.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_TotemBars/oUF_TotemBars.lua
new file mode 100644
index 0000000..ccf7d29
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_TotemBars/oUF_TotemBars.lua
@@ -0,0 +1,124 @@
+local class = select(2, UnitClass('player'))
+if(class ~= 'SHAMAN') then return end
+
+local parent, ns = ...
+local oUF = ns.oUF
+
+oUF.colors.totems = {
+	[FIRE_TOTEM_SLOT] = { 181/255, 073/255, 033/255 },
+	[EARTH_TOTEM_SLOT] = { 074/255, 142/255, 041/255 },
+	[WATER_TOTEM_SLOT] = { 057/255, 146/255, 181/255 },
+	[AIR_TOTEM_SLOT] = { 132/255, 056/255, 231/255 }
+}
+
+local GetTotemInfo, GetTime = GetTotemInfo, GetTime
+local priorities = SHAMAN_TOTEM_PRIORITIES or STANDARD_TOTEM_PRIORITIES
+
+local Totem_OnEnter = function(self)
+	if(not self:IsVisible()) then return end
+	GameTooltip:SetOwner(self, 'ANCHOR_BOTTOMRIGHT')
+	GameTooltip:SetTotem(self:GetID())
+end
+
+local Totem_OnLeave = function()
+	GameTooltip:Hide()
+end
+
+local Totem_OnUpdate = function(self, elapsed)
+	if not self.expirationTime then return end
+	self.elapsed = (self.elapsed or 0) + elapsed
+	if self.elapsed >= 0.5 then
+		local timeLeft = self.expirationTime - GetTime()
+		if timeLeft > 0 then
+			self:SetValue(timeLeft)
+		else
+			self:SetScript("OnUpdate", nil)
+		end
+	end
+end
+
+local Update = function(self, event)
+	local totems = self.TotemBars
+	if(totems.PreUpdate) then totems:PreUpdate() end
+	local haveTotem, name, start, duration, icon, timeLeft
+	for i = 1, MAX_TOTEMS do
+		local totem = totems[priorities[i]]
+		if(totem) then
+			haveTotem, name, start, duration, icon = GetTotemInfo(i)
+			timeLeft = (start + duration) - GetTime()
+			totem:SetMinMaxValues(0,duration)
+
+			if(timeLeft > 0) then
+				totem.expirationTime = (start + duration)
+				totem:SetValue(timeLeft)
+				totem:SetScript('OnUpdate', UpdateBar)
+			else
+				totem:SetValue(0)
+				totem:SetScript('OnUpdate', nil)
+			end
+		end
+	end
+
+	if(totems.PostUpdate) then
+		return totems:PostUpdate()
+	end
+end
+
+local Path = function(self, ...)
+	return (self.TotemBars.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate')
+end
+
+local Enable = function(self)
+	local totems = self.TotemBars
+
+	if(totems) then
+		totems.__owner = self
+		totems.__map = { unpack(priorities) }
+		totems.ForceUpdate = ForceUpdate
+
+		for i = 1, MAX_TOTEMS do
+			local totem = totems[i]
+			totem:SetID(priorities[i])
+
+			if(totem:IsMouseEnabled()) then
+				totem:SetScript('OnEnter', Totem_OnEnter)
+				totem:SetScript('OnLeave', Totem_OnLeave)
+			end
+		end
+
+		self:RegisterEvent('PLAYER_TOTEM_UPDATE', Path, true)
+
+		TotemFrame.Show = TotemFrame.Hide
+		TotemFrame:Hide()
+
+		TotemFrame:UnregisterEvent("PLAYER_TOTEM_UPDATE")
+		TotemFrame:UnregisterEvent("PLAYER_ENTERING_WORLD")
+		TotemFrame:UnregisterEvent("UPDATE_SHAPESHIFT_FORM")
+		TotemFrame:UnregisterEvent("PLAYER_TALENT_UPDATE")
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	if(self.TotemBars) then
+		for i = 1, MAX_TOTEMS do
+			self.TotemBars[i]:Hide()
+		end
+		TotemFrame.Show = nil
+		TotemFrame:Show()
+
+		TotemFrame:RegisterEvent("PLAYER_TOTEM_UPDATE")
+		TotemFrame:RegisterEvent("PLAYER_ENTERING_WORLD")
+		TotemFrame:RegisterEvent("UPDATE_SHAPESHIFT_FORM")
+		TotemFrame:RegisterEvent("PLAYER_TALENT_UPDATE")
+
+		self:UnregisterEvent('PLAYER_TOTEM_UPDATE', Path)
+	end
+end
+
+oUF:AddElement("TotemBars", Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_WarlockShards/oUF_WarlockShards.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_WarlockShards/oUF_WarlockShards.lua
new file mode 100644
index 0000000..fd6ac91
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/Plugins/oUF_WarlockShards/oUF_WarlockShards.lua
@@ -0,0 +1,147 @@
+if select(2, UnitClass('player')) ~= "WARLOCK" then return end
+
+local _, ns = ...
+local oUF = ns.oUF or oUF
+
+assert(oUF, 'oUF_WarlockShards was unable to locate oUF install')
+
+local MAX_POWER_PER_EMBER = 10
+local SPELL_POWER_DEMONIC_FURY = SPELL_POWER_DEMONIC_FURY
+local SPELL_POWER_BURNING_EMBERS = SPELL_POWER_BURNING_EMBERS
+local SPELL_POWER_SOUL_SHARDS = SPELL_POWER_SOUL_SHARDS
+local SPEC_WARLOCK_DESTRUCTION = SPEC_WARLOCK_DESTRUCTION
+local SPEC_WARLOCK_AFFLICTION = SPEC_WARLOCK_AFFLICTION
+local SPEC_WARLOCK_DEMONOLOGY = SPEC_WARLOCK_DEMONOLOGY
+
+oUF.colors.WarlockShards = {
+	[1] = {100/255, 0/255, 255/255},
+	[2] = {180/255, 30/255, 255/255},
+	[3] = {255/255, 115/255, 10/255}
+}
+
+local Update = function(self, event, unit, powerType)
+	local wsb = self.WarlockShards
+	if(wsb.PreUpdate) then wsb:PreUpdate(unit) end
+
+	if UnitHasVehicleUI("player") then
+		wsb:Hide()
+	else
+		wsb:Show()
+	end
+
+	local spec = GetSpecialization()
+	if spec then
+		if not wsb:IsShown() then
+			wsb:Show()
+		end
+
+		for i = 1, 4 do
+			wsb[i]:Show()
+			wsb[i]:SetStatusBarColor(unpack(oUF.colors.WarlockShards[spec]))
+		end
+
+		if (spec == SPEC_WARLOCK_DESTRUCTION) then
+			local maxPower = UnitPowerMax("player", SPELL_POWER_BURNING_EMBERS, true)
+			local power = UnitPower("player", SPELL_POWER_BURNING_EMBERS, true)
+			local numEmbers = power / MAX_POWER_PER_EMBER
+			local numBars = floor(maxPower / MAX_POWER_PER_EMBER)
+			wsb.number = numBars
+
+			-- bar unavailable
+			if numBars == 3 then
+				wsb[4]:Hide()
+			else
+				wsb[4]:Show()
+			end
+
+			for i = 1, numBars do
+				wsb[i]:SetMinMaxValues((MAX_POWER_PER_EMBER * i) - MAX_POWER_PER_EMBER, MAX_POWER_PER_EMBER * i)
+				wsb[i]:SetValue(power)
+			end
+		elseif ( spec == SPEC_WARLOCK_AFFLICTION ) then
+			local numShards = UnitPower("player", SPELL_POWER_SOUL_SHARDS)
+			local maxShards = UnitPowerMax("player", SPELL_POWER_SOUL_SHARDS)
+			wsb.number = maxShards
+
+			-- bar unavailable
+			if maxShards == 3 then
+				wsb[4]:Hide()
+			else
+				wsb[4]:Show()
+			end
+
+			for i = 1, maxShards do
+				wsb[i]:SetMinMaxValues(0, 1)
+				if i <= numShards then
+					wsb[i]:SetValue(1)
+				else
+					wsb[i]:SetValue(0)
+				end
+			end
+		elseif spec == SPEC_WARLOCK_DEMONOLOGY then
+			local power = UnitPower("player", SPELL_POWER_DEMONIC_FURY)
+			local maxPower = UnitPowerMax("player", SPELL_POWER_DEMONIC_FURY)
+
+			wsb.number = 1
+			wsb[2]:Hide()
+			wsb[3]:Hide()
+			wsb[4]:Hide()
+
+			wsb[1]:SetMinMaxValues(0, maxPower)
+			wsb[1]:SetValue(power)
+		end
+	else
+		if wsb:IsShown() then
+			wsb:Hide()
+		end
+	end
+
+	if(wsb.PostUpdate) then
+		return wsb:PostUpdate(unit, spec)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.WarlockShards.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit, 'SOUL_SHARDS')
+end
+
+local function Enable(self, unit)
+	if(unit ~= 'player') then return end
+
+	local wsb = self.WarlockShards
+	if(wsb) then
+		wsb.__owner = self
+		wsb.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('UNIT_POWER', Path)
+		self:RegisterEvent("PLAYER_TALENT_UPDATE", Path)
+
+		for i = 1, 4 do
+			if not wsb[i]:GetStatusBarTexture() then
+				Point:SetStatusBarTexture([=[Interface\TargetingFrame\UI-StatusBar]=])
+			end
+
+			wsb[i]:SetFrameLevel(wsb:GetFrameLevel() + 1)
+			wsb[i]:GetStatusBarTexture():SetHorizTile(false)
+		end
+
+		wsb.number = 4
+
+		return true
+	end
+end
+
+local function Disable(self)
+	local wsb = self.WarlockShards
+	if(wsb) then
+		self:UnregisterEvent('UNIT_POWER', Path)
+		self:UnregisterEvent("PLAYER_TALENT_UPDATE", Path)
+		wsb:Hide()
+	end
+end
+
+oUF:AddElement('WarlockShards', Path, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/LICENSE b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/LICENSE
new file mode 100644
index 0000000..f67ac68
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2006-2012 Trond A Ekseth <troeks@gmail.com>
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/blizzard.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/blizzard.lua
new file mode 100644
index 0000000..9da0ae4
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/blizzard.lua
@@ -0,0 +1,101 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local hiddenParent = CreateFrame("Frame")
+hiddenParent:Hide()
+
+local HandleFrame = function(baseName)
+	local frame
+	if(type(baseName) == 'string') then
+		frame = _G[baseName]
+	else
+		frame = baseName
+	end
+
+	if(frame) then
+		frame:UnregisterAllEvents()
+		frame:Hide()
+
+		-- Keep frame hidden without causing taint
+		frame:SetParent(hiddenParent)
+
+		local health = frame.healthbar
+		if(health) then
+			health:UnregisterAllEvents()
+		end
+
+		local power = frame.manabar
+		if(power) then
+			power:UnregisterAllEvents()
+		end
+
+		local spell = frame.spellbar
+		if(spell) then
+			spell:UnregisterAllEvents()
+		end
+
+		local altpowerbar = frame.powerBarAlt
+		if(altpowerbar) then
+			altpowerbar:UnregisterAllEvents()
+		end
+	end
+end
+
+function oUF:DisableBlizzard(unit)
+	if(not unit) or InCombatLockdown() then return end
+
+	if(unit == 'player') then
+		HandleFrame(PlayerFrame)
+
+		-- For the damn vehicle support:
+		PlayerFrame:RegisterUnitEvent('UNIT_ENTERING_VEHICLE', "player")
+		PlayerFrame:RegisterUnitEvent('UNIT_ENTERED_VEHICLE', "player")
+		PlayerFrame:RegisterUnitEvent('UNIT_EXITING_VEHICLE', "player")
+		PlayerFrame:RegisterUnitEvent('UNIT_EXITED_VEHICLE', "player")
+
+		-- User placed frames don't animate
+		PlayerFrame:SetUserPlaced(true)
+		PlayerFrame:SetDontSavePosition(true)
+	elseif(unit == 'pet') then
+		HandleFrame(PetFrame)
+	elseif(unit == 'target') then
+		HandleFrame(TargetFrame)
+		HandleFrame(ComboFrame)
+	elseif(unit == 'focus') then
+		HandleFrame(FocusFrame)
+		HandleFrame(TargetofFocusFrame)
+	elseif(unit == 'targettarget') then
+		HandleFrame(TargetFrameToT)
+	elseif(unit:match'(boss)%d?$' == 'boss') then
+		local id = unit:match'boss(%d)'
+		if(id) then
+			HandleFrame('Boss' .. id .. 'TargetFrame')
+		else
+			for i=1, 4 do
+				HandleFrame(('Boss%dTargetFrame'):format(i))
+			end
+		end
+	elseif(unit:match'(party)%d?$' == 'party') then
+		local id = unit:match'party(%d)'
+		if(id) then
+			HandleFrame('PartyMemberFrame' .. id)
+		else
+			for i=1, 4 do
+				HandleFrame(('PartyMemberFrame%d'):format(i))
+			end
+		end
+	elseif(unit:match'(arena)%d?$' == 'arena') then
+		local id = unit:match'arena(%d)'
+		if(id) then
+			HandleFrame('ArenaEnemyFrame' .. id)
+		else
+			for i=1, 4 do
+				HandleFrame(('ArenaEnemyFrame%d'):format(i))
+			end
+		end
+
+		-- Blizzard_ArenaUI should not be loaded
+		Arena_LoadUI = function() end
+		SetCVar('showArenaEnemyFrames', '0', 'SHOW_ARENA_ENEMY_FRAMES_TEXT')
+	end
+end
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/colors.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/colors.lua
new file mode 100644
index 0000000..5a64636
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/colors.lua
@@ -0,0 +1,160 @@
+local parent, ns = ...
+local oUF = ns.oUF
+local Private = oUF.Private
+
+local frame_metatable = Private.frame_metatable
+
+local colors = {
+	smooth = {
+		1, 0, 0,
+		1, 1, 0,
+		0, 1, 0
+	},
+	disconnected = {.6, .6, .6},
+	tapped = {.6,.6,.6},
+	class = {},
+	reaction = {},
+}
+
+-- We do this because people edit the vars directly, and changing the default
+-- globals makes SPICE FLOW!
+local customClassColors = function()
+	if(SVUI_CLASS_COLORS) then
+		local updateColors = function()
+			for eclass, color in next, SVUI_CLASS_COLORS do
+				colors.class[eclass] = {color.r, color.g, color.b}
+			end
+
+			for _, obj in next, oUF.objects do
+				obj:UpdateAllElements("SVUI_CLASS_COLORS")
+			end
+		end
+
+		updateColors()
+		SVUI_CLASS_COLORS:RegisterCallback(updateColors)
+
+		return true
+	end
+end
+if not customClassColors() then
+	for eclass, color in next, RAID_CLASS_COLORS do
+		colors.class[eclass] = {color.r, color.g, color.b}
+	end
+
+	local f = CreateFrame("Frame")
+	f:RegisterEvent("ADDON_LOADED")
+	f:SetScript("OnEvent", function()
+		if customClassColors() then
+			f:UnregisterEvent("ADDON_LOADED")
+			f:SetScript("OnEvent", nil)
+		end
+	end)
+end
+
+for eclass, color in next, FACTION_BAR_COLORS do
+	colors.reaction[eclass] = {color.r, color.g, color.b}
+end
+
+local function ColorsAndPercent(a, b, ...)
+	if a <= 0 or b == 0 then
+		return nil, ...
+	elseif a >= b then
+		return nil, select(select('#', ...) - 2, ...)
+	end
+
+	local num = select('#', ...) / 3
+	local segment, relperc = math.modf((a/b)*(num-1))
+	return relperc, select((segment*3)+1, ...)
+end
+
+-- http://www.wowwiki.com/ColorGradient
+local RGBColorGradient = function(...)
+	local relperc, r1, g1, b1, r2, g2, b2 = ColorsAndPercent(...)
+	if relperc then
+		return r1 + (r2-r1)*relperc, g1 + (g2-g1)*relperc, b1 + (b2-b1)*relperc
+	else
+		return r1, g1, b1
+	end
+end
+
+
+local function GetY(r, g, b)
+	return 0.3 * r + 0.59 * g + 0.11 * b
+end
+
+local function RGBToHCY(r, g, b)
+	local min, max = min(r, g, b), max(r, g, b)
+	local chroma = max - min
+	local hue
+	if chroma > 0 then
+		if r == max then
+			hue = ((g - b) / chroma) % 6
+		elseif g == max then
+			hue = (b - r) / chroma + 2
+		elseif b == max then
+			hue = (r - g) / chroma + 4
+		end
+		hue = hue / 6
+	end
+	return hue, chroma, GetY(r, g, b)
+end
+
+local abs = math.abs
+local function HCYtoRGB(hue, chroma, luma)
+	local r, g, b = 0, 0, 0
+	if hue then
+		local h2 = hue * 6
+		local x = chroma * (1 - abs(h2 % 2 - 1))
+		if h2 < 1 then
+			r, g, b = chroma, x, 0
+		elseif h2 < 2 then
+			r, g, b = x, chroma, 0
+		elseif h2 < 3 then
+			r, g, b = 0, chroma, x
+		elseif h2 < 4 then
+			r, g, b = 0, x, chroma
+		elseif h2 < 5 then
+			r, g, b = x, 0, chroma
+		else
+			r, g, b = chroma, 0, x
+		end
+	end
+	local m = luma - GetY(r, g, b)
+	return r + m, g + m, b + m
+end
+
+local HCYColorGradient = function(...)
+	local relperc, r1, g1, b1, r2, g2, b2 = ColorsAndPercent(...)
+	if not relperc then return r1, g1, b1 end
+	local h1, c1, y1 = RGBToHCY(r1, g1, b1)
+	local h2, c2, y2 = RGBToHCY(r2, g2, b2)
+	local c = c1 + (c2-c1) * relperc
+	local y = y1 + (y2-y1) * relperc
+	if h1 and h2 then
+		local dh = h2 - h1
+		if dh < -0.5  then
+			dh = dh + 1
+		elseif dh > 0.5 then
+			dh = dh - 1
+		end
+		return HCYtoRGB((h1 + dh * relperc) % 1, c, y)
+	else
+		return HCYtoRGB(h1 or h2, c, y)
+	end
+
+end
+
+local ColorGradient = function(...)
+	return (oUF.useHCYColorGradient and HCYColorGradient or RGBColorGradient)(...)
+end
+
+Private.colors = colors
+
+oUF.colors = colors
+oUF.ColorGradient = ColorGradient
+oUF.RGBColorGradient = RGBColorGradient
+oUF.HCYColorGradient = HCYColorGradient
+oUF.useHCYColorGradient = false
+
+frame_metatable.__index.colors = colors
+frame_metatable.__index.ColorGradient = ColorGradient
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/altpowerbar.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/altpowerbar.lua
new file mode 100644
index 0000000..ed2141c
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/altpowerbar.lua
@@ -0,0 +1,86 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local ALTERNATE_POWER_INDEX = ALTERNATE_POWER_INDEX
+
+local UpdatePower = function(self, event, unit, powerType)
+	if(self.unit ~= unit or powerType ~= 'ALTERNATE') or not unit then return end
+
+	local altpowerbar = self.AltPowerBar
+
+	if(altpowerbar.PreUpdate) then
+		altpowerbar:PreUpdate()
+	end
+
+	local barType, min = UnitAlternatePowerInfo(unit)
+	local cur = UnitPower(unit, ALTERNATE_POWER_INDEX)
+	local max = UnitPowerMax(unit, ALTERNATE_POWER_INDEX)
+
+	altpowerbar.barType = barType
+	altpowerbar:SetMinMaxValues(min, max)
+	altpowerbar:SetValue(cur)
+
+	if(altpowerbar.PostUpdate) then
+		return altpowerbar:PostUpdate(min, cur, max)
+	end
+end
+
+local ForceUpdate = function(element)
+	return UpdatePower(element.__owner, 'ForceUpdate', element.__owner.unit, 'ALTERNATE')
+end
+
+local Toggler = function(self, event, unit)
+	if(unit ~= self.unit) or not unit then return end
+	local altpowerbar = self.AltPowerBar
+
+	local barType, minPower, _, _, _, hideFromOthers = UnitAlternatePowerInfo(unit)
+	if(barType and (not hideFromOthers or unit == 'player' or self.realUnit == 'player')) then
+		self:RegisterEvent('UNIT_POWER', UpdatePower)
+		self:RegisterEvent('UNIT_MAXPOWER', UpdatePower)
+
+		ForceUpdate(altpowerbar)
+		altpowerbar:Show()
+	else
+		self:UnregisterEvent('UNIT_POWER', UpdatePower)
+		self:UnregisterEvent('UNIT_MAXPOWER', UpdatePower)
+
+		altpowerbar:Hide()
+	end
+end
+
+local Enable = function(self, unit)
+	local altpowerbar = self.AltPowerBar
+	if(altpowerbar) then
+		altpowerbar.__owner = self
+		altpowerbar.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('UNIT_POWER_BAR_SHOW', Toggler)
+		self:RegisterEvent('UNIT_POWER_BAR_HIDE', Toggler)
+
+		altpowerbar:Hide()
+
+		if(unit == 'player') then
+			PlayerPowerBarAlt:UnregisterEvent'UNIT_POWER_BAR_SHOW'
+			PlayerPowerBarAlt:UnregisterEvent'UNIT_POWER_BAR_HIDE'
+			PlayerPowerBarAlt:UnregisterEvent'PLAYER_ENTERING_WORLD'
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self, unit)
+	local altpowerbar = self.AltPowerBar
+	if(altpowerbar) then
+		self:UnregisterEvent('UNIT_POWER_BAR_SHOW', Toggler)
+		self:UnregisterEvent('UNIT_POWER_BAR_HIDE', Toggler)
+
+		if(unit == 'player') then
+			PlayerPowerBarAlt:RegisterEvent'UNIT_POWER_BAR_SHOW'
+			PlayerPowerBarAlt:RegisterEvent'UNIT_POWER_BAR_HIDE'
+			PlayerPowerBarAlt:RegisterEvent'PLAYER_ENTERING_WORLD'
+		end
+	end
+end
+
+oUF:AddElement('AltPowerBar', Toggler, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/assistant.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/assistant.lua
new file mode 100644
index 0000000..1d485d7
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/assistant.lua
@@ -0,0 +1,56 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local Update = function(self, event)
+	if not self.unit then return; end
+	local assistant = self.Assistant
+
+	if(assistant.PreUpdate) then
+		assistant:PreUpdate()
+	end
+
+	local unit = self.unit
+	local isAssistant = UnitInRaid(unit) and UnitIsRaidOfficer(unit) and not UnitIsGroupLeader(unit)
+	if(isAssistant) then
+		assistant:Show()
+	else
+		assistant:Hide()
+	end
+
+	if(assistant.PostUpdate) then
+		return assistant:PostUpdate(isAssistant)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.Assistant.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate')
+end
+
+local Enable = function(self)
+	local assistant = self.Assistant
+	if(assistant) then
+		self:RegisterEvent("GROUP_ROSTER_UPDATE", Path, true)
+
+		if(assistant:IsObjectType"Texture" and not assistant:GetTexture()) then
+			assistant:SetTexture[[Interface\GroupFrame\UI-Group-AssistantIcon]]
+		end
+
+		assistant.__owner = self
+		assistant.ForceUpdate = ForceUpdate
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local assistant = self.Assistant
+	if(assistant) then
+		self:UnregisterEvent("GROUP_ROSTER_UPDATE", Path)
+	end
+end
+
+oUF:AddElement('Assistant', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/aura.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/aura.lua
new file mode 100644
index 0000000..ccaba42
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/aura.lua
@@ -0,0 +1,319 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local VISIBLE = 1
+local HIDDEN = 0
+
+local floor = math.floor
+local tinsert = table.insert
+
+local UpdateTooltip = function(self)
+	GameTooltip:SetUnitAura(self.parent.__owner.unit, self:GetID(), self.filter)
+end
+
+local OnEnter = function(self)
+	if(not self:IsVisible()) then return end
+
+	GameTooltip:SetOwner(self, "ANCHOR_BOTTOMRIGHT")
+	self:UpdateTooltip()
+end
+
+local OnLeave = function()
+	GameTooltip:Hide()
+end
+
+local createAuraIcon = function(icons, index)
+	local button = CreateFrame("Button", nil, icons)
+	button:EnableMouse(true)
+	button:RegisterForClicks'RightButtonUp'
+
+	button:SetWidth(icons.size or 16)
+	button:SetHeight(icons.size or 16)
+
+	local cd = CreateFrame("Cooldown", nil, button)
+	cd:SetPoint("TOPLEFT", button, "TOPLEFT", 1, -1)
+	cd:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -1, 1)
+
+	local text = cd:CreateFontString(nil, "OVERLAY")
+	text:SetFont(icons.textFont or [[Fonts\FRIZQT__.TTF]], icons.textSize or 10, icons.textOutline or "NONE")
+	text:SetPoint("CENTER", 1, 1)
+	text:SetJustifyH("CENTER")
+
+	local icon = button:CreateTexture(nil, "ARTWORK")
+	icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
+	icon:SetPoint("TOPLEFT", button, "TOPLEFT", 1, -1)
+	icon:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -1, 1)
+
+	local count = button:CreateFontString(nil, "OVERLAY")
+	count:SetFont(icons.textFont or [[Fonts\FRIZQT__.TTF]], icons.textSize or 10, icons.textOutline or "NONE")
+	count:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -1, 0)
+	count:SetJustifyH("RIGHT")
+
+	local overlay = button:CreateTexture(nil, "OVERLAY")
+	overlay:SetTexture"Interface\\Buttons\\UI-Debuff-Overlays"
+	overlay:SetAllPoints(button)
+	overlay:SetTexCoord(.296875, .5703125, 0, .515625)
+	button.overlay = overlay
+
+	local stealable = button:CreateTexture(nil, 'OVERLAY')
+	stealable:SetTexture[[Interface\TargetingFrame\UI-TargetingFrame-Stealable]]
+	stealable:SetPoint('TOPLEFT', -3, 3)
+	stealable:SetPoint('BOTTOMRIGHT', 3, -3)
+	stealable:SetBlendMode'ADD'
+	button.stealable = stealable
+
+	button.UpdateTooltip = UpdateTooltip
+	button:SetScript("OnEnter", OnEnter)
+	button:SetScript("OnLeave", OnLeave)
+
+	tinsert(icons, button)
+
+	button.parent = icons
+	button.icon = icon
+	button.count = count
+	button.cd = cd
+	button.text = text
+
+	if(icons.PostCreateIcon) then icons:PostCreateIcon(button) end
+
+	return button
+end
+
+local customFilter = function(icons, unit, icon, name, rank, texture, count, dtype, duration, timeLeft, caster)
+	local isPlayer
+
+	if(caster == 'player' or caster == 'vehicle') then
+		isPlayer = true
+	end
+
+	if((icons.onlyShowPlayer and isPlayer) or (not icons.onlyShowPlayer and name)) then
+		icon.isPlayer = isPlayer
+		icon.owner = caster
+		return true
+	end
+end
+
+local updateIcon = function(unit, icons, index, offset, filter, isDebuff, visible)
+	if not unit then return; end
+	local name, rank, texture, count, dtype, duration, timeLeft, caster, isStealable, shouldConsolidate, spellID, canApplyAura, isBossDebuff = UnitAura(unit, index, filter)
+
+	if icons.forceShow then
+		spellID = 47540
+		name, rank, texture = GetSpellInfo(spellID)
+		count, dtype, duration, timeLeft, caster, isStealable, shouldConsolidate, canApplyAura, isBossDebuff = 5, 'Magic', 0, 60, 'player', nil, nil, nil, nil
+	end
+
+	if(name) then
+		local n = visible + offset + 1
+		local icon = icons[n]
+		if(not icon) then
+			icon = (icons.CreateIcon or createAuraIcon) (icons, n)
+		end
+
+		local show = true
+		if not icons.forceShow then
+			show = (icons.CustomFilter or customFilter) (icons, unit, icon, name, rank, texture, count, dtype, duration, timeLeft, caster, isStealable, shouldConsolidate, spellID, canApplyAura, isBossDebuff)
+		end
+		if(show) then
+			-- We might want to consider delaying the creation of an actual cooldown
+			-- object to this point, but I think that will just make things needlessly
+			-- complicated.
+			local cd = icon.cd
+			if(cd and not icons.disableCooldown) then
+				if(duration and duration > 0) then
+					cd:SetCooldown(timeLeft - duration, duration)
+					cd:Show()
+				else
+					cd:Hide()
+				end
+			end
+
+			if((isDebuff and icons.showDebuffType) or (not isDebuff and icons.showBuffType) or icons.showType) then
+				local color = DebuffTypeColor[dtype] or DebuffTypeColor.none
+
+				icon.overlay:SetVertexColor(color.r, color.g, color.b)
+				icon.overlay:Show()
+			else
+				icon.overlay:Hide()
+			end
+
+			-- XXX: Avoid popping errors on layouts without icon.stealable.
+			if(icon.stealable) then
+				local stealable = not isDebuff and isStealable
+				if(stealable and icons.showStealableBuffs and not UnitIsUnit('player', unit)) then
+					icon.stealable:Show()
+				else
+					icon.stealable:Hide()
+				end
+			end
+
+			icon.icon:SetTexture(texture)
+			icon.count:SetText((count > 1 and count))
+
+			icon.filter = filter
+			icon.isDebuff = isDebuff
+
+			icon:SetID(index)
+			icon:Show()
+
+			if(icons.PostUpdateIcon) then
+				icons:PostUpdateIcon(unit, icon, index, offset)
+			end
+
+			return VISIBLE
+		else
+			return HIDDEN
+		end
+	end
+end
+
+local SetPosition = function(icons, x)
+	if(icons and x > 0) then
+		local col = 0
+		local row = 0
+		local gap = icons.gap
+		local sizex = (icons.size or 16) + (icons['spacing-x'] or icons.spacing or 0)
+		local sizey = (icons.size or 16) + (icons['spacing-y'] or icons.spacing or 0)
+		local anchor = icons.initialAnchor or "BOTTOMLEFT"
+		local growthx = (icons["growth-x"] == "LEFT" and -1) or 1
+		local growthy = (icons["growth-y"] == "DOWN" and -1) or 1
+		local cols = floor(icons:GetWidth() / sizex + .5)
+		local rows = floor(icons:GetHeight() / sizey + .5)
+
+		for i = 1, #icons do
+			local button = icons[i]
+			if(button and button:IsShown()) then
+				if(gap and button.debuff) then
+					if(col > 0) then
+						col = col + 1
+					end
+
+					gap = false
+				end
+
+				if(col >= cols) then
+					col = 0
+					row = row + 1
+				end
+				button:ClearAllPoints()
+				button:SetPoint(anchor, icons, anchor, col * sizex * growthx, row * sizey * growthy)
+
+				col = col + 1
+			elseif(not button) then
+				break
+			end
+		end
+	end
+end
+
+local filterIcons = function(unit, icons, filter, limit, isDebuff, offset, dontHide)
+	if(not offset) then offset = 0 end
+	local index = 1
+	local visible = 0
+	while(visible < limit) do
+		local result = updateIcon(unit, icons, index, offset, filter, isDebuff, visible)
+		if(not result) then
+			break
+		elseif(result == VISIBLE) then
+			visible = visible + 1
+		end
+
+		index = index + 1
+	end
+
+	if(not dontHide) then
+		for i = visible + offset + 1, #icons do
+			icons[i]:Hide()
+		end
+	end
+
+	return visible
+end
+
+local Update = function(self, event, unit)
+	if(self.unit ~= unit) or not unit then return end
+
+	local auras = self.Auras
+	if(auras) then
+		if(auras.PreUpdate) then auras:PreUpdate(unit) end
+
+		local numBuffs = auras.numBuffs or 32
+		local numDebuffs = auras.numDebuffs or 40
+		local max = numBuffs + numDebuffs
+
+		local visibleBuffs = filterIcons(unit, auras, auras.buffFilter or auras.filter or 'HELPFUL', numBuffs, nil, 0, true)
+		auras.visibleBuffs = visibleBuffs
+
+		auras.visibleDebuffs = filterIcons(unit, auras, auras.debuffFilter or auras.filter or 'HARMFUL', numDebuffs, true, visibleBuffs)
+		auras.visibleAuras = auras.visibleBuffs + auras.visibleDebuffs
+
+		if(auras.PreSetPosition) then auras:PreSetPosition(max) end
+		(auras.SetPosition or SetPosition) (auras, max)
+
+		if(auras.PostUpdate) then auras:PostUpdate(unit) end
+	end
+
+	local buffs = self.Buffs
+	if(buffs) then
+		if(buffs.PreUpdate) then buffs:PreUpdate(unit) end
+
+		local numBuffs = buffs.num or 32
+		buffs.visibleBuffs = filterIcons(unit, buffs, buffs.filter or 'HELPFUL', numBuffs)
+
+		if(buffs.PreSetPosition) then buffs:PreSetPosition(numBuffs) end
+		(buffs.SetPosition or SetPosition) (buffs, numBuffs)
+
+		if(buffs.PostUpdate) then buffs:PostUpdate(unit) end
+	end
+
+	local debuffs = self.Debuffs
+	if(debuffs) then
+		if(debuffs.PreUpdate) then debuffs:PreUpdate(unit) end
+
+		local numDebuffs = debuffs.num or 40
+		debuffs.visibleDebuffs = filterIcons(unit, debuffs, debuffs.filter or 'HARMFUL', numDebuffs, true)
+
+		if(debuffs.PreSetPosition) then debuffs:PreSetPosition(numDebuffs) end
+		(debuffs.SetPosition or SetPosition) (debuffs, numDebuffs)
+
+		if(debuffs.PostUpdate) then debuffs:PostUpdate(unit) end
+	end
+end
+
+local ForceUpdate = function(element)
+	return Update(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+local Enable = function(self)
+	if(self.Buffs or self.Debuffs or self.Auras) then
+		self:RegisterEvent("UNIT_AURA", Update)
+
+		local buffs = self.Buffs
+		if(buffs) then
+			buffs.__owner = self
+			buffs.ForceUpdate = ForceUpdate
+		end
+
+		local debuffs = self.Debuffs
+		if(debuffs) then
+			debuffs.__owner = self
+			debuffs.ForceUpdate = ForceUpdate
+		end
+
+		local auras = self.Auras
+		if(auras) then
+			auras.__owner = self
+			auras.ForceUpdate = ForceUpdate
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	if(self.Buffs or self.Debuffs or self.Auras) then
+		self:UnregisterEvent("UNIT_AURA", Update)
+	end
+end
+
+oUF:AddElement('Aura', Update, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/castbar.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/castbar.lua
new file mode 100644
index 0000000..bf553fb
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/castbar.lua
@@ -0,0 +1,487 @@
+--[[ Element: Cast Bar
+
+	THIS FILE HEAVILY MODIFIED FOR USE WITH SUPERVILLAIN UI
+
+]]
+local parent, ns = ...
+local oUF = ns.oUF
+
+local updateSafeZone = function(self)
+	local sz = self.SafeZone
+	local width = self:GetWidth()
+	local _, _, _, ms = GetNetStats()
+
+	-- Guard against GetNetStats returning latencies of 0.
+	if(ms ~= 0) then
+		-- MADNESS!
+		local safeZonePercent = (width / self.max) * (ms / 1e5)
+		if(safeZonePercent > 1) then safeZonePercent = 1 end
+		sz:SetWidth(width * safeZonePercent)
+		sz:Show()
+	else
+		sz:Hide()
+	end
+end
+
+local UNIT_SPELLCAST_SENT = function (self, event, unit, spell, rank, target)
+	local castbar = self.Castbar
+	castbar.curTarget = (target and target ~= "") and target or nil
+end
+
+local UNIT_SPELLCAST_START = function(self, event, unit, spell)
+	if(self.unit ~= unit) or not unit then return end
+
+	local castbar = self.Castbar
+	local name, _, text, texture, startTime, endTime, tradeskill, castid, interrupt = UnitCastingInfo(unit)
+	if(not name) then
+		castbar:Hide()
+		return
+	end
+
+	endTime = endTime / 1e3
+	startTime = startTime / 1e3
+
+	local repeatCount = GetTradeskillRepeatCount() or 1
+	local start = GetTime() - startTime
+
+	if(tradeskill and repeatCount >= 1) then
+		if(castbar.previous ~= name) then
+			castbar.recipecount = 1
+			castbar.maxrecipe = repeatCount
+			castbar.duration = start
+		else
+			castbar.recipecount = castbar.recipecount or 1
+			castbar.maxrecipe = castbar.maxrecipe or repeatCount
+			castbar.duration = castbar.duration or start
+		end
+	else
+		castbar.recipecount = nil
+		castbar.maxrecipe = 1
+		castbar.duration = start
+	end
+
+	castbar.previous = name
+	castbar.tradeskill = tradeskill
+	castbar.castid = castid
+
+	local max = (endTime - startTime) * castbar.maxrecipe
+
+	castbar.max = max
+	castbar.delay = 0
+	castbar.casting = true
+	castbar.interrupt = interrupt
+
+	castbar:SetMinMaxValues(0, max)
+	castbar:SetValue(0)
+
+	if(castbar.Text) then castbar.Text:SetText(text) end
+	if(castbar.Icon) then castbar.Icon:SetTexture(texture) end
+	if(castbar.Time) then castbar.Time:SetText() end
+
+	local shield = castbar.Shield
+	if(shield and interrupt) then
+		shield:Show()
+	elseif(shield) then
+		shield:Hide()
+	end
+
+	local sf = castbar.SafeZone
+	if(sf) then
+		sf:ClearAllPoints()
+		sf:SetPoint'RIGHT'
+		sf:SetPoint'TOP'
+		sf:SetPoint'BOTTOM'
+		updateSafeZone(castbar)
+	end
+
+	if(castbar.PostCastStart) then
+		castbar:PostCastStart(unit, name, castid)
+	end
+
+	castbar:Show()
+end
+
+local UNIT_SPELLCAST_FAILED = function(self, event, unit, spellname, _, castid)
+	if (self.unit ~= unit) or not unit then return end
+
+	local castbar = self.Castbar
+	if (castbar.castid ~= castid) then	return end
+
+	castbar.previous = nil
+	castbar.casting = nil
+	castbar.tradeskill = nil
+	castbar.recipecount = nil
+	castbar.maxrecipe = 1
+	castbar.interrupt = nil
+	castbar:SetValue(0)
+	castbar:Hide()
+
+	if(castbar.PostCastFailed) then
+		return castbar:PostCastFailed(unit, spellname, castid)
+	end
+end
+
+local UNIT_SPELLCAST_INTERRUPTED = function(self, event, unit, spellname, _, castid)
+	if(self.unit ~= unit) or not unit then return end
+
+	local castbar = self.Castbar
+	if (castbar.castid ~= castid) then	return end
+
+	castbar.previous = nil
+	castbar.casting = nil
+	castbar.tradeskill = nil
+	castbar.recipecount = nil
+	castbar.maxrecipe = 1
+	castbar.channeling = nil
+
+	castbar:SetValue(0)
+	castbar:Hide()
+
+	if(castbar.PostCastInterrupted) then
+		return castbar:PostCastInterrupted(unit, spellname, castid)
+	end
+end
+
+local UNIT_SPELLCAST_INTERRUPTIBLE = function(self, event, unit)
+	if(self.unit ~= unit) or not unit then return end
+
+	local shield = self.Castbar.Shield
+	if(shield) then
+		shield:Hide()
+	end
+
+	local castbar = self.Castbar
+	if(castbar.PostCastInterruptible) then
+		return castbar:PostCastInterruptible(unit)
+	end
+end
+
+local UNIT_SPELLCAST_NOT_INTERRUPTIBLE = function(self, event, unit)
+	if(self.unit ~= unit) or not unit then return end
+
+	local shield = self.Castbar.Shield
+	if(shield) then
+		shield:Show()
+	end
+
+	local castbar = self.Castbar
+	if(castbar.PostCastNotInterruptible) then
+		return castbar:PostCastNotInterruptible(unit)
+	end
+end
+
+local UNIT_SPELLCAST_DELAYED = function(self, event, unit, spellname, _, castid)
+	if(self.unit ~= unit) or not unit then return end
+
+	local castbar = self.Castbar
+	local name, _, text, texture, startTime, endTime = UnitCastingInfo(unit)
+	if(not startTime or not castbar:IsShown()) then return end
+
+	local duration = GetTime() - (startTime / 1000)
+	if(duration < 0) then duration = 0 end
+	castbar.previous = name
+	castbar.delay = castbar.delay + castbar.duration - duration
+	castbar.duration = duration
+
+	castbar:SetValue(duration)
+
+	if(castbar.PostCastDelayed) then
+		return castbar:PostCastDelayed(unit, name, castid)
+	end
+end
+
+local UNIT_SPELLCAST_STOP = function(self, event, unit, spellname, _, castid)
+	if (self.unit ~= unit) or not unit then return end
+	local castbar = self.Castbar
+	if (castbar.castid ~= castid) then return end
+
+	if(castbar.tradeskill and castbar.recipecount and castbar.recipecount >= 0) then
+		castbar.recipecount = castbar.recipecount + 1
+	else
+		castbar.previous = nil
+		castbar.casting = nil
+		castbar.interrupt = nil
+		castbar.tradeskill = nil
+		castbar.recipecount = nil
+		castbar.maxrecipe = 1
+		castbar:SetValue(0)
+	end
+
+	castbar:Hide()
+
+	if(castbar.PostCastStop) then
+		return castbar:PostCastStop(unit, spellname, castid)
+	end
+end
+
+local UNIT_SPELLCAST_CHANNEL_START = function(self, event, unit, spellname)
+	if (self.unit ~= unit) or not unit then return end
+
+	local castbar = self.Castbar
+	local name, _, text, texture, startTime, endTime, isTrade, interrupt = UnitChannelInfo(unit)
+	if (not name) then return end
+
+	endTime = endTime / 1e3
+	startTime = startTime / 1e3
+	local max = (endTime - startTime)
+	local duration = endTime - GetTime()
+
+	castbar.previous = name
+	castbar.duration = duration
+	castbar.max = max
+	castbar.delay = 0
+	castbar.startTime = startTime
+	castbar.endTime = endTime
+	castbar.extraTickRatio = 0
+	castbar.channeling = true
+	castbar.interrupt = interrupt
+
+	-- We have to do this, as it's possible for spell casts to never have _STOP
+	-- executed or be fully completed by the OnUpdate handler before CHANNEL_START
+	-- is called.
+	castbar.casting = nil
+	castbar.tradeskill = nil
+	castbar.recipecount = nil
+	castbar.maxrecipe = 1
+	castbar.castid = nil
+
+	castbar:SetMinMaxValues(0, max)
+	castbar:SetValue(duration)
+
+	if(castbar.Text) then castbar.Text:SetText(name) end
+	if(castbar.Icon) then castbar.Icon:SetTexture(texture) end
+	if(castbar.Time) then castbar.Time:SetText() end
+
+	local shield = castbar.Shield
+	if(shield and interrupt) then
+		shield:Show()
+	elseif(shield) then
+		shield:Hide()
+	end
+
+	local sf = castbar.SafeZone
+	if(sf) then
+		sf:ClearAllPoints()
+		sf:SetPoint'LEFT'
+		sf:SetPoint'TOP'
+		sf:SetPoint'BOTTOM'
+		updateSafeZone(castbar)
+	end
+
+	if(castbar.PostChannelStart) then castbar:PostChannelStart(unit, name) end
+	castbar:Show()
+end
+
+local UNIT_SPELLCAST_CHANNEL_UPDATE = function(self, event, unit, spellname)
+	if(self.unit ~= unit) or not unit then return end
+
+	local castbar = self.Castbar
+	local name, _, text, texture, startTime, endTime, oldStart = UnitChannelInfo(unit)
+	if(not name or not castbar:IsShown()) then
+		return
+	end
+
+	castbar.previous = name
+	local duration = (endTime / 1000) - GetTime()
+	local startDelay = castbar.startTime - startTime / 1000
+	castbar.startTime = startTime / 1000
+	castbar.endTime = endTime / 1000
+	castbar.delay = castbar.delay + startDelay
+
+	castbar.duration = duration
+	castbar.max = (endTime - startTime) / 1000
+
+	castbar:SetMinMaxValues(0, castbar.max)
+	castbar:SetValue(duration)
+
+	if(castbar.PostChannelUpdate) then
+		return castbar:PostChannelUpdate(unit, name)
+	end
+end
+
+local UNIT_SPELLCAST_CHANNEL_STOP = function(self, event, unit, spellname)
+	if(self.unit ~= unit) or not unit then return end
+
+	local castbar = self.Castbar
+	if(castbar:IsShown()) then
+		castbar.channeling = nil
+		castbar.interrupt = nil
+
+		castbar:SetValue(castbar.max)
+		castbar:Hide()
+
+		if(castbar.PostChannelStop) then
+			return castbar:PostChannelStop(unit, spellname)
+		end
+	end
+end
+
+local UpdateCastingTimeInfo = function(self, duration)
+	if(self.Time) then
+		if(self.delay ~= 0) then
+			if(self.CustomDelayText) then
+				self:CustomDelayText(duration)
+			else
+				self.Time:SetFormattedText("%.1f|cffff0000-%.1f|r", duration, self.delay)
+			end
+		elseif(self.recipecount and self.recipecount > 0 and self.maxrecipe and self.maxrecipe > 1) then
+			self.Time:SetText(self.recipecount .. "/" .. self.maxrecipe)
+		else
+			if(self.CustomTimeText) then
+				self:CustomTimeText(duration)
+			else
+				self.Time:SetFormattedText("%.1f", duration)
+			end
+		end
+	end
+	if(self.Spark) then
+		self.Spark:SetPoint("CENTER", self, "LEFT", (duration / self.max) * self:GetWidth(), 0)
+	end
+end
+
+local onUpdate = function(self, elapsed)
+	self.lastUpdate = (self.lastUpdate or 0) + elapsed
+
+	if not (self.casting or self.channeling) then
+		self.unitName = nil
+		self.previous = nil
+		self.casting = nil
+		self.tradeskill = nil
+		self.recipecount = nil
+		self.maxrecipe = 1
+		self.castid = nil
+		self.channeling = nil
+
+		self:SetValue(1)
+		self:Hide()
+		return
+	end
+
+	if(self.casting) then
+		local duration = self.duration + self.lastUpdate
+		if(duration >= self.max) then
+			self.previous = nil
+			self.casting = nil
+			self.tradeskill = nil
+			self.recipecount = nil
+			self.maxrecipe = 1
+			self:Hide()
+
+			if(self.PostCastStop) then self:PostCastStop(self.__owner.unit) end
+			return
+		end
+
+		UpdateCastingTimeInfo(self, duration)
+
+		self.duration = duration
+		self:SetValue(duration)
+	elseif(self.channeling) then
+		local duration = self.duration - self.lastUpdate
+
+		if(duration <= 0) then
+			self.channeling = nil
+			self:Hide()
+
+			if(self.PostChannelStop) then self:PostChannelStop(self.__owner.unit) end
+			return
+		end
+
+		UpdateCastingTimeInfo(self, duration)
+
+		self.duration = duration
+		self:SetValue(duration)
+	end
+
+	self.lastUpdate = 0
+end
+
+local Update = function(self, ...)
+	UNIT_SPELLCAST_START(self, ...)
+	return UNIT_SPELLCAST_CHANNEL_START(self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Update(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+local Enable = function(object, unit)
+	local castbar = object.Castbar
+
+	if(castbar) then
+		castbar.__owner = object
+		castbar.ForceUpdate = ForceUpdate
+
+		if(not (unit and unit:match'%wtarget$')) then
+			object:RegisterEvent("UNIT_SPELLCAST_SENT", UNIT_SPELLCAST_SENT)
+			object:RegisterEvent("UNIT_SPELLCAST_START", UNIT_SPELLCAST_START)
+			object:RegisterEvent("UNIT_SPELLCAST_FAILED", UNIT_SPELLCAST_FAILED)
+			object:RegisterEvent("UNIT_SPELLCAST_STOP", UNIT_SPELLCAST_STOP)
+			object:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED", UNIT_SPELLCAST_INTERRUPTED)
+			object:RegisterEvent("UNIT_SPELLCAST_INTERRUPTIBLE", UNIT_SPELLCAST_INTERRUPTIBLE)
+			object:RegisterEvent("UNIT_SPELLCAST_NOT_INTERRUPTIBLE", UNIT_SPELLCAST_NOT_INTERRUPTIBLE)
+			object:RegisterEvent("UNIT_SPELLCAST_DELAYED", UNIT_SPELLCAST_DELAYED)
+			object:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START", UNIT_SPELLCAST_CHANNEL_START)
+			object:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE", UNIT_SPELLCAST_CHANNEL_UPDATE)
+			object:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP", UNIT_SPELLCAST_CHANNEL_STOP)
+			--object:RegisterEvent("UPDATE_TRADESKILL_RECAST", UPDATE_TRADESKILL_RECAST)
+		end
+
+		castbar:SetScript("OnUpdate", castbar.OnUpdate or onUpdate)
+
+		if(object.unit == "player") then
+			CastingBarFrame:UnregisterAllEvents()
+			CastingBarFrame.Show = CastingBarFrame.Hide
+			CastingBarFrame:Hide()
+		elseif(object.unit == 'pet') then
+			PetCastingBarFrame:UnregisterAllEvents()
+			PetCastingBarFrame.Show = PetCastingBarFrame.Hide
+			PetCastingBarFrame:Hide()
+		end
+
+		if(castbar:IsObjectType'StatusBar' and not castbar:GetStatusBarTexture()) then
+			castbar:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
+		end
+
+		local spark = castbar.Spark
+		if(spark and spark:IsObjectType'Texture' and not spark:GetTexture()) then
+			spark:SetTexture[[Interface\CastingBar\UI-CastingBar-Spark]]
+		end
+
+		local shield = castbar.Shield
+		if(shield and shield:IsObjectType'Texture' and not shield:GetTexture()) then
+			shield:SetTexture[[Interface\CastingBar\UI-CastingBar-Small-Shield]]
+		end
+
+		local sz = castbar.SafeZone
+		if(sz and sz:IsObjectType'Texture' and not sz:GetTexture()) then
+			sz:SetTexture(1, 0, 0)
+		end
+
+		castbar:Hide()
+
+		return true
+	end
+end
+
+local Disable = function(object, unit)
+	local castbar = object.Castbar
+
+	if(castbar) then
+		object:UnregisterEvent("UNIT_SPELLCAST_SENT", UNIT_SPELLCAST_SENT)
+		object:UnregisterEvent("UNIT_SPELLCAST_START", UNIT_SPELLCAST_START)
+		object:UnregisterEvent("UNIT_SPELLCAST_FAILED", UNIT_SPELLCAST_FAILED)
+		object:UnregisterEvent("UNIT_SPELLCAST_STOP", UNIT_SPELLCAST_STOP)
+		object:UnregisterEvent("UNIT_SPELLCAST_INTERRUPTED", UNIT_SPELLCAST_INTERRUPTED)
+		object:UnregisterEvent("UNIT_SPELLCAST_INTERRUPTIBLE", UNIT_SPELLCAST_INTERRUPTIBLE)
+		object:UnregisterEvent("UNIT_SPELLCAST_NOT_INTERRUPTIBLE", UNIT_SPELLCAST_NOT_INTERRUPTIBLE)
+		object:UnregisterEvent("UNIT_SPELLCAST_DELAYED", UNIT_SPELLCAST_DELAYED)
+		object:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_START", UNIT_SPELLCAST_CHANNEL_START)
+		object:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE", UNIT_SPELLCAST_CHANNEL_UPDATE)
+		object:UnregisterEvent("UNIT_SPELLCAST_CHANNEL_STOP", UNIT_SPELLCAST_CHANNEL_STOP)
+		--object:UnregisterEvent("UPDATE_TRADESKILL_RECAST", UPDATE_TRADESKILL_RECAST)
+
+		castbar:SetScript("OnUpdate", nil)
+	end
+end
+
+oUF:AddElement('Castbar', Update, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/combat.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/combat.lua
new file mode 100644
index 0000000..cd8c478
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/combat.lua
@@ -0,0 +1,56 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local Update = function(self, event)
+	local combat = self.Combat
+	if(combat.PreUpdate) then
+		combat:PreUpdate()
+	end
+
+	local inCombat = UnitAffectingCombat('player')
+	if(inCombat) then
+		combat:Show()
+	else
+		combat:Hide()
+	end
+
+	if(combat.PostUpdate) then
+		return combat:PostUpdate(inCombat)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.Combat.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate')
+end
+
+local Enable = function(self, unit)
+	local combat = self.Combat
+	if(combat and unit == 'player') then
+		combat.__owner = self
+		combat.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent("PLAYER_REGEN_DISABLED", Path, true)
+		self:RegisterEvent("PLAYER_REGEN_ENABLED", Path, true)
+
+		if(combat:IsObjectType"Texture" and not combat:GetTexture()) then
+			combat:SetTexture[[Interface\CharacterFrame\UI-StateIcon]]
+			combat:SetTexCoord(.5, 1, 0, .49)
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	if(self.Combat) then
+		self.Combat:Hide()
+		self:UnregisterEvent("PLAYER_REGEN_DISABLED", Path)
+		self:UnregisterEvent("PLAYER_REGEN_ENABLED", Path)
+	end
+end
+
+oUF:AddElement('Combat', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/cpoints.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/cpoints.lua
new file mode 100644
index 0000000..ee12aec
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/cpoints.lua
@@ -0,0 +1,77 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local GetComboPoints = GetComboPoints
+local MAX_COMBO_POINTS = MAX_COMBO_POINTS
+
+local Update = function(self, event, unit)
+	if(unit == 'pet') then return end
+
+	local cpoints = self.CPoints
+	if(cpoints.PreUpdate) then
+		cpoints:PreUpdate()
+	end
+
+	local cp
+	if(UnitHasVehicleUI'player') then
+		cp = GetComboPoints('vehicle', 'target')
+	else
+		cp = GetComboPoints('player', 'target')
+	end
+
+	for i=1, MAX_COMBO_POINTS do
+		if(i <= cp) then
+			cpoints[i]:Show()
+		else
+			cpoints[i]:Hide()
+		end
+	end
+
+	if(cpoints.PostUpdate) then
+		return cpoints:PostUpdate(cp)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.CPoints.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+local Enable = function(self)
+	local cpoints = self.CPoints
+	if(cpoints) then
+		cpoints.__owner = self
+		cpoints.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('UNIT_COMBO_POINTS', Path, true)
+		self:RegisterEvent('PLAYER_TARGET_CHANGED', Path, true)
+		self:RegisterEvent('UNIT_AURA', Path, true)
+
+		for index = 1, MAX_COMBO_POINTS do
+			local cpoint = cpoints[index]
+			if(cpoint:IsObjectType'Texture' and not cpoint:GetTexture()) then
+				cpoint:SetTexture[[Interface\ComboFrame\ComboPoint]]
+				cpoint:SetTexCoord(0, 0.375, 0, 1)
+			end
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local cpoints = self.CPoints
+	if(cpoints) then
+		for index = 1, MAX_COMBO_POINTS do
+			cpoints[index]:Hide()
+		end
+		self:UnregisterEvent('UNIT_COMBO_POINTS', Path)
+		self:UnregisterEvent('PLAYER_TARGET_CHANGED', Path)
+		self:UnregisterEvent('UNIT_AURA', Path)
+	end
+end
+
+oUF:AddElement('CPoints', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/druidmana.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/druidmana.lua
new file mode 100644
index 0000000..2dc1673
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/druidmana.lua
@@ -0,0 +1,114 @@
+-- Druid Mana Bar for Cat and Bear forms
+-- Authors: Califpornia aka Ennie // some code taken from oUF`s EclipseBar element
+if(select(2, UnitClass('player')) ~= 'DRUID') then return end
+
+local _, ns = ...
+local oUF = ns.oUF
+
+local function Update(self, event, unit, powertype)
+	--only the player frame will have this unit enable
+	--i mainly place this check for UNIT_DISPLAYPOWER and entering a vehicle
+	if(unit ~= 'player' or (powertype and powertype ~= 'MANA')) then return end
+
+	local druidmana = self.DruidMana
+	if(druidmana.PreUpdate) then druidmana:PreUpdate(unit) end
+
+	--check form
+	if(UnitPowerType('player') == SPELL_POWER_MANA) then
+		return druidmana:Hide()
+	else
+		druidmana:Show()
+	end
+
+	local min, max = UnitPower('player', SPELL_POWER_MANA), UnitPowerMax('player', SPELL_POWER_MANA)
+	druidmana:SetMinMaxValues(0, max)
+	druidmana:SetValue(min)
+
+	local r, g, b, t
+	if(druidmana.colorClass) then
+		t = self.colors.class['DRUID']
+	elseif(druidmana.colorSmooth) then
+		r, g, b = self.ColorGradient(min, max, unpack(druidmana.smoothGradient or self.colors.smooth))
+	elseif(druidmana.colorPower) then
+		t = self.colors.power['MANA']
+	end
+
+	if(t) then
+		r, g, b = t[1], t[2], t[3]
+	end
+
+	if(b) then
+		druidmana:SetStatusBarColor(r, g, b)
+
+		local bg = druidmana.bg
+		if(bg) then
+			local mu = bg.multiplier or 1
+			bg:SetVertexColor(r * mu, g * mu, b * mu)
+		end
+	end
+
+	if(druidmana.PostUpdate) then
+		return druidmana:PostUpdate(unit, min, max)
+	end
+end
+
+local function Path(self, ...)
+	return (self.DruidMana.Override or Update) (self, ...)
+end
+
+local function ForceUpdate(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+local OnDruidManaUpdate
+do
+	local UnitPower = UnitPower
+	OnDruidManaUpdate = function(self)
+		local unit = self.__owner.unit
+		local mana = UnitPower(unit, SPELL_POWER_MANA)
+
+		if(mana ~= self.min) then
+			self.min = mana
+			return Path(self.__owner, 'OnDruidManaUpdate', unit)
+		end
+	end
+end
+
+local Enable = function(self, unit)
+	local druidmana = self.DruidMana
+	if(druidmana and unit == 'player') then
+		druidmana.__owner = self
+		druidmana.ForceUpdate = ForceUpdate
+
+		if(druidmana.frequentUpdates) then
+			druidmana:SetScript('OnUpdate', OnDruidManaUpdate)
+		else
+			self:RegisterEvent('UNIT_POWER', Path)
+		end
+
+		self:RegisterEvent('UNIT_DISPLAYPOWER', Path)
+		self:RegisterEvent('UNIT_MAXPOWER', Path)
+
+		if(druidmana:IsObjectType'StatusBar' and not druidmana:GetStatusBarTexture()) then
+			druidmana:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local druidmana = self.DruidMana
+	if(druidmana) then
+		if(druidmana:GetScript'OnUpdate') then
+			druidmana:SetScript("OnUpdate", nil)
+		else
+			self:UnregisterEvent('UNIT_POWER', Path)
+		end
+
+		self:UnregisterEvent('UNIT_DISPLAYPOWER', Path)
+		self:UnregisterEvent('UNIT_MAXPOWER', Path)
+	end
+end
+
+oUF:AddElement('DruidMana', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/eclipsebar.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/eclipsebar.lua
new file mode 100644
index 0000000..b794c0b
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/eclipsebar.lua
@@ -0,0 +1,144 @@
+--[[ Element: Eclipse Bar
+
+	THIS FILE HEAVILY MODIFIED FOR USE WITH SUPERVILLAIN UI
+
+]]
+if(select(2, UnitClass('player')) ~= 'DRUID') then return end
+
+local parent, ns = ...
+local oUF = ns.oUF
+
+local ECLIPSE_BAR_SOLAR_BUFF_ID = ECLIPSE_BAR_SOLAR_BUFF_ID
+local ECLIPSE_BAR_LUNAR_BUFF_ID = ECLIPSE_BAR_LUNAR_BUFF_ID
+local SPELL_POWER_ECLIPSE = SPELL_POWER_ECLIPSE
+local MOONKIN_FORM = MOONKIN_FORM
+
+local UNIT_POWER = function(self, event, unit, powerType)
+	if(self.unit ~= unit or (event == 'UNIT_POWER' and powerType ~= 'ECLIPSE')) then return end
+
+	local eb = self.EclipseBar
+
+	local power = UnitPower('player', SPELL_POWER_ECLIPSE)
+	local maxPower = UnitPowerMax('player', SPELL_POWER_ECLIPSE)
+
+	if(eb.LunarBar) then
+		eb.LunarBar:SetMinMaxValues(-maxPower, maxPower)
+		eb.LunarBar:SetValue(power)
+	end
+
+	if(eb.SolarBar) then
+		eb.SolarBar:SetMinMaxValues(-maxPower, maxPower)
+		eb.SolarBar:SetValue(power * -1)
+	end
+
+	if(eb.PostUpdatePower) then
+		return eb:PostUpdatePower(unit)
+	end
+end
+
+local UPDATE_VISIBILITY = function(self, event)
+	local eb = self.EclipseBar
+
+	-- check form/mastery
+	local showBar
+	local form = GetShapeshiftFormID()
+	if(not form) then
+		local ptt = GetSpecialization()
+		if(ptt and ptt == 1) then -- player has balance spec
+			showBar = true
+		end
+	elseif(form == MOONKIN_FORM) then
+		showBar = true
+	end
+
+	if(showBar) then
+		eb:Show()
+	else
+		eb:Hide()
+	end
+
+	if(eb.PostUpdateVisibility) then
+		return eb:PostUpdateVisibility(self.unit)
+	end
+end
+
+local UNIT_AURA = function(self, event, unit)
+	if(self.unit ~= unit) or not unit then return end
+
+	local i = 1
+	local hasSolarEclipse, hasLunarEclipse
+	repeat
+		local _, _, _, _, _, _, _, _, _, _, spellID = UnitAura(unit, i, 'HELPFUL')
+
+		if(spellID == ECLIPSE_BAR_SOLAR_BUFF_ID) then
+			hasSolarEclipse = true
+		elseif(spellID == ECLIPSE_BAR_LUNAR_BUFF_ID) then
+			hasLunarEclipse = true
+		end
+
+		i = i + 1
+	until not spellID
+
+	local eb = self.EclipseBar
+	eb.hasSolarEclipse = hasSolarEclipse
+	eb.hasLunarEclipse = hasLunarEclipse
+
+	if(eb.PostUnitAura) then
+		return eb:PostUnitAura(unit)
+	end
+end
+
+local ECLIPSE_DIRECTION_CHANGE = function(self, event, status)
+	local eb = self.EclipseBar
+
+	if(status and eb:IsVisible() and eb.PostDirectionChange[status]) then
+		return eb.PostDirectionChange[status](self.unit)
+	end
+end
+
+local Update = function(self, ...)
+	UNIT_POWER(self, ...)
+	UNIT_AURA(self, ...)
+	return UPDATE_VISIBILITY(self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Update(element.__owner, 'ForceUpdate', element.__owner.unit, 'ECLIPSE')
+end
+
+local function Enable(self)
+	local eb = self.EclipseBar
+	if(eb) then
+		eb.__owner = self
+		eb.ForceUpdate = ForceUpdate
+
+		if(eb.LunarBar and eb.LunarBar:IsObjectType'StatusBar' and not eb.LunarBar:GetStatusBarTexture()) then
+			eb.LunarBar:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
+		end
+		if(eb.SolarBar and eb.SolarBar:IsObjectType'StatusBar' and not eb.SolarBar:GetStatusBarTexture()) then
+			eb.SolarBar:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
+		end
+
+		self:RegisterEvent('ECLIPSE_DIRECTION_CHANGE', ECLIPSE_DIRECTION_CHANGE, true)
+		self:RegisterEvent('PLAYER_TALENT_UPDATE', UPDATE_VISIBILITY, true)
+		self:RegisterEvent('UNIT_AURA', UNIT_AURA)
+		self:RegisterEvent('UNIT_POWER', UNIT_POWER)
+		self:RegisterEvent('UPDATE_SHAPESHIFT_FORM', UPDATE_VISIBILITY, true)
+
+		return true
+	end
+end
+
+local function Disable(self)
+	local eb = self.EclipseBar
+	if(eb) then
+		eb:Hide()
+		self:UnregisterEvent('ECLIPSE_DIRECTION_CHANGE', ECLIPSE_DIRECTION_CHANGE)
+		self:UnregisterEvent('PLAYER_TALENT_UPDATE', UPDATE_VISIBILITY)
+		self:UnregisterEvent('UNIT_AURA', UNIT_AURA)
+		self:UnregisterEvent('UNIT_POWER', UNIT_POWER)
+		self:UnregisterEvent('UPDATE_SHAPESHIFT_FORM', UPDATE_VISIBILITY)
+	end
+end
+
+oUF:AddElement('EclipseBar', Update, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/healprediction.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/healprediction.lua
new file mode 100644
index 0000000..a1f5a94
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/healprediction.lua
@@ -0,0 +1,168 @@
+local _, ns = ...
+local oUF = ns.oUF
+
+local function Update(self, event, unit)
+	if(self.unit ~= unit) or not unit then return end
+
+	local hp = self.HealPrediction
+	hp.parent = self
+	if(hp.PreUpdate) then hp:PreUpdate(unit) end
+
+	local myIncomingHeal = UnitGetIncomingHeals(unit, 'player') or 0
+	local allIncomingHeal = UnitGetIncomingHeals(unit) or 0
+	local totalAbsorb = UnitGetTotalAbsorbs(unit) or 0
+	local myCurrentHealAbsorb = UnitGetTotalHealAbsorbs(unit) or 0
+	local health, maxHealth = UnitHealth(unit), UnitHealthMax(unit)
+
+	local overHealAbsorb = false
+	if(health < myCurrentHealAbsorb) then
+		overHealAbsorb = true
+		myCurrentHealAbsorb = health
+	end
+
+	if(health - myCurrentHealAbsorb + allIncomingHeal > maxHealth * hp.maxOverflow) then
+		allIncomingHeal = maxHealth * hp.maxOverflow - health + myCurrentHealAbsorb
+	end
+
+	local otherIncomingHeal = 0
+	if(allIncomingHeal < myIncomingHeal) then
+		myIncomingHeal = allIncomingHeal
+	else
+		otherIncomingHeal = allIncomingHeal - myIncomingHeal
+	end
+
+	local overAbsorb = false
+	if(health - myCurrentHealAbsorb + allIncomingHeal + totalAbsorb >= maxHealth or health + totalAbsorb >= maxHealth) then
+		if(totalAbsorb > 0) then
+			overAbsorb = true
+		end
+
+		if(allIncomingHeal > myCurrentHealAbsorb) then
+			totalAbsorb = max(0, maxHealth - (health - myCurrentHealAbsorb + allIncomingHeal))
+		else
+			totalAbsorb = max(0, maxHealth - health)
+		end
+	end
+
+	if(myCurrentHealAbsorb > allIncomingHeal) then
+		myCurrentHealAbsorb = myCurrentHealAbsorb - allIncomingHeal
+	else
+		myCurrentHealAbsorb = 0
+	end
+
+	if(hp.myBar) then
+		hp.myBar:SetMinMaxValues(0, maxHealth)
+		hp.myBar:SetValue(myIncomingHeal)
+		hp.myBar:Show()
+	end
+
+	if(hp.otherBar) then
+		hp.otherBar:SetMinMaxValues(0, maxHealth)
+		hp.otherBar:SetValue(otherIncomingHeal)
+		hp.otherBar:Show()
+	end
+
+	if(hp.absorbBar) then
+		hp.absorbBar:SetMinMaxValues(0, maxHealth)
+		hp.absorbBar:SetValue(totalAbsorb)
+		hp.absorbBar:Show()
+	end
+
+	if(hp.healAbsorbBar) then
+		hp.healAbsorbBar:SetMinMaxValues(0, maxHealth)
+		hp.healAbsorbBar:SetValue(myCurrentHealAbsorb)
+		hp.healAbsorbBar:Show()
+	end
+
+	if(hp.PostUpdate) then
+		return hp:PostUpdate(unit, overAbsorb, overHealAbsorb)
+	end
+end
+
+local function Path(self, ...)
+	return (self.HealPrediction.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+local function Enable(self)
+	local hp = self.HealPrediction
+	if(hp) then
+		hp.__owner = self
+		hp.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('UNIT_HEAL_PREDICTION', Path)
+		self:RegisterEvent('UNIT_MAXHEALTH', Path)
+		if(hp.frequentUpdates) then
+			self:RegisterEvent('UNIT_HEALTH_FREQUENT', Path)
+		else
+			self:RegisterEvent('UNIT_HEALTH', Path)
+		end
+		self:RegisterEvent('UNIT_ABSORB_AMOUNT_CHANGED', Path)
+		self:RegisterEvent('UNIT_HEAL_ABSORB_AMOUNT_CHANGED', Path)
+
+		if(not hp.maxOverflow) then
+			hp.maxOverflow = 1.05
+		end
+
+		if(hp.myBar) then
+			if(hp.myBar:IsObjectType'StatusBar' and not hp.myBar:GetStatusBarTexture()) then
+				hp.myBar:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
+			end
+
+			hp.myBar:Show()
+		end
+		if(hp.otherBar) then
+			if(hp.otherBar:IsObjectType'StatusBar' and not hp.otherBar:GetStatusBarTexture()) then
+				hp.otherBar:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
+			end
+
+			hp.otherBar:Show()
+		end
+		if(hp.absorbBar) then
+			if(hp.absorbBar:IsObjectType'StatusBar' and not hp.absorbBar:GetStatusBarTexture()) then
+				hp.absorbBar:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
+			end
+
+			hp.absorbBar:Show()
+		end
+		if(hp.healAbsorbBar) then
+			if(hp.healAbsorbBar:IsObjectType'StatusBar' and not hp.healAbsorbBar:GetStatusBarTexture()) then
+				hp.healAbsorbBar:SetStatusBarTexture([[Interface\TargetingFrame\UI-StatusBar]])
+			end
+
+			hp.healAbsorbBar:Show()
+		end
+
+		return true
+	end
+end
+
+local function Disable(self)
+	local hp = self.HealPrediction
+	if(hp) then
+		if(hp.myBar) then
+			hp.myBar:Hide()
+		end
+		if(hp.otherBar) then
+			hp.otherBar:Hide()
+		end
+		if(hp.absorbBar) then
+			hp.absorbBar:Hide()
+		end
+		if(hp.healAbsorbBar) then
+			hp.healAbsorbBar:Hide()
+		end
+
+		self:UnregisterEvent('UNIT_HEAL_PREDICTION', Path)
+		self:UnregisterEvent('UNIT_MAXHEALTH', Path)
+		self:UnregisterEvent('UNIT_HEALTH', Path)
+		self:UnregisterEvent('UNIT_HEALTH_FREQUENT', Path)
+		self:UnregisterEvent('UNIT_ABSORB_AMOUNT_CHANGED', Path)
+		self:UnregisterEvent('UNIT_HEAL_ABSORB_AMOUNT_CHANGED', Path)
+	end
+end
+
+oUF:AddElement('HealPrediction', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/health.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/health.lua
new file mode 100644
index 0000000..3019292
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/health.lua
@@ -0,0 +1,262 @@
+--[[ Element: Health Bar
+
+	THIS FILE HEAVILY MODIFIED FOR USE WITH SUPERVILLAIN UI
+
+]]
+local parent, ns = ...
+local oUF = ns.oUF
+local updateFrequentUpdates
+local random = math.random
+oUF.colors.health = {49/255, 207/255, 37/255}
+
+local Update = function(self, event, unit)
+	if(self.unit ~= unit) or not unit then return end
+	local health = self.Health
+
+	local min, max = UnitHealth(unit), UnitHealthMax(unit)
+	local disconnected = not UnitIsConnected(unit)
+	local invisible = ((min == max) or UnitIsDeadOrGhost(unit) or disconnected)
+	if invisible then health.lowAlerted = false end
+
+	if health.fillInverted then
+		health:SetReverseFill(true)
+	end
+
+	health:SetMinMaxValues(0, max)
+
+	local percent = 100
+	if(disconnected) then
+		health:SetValue(max)
+		percent = 100
+	else
+		health:SetValue(min)
+		percent = (min / max) * 100
+	end
+
+	percent = invisible and 100 or ((min / max) * 100)
+
+	health.percent = percent
+	health.disconnected = disconnected
+
+	if health.frequentUpdates ~= health.__frequentUpdates then
+		health.__frequentUpdates = health.frequentUpdates
+		updateFrequentUpdates(self)
+	end
+
+	local bg = health.bg;
+	local db = oUF.SVConfigs;
+	local r, g, b, t, t2;
+
+	if(health.colorTapping and not UnitPlayerControlled(unit) and UnitIsTapped(unit) and not UnitIsTappedByPlayer(unit) and not UnitIsTappedByAllThreatList(unit)) then
+		t = oUF.colors.tapped
+	elseif(health.colorDisconnected and not UnitIsConnected(unit)) then
+		t = oUF.colors.disconnected
+	elseif(health.colorClass and UnitIsPlayer(unit)) or
+		(health.colorClassNPC and not UnitIsPlayer(unit)) or
+		(health.colorClassPet and UnitPlayerControlled(unit) and not UnitIsPlayer(unit)) then
+		local _, class = UnitClass(unit)
+		local tmp = oUF.colors.class[class] or oUF.colors.health
+		t = {(tmp[1] * 0.75),(tmp[2] * 0.75),(tmp[3] * 0.75)}
+		if(bg and (db and db.classbackdrop) and UnitIsPlayer(unit)) then
+			t2 = t
+		end
+	elseif(health.colorReaction and UnitReaction(unit, 'player')) then
+		t = oUF.colors.reaction[UnitReaction(unit, "player")]
+		if(bg and (db and db.classbackdrop) and not UnitIsPlayer(unit) and UnitReaction(unit, "player")) then
+			t2 = t
+		end
+	elseif(health.colorSmooth) then
+		r, g, b = oUF.ColorGradient(min, max, unpack(health.smoothGradient or oUF.colors.smooth))
+	elseif(health.colorHealth) then
+		t = oUF.colors.health
+	end
+
+	if(t) then
+		r, g, b = t[1], t[2], t[3]
+	end
+
+	if(b) then
+		if(db and db.healthclass == true and db.colorhealthbyvalue == true or db.colorhealthbyvalue and self.isForced and not(UnitIsTapped(unit) and not UnitIsTappedByPlayer(unit))) then
+			r, g, b = self.ColorGradient(min,max,1,0,0,1,1,0,r,g,b)
+		end
+		health:SetStatusBarColor(r, g, b)
+		if(bg) then
+			local mu = bg.multiplier or 1
+			if(t2) then
+				r, g, b = t2[1], t2[2], t2[3]
+			end
+			bg:SetVertexColor(r * mu, g * mu, b * mu)
+		end
+	end
+
+	if self.ResurrectIcon then
+		self.ResurrectIcon:SetAlpha(min == 0 and 1 or 0)
+	end
+
+	if self.isForced then
+		min = random(1,max)
+		health:SetValue(min)
+	end
+
+	if(health.gridMode) then
+		health:SetOrientation("VERTICAL")
+	end
+
+	if(health.LowAlertFunc and UnitIsPlayer("target") and health.percent < 6 and UnitIsEnemy("target", "player") and not health.lowAlerted) then
+		health.lowAlerted = true
+		health.LowAlertFunc(self)
+	end
+
+	if(health.PostUpdate) then
+		return health.PostUpdate(self, health.percent)
+	end
+end
+
+local CustomUpdate = function(self, event, unit)
+	if(self.unit ~= unit) or not unit then return end
+	local health = self.Health
+
+	local min, max = UnitHealth(unit), UnitHealthMax(unit)
+	local disconnected = not UnitIsConnected(unit)
+	local invisible = ((min == max) or UnitIsDeadOrGhost(unit) or disconnected);
+	local tapped = (UnitIsTapped(unit) and (not UnitIsTappedByPlayer(unit)));
+	if invisible then health.lowAlerted = false end
+
+	if health.fillInverted then
+		health:SetReverseFill(true)
+	end
+
+	health:SetMinMaxValues(-max, 0)
+	health:SetValue(-min)
+
+	health.percent = invisible and 100 or ((min / max) * 100)
+
+	health.disconnected = disconnected
+
+	if health.frequentUpdates ~= health.__frequentUpdates then
+		health.__frequentUpdates = health.frequentUpdates
+		updateFrequentUpdates(self)
+	end
+
+	local bg = health.bg;
+	local mu
+	if(max == 0) then
+		mu = 0
+	else
+		mu = (min / max)
+	end
+
+	if(invisible or not health.overlayAnimation) then
+		health.animation[1].anim:Stop()
+		health.animation[1]:SetAlpha(0)
+	end
+
+	if(invisible) then
+		health:SetStatusBarColor(0.6,0.4,1,0.5)
+		health.animation[1]:SetVertexColor(0.8,0.3,1,0.4)
+	elseif(health.colorOverlay) then
+		local t = oUF_Villain.colors.health
+		health:SetStatusBarColor(t[1], t[2], t[3], 0.9)
+	else
+		health:SetStatusBarColor(1, 0.25 * mu, 0, 0.85)
+		health.animation[1]:SetVertexColor(1, 0.1 * mu, 0, 0.5)
+	end
+
+	if(bg) then
+		bg:SetVertexColor(0,0,0,0)
+	end
+
+	if(health.overlayAnimation and not invisible) then
+		if(mu <= 0.25) then
+			health.animation[1]:SetAlpha(1)
+			health.animation[1].anim:Play()
+		else
+			health.animation[1].anim:Stop()
+			health.animation[1]:SetAlpha(0)
+		end
+	end
+
+	if self.ResurrectIcon then
+		self.ResurrectIcon:SetAlpha(min == 0 and 1 or 0)
+	end
+
+	if self.isForced then
+		local current = random(1,max)
+		health:SetValue(-current)
+	end
+
+	if(health.LowAlertFunc and UnitIsPlayer("target") and health.percent < 6 and UnitIsEnemy("target", "player") and not health.lowAlerted) then
+		health.lowAlerted = true
+		health.LowAlertFunc(self)
+	end
+
+	if(health.PostUpdate) then
+		return health.PostUpdate(self, health.percent)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.Health.Override and CustomUpdate or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+function updateFrequentUpdates(self)
+	local health = self.Health
+	if health.frequentUpdates and not self:IsEventRegistered("UNIT_HEALTH_FREQUENT") then
+		if GetCVarBool("predictedHealth") ~= 1 then
+			SetCVar("predictedHealth", 1)
+		end
+
+		self:RegisterEvent('UNIT_HEALTH_FREQUENT', Path)
+
+		if self:IsEventRegistered("UNIT_HEALTH") then
+			self:UnregisterEvent("UNIT_HEALTH", Path)
+		end
+	elseif not self:IsEventRegistered("UNIT_HEALTH") then
+		self:RegisterEvent('UNIT_HEALTH', Path)
+
+		if self:IsEventRegistered("UNIT_HEALTH_FREQUENT") then
+			self:UnregisterEvent("UNIT_HEALTH_FREQUENT", Path)
+		end
+	end
+end
+
+local Enable = function(self, unit)
+	local health = self.Health
+	if(health) then
+		health.__owner = self
+		health.ForceUpdate = ForceUpdate
+		health.__frequentUpdates = health.frequentUpdates
+		updateFrequentUpdates(self)
+
+		self:RegisterEvent("UNIT_MAXHEALTH", Path)
+		self:RegisterEvent('UNIT_CONNECTION', Path)
+
+		-- For tapping.
+		self:RegisterEvent('UNIT_FACTION', Path)
+
+		if(health:IsObjectType'StatusBar' and not health:GetStatusBarTexture()) then
+			health:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local health = self.Health
+	if(health) then
+		health:Hide()
+		self:UnregisterEvent('UNIT_HEALTH_FREQUENT', Path)
+		self:UnregisterEvent('UNIT_HEALTH', Path)
+		self:UnregisterEvent('UNIT_MAXHEALTH', Path)
+		self:UnregisterEvent('UNIT_CONNECTION', Path)
+
+		self:UnregisterEvent('UNIT_FACTION', Path)
+	end
+end
+
+oUF:AddElement('Health', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/leader.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/leader.lua
new file mode 100644
index 0000000..5246716
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/leader.lua
@@ -0,0 +1,56 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local Update = function(self, event)
+	local leader = self.Leader
+	if(leader.PreUpdate) then
+		leader:PreUpdate()
+	end
+
+	local unit = self.unit
+	local isLeader = (UnitInParty(unit) or UnitInRaid(unit)) and UnitIsGroupLeader(unit)
+	if(isLeader) then
+		leader:Show()
+	else
+		leader:Hide()
+	end
+
+	if(leader.PostUpdate) then
+		return leader:PostUpdate(isLeader)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.Leader.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate')
+end
+
+local Enable = function(self)
+	local leader = self.Leader
+	if(leader) then
+		leader.__owner = self
+		leader.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent("PARTY_LEADER_CHANGED", Path, true)
+		self:RegisterEvent("GROUP_ROSTER_UPDATE", Path, true)
+
+		if(leader:IsObjectType"Texture" and not leader:GetTexture()) then
+			leader:SetTexture[[Interface\GroupFrame\UI-Group-LeaderIcon]]
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local leader = self.Leader
+	if(leader) then
+		self:UnregisterEvent("PARTY_LEADER_CHANGED", Path)
+		self:UnregisterEvent("GROUP_ROSTER_UPDATE", Path)
+	end
+end
+
+oUF:AddElement('Leader', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/lfdrole.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/lfdrole.lua
new file mode 100644
index 0000000..b5ad1bc
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/lfdrole.lua
@@ -0,0 +1,59 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local Update = function(self, event)
+	local lfdrole = self.LFDRole
+	if(lfdrole.PreUpdate) then
+		lfdrole:PreUpdate()
+	end
+
+	local role = UnitGroupRolesAssigned(self.unit)
+	if(role == 'TANK' or role == 'HEALER' or role == 'DAMAGER') then
+		lfdrole:SetTexCoord(GetTexCoordsForRoleSmallCircle(role))
+		lfdrole:Show()
+	else
+		lfdrole:Hide()
+	end
+
+	if(lfdrole.PostUpdate) then
+		return lfdrole:PostUpdate(role)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.LFDRole.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate')
+end
+
+local Enable = function(self)
+	local lfdrole = self.LFDRole
+	if(lfdrole) then
+		lfdrole.__owner = self
+		lfdrole.ForceUpdate = ForceUpdate
+
+		if(self.unit == "player") then
+			self:RegisterEvent("PLAYER_ROLES_ASSIGNED", Path, true)
+		else
+			self:RegisterEvent("GROUP_ROSTER_UPDATE", Path, true)
+		end
+
+		if(lfdrole:IsObjectType"Texture" and not lfdrole:GetTexture()) then
+			lfdrole:SetTexture[[Interface\LFGFrame\UI-LFG-ICON-PORTRAITROLES]]
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local lfdrole = self.LFDRole
+	if(lfdrole) then
+		self:UnregisterEvent("PLAYER_ROLES_ASSIGNED", Path)
+		self:UnregisterEvent("GROUP_ROSTER_UPDATE", Path)
+	end
+end
+
+oUF:AddElement('LFDRole', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/masterlooter.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/masterlooter.lua
new file mode 100644
index 0000000..3299fab
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/masterlooter.lua
@@ -0,0 +1,74 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local Update = function(self, event)
+	local unit = self.unit
+	local masterlooter = self.MasterLooter
+	if(not (UnitInParty(unit) or UnitInRaid(unit))) then
+		return masterlooter:Hide()
+	end
+
+	if(masterlooter.PreUpdate) then
+		masterlooter:PreUpdate()
+	end
+
+	local method, pid, rid = GetLootMethod()
+	if(method == 'master') then
+		local mlUnit
+		if(pid) then
+			if(pid == 0) then
+				mlUnit = 'player'
+			else
+				mlUnit = 'party'..pid
+			end
+		elseif(rid) then
+			mlUnit = 'raid'..rid
+		end
+
+		if(UnitIsUnit(unit, mlUnit)) then
+			masterlooter:Show()
+		elseif(masterlooter:IsShown()) then
+			masterlooter:Hide()
+		end
+	else
+		masterlooter:Hide()
+	end
+
+	if(masterlooter.PostUpdate) then
+		return masterlooter:PostUpdate(masterlooter:IsShown())
+	end
+end
+
+local Path = function(self, ...)
+	return (self.MasterLooter.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate')
+end
+
+local function Enable(self, unit)
+	local masterlooter = self.MasterLooter
+	if(masterlooter) then
+		masterlooter.__owner = self
+		masterlooter.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('PARTY_LOOT_METHOD_CHANGED', Path, true)
+		self:RegisterEvent('GROUP_ROSTER_UPDATE', Path, true)
+
+		if(masterlooter:IsObjectType('Texture') and not masterlooter:GetTexture()) then
+			masterlooter:SetTexture([[Interface\GroupFrame\UI-Group-MasterLooter]])
+		end
+
+		return true
+	end
+end
+
+local function Disable(self)
+	if(self.MasterLooter) then
+		self:UnregisterEvent('PARTY_LOOT_METHOD_CHANGED', Path)
+		self:UnregisterEvent('GROUP_ROSTER_UPDATE', Path)
+	end
+end
+
+oUF:AddElement('MasterLooter', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/picon.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/picon.lua
new file mode 100644
index 0000000..ecfaefa
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/picon.lua
@@ -0,0 +1,53 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local Update = function(self, event)
+	local picon = self.PhaseIcon
+	if(picon.PreUpdate) then
+		picon:PreUpdate()
+	end
+
+	local inPhase = UnitInPhase(self.unit)
+	if(inPhase) then
+		picon:Hide()
+	else
+		picon:Show()
+	end
+
+	if(picon.PostUpdate) then
+		return picon:PostUpdate(inPhase)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.PhaseIcon.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate')
+end
+
+local Enable = function(self)
+	local picon = self.PhaseIcon
+	if(picon) then
+		picon.__owner = self
+		picon.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('UNIT_PHASE', Path, true)
+
+		if(picon:IsObjectType'Texture' and not picon:GetTexture()) then
+			picon:SetTexture[[Interface\TargetingFrame\UI-PhasingIcon]]
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local picon = self.PhaseIcon
+	if(picon) then
+		self:UnregisterEvent('UNIT_PHASE', Path)
+	end
+end
+
+oUF:AddElement('PhaseIcon', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/portraits.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/portraits.lua
new file mode 100644
index 0000000..66b810b
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/portraits.lua
@@ -0,0 +1,114 @@
+--[[ Element: Portraits
+
+	THIS FILE HEAVILY MODIFIED FOR USE WITH SUPERVILLAIN UI
+
+]]
+local parent, ns = ...
+local oUF = ns.oUF
+
+local Update = function(self, event, unit)
+	if(not unit or not UnitIsUnit(self.unit, unit)) then return end
+
+	local portrait = self.Portrait
+	if(portrait.PreUpdate) then portrait:PreUpdate(unit) end
+
+	if(portrait:IsObjectType'Model') then
+		local guid = UnitGUID(unit)
+		local camera = portrait.UserCamDistance or 1
+		local rotate = portrait.UserRotation
+		if(not UnitExists(unit) or not UnitIsConnected(unit) or not UnitIsVisible(unit)) then
+			portrait:SetCamDistanceScale(1)
+			portrait:SetPortraitZoom(0)
+			portrait:SetPosition(4,-1,1)
+			portrait:ClearModel()
+			portrait:SetModel([[Spells\Monk_travelingmist_missile.m2]])
+			portrait.guid = nil
+			portrait:SetBackdropColor(0.25,0.25,0.25)
+			if portrait.UpdateColor then
+				portrait:UpdateColor(0.25,0.25,0.25)
+			end
+		elseif(portrait.guid ~= guid or event == 'UNIT_MODEL_CHANGED') then
+			portrait:SetCamDistanceScale(camera)
+			portrait:SetPortraitZoom(1)
+			portrait:SetPosition(0,0,0)
+			portrait:ClearModel()
+			portrait:SetUnit(unit)
+			portrait.guid = guid
+
+			if(rotate and portrait:GetFacing() ~= rotate / 60) then
+				portrait:SetFacing(rotate / 60)
+			end
+
+			local r, g, b, color = 0.25, 0.25, 0.25
+			if not UnitIsPlayer(unit)then
+				color = self.colors.reaction[UnitReaction(unit,"player")]
+				if(color ~= nil) then
+					r,g,b = color[1], color[2], color[3]
+				end
+			else
+				local _,unitClass = UnitClass(unit)
+				if unitClass then
+					color = self.colors.class[unitClass]
+					r,g,b = color[1], color[2], color[3]
+				end
+			end
+			portrait:SetBackdropColor(r,g,b)
+			if portrait.UpdateColor then
+				portrait:UpdateColor(r,g,b)
+			end
+		end
+	else
+		SetPortraitTexture(portrait, unit)
+	end
+
+	if(portrait.PostUpdate) then
+		return portrait:PostUpdate(unit)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.Portrait.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+local Enable = function(self, unit)
+	local portrait = self.Portrait
+	if(portrait) then
+		portrait.__owner = self
+		portrait.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent("UNIT_PORTRAIT_UPDATE", Path)
+		self:RegisterEvent("UNIT_MODEL_CHANGED", Path)
+		self:RegisterEvent('UNIT_CONNECTION', Path)
+		if(unit == 'target' or unit == 'targettarget') then
+			self:RegisterEvent('PLAYER_TARGET_CHANGED', Path)
+		end
+		-- The quest log uses PARTY_MEMBER_{ENABLE,DISABLE} to handle updating of
+		-- party members overlapping quests. This will probably be enough to handle
+		-- model updating.
+		--
+		-- DISABLE isn't used as it fires when we most likely don't have the
+		-- information we want.
+		if(unit == 'party') then
+			self:RegisterEvent('PARTY_MEMBER_ENABLE', Path)
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local portrait = self.Portrait
+	if(portrait) then
+		self:UnregisterEvent("UNIT_PORTRAIT_UPDATE", Path)
+		self:UnregisterEvent("UNIT_MODEL_CHANGED", Path)
+		self:UnregisterEvent('PARTY_MEMBER_ENABLE', Path)
+		self:UnregisterEvent('UNIT_CONNECTION', Path)
+		self:UnregisterEvent('PLAYER_TARGET_CHANGED', Path)
+	end
+end
+
+oUF:AddElement('Portrait', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/power.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/power.lua
new file mode 100644
index 0000000..9275a54
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/power.lua
@@ -0,0 +1,153 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local updateFrequentUpdates
+oUF.colors.power = {}
+for power, color in next, PowerBarColor do
+	if(type(power) == 'string') then
+		oUF.colors.power[power] = {color.r, color.g, color.b}
+	end
+end
+local GetDisplayPower = function(power, unit)
+	if not unit then return; end
+	local _, _, _, _, _, _, showOnRaid = UnitAlternatePowerInfo(unit)
+	if(power.displayAltPower and showOnRaid) then
+		return ALTERNATE_POWER_INDEX
+	else
+		return (UnitPowerType(unit))
+	end
+end
+
+local Update = function(self, event, unit)
+	if(self.unit ~= unit) or not unit then return end
+	local power = self.Power
+
+	if(power.PreUpdate) then power:PreUpdate(unit) end
+
+	local displayType = GetDisplayPower(power, unit)
+	local min, max = UnitPower(unit, displayType), UnitPowerMax(unit, displayType)
+	local disconnected = not UnitIsConnected(unit)
+	if max == 0 then
+		max = 1
+	end
+	power:SetMinMaxValues(0, max)
+
+	if(disconnected) then
+		power:SetValue(max)
+	else
+		power:SetValue(min)
+	end
+
+	power.disconnected = disconnected
+	if power.frequentUpdates ~= power.__frequentUpdates then
+		power.__frequentUpdates = power.frequentUpdates
+		updateFrequentUpdates(self)
+	end
+
+	local r, g, b, t
+	if(power.colorTapping and not UnitPlayerControlled(unit) and UnitIsTapped(unit) and not UnitIsTappedByPlayer(unit) and not UnitIsTappedByAllThreatList(unit)) then
+		t = self.colors.tapped
+	elseif(power.colorDisconnected and not UnitIsConnected(unit)) then
+		t = self.colors.disconnected
+	elseif(power.colorPower) then
+		local ptype, ptoken, altR, altG, altB = UnitPowerType(unit)
+		t = self.colors.power[ptoken]
+		if(not t and altR) then
+			r, g, b = altR, altG, altB
+		end
+	elseif(power.colorClass and UnitIsPlayer(unit)) or
+		(power.colorClassNPC and not UnitIsPlayer(unit)) or
+		(power.colorClassPet and UnitPlayerControlled(unit) and not UnitIsPlayer(unit)) then
+		local _, class = UnitClass(unit)
+		t = self.colors.class[class]
+	elseif(power.colorReaction and UnitReaction(unit, 'player')) then
+		t = self.colors.reaction[UnitReaction(unit, "player")]
+	elseif(power.colorSmooth) then
+		r, g, b = self.ColorGradient(min, max, unpack(power.smoothGradient or self.colors.smooth))
+	end
+
+	if(t) then
+		r, g, b = t[1], t[2], t[3]
+	end
+
+	if(b) then
+		power:SetStatusBarColor(r, g, b)
+
+		local bg = power.bg
+		if(bg) then
+			local mu = bg.multiplier or 1
+			bg:SetVertexColor(r * mu, g * mu, b * mu)
+		end
+	end
+
+	if(power.PostUpdate) then
+		return power:PostUpdate(unit, min, max)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.Power.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+function updateFrequentUpdates(self)
+	local power = self.Power
+	if power.frequentUpdates and not self:IsEventRegistered('UNIT_POWER_FREQUENT') then
+		self:RegisterEvent('UNIT_POWER_FREQUENT', Path)
+
+		if self:IsEventRegistered('UNIT_POWER') then
+			self:UnregisterEvent('UNIT_POWER', Path)
+		end
+	elseif not self:IsEventRegistered('UNIT_POWER') then
+		self:RegisterEvent('UNIT_POWER', Path)
+
+		if self:IsEventRegistered('UNIT_POWER_FREQUENT') then
+			self:UnregisterEvent('UNIT_POWER_FREQUENT', Path)
+		end
+	end
+end
+
+local Enable = function(self, unit)
+	local power = self.Power
+	if(power) then
+		power.__owner = self
+		power.ForceUpdate = ForceUpdate
+
+		power.__frequentUpdates = power.frequentUpdates
+		updateFrequentUpdates(self)
+
+		self:RegisterEvent('UNIT_POWER_BAR_SHOW', Path)
+		self:RegisterEvent('UNIT_POWER_BAR_HIDE', Path)
+		self:RegisterEvent('UNIT_DISPLAYPOWER', Path)
+		self:RegisterEvent('UNIT_CONNECTION', Path)
+		self:RegisterEvent('UNIT_MAXPOWER', Path)
+
+		-- For tapping.
+		self:RegisterEvent('UNIT_FACTION', Path)
+
+		if(power:IsObjectType'StatusBar' and not power:GetStatusBarTexture()) then
+			power:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local power = self.Power
+	if(power) then
+		self:UnregisterEvent('UNIT_POWER_FREQUENT', Path)
+		self:UnregisterEvent('UNIT_POWER', Path)
+		self:UnregisterEvent('UNIT_POWER_BAR_SHOW', Path)
+		self:UnregisterEvent('UNIT_POWER_BAR_HIDE', Path)
+		self:UnregisterEvent('UNIT_DISPLAYPOWER', Path)
+		self:UnregisterEvent('UNIT_CONNECTION', Path)
+		self:UnregisterEvent('UNIT_MAXPOWER', Path)
+		self:UnregisterEvent('UNIT_FACTION', Path)
+	end
+end
+
+oUF:AddElement('Power', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/pvp.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/pvp.lua
new file mode 100644
index 0000000..27d7d74
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/pvp.lua
@@ -0,0 +1,61 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local Update = function(self, event, unit)
+	if(unit ~= self.unit) then return end
+
+	local pvp = self.PvP
+	if(pvp.PreUpdate) then
+		pvp:PreUpdate()
+	end
+
+	local status
+	local factionGroup = UnitFactionGroup(unit)
+	if(UnitIsPVPFreeForAll(unit)) then
+		pvp:SetTexture[[Interface\TargetingFrame\UI-PVP-FFA]]
+		status = 'ffa'
+	elseif(factionGroup and factionGroup ~= 'Neutral' and UnitIsPVP(unit)) then
+		pvp:SetTexture([[Interface\TargetingFrame\UI-PVP-]]..factionGroup)
+		status = factionGroup
+	end
+
+	if(status) then
+		pvp:Show()
+	else
+		pvp:Hide()
+	end
+
+	if(pvp.PostUpdate) then
+		return pvp:PostUpdate(status)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.PvP.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+local Enable = function(self)
+	local pvp = self.PvP
+	if(pvp) then
+		pvp.__owner = self
+		pvp.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent("UNIT_FACTION", Path)
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local pvp = self.PvP
+	if(pvp) then
+		pvp:Hide()
+		self:UnregisterEvent("UNIT_FACTION", Path)
+	end
+end
+
+oUF:AddElement('PvP', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/qicon.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/qicon.lua
new file mode 100644
index 0000000..cc2e4a6
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/qicon.lua
@@ -0,0 +1,54 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local Update = function(self, event, unit)
+	if(unit ~= self.unit) then return end
+
+	local qicon = self.QuestIcon
+	if(qicon.PreUpdate) then
+		qicon:PreUpdate()
+	end
+
+	local isQuestBoss = UnitIsQuestBoss(unit)
+	if(isQuestBoss) then
+		qicon:Show()
+	else
+		qicon:Hide()
+	end
+
+	if(qicon.PostUpdate) then
+		return qicon:PostUpdate(isQuestBoss)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.QuestIcon.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+local Enable = function(self)
+	local qicon = self.QuestIcon
+	if(qicon) then
+		qicon.__owner = self
+		qicon.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('UNIT_CLASSIFICATION_CHANGED', Path)
+
+		if(qicon:IsObjectType'Texture' and not qicon:GetTexture()) then
+			qicon:SetTexture[[Interface\TargetingFrame\PortraitQuestBadge]]
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	if(self.QuestIcon) then
+		self:UnregisterEvent('UNIT_CLASSIFICATION_CHANGED', Path)
+	end
+end
+
+oUF:AddElement('QuestIcon', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/range.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/range.lua
new file mode 100644
index 0000000..5978aac
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/range.lua
@@ -0,0 +1,250 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local _FRAMES = {}
+local OnRangeFrame
+
+local UnitIsConnected = UnitIsConnected
+local tinsert, tremove, twipe = table.insert, table.remove, table.wipe
+
+local friendlySpells, resSpells, longEnemySpells, enemySpells, petSpells = {}, {}, {}, {}, {}
+
+local function AddSpell(table, spellID)
+	local name = GetSpellInfo(spellID)
+	if name then
+		local usable, nomana = IsUsableSpell(name)
+		if usable or nomana then
+			table[#table + 1] = name
+		end
+	end
+end
+
+local _,class = UnitClass("player")
+local function UpdateSpellList()
+	twipe(friendlySpells)
+	twipe(resSpells)
+	twipe(longEnemySpells)
+	twipe(enemySpells)
+	twipe(petSpells)
+
+	if class == "PRIEST" then
+		AddSpell(enemySpells, 585) -- Smite
+		AddSpell(longEnemySpells, 589) -- Shadow Word: Pain
+		AddSpell(friendlySpells, 2061) -- Flash Heal
+		AddSpell(resSpells, 2006) -- Resurrection
+	elseif class == "DRUID" then
+		AddSpell(enemySpells, 33786) -- Cyclone
+		AddSpell(longEnemySpells, 5176) -- Wrath
+		AddSpell(friendlySpells, 774) -- Rejuvenation
+		AddSpell(resSpells, 50769) -- Revive
+		AddSpell(resSpells, 20484) -- Rebirth
+	elseif class == "PALADIN" then
+		AddSpell(enemySpells, 20271) -- Judgement
+		AddSpell(friendlySpells, 85673) -- Word of Glory
+		AddSpell(resSpells, 7328) -- Redemption
+		AddSpell(longEnemySpells, 114165) -- Holy Prism
+		AddSpell(longEnemySpells, 114157) -- Execution Sentence
+	elseif class == "SHAMAN" then
+		AddSpell(enemySpells, 8042) -- Earth Shock
+		AddSpell(longEnemySpells, 403) -- Lightning Bolt
+		AddSpell(friendlySpells, 8004) -- Healing Surge
+		AddSpell(resSpells, 2008) -- Ancestral Spirit
+	elseif class == "WARLOCK" then
+		AddSpell(enemySpells, 5782) -- Fear
+		AddSpell(longEnemySpells, 172) -- Corruption
+		AddSpell(longEnemySpells, 686) -- Shadow Bolt
+		AddSpell(longEnemySpells, 17962) -- Conflag
+		AddSpell(petSpells, 755) -- Health Funnel
+		AddSpell(friendlySpells, 5697) -- Unending Breath
+	elseif class == "MAGE" then
+		AddSpell(enemySpells, 118) -- Polymorph
+		AddSpell(longEnemySpells, 44614) -- Frostfire Bolt
+		AddSpell(friendlySpells, 475) -- Remove Curse
+	elseif class == "HUNTER" then
+		AddSpell(petSpells, 136) -- Mend Pet
+		AddSpell(enemySpells, 75) -- Auto Shot
+	elseif class == "DEATHKNIGHT" then
+		AddSpell(enemySpells, 49576) -- Death Grip
+		AddSpell(friendlySpells, 47541) -- Death Coil
+		AddSpell(resSpells, 61999) -- Raise Ally
+	elseif class == "ROGUE" then
+		AddSpell(enemySpells, 2094) -- Blind
+		AddSpell(longEnemySpells, 1725) -- Distract
+		AddSpell(friendlySpells, 57934) -- Tricks of the Trade
+	elseif class == "WARRIOR" then
+		AddSpell(enemySpells, 5246) -- Intimidating Shout
+		AddSpell(enemySpells, 100) -- Charge
+		AddSpell(longEnemySpells, 355) -- Taunt
+		AddSpell(friendlySpells, 3411) -- Intervene
+	elseif class == "MONK" then
+		AddSpell(enemySpells, 115546) -- Provoke
+		AddSpell(friendlySpells, 115450) -- Detox
+		AddSpell(resSpells, 115178) -- Resuscitate
+	end
+end
+
+local function getUnit(unit)
+	if not unit:find("party") or not unit:find("raid") then
+		for i=1, 4 do
+			if UnitIsUnit(unit, "party"..i) then
+				return "party"..i
+			end
+		end
+
+		for i=1, 40 do
+			if UnitIsUnit(unit, "raid"..i) then
+				return "raid"..i
+			end
+		end
+	else
+		return unit
+	end
+end
+
+local function friendlyIsInRange(unit)
+	if CheckInteractDistance(unit, 1) then
+		return true
+	end
+
+	if UnitIsDeadOrGhost(unit) and #resSpells > 0 then
+		for _, name in ipairs(resSpells) do
+			if IsSpellInRange(name, unit) == 1 then
+				return true
+			end
+		end
+
+		return false
+	end
+
+	if #friendlySpells == 0 and (UnitInRaid(unit) or UnitInParty(unit)) then
+		unit = getUnit(unit)
+		return unit and UnitInRange(unit)
+	else
+		for _, name in ipairs(friendlySpells) do
+			if IsSpellInRange(name, unit) == 1 then
+				return true
+			end
+		end
+	end
+
+	return false
+end
+
+local function petIsInRange(unit)
+	if CheckInteractDistance(unit, 2) then
+		return true
+	end
+
+	for _, name in ipairs(friendlySpells) do
+		if IsSpellInRange(name, unit) == 1 then
+			return true
+		end
+	end
+	for _, name in ipairs(petSpells) do
+		if IsSpellInRange(name, unit) == 1 then
+			return true
+		end
+	end
+
+	return false
+end
+
+local function enemyIsInRange(unit)
+	for _, name in ipairs(enemySpells) do
+		if IsSpellInRange(name, unit) == 1 then
+			return true
+		end
+	end
+
+	return false
+end
+
+local function enemyIsInLongRange(unit)
+	for _, name in ipairs(longEnemySpells) do
+		if IsSpellInRange(name, unit) == 1 then
+			return true
+		end
+	end
+
+	return false
+end
+
+-- updating of range.
+local timer = 0
+local OnRangeUpdate = function(self, elapsed)
+	timer = timer + elapsed
+
+	if(timer >= .20) then
+		for _, object in next, _FRAMES do
+			if(object:IsShown()) then
+				local range = object.Range
+				local unit = object.unit
+				if(unit) then
+					if UnitCanAttack("player", unit) then
+						if enemyIsInRange(unit) then
+							object:SetAlpha(range.insideAlpha)
+						elseif enemyIsInLongRange(unit) then
+							object:SetAlpha(range.insideAlpha)
+						else
+							object:SetAlpha(range.outsideAlpha)
+						end
+					elseif UnitIsUnit(unit, "pet") then
+						if petIsInRange(unit) then
+							object:SetAlpha(range.insideAlpha)
+						else
+							object:SetAlpha(range.outsideAlpha)
+						end
+					else
+						if friendlyIsInRange(unit) and UnitIsConnected(unit) then
+							object:SetAlpha(range.insideAlpha)
+						else
+							object:SetAlpha(range.outsideAlpha)
+						end
+					end
+				else
+					object:SetAlpha(range.insideAlpha)
+				end
+			end
+		end
+
+		timer = 0
+	end
+end
+
+local Enable = function(self)
+	local range = self.Range
+	if(range and range.insideAlpha and range.outsideAlpha) then
+		tinsert(_FRAMES, self)
+
+		if(not OnRangeFrame) then
+			OnRangeFrame = CreateFrame"Frame"
+			OnRangeFrame:RegisterEvent("LEARNED_SPELL_IN_TAB");
+			OnRangeFrame:RegisterEvent("PLAYER_ENTERING_WORLD");
+			OnRangeFrame:SetScript("OnUpdate", OnRangeUpdate)
+			OnRangeFrame:SetScript("OnEvent", UpdateSpellList)
+		end
+
+		OnRangeFrame:Show()
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local range = self.Range
+	if(range) then
+		for k, frame in next, _FRAMES do
+			if(frame == self) then
+				tremove(_FRAMES, k)
+				frame:SetAlpha(1)
+				break
+			end
+		end
+
+		if(#_FRAMES == 0) then
+			OnRangeFrame:Hide()
+		end
+	end
+end
+
+oUF:AddElement('Range', nil, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/readycheck.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/readycheck.lua
new file mode 100644
index 0000000..1326eb8
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/readycheck.lua
@@ -0,0 +1,130 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local _TIMERS = {}
+local ReadyCheckFrame
+
+local removeEntry = function(icon)
+	_TIMERS[icon] = nil
+	if(not next(_TIMERS)) then
+		return ReadyCheckFrame:Hide()
+	end
+end
+
+local Start = function(self)
+	removeEntry(self)
+
+	self:SetTexture(READY_CHECK_WAITING_TEXTURE)
+	self.state = 'waiting'
+	self:SetAlpha(1)
+	self:Show()
+end
+
+local Confirm = function(self, ready)
+	removeEntry(self)
+
+	if(ready) then
+		self:SetTexture(READY_CHECK_READY_TEXTURE)
+		self.state = 'ready'
+	else
+		self:SetTexture(READY_CHECK_NOT_READY_TEXTURE)
+		self.state = 'notready'
+	end
+
+	self:SetAlpha(1)
+	self:Show()
+end
+
+local Finish = function(self)
+	if(self.state == 'waiting') then
+		self:SetTexture(READY_CHECK_AFK_TEXTURE)
+		self.state = 'afk'
+	end
+
+	self.finishedTimer = self.finishedTime or 10
+	self.fadeTimer = self.fadeTime or 1.5
+
+	_TIMERS[self] = true
+	ReadyCheckFrame:Show()
+end
+
+local OnUpdate = function(self, elapsed)
+	self.elapsed = (self.elapsed or 0) + elapsed
+	if self.elapsed < .25 then return end
+
+	for icon in next, _TIMERS do
+		if(icon.finishedTimer) then
+			icon.finishedTimer = icon.finishedTimer - self.elapsed
+			if(icon.finishedTimer <= 0) then
+				icon.finishedTimer = nil
+			end
+		elseif(icon.fadeTimer) then
+			icon.fadeTimer = icon.fadeTimer - self.elapsed
+			icon:SetAlpha(icon.fadeTimer / (icon.fadeTime or 1.5))
+
+			if(icon.fadeTimer <= 0) then
+				icon:Hide()
+				removeEntry(icon)
+			end
+		end
+	end
+
+	self.elapsed = 0
+end
+
+local Update = function(self, event)
+	local unit = self.unit
+	local readyCheck = self.ReadyCheck
+	if(event == 'READY_CHECK_FINISHED') then
+		Finish(readyCheck)
+	else
+		local status = GetReadyCheckStatus(unit)
+		if(UnitExists(unit) and status) then
+			if(status == 'ready') then
+				Confirm(readyCheck, 1)
+			elseif(status == 'notready') then
+				Confirm(readyCheck)
+			else
+				Start(readyCheck)
+			end
+		end
+	end
+end
+
+local Path = function(self, ...)
+	return (self.ReadyCheck.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate')
+end
+
+local Enable = function(self, unit)
+	local readyCheck = self.ReadyCheck
+	if(readyCheck and (unit and (unit:sub(1, 5) == 'party' or unit:sub(1,4) == 'raid'))) then
+		readyCheck.__owner = self
+		readyCheck.ForceUpdate = ForceUpdate
+
+		if(not ReadyCheckFrame) then
+			ReadyCheckFrame = CreateFrame'Frame'
+			ReadyCheckFrame:SetScript('OnUpdate', OnUpdate)
+		end
+
+		self:RegisterEvent('READY_CHECK', Path, true)
+		self:RegisterEvent('READY_CHECK_CONFIRM', Path, true)
+		self:RegisterEvent('READY_CHECK_FINISHED', Path, true)
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local readyCheck = self.ReadyCheck
+	if(readyCheck) then
+		self:UnregisterEvent('READY_CHECK', Path)
+		self:UnregisterEvent('READY_CHECK_CONFIRM', Path)
+		self:UnregisterEvent('READY_CHECK_FINISHED', Path)
+	end
+end
+
+oUF:AddElement('ReadyCheck', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/resting.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/resting.lua
new file mode 100644
index 0000000..ab1de54
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/resting.lua
@@ -0,0 +1,54 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local Update = function(self, event)
+	local resting = self.Resting
+	if(resting.PreUpdate) then
+		resting:PreUpdate()
+	end
+
+	local isResting = IsResting()
+	if(isResting) then
+		resting:Show()
+	else
+		resting:Hide()
+	end
+
+	if(resting.PostUpdate) then
+		return resting:PostUpdate(isResting)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.Resting.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate')
+end
+
+local Enable = function(self, unit)
+	local resting = self.Resting
+	if(resting and unit == 'player') then
+		resting.__owner = self
+		resting.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent("PLAYER_UPDATE_RESTING", Path, true)
+
+		if(resting:IsObjectType"Texture" and not resting:GetTexture()) then
+			resting:SetTexture[[Interface\CharacterFrame\UI-StateIcon]]
+			resting:SetTexCoord(0, .5, 0, .421875)
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local resting = self.Resting
+	if(resting) then
+		self:UnregisterEvent("PLAYER_UPDATE_RESTING", Path)
+	end
+end
+
+oUF:AddElement('Resting', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/resurrect.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/resurrect.lua
new file mode 100644
index 0000000..e6fc1ab
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/resurrect.lua
@@ -0,0 +1,54 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local Update = function(self, event)
+	if not self.unit then return; end
+	local resurrect = self.ResurrectIcon
+	if(resurrect.PreUpdate) then
+		resurrect:PreUpdate()
+	end
+
+	local incomingResurrect = UnitHasIncomingResurrection(self.unit)
+	if(incomingResurrect) then
+		resurrect:Show()
+	else
+		resurrect:Hide()
+	end
+
+	if(resurrect.PostUpdate) then
+		return resurrect:PostUpdate(incomingResurrect)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.ResurrectIcon.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate')
+end
+
+local Enable = function(self)
+	local resurrect = self.ResurrectIcon
+	if(resurrect) then
+		resurrect.__owner = self
+		resurrect.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('INCOMING_RESURRECT_CHANGED', Path, true)
+
+		if(resurrect:IsObjectType('Texture') and not resurrect:GetTexture()) then
+			resurrect:SetTexture[[Interface\RaidFrame\Raid-Icon-Rez]]
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local resurrect = self.ResurrectIcon
+	if(resurrect) then
+		self:UnregisterEvent('INCOMING_RESURRECT_CHANGED', Path)
+	end
+end
+
+oUF:AddElement('ResurrectIcon', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/ricons.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/ricons.lua
new file mode 100644
index 0000000..d990b62
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/ricons.lua
@@ -0,0 +1,59 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local GetRaidTargetIndex = GetRaidTargetIndex
+local SetRaidTargetIconTexture = SetRaidTargetIconTexture
+
+local Update = function(self, event)
+	if not self.unit then return end
+	local icon = self.RaidIcon
+	if(icon.PreUpdate) then
+		icon:PreUpdate()
+	end
+
+	local index = GetRaidTargetIndex(self.unit)
+	if(index) then
+		SetRaidTargetIconTexture(icon, index)
+		icon:Show()
+	else
+		icon:Hide()
+	end
+
+	if(icon.PostUpdate) then
+		return icon:PostUpdate(index)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.RaidIcon.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	if(not element.__owner.unit) then return end
+	return Path(element.__owner, 'ForceUpdate')
+end
+
+local Enable = function(self)
+	local ricon = self.RaidIcon
+	if(ricon) then
+		ricon.__owner = self
+		ricon.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent("RAID_TARGET_UPDATE", Path, true)
+
+		if(ricon:IsObjectType"Texture" and not ricon:GetTexture()) then
+			ricon:SetTexture[[Interface\TargetingFrame\UI-RaidTargetingIcons]]
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local ricon = self.RaidIcon
+	if(ricon) then
+		self:UnregisterEvent("RAID_TARGET_UPDATE", Path)
+	end
+end
+
+oUF:AddElement('RaidIcon', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/runebar.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/runebar.lua
new file mode 100644
index 0000000..45f02cb
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/runebar.lua
@@ -0,0 +1,168 @@
+--[[ Element: Runes Bar
+
+ Handle updating and visibility of the Death Knight's Rune indicators.
+
+ Widget
+
+ Runes - An array holding six StatusBar's.
+
+ Sub-Widgets
+
+ .bg - A Texture which functions as a background. It will inherit the color of
+       the main StatusBar.
+
+ Notes
+
+ The default StatusBar texture will be applied if the UI widget doesn't have a
+             status bar texture or color defined.
+
+ Sub-Widgets Options
+
+ .multiplier - Defines a multiplier, which is used to tint the background based
+               on the main widgets R, G and B values. Defaults to 1 if not
+               present.
+
+ Examples
+
+   local Runes = {}
+   for index = 1, 6 do
+      -- Position and size of the rune bar indicators
+      local Rune = CreateFrame('StatusBar', nil, self)
+      Rune:SetSize(120 / 6, 20)
+      Rune:SetPoint('TOPLEFT', self, 'BOTTOMLEFT', index * 120 / 6, 0)
+
+      Runes[index] = Rune
+   end
+
+   -- Register with oUF
+   self.Runes = Runes
+]]
+
+if select(2, UnitClass("player")) ~= "DEATHKNIGHT" then return end
+
+
+local parent, ns = ...
+local oUF = ns.oUF
+local floor = math.floor
+
+oUF.colors.Runes = {
+	{1, 0, 0},   -- blood
+	{0, .5, 0},  -- unholy
+	{0, 1, 1},   -- frost
+	{.9, .1, 1}, -- death
+}
+
+local runemap = { 1, 2, 5, 6, 3, 4 }
+local BLOOD_OF_THE_NORTH = 54637
+local OnUpdate = function(self, elapsed)
+	local duration = self.duration + elapsed
+	if(duration >= self.max) then
+		return self:SetScript("OnUpdate", nil)
+	else
+		self.duration = duration
+		return self:SetValue(duration)
+	end
+end
+
+local spellName = GetSpellInfo(54637)
+local UpdateType = function(self, event, rid, alt)
+	local isUsable = IsUsableSpell(spellName)
+	local rune = self.Runes[runemap[rid]]
+	local runeType = GetRuneType(rid) or alt
+	if isUsable and runeType == 1 then runeType = 4; end
+	if not runeType then return; end
+	local colors = oUF.colors.Runes[runeType]
+	local r, g, b = colors[1], colors[2], colors[3]
+	rune:SetStatusBarColor(r, g, b)
+
+	if(rune.bg) then
+		local mu = rune.bg.multiplier or 1
+		rune.bg:SetVertexColor(r * mu, g * mu, b * mu)
+	end
+end
+
+local UpdateRune = function(self, event, rid)
+	local rune = self.Runes[runemap[rid]]
+	if(rune) then
+		local start, duration, runeReady = GetRuneCooldown(rid)
+		if(runeReady) then
+			rune:SetMinMaxValues(0, 1)
+			rune:SetValue(1)
+			rune:SetScript("OnUpdate", nil)
+		else
+			rune.duration = GetTime() - start
+			rune.max = duration
+			rune:SetMinMaxValues(1, duration)
+			rune:SetScript("OnUpdate", OnUpdate)
+		end
+	end
+end
+
+local Update = function(self, event)
+	for i=1, 6 do
+		UpdateRune(self, event, i)
+	end
+end
+
+local function UpdateAllRuneTypes(self)
+	if(self) then
+		for i=1, 6 do
+			UpdateType(self, nil, i)
+		end
+	end
+end
+
+local ForceUpdate = function(element)
+	return Update(element.__owner, 'ForceUpdate')
+end
+
+local Enable = function(self, unit)
+	local runes = self.Runes
+	if(runes and unit == 'player') then
+		runes.__owner = self
+		runes.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent("RUNE_POWER_UPDATE", UpdateRune, true)
+		self:RegisterEvent("RUNE_TYPE_UPDATE", UpdateType, true)	--I have no idea why this won't fire on initial login.
+		self:RegisterEvent("PLAYER_ENTERING_WORLD", UpdateAllRuneTypes)
+
+		if not runes.UpdateAllRuneTypes then runes.UpdateAllRuneTypes = UpdateAllRuneTypes end
+
+		for i=1, 6 do
+			local rune = runes[runemap[i]]
+			if(rune:IsObjectType'StatusBar' and not rune:GetStatusBarTexture()) then
+				rune:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
+			end
+
+			-- From my minor testing this is a okey solution. A full login always remove
+			-- the death runes, or at least the clients knowledge about them.
+			UpdateType(self, nil, i, floor((runemap[i]+1)/2))
+		end
+
+		-- oUF leaves the vehicle events registered on the player frame, so
+		-- buffs and such are correctly updated when entering/exiting vehicles.
+		--
+		-- This however makes the code also show/hide the RuneFrame.
+		RuneFrame.Show = RuneFrame.Hide
+		RuneFrame:Hide()
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	RuneFrame.Show = nil
+	RuneFrame:Show()
+
+
+	local runes = self.Runes
+	if(runes) then
+		runes:SetScript('OnUpdate', nil)
+
+		self:UnregisterEvent("RUNE_POWER_UPDATE", UpdateRune)
+		self:UnregisterEvent("RUNE_TYPE_UPDATE", UpdateType)
+		self:UnregisterEvent("PLAYER_ENTERING_WORLD", UpdateAllRuneTypes)
+	end
+end
+
+oUF:AddElement("Runes", Update, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/stagger.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/stagger.lua
new file mode 100644
index 0000000..6cc7dc9
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/stagger.lua
@@ -0,0 +1,140 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+-- percentages at which the bar should change color
+local STAGGER_YELLOW_TRANSITION = STAGGER_YELLOW_TRANSITION
+local STAGGER_RED_TRANSITION = STAGGER_RED_TRANSITION
+
+-- table indices of bar colors
+local GREEN_INDEX = 1;
+local YELLOW_INDEX = 2;
+local RED_INDEX = 3;
+
+local STANCE_OF_THE_STURY_OX_ID = 23
+
+local UnitHealthMax = UnitHealthMax
+local UnitStagger = UnitStagger
+
+local _, playerClass = UnitClass("player")
+
+-- TODO: fix color in the power element
+oUF.colors.power[BREWMASTER_POWER_BAR_NAME] = {
+	{0.52, 1.0, 0.52},
+	{1.0, 0.98, 0.72},
+	{1.0, 0.42, 0.42},
+}
+local color = oUF.colors.power[BREWMASTER_POWER_BAR_NAME]
+
+local function UpdateMaxValues(self)
+	local stagger = self.Stagger
+	if(stagger) then
+		local maxhealth = UnitHealthMax("player");
+		stagger:SetMinMaxValues(0, maxhealth);
+	end
+end
+
+local Update = function(self, event, unit)
+	if unit and unit ~= self.unit then return end
+	local element = self.Stagger
+
+	if(element.PreUpdate) then
+		element:PreUpdate()
+	end
+
+	local maxHealth = UnitHealthMax("player")
+	local stagger = UnitStagger("player")
+	local staggerPercent = stagger / maxHealth
+
+	element:SetMinMaxValues(0, maxHealth)
+	element:SetValue(stagger)
+
+	local rgb
+	if(staggerPercent >= STAGGER_RED_TRANSITION) then
+		rgb = color[RED_INDEX]
+	elseif(staggerPercent > STAGGER_YELLOW_TRANSITION) then
+		rgb = color[YELLOW_INDEX]
+	else
+		rgb = color[GREEN_INDEX]
+	end
+
+	local r, g, b = rgb[1], rgb[2], rgb[3]
+	element:SetStatusBarColor(r, g, b)
+
+	local bg = element.bg
+	if(bg) then
+		local mu = bg.multiplier or 1
+		bg:SetVertexColor(r * mu, g * mu, b * mu)
+	end
+
+	if(element.PostUpdate) then
+		element:PostUpdate(maxHealth, stagger, staggerPercent, r, g, b)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.Stagger.Override or Update)(self, ...)
+end
+
+local Visibility = function(self, event, unit)
+	if(STANCE_OF_THE_STURY_OX_ID ~= GetShapeshiftFormID() or UnitHasVehiclePlayerFrameUI("player")) then
+		if self.Stagger:IsShown() then
+			self.Stagger:Hide()
+			self:UnregisterEvent('UNIT_AURA', Path)
+		end
+	elseif not self.Stagger:IsShown() then
+		self.Stagger:Show()
+		self:RegisterEvent('UNIT_AURA', Path)
+		return Path(self, event, unit)
+	end
+end
+
+local VisibilityPath = function(self, ...)
+	return (self.Stagger.OverrideVisibility or Visibility)(self, ...)
+end
+
+local ForceUpdate = function(element)
+	return VisibilityPath(element.__owner, "ForceUpdate", element.__owner.unit)
+end
+
+local Enable = function(self, unit)
+	if(playerClass ~= "MONK" or unit ~= 'player') then return end
+
+	local element = self.Stagger
+	if(element) then
+		element.__owner = self
+		element.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent('UNIT_DISPLAYPOWER', VisibilityPath)
+		self:RegisterEvent('UPDATE_SHAPESHIFT_FORM', VisibilityPath)
+
+		if(element:IsObjectType'StatusBar' and not element:GetStatusBarTexture()) then
+			element:SetStatusBarTexture[[Interface\TargetingFrame\UI-StatusBar]]
+		end
+
+		MonkStaggerBar.Hide = MonkStaggerBar.Show
+		MonkStaggerBar:UnregisterEvent'PLAYER_ENTERING_WORLD'
+		MonkStaggerBar:UnregisterEvent'PLAYER_SPECIALIZATION_CHANGED'
+		MonkStaggerBar:UnregisterEvent'UNIT_DISPLAYPOWER'
+		MonkStaggerBar:UnregisterEvent'UPDATE_VEHICLE_ACTION_BAR'
+		return true
+	end
+end
+
+local Disable = function(self)
+	local element = self.Stagger
+	if(element) then
+		element:Hide()
+		self:UnregisterEvent('UNIT_AURA', Path)
+		self:UnregisterEvent('UNIT_DISPLAYPOWER', VisibilityPath)
+		self:UnregisterEvent('UPDATE_SHAPESHIFT_FORM', VisibilityPath)
+
+		MonkStaggerBar.Show = nil
+		MonkStaggerBar:Show()
+		MonkStaggerBar:UnregisterEvent'PLAYER_ENTERING_WORLD'
+		MonkStaggerBar:UnregisterEvent'PLAYER_SPECIALIZATION_CHANGED'
+		MonkStaggerBar:UnregisterEvent'UNIT_DISPLAYPOWER'
+		MonkStaggerBar:UnregisterEvent'UPDATE_VEHICLE_ACTION_BAR'
+	end
+end
+
+oUF:AddElement("Stagger", VisibilityPath, Enable, Disable)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/tags.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/tags.lua
new file mode 100644
index 0000000..c7b6304
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/tags.lua
@@ -0,0 +1,761 @@
+--[[
+-- Credits: Vika, Cladhaire, Tekkub
+]]
+
+local parent, ns = ...
+local oUF = ns.oUF
+
+local format = string.format
+local tinsert, tremove = table.insert, table.remove
+local _PATTERN = '%[..-%]+'
+
+local _ENV = {
+	Hex = function(r, g, b)
+		if type(r) == "table" then
+			if r.r then r, g, b = r.r, r.g, r.b else r, g, b = unpack(r) end
+		end
+		return format("|cff%02x%02x%02x", r*255, g*255, b*255)
+	end,
+	ColorGradient = oUF.ColorGradient,
+}
+local _PROXY = setmetatable(_ENV, {__index = _G})
+
+local tagStrings = {
+	["creature"] = [[function(u)
+		return UnitCreatureFamily(u) or UnitCreatureType(u)
+	end]],
+
+	["dead"] = [[function(u)
+		if(UnitIsDead(u)) then
+			return 'Dead'
+		elseif(UnitIsGhost(u)) then
+			return 'Ghost'
+		end
+	end]],
+
+	["difficulty"] = [[function(u)
+		if UnitCanAttack("player", u) then
+			local l = UnitLevel(u)
+			return Hex(GetQuestDifficultyColor((l > 0) and l or 99))
+		end
+	end]],
+
+	["leader"] = [[function(u)
+		if(UnitIsGroupLeader(u)) then
+			return 'L'
+		end
+	end]],
+
+	["leaderlong"]  = [[function(u)
+		if(UnitIsGroupLeader(u)) then
+			return 'Leader'
+		end
+	end]],
+
+	["level"] = [[function(u)
+		local l = UnitLevel(u)
+		if ( UnitIsWildBattlePet(u) or UnitIsBattlePetCompanion(u) ) then
+			l = UnitBattlePetLevel(u)
+		end
+
+		if(l > 0) then
+			return l
+		else
+			return '??'
+		end
+	end]],
+
+	["missinghp"] = [[function(u)
+		local current = UnitHealthMax(u) - UnitHealth(u)
+		if(current > 0) then
+			return current
+		end
+	end]],
+
+	["missingpp"] = [[function(u)
+		local current = UnitPowerMax(u) - UnitPower(u)
+		if(current > 0) then
+			return current
+		end
+	end]],
+
+	["name"] = [[function(u, r)
+		return UnitName(r or u)
+	end]],
+
+	["offline"] = [[function(u)
+		if(not UnitIsConnected(u)) then
+			return 'Offline'
+		end
+	end]],
+
+	["perhp"] = [[function(u)
+		local m = UnitHealthMax(u)
+		if(m == 0) then
+			return 0
+		else
+			return math.floor(UnitHealth(u)/m*100+.5)
+		end
+	end]],
+
+	["perpp"] = [[function(u)
+		local m = UnitPowerMax(u)
+		if(m == 0) then
+			return 0
+		else
+			return math.floor(UnitPower(u)/m*100+.5)
+		end
+	end]],
+
+	["plus"] = [[function(u)
+		local c = UnitClassification(u)
+		if(c == 'elite' or c == 'rareelite') then
+			return '+'
+		end
+	end]],
+
+	["pvp"] = [[function(u)
+		if(UnitIsPVP(u)) then
+			return 'PvP'
+		end
+	end]],
+
+	["raidcolor"] = [[function(u)
+		local _, x = UnitClass(u)
+		if(x) then
+			return Hex(_COLORS.class[x])
+		end
+	end]],
+
+	["rare"] = [[function(u)
+		local c = UnitClassification(u)
+		if(c == 'rare' or c == 'rareelite') then
+			return 'Rare'
+		end
+	end]],
+
+	["resting"] = [[function(u)
+		if(u == 'player' and IsResting()) then
+			return 'zzz'
+		end
+	end]],
+
+	["sex"] = [[function(u)
+		local s = UnitSex(u)
+		if(s == 2) then
+			return 'Male'
+		elseif(s == 3) then
+			return 'Female'
+		end
+	end]],
+
+	["smartclass"] = [[function(u)
+		if(UnitIsPlayer(u)) then
+			return _TAGS['class'](u)
+		end
+
+		return _TAGS['creature'](u)
+	end]],
+
+	["status"] = [[function(u)
+		if(UnitIsDead(u)) then
+			return 'Dead'
+		elseif(UnitIsGhost(u)) then
+			return 'Ghost'
+		elseif(not UnitIsConnected(u)) then
+			return 'Offline'
+		else
+			return _TAGS['resting'](u)
+		end
+	end]],
+
+	["threat"] = [[function(u)
+		local s = UnitThreatSituation(u)
+		if(s == 1) then
+			return '++'
+		elseif(s == 2) then
+			return '--'
+		elseif(s == 3) then
+			return 'Aggro'
+		end
+	end]],
+
+	["threatcolor"] = [[function(u)
+		return Hex(GetThreatStatusColor(UnitThreatSituation(u)))
+	end]],
+
+	["cpoints"] = [[function(u)
+		local cp
+		if(UnitHasVehicleUI'player') then
+			cp = GetComboPoints('vehicle', 'target')
+		else
+			cp = GetComboPoints('player', 'target')
+		end
+
+		if(cp > 0) then
+			return cp
+		end
+	end]],
+
+	['smartlevel'] = [[function(u)
+		local c = UnitClassification(u)
+		if(c == 'worldboss') then
+			return 'Boss'
+		else
+			local plus = _TAGS['plus'](u)
+			local level = _TAGS['level'](u)
+			if(plus) then
+				return level .. plus
+			else
+				return level
+			end
+		end
+	end]],
+
+	["classification"] = [[function(u)
+		local c = UnitClassification(u)
+		if(c == 'rare') then
+			return 'Rare'
+		elseif(c == 'rareelite') then
+			return 'Rare Elite'
+		elseif(c == 'elite') then
+			return 'Elite'
+		elseif(c == 'worldboss') then
+			return 'Boss'
+		elseif(c == 'minus') then
+			return 'Affix'
+		end
+	end]],
+
+	["shortclassification"] = [[function(u)
+		local c = UnitClassification(u)
+		if(c == 'rare') then
+			return 'R'
+		elseif(c == 'rareelite') then
+			return 'R+'
+		elseif(c == 'elite') then
+			return '+'
+		elseif(c == 'worldboss') then
+			return 'B'
+		elseif(c == 'minus') then
+			return '-'
+		end
+	end]],
+
+	["group"] = [[function(unit)
+		local name, server = UnitName(unit)
+		if(server and server ~= "") then
+			name = format("%s-%s", name, server)
+		end
+
+		for i=1, GetNumGroupMembers() do
+			local raidName, _, group = GetRaidRosterInfo(i)
+			if( raidName == name ) then
+				return group
+			end
+		end
+	end]],
+
+	["deficit:name"] = [[function(u)
+		local missinghp = _TAGS['missinghp'](u)
+		if(missinghp) then
+			return '-' .. missinghp
+		else
+			return _TAGS['name'](u)
+		end
+	end]],
+
+	['pereclipse'] = [[function(u)
+		local m = UnitPowerMax('player', SPELL_POWER_ECLIPSE)
+		if(m == 0) then
+			return 0
+		else
+			return math.abs(UnitPower('player', SPELL_POWER_ECLIPSE)/m*100)
+		end
+	end]],
+
+	['curmana'] = [[function(unit)
+		return UnitPower(unit, SPELL_POWER_MANA)
+	end]],
+
+	['maxmana'] = [[function(unit)
+		return UnitPowerMax(unit, SPELL_POWER_MANA)
+	end]],
+
+	['soulshards'] = [[function()
+		local num = UnitPower('player', SPELL_POWER_SOUL_SHARDS)
+		if(num > 0) then
+			return num
+		end
+	end]],
+
+	['holypower'] = [[function()
+		local num = UnitPower('player', SPELL_POWER_HOLY_POWER)
+		if(num > 0) then
+			return num
+		end
+	end]],
+
+	['chi'] = [[function()
+		local num = UnitPower('player', SPELL_POWER_CHI)
+		if(num > 0) then
+			return num
+		end
+	end]],
+
+	['shadoworbs'] = [[function()
+		local num = UnitPower('player', SPELL_POWER_SHADOW_ORBS)
+		if(num > 0) then
+			return num
+		end
+	end]],
+
+	['affix'] = [[function(u)
+		local c = UnitClassification(u)
+		if(c == 'minus') then
+			return 'Affix'
+		end
+	end]],
+}
+
+local tags = setmetatable(
+	{
+		curhp = UnitHealth,
+		curpp = UnitPower,
+		maxhp = UnitHealthMax,
+		maxpp = UnitPowerMax,
+		class = UnitClass,
+		faction = UnitFactionGroup,
+		race = UnitRace,
+	},
+
+	{
+		__index = function(self, key)
+			local tagFunc = tagStrings[key]
+			if(tagFunc) then
+				local func, err = loadstring('return ' .. tagFunc)
+				if(func) then
+					func = func()
+
+					-- Want to trigger __newindex, so no rawset.
+					self[key] = func
+					tagStrings[key] = nil
+
+					return func
+				else
+					error(err, 3)
+				end
+			end
+		end,
+		__newindex = function(self, key, val)
+			if(type(val) == 'string') then
+				tagStrings[key] = val
+			elseif(type(val) == 'function') then
+				-- So we don't clash with any custom envs.
+				if(getfenv(val) == _G) then
+					setfenv(val, _PROXY)
+				end
+
+				rawset(self, key, val)
+			end
+		end,
+	}
+)
+
+_ENV._TAGS = tags
+
+local onUpdateDelay = {}
+local tagEvents = {
+	["curhp"]               = "UNIT_HEALTH",
+	["dead"]                = "UNIT_HEALTH",
+	["leader"]              = "PARTY_LEADER_CHANGED",
+	["leaderlong"]          = "PARTY_LEADER_CHANGED",
+	["level"]               = "UNIT_LEVEL PLAYER_LEVEL_UP",
+	["maxhp"]               = "UNIT_MAXHEALTH",
+	["missinghp"]           = "UNIT_HEALTH UNIT_MAXHEALTH",
+	["name"]                = "UNIT_NAME_UPDATE",
+	["perhp"]               = "UNIT_HEALTH UNIT_MAXHEALTH",
+	["pvp"]                 = "UNIT_FACTION",
+	["resting"]             = "PLAYER_UPDATE_RESTING",
+	["smartlevel"]          = "UNIT_LEVEL PLAYER_LEVEL_UP UNIT_CLASSIFICATION_CHANGED",
+	["threat"]              = "UNIT_THREAT_SITUATION_UPDATE",
+	["threatcolor"]         = "UNIT_THREAT_SITUATION_UPDATE",
+	['cpoints']             = 'UNIT_COMBO_POINTS PLAYER_TARGET_CHANGED',
+	['affix']				= 'UNIT_CLASSIFICATION_CHANGED',
+	['plus']				= 'UNIT_CLASSIFICATION_CHANGED',
+	['rare']                = 'UNIT_CLASSIFICATION_CHANGED',
+	['classification']      = 'UNIT_CLASSIFICATION_CHANGED',
+	['shortclassification'] = 'UNIT_CLASSIFICATION_CHANGED',
+	["group"]               = "GROUP_ROSTER_UPDATE",
+	["curpp"]               = 'UNIT_POWER',
+	["maxpp"]               = 'UNIT_MAXPOWER',
+	["missingpp"]           = 'UNIT_MAXPOWER UNIT_POWER',
+	["perpp"]               = 'UNIT_MAXPOWER UNIT_POWER',
+	["offline"]             = "UNIT_HEALTH UNIT_CONNECTION",
+	["status"]              = "UNIT_HEALTH PLAYER_UPDATE_RESTING UNIT_CONNECTION",
+	["pereclipse"]          = 'UNIT_POWER',
+	['curmana']             = 'UNIT_POWER UNIT_MAXPOWER',
+	['maxmana']             = 'UNIT_POWER UNIT_MAXPOWER',
+	['soulshards']          = 'UNIT_POWER',
+	['holypower']           = 'UNIT_POWER',
+	['chi']                 = 'UNIT_POWER',
+	['shadoworbs']          = 'UNIT_POWER',
+}
+
+local unitlessEvents = {
+	PLAYER_LEVEL_UP = true,
+	PLAYER_UPDATE_RESTING = true,
+	PLAYER_TARGET_CHANGED = true,
+
+	PARTY_LEADER_CHANGED = true,
+
+	GROUP_ROSTER_UPDATE = true,
+
+	UNIT_COMBO_POINTS = true
+}
+
+local events = {}
+local frame = CreateFrame"Frame"
+frame:SetScript('OnEvent', function(self, event, unit)
+	local strings = events[event]
+	if(strings) then
+		for k, fontstring in next, strings do
+			if(fontstring:IsVisible() and (unitlessEvents[event] or fontstring.parent.unit == unit)) then
+				fontstring:UpdateTag()
+			end
+		end
+	end
+end)
+
+local OnUpdates = {}
+local eventlessUnits = {}
+
+local createOnUpdate = function(timer)
+	local OnUpdate = OnUpdates[timer]
+
+	if(not OnUpdate) then
+		local total = timer
+		local frame = CreateFrame'Frame'
+		local strings = eventlessUnits[timer]
+
+		frame:SetScript('OnUpdate', function(self, elapsed)
+			if(total >= timer) then
+				for k, fs in next, strings do
+					if(fs.parent:IsShown() and UnitExists(fs.parent.unit)) then
+						fs:UpdateTag()
+					end
+				end
+
+				total = 0
+			end
+
+			total = total + elapsed
+		end)
+
+		OnUpdates[timer] = frame
+	end
+end
+
+local OnShow = function(self)
+	for _, fs in next, self.__tags do
+		fs:UpdateTag()
+	end
+end
+
+local getTagName = function(tag)
+	local s = (tag:match('>+()') or 2)
+	local e = tag:match('.*()<+')
+	e = (e and e - 1) or -2
+
+	return tag:sub(s, e), s, e
+end
+
+local RegisterEvent = function(fontstr, event)
+	if(not events[event]) then events[event] = {} end
+
+	frame:RegisterEvent(event)
+	tinsert(events[event], fontstr)
+end
+
+local RegisterEvents = function(fontstr, tagstr)
+	for tag in tagstr:gmatch(_PATTERN) do
+		tag = getTagName(tag)
+		local tagevents = tagEvents[tag]
+		if(tagevents) then
+			for event in tagevents:gmatch'%S+' do
+				RegisterEvent(fontstr, event)
+			end
+		end
+	end
+end
+
+local UnregisterEvents = function(fontstr)
+	for event, data in pairs(events) do
+		for k, tagfsstr in pairs(data) do
+			if(tagfsstr == fontstr) then
+				if(#data == 1) then
+					frame:UnregisterEvent(event)
+				end
+
+				tremove(data, k)
+			end
+		end
+	end
+end
+
+local OnEnter = function(self)
+	for _, fs in pairs(self.__mousetags) do
+		fs:SetAlpha(1)
+	end
+end
+
+local OnLeave = function(self)
+	for _, fs in pairs(self.__mousetags) do
+		fs:SetAlpha(0)
+	end
+end
+
+local tagPool = {}
+local funcPool = {}
+local tmp = {}
+local escapeSequences = {
+	["||c"] = "|c",
+	["||r"] = "|r",
+	["||T"] = "|T",
+	["||t"] = "|t",
+}
+
+local Tag = function(self, fs, tagstr)
+	if(not fs or not tagstr) then return end
+
+	if(not self.__tags) then
+		self.__tags = {}
+		self.__mousetags = {}
+		tinsert(self.__elements, OnShow)
+	else
+		-- Since people ignore everything that's good practice - unregister the tag
+		-- if it already exists.
+		for _, tag in pairs(self.__tags) do
+			if(fs == tag) then
+				-- We don't need to remove it from the __tags table as Untag handles
+				-- that for us.
+				self:Untag(fs)
+			end
+		end
+	end
+
+	fs.parent = self
+
+	for escapeSequence, replacement in pairs(escapeSequences) do
+		while tagstr:find(escapeSequence) do
+			tagstr = tagstr:gsub(escapeSequence, replacement)
+		end
+	end
+
+	if tagstr:find('%[mouseover%]') then
+		tinsert(self.__mousetags, fs)
+		fs:SetAlpha(0)
+		if not self.__HookFunc then
+			self:HookScript('OnEnter', OnEnter)
+			self:HookScript('OnLeave', OnLeave)
+			self.__HookFunc = true;
+		end
+		tagstr = tagstr:gsub('%[mouseover%]', '')
+	else
+		for index, fontString in pairs(self.__mousetags) do
+			if fontString == fs then
+				self.__mousetags[index] = nil;
+				fs:SetAlpha(1)
+			end
+		end
+	end
+
+	local containsOnUpdate
+	for tag in tagstr:gmatch(_PATTERN) do
+		if not tagEvents[tag:sub(2, -2)] then
+			containsOnUpdate = onUpdateDelay[tag:sub(2, -2)] or 0.15;
+		end
+	end
+
+	local func = tagPool[tagstr]
+	if(not func) then
+		local format, numTags = tagstr:gsub('%%', '%%%%'):gsub(_PATTERN, '%%s')
+		local args = {}
+
+		for bracket in tagstr:gmatch(_PATTERN) do
+			local tagFunc = funcPool[bracket] or tags[bracket:sub(2, -2)]
+
+			if(not tagFunc) then
+				local tagName, s, e = getTagName(bracket)
+				local tag = tags[tagName]
+				if(tag) then
+					s = s - 2
+					e = e + 2
+
+					if(s ~= 0 and e ~= 0) then
+						local pre = bracket:sub(2, s)
+						local ap = bracket:sub(e, -2)
+
+						tagFunc = function(u,r)
+							local str = tag(u,r)
+							if(str) then
+								return pre..str..ap
+							end
+						end
+					elseif(s ~= 0) then
+						local pre = bracket:sub(2, s)
+
+						tagFunc = function(u,r)
+							local str = tag(u,r)
+							if(str) then
+								return pre..str
+							end
+						end
+					elseif(e ~= 0) then
+						local ap = bracket:sub(e, -2)
+
+						tagFunc = function(u,r)
+							local str = tag(u,r)
+							if(str) then
+								return str..ap
+							end
+						end
+					end
+
+					funcPool[bracket] = tagFunc
+				end
+			end
+
+			if(tagFunc) then
+				tinsert(args, tagFunc)
+			else
+				numTags = -1
+				func = function(self)
+					return self:SetFormattedText('[error]')
+				end
+			end
+		end
+
+		if(numTags == 1) then
+			func = function(self)
+				local parent = self.parent
+				local realUnit
+				if(self.overrideUnit) then
+					realUnit = parent.realUnit
+				end
+
+				_ENV._COLORS = parent.colors
+				return self:SetFormattedText(
+					format,
+					args[1](parent.unit, realUnit) or ''
+				)
+			end
+		elseif(numTags == 2) then
+			func = function(self)
+				local parent = self.parent
+				local unit = parent.unit
+				local realUnit
+				if(self.overrideUnit) then
+					realUnit = parent.realUnit
+				end
+
+				_ENV._COLORS = parent.colors
+				return self:SetFormattedText(
+					format,
+					args[1](unit, realUnit) or '',
+					args[2](unit, realUnit) or ''
+				)
+			end
+		elseif(numTags == 3) then
+			func = function(self)
+				local parent = self.parent
+				local unit = parent.unit
+				local realUnit
+				if(self.overrideUnit) then
+					realUnit = parent.realUnit
+				end
+
+				_ENV._COLORS = parent.colors
+				return self:SetFormattedText(
+					format,
+					args[1](unit, realUnit) or '',
+					args[2](unit, realUnit) or '',
+					args[3](unit, realUnit) or ''
+				)
+			end
+		elseif numTags ~= -1 then
+			func = function(self)
+				local parent = self.parent
+				local unit = parent.unit
+				local realUnit
+				if(self.overrideUnit) then
+					realUnit = parent.realUnit
+				end
+
+				_ENV._COLORS = parent.colors
+				for i, func in next, args do
+					tmp[i] = func(unit, realUnit) or ''
+				end
+
+				-- We do 1, numTags because tmp can hold several unneeded variables.
+				return self:SetFormattedText(format, unpack(tmp, 1, numTags))
+			end
+		end
+
+		if numTags ~= -1 then
+			tagPool[tagstr] = func
+		end
+	end
+	fs.UpdateTag = func
+
+	local unit = self.unit
+	if((unit and unit:match'%w+target') or fs.frequentUpdates) or containsOnUpdate then
+		local timer
+		if(type(fs.frequentUpdates) == 'number') then
+			timer = fs.frequentUpdates
+		elseif containsOnUpdate then
+			timer = containsOnUpdate
+		else
+			timer = .5
+		end
+
+		if(not eventlessUnits[timer]) then eventlessUnits[timer] = {} end
+		tinsert(eventlessUnits[timer], fs)
+
+		createOnUpdate(timer)
+	else
+		RegisterEvents(fs, tagstr)
+	end
+
+	tinsert(self.__tags, fs)
+end
+
+local Untag = function(self, fs)
+	if(not fs) then return end
+
+	UnregisterEvents(fs)
+	for _, timers in next, eventlessUnits do
+		for k, fontstr in next, timers do
+			if(fs == fontstr) then
+				tremove(timers, k)
+			end
+		end
+	end
+
+	for k, fontstr in next, self.__tags do
+		if(fontstr == fs) then
+			tremove(self.__tags, k)
+		end
+	end
+
+	fs.UpdateTag = nil
+end
+
+oUF.Tags = {
+	Methods = tags,
+	Events = tagEvents,
+	SharedEvents = unitlessEvents,
+	OnUpdateThrottle = onUpdateDelay,
+}
+oUF:RegisterMetaFunction('Tag', Tag)
+oUF:RegisterMetaFunction('Untag', Untag)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/threat.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/threat.lua
new file mode 100644
index 0000000..2a7f4cb
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/threat.lua
@@ -0,0 +1,65 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+local Update = function(self, event, unit)
+	if(unit ~= self.unit) or not unit or not IsLoggedIn() then return end
+
+	local threat = self.Threat
+	if(threat.PreUpdate) then threat:PreUpdate(unit) end
+
+	local status = UnitThreatSituation(unit)
+
+	local r, g, b
+	if(status and status > 0) then
+		r, g, b = GetThreatStatusColor(status)
+
+		if threat:IsObjectType"Texture" then
+			threat:SetVertexColor(r, g, b)
+		end
+		threat:Show()
+	else
+		threat:Hide()
+	end
+
+	if(threat.PostUpdate) then
+		return threat:PostUpdate(unit, status, r, g, b)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.Threat.Override or Update) (self, ...)
+end
+
+local ForceUpdate = function(element)
+	return Path(element.__owner, 'ForceUpdate', element.__owner.unit)
+end
+
+local Enable = function(self)
+	local threat = self.Threat
+	if(threat) then
+		threat.__owner = self
+		threat.ForceUpdate = ForceUpdate
+
+		self:RegisterEvent("UNIT_THREAT_SITUATION_UPDATE", Path)
+		self:RegisterEvent("UNIT_THREAT_LIST_UPDATE", Path)
+		threat:Hide()
+
+		if(threat:IsObjectType"Texture" and not threat:GetTexture()) then
+			threat:SetTexture[[Interface\Minimap\ObjectIcons]]
+			threat:SetTexCoord(1/4, 3/8, 0, 1/4)
+		end
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	local threat = self.Threat
+	if(threat) then
+		self:UnregisterEvent("UNIT_THREAT_SITUATION_UPDATE", Path)
+		self:UnregisterEvent("UNIT_THREAT_LIST_UPDATE", Path)
+		threat:Hide()
+	end
+end
+
+oUF:AddElement('Threat', Path, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/totems.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/totems.lua
new file mode 100644
index 0000000..c504fd4
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/elements/totems.lua
@@ -0,0 +1,133 @@
+local parent, ns = ...
+local oUF = ns.oUF
+
+oUF.colors.totems = {
+	[FIRE_TOTEM_SLOT] = { 181/255, 073/255, 033/255 },
+	[EARTH_TOTEM_SLOT] = { 074/255, 142/255, 041/255 },
+	[WATER_TOTEM_SLOT] = { 057/255, 146/255, 181/255 },
+	[AIR_TOTEM_SLOT] = { 132/255, 056/255, 231/255 }
+}
+
+local priorities = STANDARD_TOTEM_PRIORITIES
+if(select(2, UnitClass'player') == 'SHAMAN') then
+	priorities = SHAMAN_TOTEM_PRIORITIES
+end
+
+local OnClick = function(self)
+	DestroyTotem(self:GetID())
+end
+
+local UpdateTooltip = function(self)
+	GameTooltip:SetTotem(self:GetID())
+end
+
+local OnEnter = function(self)
+	if(not self:IsVisible()) then return end
+	GameTooltip:SetOwner(self, 'ANCHOR_BOTTOMRIGHT')
+	self:UpdateTooltip()
+end
+
+local OnLeave = function()
+	GameTooltip:Hide()
+end
+
+local UpdateTotem = function(self, event, slot)
+	if(slot > MAX_TOTEMS) then return end
+	local totems = self.Totems
+
+	if(totems.PreUpdate) then totems:PreUpdate(priorities[slot]) end
+
+	local totem = totems[priorities[slot]]
+	local haveTotem, name, start, duration, icon = GetTotemInfo(slot)
+	if(duration > 0) then
+		if(totem.Icon) then
+			totem.Icon:SetTexture(icon)
+		end
+
+		if(totem.Cooldown) then
+			totem.Cooldown:SetCooldown(start, duration)
+		end
+
+		totem:Show()
+	else
+		totem:Hide()
+	end
+
+	if(totems.PostUpdate) then
+		return totems:PostUpdate(priorities[slot], haveTotem, name, start, duration, icon)
+	end
+end
+
+local Path = function(self, ...)
+	return (self.Totems.Override or UpdateTotem) (self, ...)
+end
+
+local Update = function(self, event)
+	for i = 1, MAX_TOTEMS do
+		Path(self, event, i)
+	end
+end
+
+local ForceUpdate = function(element)
+	return Update(element.__owner, 'ForceUpdate')
+end
+
+local Enable = function(self)
+	local totems = self.Totems
+
+	if(totems) then
+		totems.__owner = self
+		totems.__map = { unpack(priorities) }
+		totems.ForceUpdate = ForceUpdate
+
+		for i = 1, MAX_TOTEMS do
+			local totem = totems[i]
+
+			totem:SetID(priorities[i])
+
+			if(totem:HasScript'OnClick') then
+				totem:SetScript('OnClick', OnClick)
+			end
+
+			if(totem:IsMouseEnabled()) then
+				totem:SetScript('OnEnter', OnEnter)
+				totem:SetScript('OnLeave', OnLeave)
+
+				if(not totem.UpdateTooltip) then
+					totem.UpdateTooltip = UpdateTooltip
+				end
+			end
+		end
+
+		self:RegisterEvent('PLAYER_TOTEM_UPDATE', Path, true)
+
+		TotemFrame.Show = TotemFrame.Hide
+		TotemFrame:Hide()
+
+		TotemFrame:UnregisterEvent"PLAYER_TOTEM_UPDATE"
+		TotemFrame:UnregisterEvent"PLAYER_ENTERING_WORLD"
+		TotemFrame:UnregisterEvent"UPDATE_SHAPESHIFT_FORM"
+		TotemFrame:UnregisterEvent"PLAYER_TALENT_UPDATE"
+
+		return true
+	end
+end
+
+local Disable = function(self)
+	if(self.Totems) then
+		for i = 1, MAX_TOTEMS do
+			self.Totems[i]:Hide()
+		end
+		TotemFrame.Show = nil
+		TotemFrame:Show()
+
+		TotemFrame:RegisterEvent"PLAYER_TOTEM_UPDATE"
+		TotemFrame:RegisterEvent"PLAYER_ENTERING_WORLD"
+		TotemFrame:RegisterEvent"UPDATE_SHAPESHIFT_FORM"
+		TotemFrame:RegisterEvent"PLAYER_TALENT_UPDATE"
+
+		self:UnregisterEvent('PLAYER_TOTEM_UPDATE', Path)
+	end
+end
+
+oUF:AddElement("Totems", Update, Enable, Disable)
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/events.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/events.lua
new file mode 100644
index 0000000..51385cb
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/events.lua
@@ -0,0 +1,193 @@
+local parent, ns = ...
+local oUF = ns.oUF
+local Private = oUF.Private
+
+local argcheck = Private.argcheck
+local error = Private.error
+local frame_metatable = Private.frame_metatable
+
+local tinsert, tremove = table.insert, table.remove
+
+-- Events
+local RegisterEvent, UnregisterEvent, IsEventRegistered
+
+do
+	local eventFrame = CreateFrame("Frame")
+	local registry = {}
+	local framesForUnit = {}
+	local alternativeUnits = {
+		['player'] = 'vehicle',
+		['pet'] = 'player',
+		['party1'] = 'partypet1',
+		['party2'] = 'partypet2',
+		['party3'] = 'partypet3',
+		['party4'] = 'partypet4',
+	}
+
+	local RegisterFrameForUnit = function(frame, unit)
+		if not unit then return end
+		if framesForUnit[unit] then
+			framesForUnit[unit][frame] = true
+		else
+			framesForUnit[unit] = { [frame] = true }
+		end
+	end
+
+	local UnregisterFrameForUnit = function(frame, unit)
+		if not unit then return end
+		local frames = framesForUnit[unit]
+		if frames and frames[frame] then
+			frames[frame] = nil
+			if not next(frames) then
+				framesForUnit[unit] = nil
+			end
+		end
+	end
+
+	Private.UpdateUnits = function(frame, unit, realUnit)
+		if unit == realUnit then
+			realUnit = nil
+		end
+		if frame.unit ~= unit or frame.realUnit ~= realUnit then
+			if not frame:GetScript('OnUpdate') then
+				UnregisterFrameForUnit(frame, frame.unit)
+				UnregisterFrameForUnit(frame, frame.realUnit)
+				RegisterFrameForUnit(frame, unit)
+				RegisterFrameForUnit(frame, realUnit)
+			end
+
+			frame.alternativeUnit = alternativeUnits[unit]
+			frame.unit = unit
+			frame.realUnit = realUnit
+			frame.id = unit:match'^.-(%d+)'
+			return true
+		end
+	end
+
+	-- Holds true for every event, where the first (unit) argument should be ignored.
+	local sharedUnitEvents = {
+		UNIT_ENTERED_VEHICLE = true,
+		UNIT_EXITED_VEHICLE = true,
+		UNIT_PET = true,
+	}
+
+	eventFrame:SetScript('OnEvent', function(_, event, arg1, ...)
+		local listeners = registry[event]
+		if arg1 and not sharedUnitEvents[event] then
+			local frames = framesForUnit[arg1]
+			if frames then
+				for frame in next, frames do
+					if listeners[frame] and frame:IsVisible() then
+						frame[event](frame, event, arg1, ...)
+					end
+				end
+			end
+		else
+			for frame in next, listeners do
+				if frame:IsVisible() then
+					frame[event](frame, event, arg1, ...)
+				end
+			end
+		end
+	end)
+
+	function RegisterEvent(self, event, unitless)
+		if(unitless) then
+			sharedUnitEvents[event] = true
+		end
+
+		if not registry[event] then
+			registry[event] = { [self] = true }
+			eventFrame:RegisterEvent(event)
+		else
+			registry[event][self] = true
+		end
+	end
+
+	function UnregisterEvent(self, event)
+		if registry[event] then
+			registry[event][self] = nil
+			if not next(registry[event]) then
+				registry[event] = nil
+				eventFrame:UnregisterEvent(event)
+			end
+		end
+	end
+
+	function IsEventRegistered(self, event)
+		return registry[event] and registry[event][self]
+	end
+end
+
+local event_metatable = {
+	__call = function(funcs, self, ...)
+		for _, func in next, funcs do
+			func(self, ...)
+		end
+	end,
+}
+
+function frame_metatable.__index:RegisterEvent(event, func, unitless)
+	-- Block OnUpdate polled frames from registering events.
+	if(self.__eventless) then return end
+
+	argcheck(event, 2, 'string')
+
+	if(type(func) == 'string' and type(self[func]) == 'function') then
+		func = self[func]
+	end
+
+	local curev = self[event]
+	local kind = type(curev)
+	if(curev and func) then
+		if(kind == 'function' and curev ~= func) then
+			self[event] = setmetatable({curev, func}, event_metatable)
+		elseif(kind == 'table') then
+			for _, infunc in next, curev do
+				if(infunc == func) then return end
+			end
+
+			tinsert(curev, func)
+		end
+	elseif(IsEventRegistered(self, event)) then
+		return
+	else
+		if(type(func) == 'function') then
+			self[event] = func
+		elseif(not self[event]) then
+			return error("Style [%s] attempted to register event [%s] on unit [%s] with a handler that doesn't exist.", self.style, event, self.unit or 'unknown')
+		end
+
+		RegisterEvent(self, event, unitless)
+	end
+end
+
+function frame_metatable.__index:UnregisterEvent(event, func)
+	argcheck(event, 2, 'string')
+
+	local curev = self[event]
+	if(type(curev) == 'table' and func) then
+		for k, infunc in next, curev do
+			if(infunc == func) then
+				tremove(curev, k)
+
+				local n = #curev
+				if(n == 1) then
+					local _, handler = next(curev)
+					self[event] = handler
+				elseif(n == 0) then
+					UnregisterEvent(self, event)
+				end
+
+				break
+			end
+		end
+	elseif(curev == func) then
+		self[event] = nil
+		UnregisterEvent(self, event)
+	end
+end
+
+function frame_metatable.__index:IsEventRegistered(event)
+	return IsEventRegistered(self, event)
+end
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/factory.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/factory.lua
new file mode 100644
index 0000000..2e2f4cc
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/factory.lua
@@ -0,0 +1,49 @@
+local parent, ns = ...
+local oUF = ns.oUF
+local Private = oUF.Private
+
+local argcheck = Private.argcheck
+local tinsert = table.insert
+
+local _QUEUE = {}
+local _FACTORY = CreateFrame'Frame'
+_FACTORY:SetScript('OnEvent', function(self, event, ...)
+	return self[event](self, event, ...)
+end)
+
+_FACTORY:RegisterEvent'PLAYER_LOGIN'
+_FACTORY.active = true
+
+function _FACTORY:PLAYER_LOGIN()
+	if(not self.active) then return end
+
+	for _, func in next, _QUEUE do
+		func(oUF)
+	end
+
+	-- Avoid creating dupes.
+	wipe(_QUEUE)
+end
+
+function oUF:Factory(func)
+	argcheck(func, 2, 'function')
+
+	-- Call the function directly if we're active and logged in.
+	if(IsLoggedIn() and _FACTORY.active) then
+		return func(self)
+	else
+		tinsert(_QUEUE, func)
+	end
+end
+
+function oUF:EnableFactory()
+	_FACTORY.active = true
+end
+
+function oUF:DisableFactory()
+	_FACTORY.active = nil
+end
+
+function oUF:RunFactoryQueue()
+	_FACTORY:PLAYER_LOGIN()
+end
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/finalize.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/finalize.lua
new file mode 100644
index 0000000..9355d19
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/finalize.lua
@@ -0,0 +1,4 @@
+local parent, ns = ...
+
+-- It's named Private for a reason!
+ns.oUF.Private = nil
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/init.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/init.lua
new file mode 100644
index 0000000..46aef44
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/init.lua
@@ -0,0 +1,3 @@
+local parent, ns = ...
+ns.oUF = {}
+ns.oUF.Private = {}
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/oUF_core.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/oUF_core.lua
new file mode 100644
index 0000000..44740a7
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/oUF_core.lua
@@ -0,0 +1,1225 @@
+local parent, ns = ...
+
+local oUF = {}
+
+local global = GetAddOnMetadata(parent, 'X-oUF')
+local _VERSION = GetAddOnMetadata(parent, 'version')
+
+local upper = string.upper
+local split = string.split
+local tinsert, tremove = table.insert, table.remove
+
+local styles, style = {}
+local callback, objects = {}, {}
+
+local elements = {}
+local activeElements = {}
+
+--[[
+ /$$$$$$$          /$$                      /$$
+| $$__  $$        |__/                     | $$
+| $$  \ $$/$$$$$$  /$$ /$$    /$$/$$$$$$  /$$$$$$    /$$$$$$
+| $$$$$$$/$$__  $$| $$|  $$  /$$/____  $$|_  $$_/   /$$__  $$
+| $$____/ $$  \__/| $$ \  $$/$$/ /$$$$$$$  | $$    | $$$$$$$$
+| $$    | $$      | $$  \  $$$/ /$$__  $$  | $$ /$$| $$_____/
+| $$    | $$      | $$   \  $/ |  $$$$$$$  |  $$$$/|  $$$$$$$
+|__/    |__/      |__/    \_/   \_______/   \___/   \_______/
+--]]
+
+local Private = {}
+
+local match = string.match
+local format = string.format
+
+function Private.argcheck(value, num, ...)
+	assert(type(num) == 'number', "Bad argument #2 to 'argcheck' (number expected, got "..type(num)..")")
+
+	for i=1,select("#", ...) do
+		if type(value) == select(i, ...) then return end
+	end
+
+	local types = strjoin(", ", ...)
+	local name = match(debugstack(2,2,0), ": in function [`<](.-)['>]")
+	error(("Bad argument #%d to '%s' (%s expected, got %s"):format(num, name, types, type(value)), 3)
+end
+
+function Private.print(...)
+	print("|cff33ff99oUF:|r", ...)
+end
+
+function Private.error(...)
+	Private.print("|cffff0000Error:|r "..format(...))
+end
+
+local argcheck = Private.argcheck
+local error = Private.error
+local print = Private.print
+local frame_metatable = Private.frame_metatable
+
+--[[
+           /$$   /$$ /$$$$$$$$
+          | $$  | $$| $$_____/
+  /$$$$$$ | $$  | $$| $$
+ /$$__  $$| $$  | $$| $$$$$
+| $$  \ $$| $$  | $$| $$__/
+| $$  | $$| $$  | $$| $$
+|  $$$$$$/|  $$$$$$/| $$
+ \______/  \______/ |__/
+--]]
+
+-- updating of "invalid" units.
+local enableTargetUpdate = function(object)
+	object.onUpdateFrequency = object.onUpdateFrequency or .5
+	object.__eventless = true
+
+	local total = 0
+	object:SetScript('OnUpdate', function(self, elapsed)
+		if(not self.unit) then
+			return
+		elseif(total > self.onUpdateFrequency) then
+			self:UpdateAllElements'OnUpdate'
+			total = 0
+		end
+
+		total = total + elapsed
+	end)
+end
+Private.enableTargetUpdate = enableTargetUpdate
+
+local updateActiveUnit = function(self, event, unit)
+	-- Calculate units to work with
+	local realUnit, modUnit = SecureButton_GetUnit(self), SecureButton_GetModifiedUnit(self)
+
+	-- _GetUnit() doesn't rewrite playerpet -> pet like _GetModifiedUnit does.
+	if(realUnit == 'playerpet') then
+		realUnit = 'pet'
+	elseif(realUnit == 'playertarget') then
+		realUnit = 'target'
+	end
+
+	if(modUnit == "pet" and realUnit ~= "pet") then
+		modUnit = "vehicle"
+	end
+
+	-- Drop out if the event unit doesn't match any of the frame units.
+	if(not UnitExists(modUnit) or unit and unit ~= realUnit and unit ~= modUnit) then return end
+
+	-- Change the active unit and run a full update.
+	if Private.UpdateUnits(self, modUnit, realUnit) then
+		self:UpdateAllElements('RefreshUnit')
+
+		return true
+	end
+end
+
+local iterateChildren = function(...)
+	for l = 1, select("#", ...) do
+		local obj = select(l, ...)
+
+		if(type(obj) == 'table' and obj.isChild) then
+			updateActiveUnit(obj, "iterateChildren")
+		end
+	end
+end
+
+local OnAttributeChanged = function(self, name, value)
+	if(name == "unit" and value) then
+		if(self.hasChildren) then
+			iterateChildren(self:GetChildren())
+		end
+
+		if(not self:GetAttribute'oUF-onlyProcessChildren') then
+			updateActiveUnit(self, "OnAttributeChanged")
+		end
+	end
+end
+
+local frame_metatable = {
+	__index = CreateFrame"Button"
+}
+Private.frame_metatable = frame_metatable
+
+for k, v in pairs{
+	UpdateElement = function(self, name)
+		local unit = self.unit
+		if(not unit or not UnitExists(unit)) then return end
+
+		local element = elements[name]
+		if(not element or not self:IsElementEnabled(name) or not activeElements[self]) then return end
+		if(element.update) then
+			element.update(self, 'OnShow', unit)
+		end
+	end,
+
+	EnableElement = function(self, name, unit)
+		argcheck(name, 2, 'string')
+		argcheck(unit, 3, 'string', 'nil')
+
+		local element = elements[name]
+
+
+		if(not element or self:IsElementEnabled(name) or not activeElements[self]) then return end
+
+		if(element.enable(self, unit or self.unit)) then
+			activeElements[self][name] = true
+
+			if(element.update) then
+				tinsert(self.__elements, element.update)
+			end
+		end
+	end,
+
+	DisableElement = function(self, name)
+		argcheck(name, 2, 'string')
+
+		local enable = self:IsElementEnabled(name)
+		if(not enable) then return end
+
+		local update = elements[name].update
+		for k, func in next, self.__elements do
+			if(func == update) then
+				tremove(self.__elements, k)
+				break
+			end
+		end
+
+		activeElements[self][name] = nil
+
+		-- We need to run a new update cycle in-case we knocked ourself out of sync.
+		-- The main reason we do this is to make sure the full update is completed
+		-- if an element for some reason removes itself _during_ the update
+		-- progress.
+		self:UpdateAllElements('DisableElement', name)
+
+		return elements[name].disable(self)
+	end,
+
+	IsElementEnabled = function(self, name)
+		argcheck(name, 2, 'string')
+
+		local element = elements[name]
+		if(not element) then return end
+
+		local active = activeElements[self]
+		return active and active[name]
+	end,
+
+	Enable = RegisterUnitWatch,
+	Disable = function(self)
+		UnregisterUnitWatch(self)
+		self:Hide()
+	end,
+
+	UpdateAllElements = function(self, event)
+		local unit = self.unit
+		if(not unit or not UnitExists(unit)) then return end
+
+		if(self.PreUpdate) then
+			self:PreUpdate(event)
+		end
+
+		for _, func in next, self.__elements do
+			func(self, event, unit)
+		end
+
+		if(self.PostUpdate) then
+			self:PostUpdate(event)
+		end
+	end,
+} do
+	frame_metatable.__index[k] = v
+end
+
+local OnShow = function(self)
+	if(not updateActiveUnit(self, 'OnShow')) then
+		return self:UpdateAllElements'OnShow'
+	end
+end
+
+local UpdatePet = function(self, event, unit)
+	local petUnit
+	if(unit == 'target') then
+		return
+	elseif(unit == 'player') then
+		petUnit = 'pet'
+	else
+		-- Convert raid26 -> raidpet26
+		petUnit = unit:gsub('^(%a+)(%d+)', '%1pet%2')
+	end
+
+	if(self.unit ~= petUnit) then return end
+	if(not updateActiveUnit(self, event)) then
+		return self:UpdateAllElements(event)
+	end
+end
+
+local initObject = function(unit, style, styleFunc, header, ...)
+	local num = select('#', ...)
+	for i=1, num do
+		local object = select(i, ...)
+		local objectUnit = object:GetAttribute'oUF-guessUnit' or unit
+		local suffix = object:GetAttribute'unitsuffix'
+
+		object.__elements = {}
+		object.style = style
+		object = setmetatable(object, frame_metatable)
+
+		-- Expose the frame through oUF.objects.
+		tinsert(objects, object)
+
+		-- We have to force update the frames when PEW fires.
+		object:RegisterEvent("PLAYER_ENTERING_WORLD", object.UpdateAllElements)
+
+		-- Handle the case where someone has modified the unitsuffix attribute in
+		-- oUF-initialConfigFunction.
+		if(suffix and objectUnit and not objectUnit:match(suffix)) then
+			objectUnit = objectUnit .. suffix
+		end
+
+		if(not (suffix == 'target' or objectUnit and objectUnit:match'target')) then
+			object:RegisterEvent('UNIT_ENTERED_VEHICLE', updateActiveUnit)
+			object:RegisterEvent('UNIT_EXITED_VEHICLE', updateActiveUnit)
+
+			-- We don't need to register UNIT_PET for the player unit. We register it
+			-- mainly because UNIT_EXITED_VEHICLE and UNIT_ENTERED_VEHICLE doesn't always
+			-- have pet information when they fire for party and raid units.
+			if(objectUnit ~= 'player') then
+				object:RegisterEvent('UNIT_PET', UpdatePet)
+			end
+		end
+
+		if(not header) then
+			-- No header means it's a frame created through :Spawn().
+			object:SetAttribute("*type1", "target")
+			object:SetAttribute('*type2', 'togglemenu')
+
+			-- No need to enable this for *target frames.
+			if(not (unit:match'target' or suffix == 'target')) then
+				object:SetAttribute('toggleForVehicle', true)
+			end
+
+			-- Other boss and target units are handled by :HandleUnit().
+			if(suffix == 'target') then
+				enableTargetUpdate(object)
+			else
+				oUF:HandleUnit(object)
+			end
+		else
+			-- Used to update frames when they change position in a group.
+			object:RegisterEvent('GROUP_ROSTER_UPDATE', object.UpdateAllElements)
+
+			if(num > 1) then
+				if(object:GetParent() == header) then
+					object.hasChildren = true
+				else
+					object.isChild = true
+				end
+			end
+
+			if(suffix == 'target') then
+				enableTargetUpdate(object)
+			end
+		end
+
+		Private.UpdateUnits(object, objectUnit)
+
+		styleFunc(object, objectUnit, not header)
+
+		object:SetScript("OnAttributeChanged", OnAttributeChanged)
+		object:SetScript("OnShow", OnShow)
+
+		activeElements[object] = {}
+		for element in next, elements do
+			object:EnableElement(element, objectUnit)
+		end
+
+		for _, func in next, callback do
+			func(object)
+		end
+
+		-- Make Clique happy
+		_G.ClickCastFrames = ClickCastFrames or {}
+		ClickCastFrames[object] = true
+	end
+end
+
+local walkObject = function(object, unit)
+	local parent = object:GetParent()
+	local style = parent.style or style
+	local styleFunc = styles[style]
+
+	local header = parent:GetAttribute'oUF-headerType' and parent
+
+	-- Check if we should leave the main frame blank.
+	if(object:GetAttribute'oUF-onlyProcessChildren') then
+		object.hasChildren = true
+		object:SetScript('OnAttributeChanged', OnAttributeChanged)
+		return initObject(unit, style, styleFunc, header, object:GetChildren())
+	end
+
+	return initObject(unit, style, styleFunc, header, object, object:GetChildren())
+end
+
+function oUF:RegisterInitCallback(func)
+	tinsert(callback, func)
+end
+
+function oUF:RegisterMetaFunction(name, func)
+	argcheck(name, 2, 'string')
+	argcheck(func, 3, 'function', 'table')
+
+	if(frame_metatable.__index[name]) then
+		return
+	end
+
+	frame_metatable.__index[name] = func
+end
+
+function oUF:RegisterStyle(name, func)
+	argcheck(name, 2, 'string')
+	argcheck(func, 3, 'function', 'table')
+
+	if(styles[name]) then return error("Style [%s] already registered.", name) end
+	if(not style) then style = name end
+
+	styles[name] = func
+end
+
+function oUF:SetActiveStyle(name)
+	argcheck(name, 2, 'string')
+	if(not styles[name]) then return error("Style [%s] does not exist.", name) end
+
+	style = name
+end
+
+do
+	local function iter(_, n)
+		-- don't expose the style functions.
+		return (next(styles, n))
+	end
+
+	function oUF.IterateStyles()
+		return iter, nil, nil
+	end
+end
+
+local getCondition
+do
+	local conditions = {
+		raid40 = '[@raid26,exists] show;',
+		raid25 = '[@raid11,exists] show;',
+		raid10 = '[@raid6,exists] show;',
+		raid = '[group:raid] show;',
+		party = '[group:party,nogroup:raid] show;',
+		solo = '[@player,exists,nogroup:party] show;',
+	}
+
+	function getCondition(...)
+		local cond = ''
+
+		for i=1, select('#', ...) do
+			local short = select(i, ...)
+
+			local condition = conditions[short]
+			if(condition) then
+				cond = cond .. condition
+			end
+		end
+
+		return cond .. 'hide'
+	end
+end
+
+local generateName = function(unit, ...)
+	local name = 'oUF_' .. style:gsub('[^%a%d_]+', '')
+
+	local raid, party, groupFilter
+	for i=1, select('#', ...), 2 do
+		local att, val = select(i, ...)
+		if(att == 'showRaid') then
+			raid = true
+		elseif(att == 'showParty') then
+			party = true
+		elseif(att == 'groupFilter') then
+			groupFilter = val
+		end
+	end
+
+	local append
+	if(raid) then
+		if(groupFilter) then
+			if(type(groupFilter) == 'number' and groupFilter > 0) then
+				append = groupFilter
+			elseif(groupFilter:match'TANK') then
+				append = 'MainTank'
+			elseif(groupFilter:match'ASSIST') then
+				append = 'MainAssist'
+			else
+				local _, count = groupFilter:gsub(',', '')
+				if(count == 0) then
+					append = 'Raid' .. groupFilter
+				else
+					append = 'Raid'
+				end
+			end
+		else
+			append = 'Raid'
+		end
+	elseif(party) then
+		append = 'Party'
+	elseif(unit) then
+		append = unit:gsub("^%l", upper)
+	end
+
+	if(append) then
+		name = name .. append
+	end
+
+	-- Change oUF_LilyRaidRaid into oUF_LilyRaid
+	name = name:gsub('(%u%l+)([%u%l]*)%1', '%1')
+	-- Change oUF_LilyTargettarget into oUF_LilyTargetTarget
+	name = name:gsub('t(arget)', 'T%1')
+
+	local base = name
+	local i = 2
+	while(_G[name]) do
+		name = base .. i
+		i = i + 1
+	end
+
+	return name
+end
+
+do
+	local styleProxy = function(self, frame, ...)
+		return walkObject(_G[frame])
+	end
+
+	-- There has to be an easier way to do this.
+	local initialConfigFunction = [[
+		local header = self:GetParent()
+		local frames = table.new()
+		table.insert(frames, self)
+		self:GetChildList(frames)
+		for i=1, #frames do
+			local frame = frames[i]
+			local unit
+			-- There's no need to do anything on frames with onlyProcessChildren
+			if(not frame:GetAttribute'oUF-onlyProcessChildren') then
+				RegisterUnitWatch(frame)
+
+				-- Attempt to guess what the header is set to spawn.
+				local groupFilter = header:GetAttribute'groupFilter'
+
+				if(type(groupFilter) == 'string' and groupFilter:match('MAIN[AT]')) then
+					local role = groupFilter:match('MAIN([AT])')
+					if(role == 'T') then
+						unit = 'maintank'
+					else
+						unit = 'mainassist'
+					end
+				elseif(header:GetAttribute'showRaid') then
+					unit = 'raid'
+				elseif(header:GetAttribute'showParty') then
+					unit = 'party'
+				end
+
+				local headerType = header:GetAttribute'oUF-headerType'
+				local suffix = frame:GetAttribute'unitsuffix'
+				if(unit and suffix) then
+					if(headerType == 'pet' and suffix == 'target') then
+						unit = unit .. headerType .. suffix
+					else
+						unit = unit .. suffix
+					end
+				elseif(unit and headerType == 'pet') then
+					unit = unit .. headerType
+				end
+
+				frame:SetAttribute('*type1', 'target')
+				frame:SetAttribute('*type2', 'togglemenu')
+				frame:SetAttribute('toggleForVehicle', true)
+				frame:SetAttribute('oUF-guessUnit', unit)
+			end
+
+			local body = header:GetAttribute'oUF-initialConfigFunction'
+			if(body) then
+				frame:Run(body, unit)
+			end
+		end
+
+		header:CallMethod('styleFunction', self:GetName())
+
+		local clique = header:GetFrameRef("clickcast_header")
+		if(clique) then
+			clique:SetAttribute("clickcast_button", self)
+			clique:RunAttribute("clickcast_register")
+		end
+	]]
+
+	function oUF:SpawnHeader(overrideName, template, visibility, ...)
+		if(not style) then return error("Unable to create frame. No styles have been registered.") end
+
+		template = (template or 'SecureGroupHeaderTemplate')
+
+		local isPetHeader = template:match'PetHeader'
+		local name = overrideName or generateName(nil, ...)
+		local header = CreateFrame('Frame', name, UIParent, template)
+
+		header:SetAttribute("template", "oUF_ClickCastUnitTemplate")
+		for i=1, select("#", ...), 2 do
+			local att, val = select(i, ...)
+			if(not att) then break end
+			header:SetAttribute(att, val)
+		end
+
+		header.style = style
+		header.styleFunction = styleProxy
+
+		-- We set it here so layouts can't directly override it.
+		header:SetAttribute('initialConfigFunction', initialConfigFunction)
+		header:SetAttribute('oUF-headerType', isPetHeader and 'pet' or 'group')
+
+		if(Clique) then
+			SecureHandlerSetFrameRef(header, 'clickcast_header', Clique.header)
+		end
+
+		if(header:GetAttribute'showParty') then
+			self:DisableBlizzard'party'
+		end
+
+		if(visibility) then
+			local type, list = split(' ', visibility, 2)
+			if(list and type == 'custom') then
+				RegisterAttributeDriver(header, 'state-visibility', list)
+			else
+				local condition = getCondition(split(',', visibility))
+				RegisterAttributeDriver(header, 'state-visibility', condition)
+			end
+		end
+
+		return header
+	end
+end
+
+function oUF:Spawn(unit, overrideName, overrideTemplate)
+	argcheck(unit, 2, 'string')
+	if(not style) then return error("Unable to create frame. No styles have been registered.") end
+
+	unit = unit:lower()
+
+	local name = overrideName or generateName(unit)
+	local object = CreateFrame("Button", name, UIParent, overrideTemplate or "SecureUnitButtonTemplate")
+	Private.UpdateUnits(object, unit)
+
+	self:DisableBlizzard(unit)
+	walkObject(object, unit)
+
+	object:SetAttribute("unit", unit)
+	RegisterUnitWatch(object)
+
+	return object
+end
+
+function oUF:AddElement(name, update, enable, disable)
+	argcheck(name, 2, 'string')
+	argcheck(update, 3, 'function', 'nil')
+	argcheck(enable, 4, 'function', 'nil')
+	argcheck(disable, 5, 'function', 'nil')
+
+	if(elements[name]) then return error('Element [%s] is already registered.', name) end
+	elements[name] = {
+		update = update;
+		enable = enable;
+		disable = disable;
+	}
+end
+
+oUF.version = _VERSION
+oUF.objects = objects
+
+if(global) then
+	if(parent ~= 'oUF' and global == 'oUF') then
+		error("%s is doing it wrong and setting its global to oUF.", parent)
+	else
+		_G[global] = oUF
+	end
+end
+
+
+--[[
+ /$$$$$$$$                             /$$
+| $$_____/                            | $$
+| $$    /$$    /$$/$$$$$$  /$$$$$$$  /$$$$$$   /$$$$$$$
+| $$$$$|  $$  /$$/$$__  $$| $$__  $$|_  $$_/  /$$_____/
+| $$__/ \  $$/$$/ $$$$$$$$| $$  \ $$  | $$   |  $$$$$$
+| $$     \  $$$/| $$_____/| $$  | $$  | $$ /$$\____  $$
+| $$$$$$$$\  $/ |  $$$$$$$| $$  | $$  |  $$$$//$$$$$$$/
+|________/ \_/   \_______/|__/  |__/   \___/ |_______/
+--]]
+
+local RegisterEvent, UnregisterEvent, IsEventRegistered
+
+do
+	local eventFrame = CreateFrame("Frame")
+	local registry = {}
+	local framesForUnit = {}
+	local alternativeUnits = {
+		['player'] = 'vehicle',
+		['pet'] = 'player',
+		['party1'] = 'partypet1',
+		['party2'] = 'partypet2',
+		['party3'] = 'partypet3',
+		['party4'] = 'partypet4',
+	}
+
+	local RegisterFrameForUnit = function(frame, unit)
+		if not unit then return end
+		if framesForUnit[unit] then
+			framesForUnit[unit][frame] = true
+		else
+			framesForUnit[unit] = { [frame] = true }
+		end
+	end
+
+	local UnregisterFrameForUnit = function(frame, unit)
+		if not unit then return end
+		local frames = framesForUnit[unit]
+		if frames and frames[frame] then
+			frames[frame] = nil
+			if not next(frames) then
+				framesForUnit[unit] = nil
+			end
+		end
+	end
+
+	Private.UpdateUnits = function(frame, unit, realUnit)
+		if unit == realUnit then
+			realUnit = nil
+		end
+		if frame.unit ~= unit or frame.realUnit ~= realUnit then
+			if not frame:GetScript('OnUpdate') then
+				UnregisterFrameForUnit(frame, frame.unit)
+				UnregisterFrameForUnit(frame, frame.realUnit)
+				RegisterFrameForUnit(frame, unit)
+				RegisterFrameForUnit(frame, realUnit)
+			end
+
+			frame.alternativeUnit = alternativeUnits[unit]
+			frame.unit = unit
+			frame.realUnit = realUnit
+			frame.id = unit:match'^.-(%d+)'
+			return true
+		end
+	end
+
+	-- Holds true for every event, where the first (unit) argument should be ignored.
+	local sharedUnitEvents = {
+		UNIT_ENTERED_VEHICLE = true,
+		UNIT_EXITED_VEHICLE = true,
+		UNIT_PET = true,
+	}
+
+	eventFrame:SetScript('OnEvent', function(_, event, arg1, ...)
+		local listeners = registry[event]
+		if arg1 and not sharedUnitEvents[event] then
+			local frames = framesForUnit[arg1]
+			if frames then
+				for frame in next, frames do
+					if listeners[frame] and frame:IsVisible() then
+						frame[event](frame, event, arg1, ...)
+					end
+				end
+			end
+		else
+			for frame in next, listeners do
+				if frame:IsVisible() then
+					frame[event](frame, event, arg1, ...)
+				end
+			end
+		end
+	end)
+
+	function RegisterEvent(self, event, unitless)
+		if(unitless) then
+			sharedUnitEvents[event] = true
+		end
+
+		if not registry[event] then
+			registry[event] = { [self] = true }
+			eventFrame:RegisterEvent(event)
+		else
+			registry[event][self] = true
+		end
+	end
+
+	function UnregisterEvent(self, event)
+		if registry[event] then
+			registry[event][self] = nil
+			if not next(registry[event]) then
+				registry[event] = nil
+				eventFrame:UnregisterEvent(event)
+			end
+		end
+	end
+
+	function IsEventRegistered(self, event)
+		return registry[event] and registry[event][self]
+	end
+end
+
+local event_metatable = {
+	__call = function(funcs, self, ...)
+		for _, func in next, funcs do
+			func(self, ...)
+		end
+	end,
+}
+
+function frame_metatable.__index:RegisterEvent(event, func, unitless)
+	-- Block OnUpdate polled frames from registering events.
+	if(self.__eventless) then return end
+
+	argcheck(event, 2, 'string')
+
+	if(type(func) == 'string' and type(self[func]) == 'function') then
+		func = self[func]
+	end
+
+	local curev = self[event]
+	local kind = type(curev)
+	if(curev and func) then
+		if(kind == 'function' and curev ~= func) then
+			self[event] = setmetatable({curev, func}, event_metatable)
+		elseif(kind == 'table') then
+			for _, infunc in next, curev do
+				if(infunc == func) then return end
+			end
+
+			tinsert(curev, func)
+		end
+	elseif(IsEventRegistered(self, event)) then
+		return
+	else
+		if(type(func) == 'function') then
+			self[event] = func
+		elseif(not self[event]) then
+			return error("Style [%s] attempted to register event [%s] on unit [%s] with a handler that doesn't exist.", self.style, event, self.unit or 'unknown')
+		end
+
+		RegisterEvent(self, event, unitless)
+	end
+end
+
+function frame_metatable.__index:UnregisterEvent(event, func)
+	argcheck(event, 2, 'string')
+
+	local curev = self[event]
+	if(type(curev) == 'table' and func) then
+		for k, infunc in next, curev do
+			if(infunc == func) then
+				tremove(curev, k)
+
+				local n = #curev
+				if(n == 1) then
+					local _, handler = next(curev)
+					self[event] = handler
+				elseif(n == 0) then
+					UnregisterEvent(self, event)
+				end
+
+				break
+			end
+		end
+	elseif(curev == func) then
+		self[event] = nil
+		UnregisterEvent(self, event)
+	end
+end
+
+function frame_metatable.__index:IsEventRegistered(event)
+	return IsEventRegistered(self, event)
+end
+
+--[[
+ /$$$$$$$$                  /$$
+| $$_____/                 | $$
+| $$    /$$$$$$   /$$$$$$$/$$$$$$    /$$$$$$   /$$$$$$  /$$   /$$
+| $$$$$|____  $$ /$$_____/_  $$_/   /$$__  $$ /$$__  $$| $$  | $$
+| $$__/ /$$$$$$$| $$       | $$    | $$  \ $$| $$  \__/| $$  | $$
+| $$   /$$__  $$| $$       | $$ /$$| $$  | $$| $$      | $$  | $$
+| $$  |  $$$$$$$|  $$$$$$$ |  $$$$/|  $$$$$$/| $$      |  $$$$$$$
+|__/   \_______/ \_______/  \___/   \______/ |__/       \____  $$
+                                                        /$$  | $$
+                                                       |  $$$$$$/
+                                                        \______/
+--]]
+
+local tinsert = table.insert
+
+local _QUEUE = {}
+local _FACTORY = CreateFrame'Frame'
+_FACTORY:SetScript('OnEvent', function(self, event, ...)
+	return self[event](self, event, ...)
+end)
+
+_FACTORY:RegisterEvent'PLAYER_LOGIN'
+_FACTORY.active = true
+
+function _FACTORY:PLAYER_LOGIN()
+	if(not self.active) then return end
+
+	for _, func in next, _QUEUE do
+		func(oUF)
+	end
+
+	-- Avoid creating dupes.
+	wipe(_QUEUE)
+end
+
+function oUF:Factory(func)
+	argcheck(func, 2, 'function')
+
+	-- Call the function directly if we're active and logged in.
+	if(IsLoggedIn() and _FACTORY.active) then
+		return func(self)
+	else
+		tinsert(_QUEUE, func)
+	end
+end
+
+function oUF:EnableFactory()
+	_FACTORY.active = true
+end
+
+function oUF:DisableFactory()
+	_FACTORY.active = nil
+end
+
+function oUF:RunFactoryQueue()
+	_FACTORY:PLAYER_LOGIN()
+end
+
+--[[
+ /$$$$$$$  /$$ /$$                                             /$$
+| $$__  $$| $$|__/                                            | $$
+| $$  \ $$| $$ /$$ /$$$$$$$$/$$$$$$$$  /$$$$$$   /$$$$$$  /$$$$$$$
+| $$$$$$$ | $$| $$|____ /$$/____ /$$/ |____  $$ /$$__  $$/$$__  $$
+| $$__  $$| $$| $$   /$$$$/   /$$$$/   /$$$$$$$| $$  \__/ $$  | $$
+| $$  \ $$| $$| $$  /$$__/   /$$__/   /$$__  $$| $$     | $$  | $$
+| $$$$$$$/| $$| $$ /$$$$$$$$/$$$$$$$$|  $$$$$$$| $$     |  $$$$$$$
+|_______/ |__/|__/|________/________/ \_______/|__/      \_______/
+--]]
+
+local hiddenParent = CreateFrame("Frame")
+hiddenParent:Hide()
+
+local HandleFrame = function(baseName)
+	local frame
+	if(type(baseName) == 'string') then
+		frame = _G[baseName]
+	else
+		frame = baseName
+	end
+
+	if(frame) then
+		frame:UnregisterAllEvents()
+		frame:Hide()
+
+		-- Keep frame hidden without causing taint
+		frame:SetParent(hiddenParent)
+
+		local health = frame.healthbar
+		if(health) then
+			health:UnregisterAllEvents()
+		end
+
+		local power = frame.manabar
+		if(power) then
+			power:UnregisterAllEvents()
+		end
+
+		local spell = frame.spellbar
+		if(spell) then
+			spell:UnregisterAllEvents()
+		end
+
+		local altpowerbar = frame.powerBarAlt
+		if(altpowerbar) then
+			altpowerbar:UnregisterAllEvents()
+		end
+	end
+end
+
+function oUF:DisableBlizzard(unit)
+	if(not unit) or InCombatLockdown() then return end
+
+	if(unit == 'player') then
+		HandleFrame(PlayerFrame)
+
+		-- For the damn vehicle support:
+		PlayerFrame:RegisterUnitEvent('UNIT_ENTERING_VEHICLE', "player")
+		PlayerFrame:RegisterUnitEvent('UNIT_ENTERED_VEHICLE', "player")
+		PlayerFrame:RegisterUnitEvent('UNIT_EXITING_VEHICLE', "player")
+		PlayerFrame:RegisterUnitEvent('UNIT_EXITED_VEHICLE', "player")
+
+		-- User placed frames don't animate
+		PlayerFrame:SetUserPlaced(true)
+		PlayerFrame:SetDontSavePosition(true)
+	elseif(unit == 'pet') then
+		HandleFrame(PetFrame)
+	elseif(unit == 'target') then
+		HandleFrame(TargetFrame)
+		HandleFrame(ComboFrame)
+	elseif(unit == 'focus') then
+		HandleFrame(FocusFrame)
+		HandleFrame(TargetofFocusFrame)
+	elseif(unit == 'targettarget') then
+		HandleFrame(TargetFrameToT)
+	elseif(unit:match'(boss)%d?$' == 'boss') then
+		local id = unit:match'boss(%d)'
+		if(id) then
+			HandleFrame('Boss' .. id .. 'TargetFrame')
+		else
+			for i=1, 4 do
+				HandleFrame(('Boss%dTargetFrame'):format(i))
+			end
+		end
+	elseif(unit:match'(party)%d?$' == 'party') then
+		local id = unit:match'party(%d)'
+		if(id) then
+			HandleFrame('PartyMemberFrame' .. id)
+		else
+			for i=1, 4 do
+				HandleFrame(('PartyMemberFrame%d'):format(i))
+			end
+		end
+	elseif(unit:match'(arena)%d?$' == 'arena') then
+		local id = unit:match'arena(%d)'
+		if(id) then
+			HandleFrame('ArenaEnemyFrame' .. id)
+		else
+			for i=1, 4 do
+				HandleFrame(('ArenaEnemyFrame%d'):format(i))
+			end
+		end
+
+		-- Blizzard_ArenaUI should not be loaded
+		Arena_LoadUI = function() end
+		SetCVar('showArenaEnemyFrames', '0', 'SHOW_ARENA_ENEMY_FRAMES_TEXT')
+	end
+end
+
+--[[
+ /$$   /$$           /$$   /$$
+| $$  | $$          |__/  | $$
+| $$  | $$ /$$$$$$$  /$$ /$$$$$$   /$$$$$$$
+| $$  | $$| $$__  $$| $$|_  $$_/  /$$_____/
+| $$  | $$| $$  \ $$| $$  | $$   |  $$$$$$
+| $$  | $$| $$  | $$| $$  | $$ /$$\____  $$
+|  $$$$$$/| $$  | $$| $$  |  $$$$//$$$$$$$/
+ \______/ |__/  |__/|__/   \___/ |_______/
+--]]
+
+local enableTargetUpdate = Private.enableTargetUpdate
+
+-- Handles unit specific actions.
+function oUF:HandleUnit(object, unit)
+	local unit = object.unit or unit
+
+	if(unit == 'target') then
+		object:RegisterEvent('PLAYER_TARGET_CHANGED', object.UpdateAllElements)
+	elseif(unit == 'mouseover') then
+		object:RegisterEvent('UPDATE_MOUSEOVER_UNIT', object.UpdateAllElements)
+	elseif(unit == 'focus') then
+		object:RegisterEvent('PLAYER_FOCUS_CHANGED', object.UpdateAllElements)
+	elseif(unit:match'(boss)%d?$' == 'boss') then
+		object:RegisterEvent('INSTANCE_ENCOUNTER_ENGAGE_UNIT', object.UpdateAllElements, true)
+		object:RegisterEvent('UNIT_TARGETABLE_CHANGED', object.UpdateAllElements)
+	elseif(unit:match'%w+target') then
+		enableTargetUpdate(object)
+	end
+end
+
+--[[
+  /$$$$$$            /$$
+ /$$__  $$          | $$
+| $$  \__/  /$$$$$$ | $$  /$$$$$$   /$$$$$$  /$$$$$$$
+| $$       /$$__  $$| $$ /$$__  $$ /$$__  $$/$$_____/
+| $$      | $$  \ $$| $$| $$  \ $$| $$  \__/  $$$$$$
+| $$    $$| $$  | $$| $$| $$  | $$| $$      \____  $$
+|  $$$$$$/|  $$$$$$/| $$|  $$$$$$/| $$      /$$$$$$$/
+ \______/  \______/ |__/ \______/ |__/     |_______/
+--]]
+
+
+
+local colors = {
+	smooth = {
+		1, 0, 0,
+		1, 1, 0,
+		0, 1, 0
+	},
+	disconnected = {.6, .6, .6},
+	tapped = {.6,.6,.6},
+	class = {},
+	reaction = {},
+}
+
+-- We do this because people edit the vars directly, and changing the default
+-- globals makes SPICE FLOW!
+local customClassColors = function()
+	if(SVUI_CLASS_COLORS) then
+		local updateColors = function()
+			for eclass, color in next, SVUI_CLASS_COLORS do
+				colors.class[eclass] = {color.r, color.g, color.b}
+			end
+
+			for _, obj in next, oUF.objects do
+				obj:UpdateAllElements("SVUI_CLASS_COLORS")
+			end
+		end
+
+		updateColors()
+		SVUI_CLASS_COLORS:RegisterCallback(updateColors)
+
+		return true
+	end
+end
+if not customClassColors() then
+	for eclass, color in next, RAID_CLASS_COLORS do
+		colors.class[eclass] = {color.r, color.g, color.b}
+	end
+
+	local f = CreateFrame("Frame")
+	f:RegisterEvent("ADDON_LOADED")
+	f:SetScript("OnEvent", function()
+		if customClassColors() then
+			f:UnregisterEvent("ADDON_LOADED")
+			f:SetScript("OnEvent", nil)
+		end
+	end)
+end
+
+for eclass, color in next, FACTION_BAR_COLORS do
+	colors.reaction[eclass] = {color.r, color.g, color.b}
+end
+
+local function ColorsAndPercent(a, b, ...)
+	if a <= 0 or b == 0 then
+		return nil, ...
+	elseif a >= b then
+		return nil, select(select('#', ...) - 2, ...)
+	end
+
+	local num = select('#', ...) / 3
+	local segment, relperc = math.modf((a/b)*(num-1))
+	return relperc, select((segment*3)+1, ...)
+end
+
+-- http://www.wowwiki.com/ColorGradient
+local RGBColorGradient = function(...)
+	local relperc, r1, g1, b1, r2, g2, b2 = ColorsAndPercent(...)
+	if relperc then
+		return r1 + (r2-r1)*relperc, g1 + (g2-g1)*relperc, b1 + (b2-b1)*relperc
+	else
+		return r1, g1, b1
+	end
+end
+
+
+local function GetY(r, g, b)
+	return 0.3 * r + 0.59 * g + 0.11 * b
+end
+
+local function RGBToHCY(r, g, b)
+	local min, max = min(r, g, b), max(r, g, b)
+	local chroma = max - min
+	local hue
+	if chroma > 0 then
+		if r == max then
+			hue = ((g - b) / chroma) % 6
+		elseif g == max then
+			hue = (b - r) / chroma + 2
+		elseif b == max then
+			hue = (r - g) / chroma + 4
+		end
+		hue = hue / 6
+	end
+	return hue, chroma, GetY(r, g, b)
+end
+
+local abs = math.abs
+local function HCYtoRGB(hue, chroma, luma)
+	local r, g, b = 0, 0, 0
+	if hue then
+		local h2 = hue * 6
+		local x = chroma * (1 - abs(h2 % 2 - 1))
+		if h2 < 1 then
+			r, g, b = chroma, x, 0
+		elseif h2 < 2 then
+			r, g, b = x, chroma, 0
+		elseif h2 < 3 then
+			r, g, b = 0, chroma, x
+		elseif h2 < 4 then
+			r, g, b = 0, x, chroma
+		elseif h2 < 5 then
+			r, g, b = x, 0, chroma
+		else
+			r, g, b = chroma, 0, x
+		end
+	end
+	local m = luma - GetY(r, g, b)
+	return r + m, g + m, b + m
+end
+
+local HCYColorGradient = function(...)
+	local relperc, r1, g1, b1, r2, g2, b2 = ColorsAndPercent(...)
+	if not relperc then return r1, g1, b1 end
+	local h1, c1, y1 = RGBToHCY(r1, g1, b1)
+	local h2, c2, y2 = RGBToHCY(r2, g2, b2)
+	local c = c1 + (c2-c1) * relperc
+	local y = y1 + (y2-y1) * relperc
+	if h1 and h2 then
+		local dh = h2 - h1
+		if dh < -0.5  then
+			dh = dh + 1
+		elseif dh > 0.5 then
+			dh = dh - 1
+		end
+		return HCYtoRGB((h1 + dh * relperc) % 1, c, y)
+	else
+		return HCYtoRGB(h1 or h2, c, y)
+	end
+
+end
+
+local ColorGradient = function(...)
+	return (oUF.useHCYColorGradient and HCYColorGradient or RGBColorGradient)(...)
+end
+
+Private.colors = colors
+
+oUF.colors = colors
+oUF.ColorGradient = ColorGradient
+oUF.RGBColorGradient = RGBColorGradient
+oUF.HCYColorGradient = HCYColorGradient
+oUF.useHCYColorGradient = false
+
+frame_metatable.__index.colors = colors
+frame_metatable.__index.ColorGradient = ColorGradient
+
+--[[
+ /$$$$$$$$/$$                     /$$ /$$
+| $$_____/__/                    | $$|__/
+| $$      /$$ /$$$$$$$   /$$$$$$ | $$ /$$ /$$$$$$$$  /$$$$$$
+| $$$$$  | $$| $$__  $$ |____  $$| $$| $$|____ /$$/ /$$__  $$
+| $$__/  | $$| $$  \ $$  /$$$$$$$| $$| $$   /$$$$/ | $$$$$$$$
+| $$     | $$| $$  | $$ /$$__  $$| $$| $$  /$$__/  | $$_____/
+| $$     | $$| $$  | $$|  $$$$$$$| $$| $$ /$$$$$$$$|  $$$$$$$
+|__/     |__/|__/  |__/ \_______/|__/|__/|________/ \_______/
+--]]
+
+-- It's named Private for a reason!
+-- Private = nil
+ns.oUF = oUF
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/ouf.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/ouf.lua
new file mode 100644
index 0000000..e25715e
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/ouf.lua
@@ -0,0 +1,600 @@
+local parent, ns = ...
+local global = GetAddOnMetadata(parent, 'X-oUF')
+local _VERSION = GetAddOnMetadata(parent, 'version')
+
+local oUF = ns.oUF
+local Private = oUF.Private
+
+local argcheck = Private.argcheck
+
+local print = Private.print
+local error = Private.error
+
+local upper = string.upper
+local split = string.split
+local tinsert, tremove = table.insert, table.remove
+
+local styles, style = {}
+local callback, objects = {}, {}
+
+local elements = {}
+local activeElements = {}
+
+-- updating of "invalid" units.
+local enableTargetUpdate = function(object)
+	object.onUpdateFrequency = object.onUpdateFrequency or .5
+	object.__eventless = true
+
+	local total = 0
+	object:SetScript('OnUpdate', function(self, elapsed)
+		if(not self.unit) then
+			return
+		elseif(total > self.onUpdateFrequency) then
+			self:UpdateAllElements'OnUpdate'
+			total = 0
+		end
+
+		total = total + elapsed
+	end)
+end
+Private.enableTargetUpdate = enableTargetUpdate
+
+local updateActiveUnit = function(self, event, unit)
+	-- Calculate units to work with
+	local realUnit, modUnit = SecureButton_GetUnit(self), SecureButton_GetModifiedUnit(self)
+
+	-- _GetUnit() doesn't rewrite playerpet -> pet like _GetModifiedUnit does.
+	if(realUnit == 'playerpet') then
+		realUnit = 'pet'
+	elseif(realUnit == 'playertarget') then
+		realUnit = 'target'
+	end
+
+	if(modUnit == "pet" and realUnit ~= "pet") then
+		modUnit = "vehicle"
+	end
+
+	-- Drop out if the event unit doesn't match any of the frame units.
+	if(not UnitExists(modUnit) or unit and unit ~= realUnit and unit ~= modUnit) then return end
+
+	-- Change the active unit and run a full update.
+	if Private.UpdateUnits(self, modUnit, realUnit) then
+		self:UpdateAllElements('RefreshUnit')
+
+		return true
+	end
+end
+
+local iterateChildren = function(...)
+	for l = 1, select("#", ...) do
+		local obj = select(l, ...)
+
+		if(type(obj) == 'table' and obj.isChild) then
+			updateActiveUnit(obj, "iterateChildren")
+		end
+	end
+end
+
+local OnAttributeChanged = function(self, name, value)
+	if(name == "unit" and value) then
+		if(self.hasChildren) then
+			iterateChildren(self:GetChildren())
+		end
+
+		if(not self:GetAttribute'oUF-onlyProcessChildren') then
+			updateActiveUnit(self, "OnAttributeChanged")
+		end
+	end
+end
+
+local frame_metatable = {
+	__index = CreateFrame"Button"
+}
+Private.frame_metatable = frame_metatable
+
+for k, v in pairs{
+	UpdateElement = function(self, name)
+		local unit = self.unit
+		if(not unit or not UnitExists(unit)) then return end
+
+		local element = elements[name]
+		if(not element or not self:IsElementEnabled(name) or not activeElements[self]) then return end
+		if(element.update) then
+			element.update(self, 'OnShow', unit)
+		end
+	end,
+
+	EnableElement = function(self, name, unit)
+		argcheck(name, 2, 'string')
+		argcheck(unit, 3, 'string', 'nil')
+
+		local element = elements[name]
+
+
+		if(not element or self:IsElementEnabled(name) or not activeElements[self]) then return end
+
+		if(element.enable(self, unit or self.unit)) then
+			activeElements[self][name] = true
+
+			if(element.update) then
+				tinsert(self.__elements, element.update)
+			end
+		end
+	end,
+
+	DisableElement = function(self, name)
+		argcheck(name, 2, 'string')
+
+		local enable = self:IsElementEnabled(name)
+		if(not enable) then return end
+
+		local update = elements[name].update
+		for k, func in next, self.__elements do
+			if(func == update) then
+				tremove(self.__elements, k)
+				break
+			end
+		end
+
+		activeElements[self][name] = nil
+
+		-- We need to run a new update cycle in-case we knocked ourself out of sync.
+		-- The main reason we do this is to make sure the full update is completed
+		-- if an element for some reason removes itself _during_ the update
+		-- progress.
+		self:UpdateAllElements('DisableElement', name)
+
+		return elements[name].disable(self)
+	end,
+
+	IsElementEnabled = function(self, name)
+		argcheck(name, 2, 'string')
+
+		local element = elements[name]
+		if(not element) then return end
+
+		local active = activeElements[self]
+		return active and active[name]
+	end,
+
+	Enable = RegisterUnitWatch,
+	Disable = function(self)
+		UnregisterUnitWatch(self)
+		self:Hide()
+	end,
+
+	UpdateAllElements = function(self, event)
+		local unit = self.unit
+		if(not unit or not UnitExists(unit)) then return end
+
+		if(self.PreUpdate) then
+			self:PreUpdate(event)
+		end
+
+		for _, func in next, self.__elements do
+			func(self, event, unit)
+		end
+
+		if(self.PostUpdate) then
+			self:PostUpdate(event)
+		end
+	end,
+} do
+	frame_metatable.__index[k] = v
+end
+
+local OnShow = function(self)
+	if(not updateActiveUnit(self, 'OnShow')) then
+		return self:UpdateAllElements'OnShow'
+	end
+end
+
+local UpdatePet = function(self, event, unit)
+	local petUnit
+	if(unit == 'target') then
+		return
+	elseif(unit == 'player') then
+		petUnit = 'pet'
+	else
+		-- Convert raid26 -> raidpet26
+		petUnit = unit:gsub('^(%a+)(%d+)', '%1pet%2')
+	end
+
+	if(self.unit ~= petUnit) then return end
+	if(not updateActiveUnit(self, event)) then
+		return self:UpdateAllElements(event)
+	end
+end
+
+local initObject = function(unit, style, styleFunc, header, ...)
+	local num = select('#', ...)
+	for i=1, num do
+		local object = select(i, ...)
+		local objectUnit = object:GetAttribute'oUF-guessUnit' or unit
+		local suffix = object:GetAttribute'unitsuffix'
+
+		object.__elements = {}
+		object.style = style
+		object = setmetatable(object, frame_metatable)
+
+		-- Expose the frame through oUF.objects.
+		tinsert(objects, object)
+
+		-- We have to force update the frames when PEW fires.
+		object:RegisterEvent("PLAYER_ENTERING_WORLD", object.UpdateAllElements)
+
+		-- Handle the case where someone has modified the unitsuffix attribute in
+		-- oUF-initialConfigFunction.
+		if(suffix and objectUnit and not objectUnit:match(suffix)) then
+			objectUnit = objectUnit .. suffix
+		end
+
+		if(not (suffix == 'target' or objectUnit and objectUnit:match'target')) then
+			object:RegisterEvent('UNIT_ENTERED_VEHICLE', updateActiveUnit)
+			object:RegisterEvent('UNIT_EXITED_VEHICLE', updateActiveUnit)
+
+			-- We don't need to register UNIT_PET for the player unit. We register it
+			-- mainly because UNIT_EXITED_VEHICLE and UNIT_ENTERED_VEHICLE doesn't always
+			-- have pet information when they fire for party and raid units.
+			if(objectUnit ~= 'player') then
+				object:RegisterEvent('UNIT_PET', UpdatePet)
+			end
+		end
+
+		if(not header) then
+			-- No header means it's a frame created through :Spawn().
+			object:SetAttribute("*type1", "target")
+			object:SetAttribute('*type2', 'togglemenu')
+
+			-- No need to enable this for *target frames.
+			if(not (unit:match'target' or suffix == 'target')) then
+				object:SetAttribute('toggleForVehicle', true)
+			end
+
+			-- Other boss and target units are handled by :HandleUnit().
+			if(suffix == 'target') then
+				enableTargetUpdate(object)
+			else
+				oUF:HandleUnit(object)
+			end
+		else
+			-- Used to update frames when they change position in a group.
+			object:RegisterEvent('GROUP_ROSTER_UPDATE', object.UpdateAllElements)
+
+			if(num > 1) then
+				if(object:GetParent() == header) then
+					object.hasChildren = true
+				else
+					object.isChild = true
+				end
+			end
+
+			if(suffix == 'target') then
+				enableTargetUpdate(object)
+			end
+		end
+
+		Private.UpdateUnits(object, objectUnit)
+
+		styleFunc(object, objectUnit, not header)
+
+		object:SetScript("OnAttributeChanged", OnAttributeChanged)
+		object:SetScript("OnShow", OnShow)
+
+		activeElements[object] = {}
+		for element in next, elements do
+			object:EnableElement(element, objectUnit)
+		end
+
+		for _, func in next, callback do
+			func(object)
+		end
+
+		-- Make Clique happy
+		_G.ClickCastFrames = ClickCastFrames or {}
+		ClickCastFrames[object] = true
+	end
+end
+
+local walkObject = function(object, unit)
+	local parent = object:GetParent()
+	local style = parent.style or style
+	local styleFunc = styles[style]
+
+	local header = parent:GetAttribute'oUF-headerType' and parent
+
+	-- Check if we should leave the main frame blank.
+	if(object:GetAttribute'oUF-onlyProcessChildren') then
+		object.hasChildren = true
+		object:SetScript('OnAttributeChanged', OnAttributeChanged)
+		return initObject(unit, style, styleFunc, header, object:GetChildren())
+	end
+
+	return initObject(unit, style, styleFunc, header, object, object:GetChildren())
+end
+
+function oUF:RegisterInitCallback(func)
+	tinsert(callback, func)
+end
+
+function oUF:RegisterMetaFunction(name, func)
+	argcheck(name, 2, 'string')
+	argcheck(func, 3, 'function', 'table')
+
+	if(frame_metatable.__index[name]) then
+		return
+	end
+
+	frame_metatable.__index[name] = func
+end
+
+function oUF:RegisterStyle(name, func)
+	argcheck(name, 2, 'string')
+	argcheck(func, 3, 'function', 'table')
+
+	if(styles[name]) then return error("Style [%s] already registered.", name) end
+	if(not style) then style = name end
+
+	styles[name] = func
+end
+
+function oUF:SetActiveStyle(name)
+	argcheck(name, 2, 'string')
+	if(not styles[name]) then return error("Style [%s] does not exist.", name) end
+
+	style = name
+end
+
+do
+	local function iter(_, n)
+		-- don't expose the style functions.
+		return (next(styles, n))
+	end
+
+	function oUF.IterateStyles()
+		return iter, nil, nil
+	end
+end
+
+local getCondition
+do
+	local conditions = {
+		raid40 = '[@raid26,exists] show;',
+		raid25 = '[@raid11,exists] show;',
+		raid10 = '[@raid6,exists] show;',
+		raid = '[group:raid] show;',
+		party = '[group:party,nogroup:raid] show;',
+		solo = '[@player,exists,nogroup:party] show;',
+	}
+
+	function getCondition(...)
+		local cond = ''
+
+		for i=1, select('#', ...) do
+			local short = select(i, ...)
+
+			local condition = conditions[short]
+			if(condition) then
+				cond = cond .. condition
+			end
+		end
+
+		return cond .. 'hide'
+	end
+end
+
+local generateName = function(unit, ...)
+	local name = 'oUF_' .. style:gsub('[^%a%d_]+', '')
+
+	local raid, party, groupFilter
+	for i=1, select('#', ...), 2 do
+		local att, val = select(i, ...)
+		if(att == 'showRaid') then
+			raid = true
+		elseif(att == 'showParty') then
+			party = true
+		elseif(att == 'groupFilter') then
+			groupFilter = val
+		end
+	end
+
+	local append
+	if(raid) then
+		if(groupFilter) then
+			if(type(groupFilter) == 'number' and groupFilter > 0) then
+				append = groupFilter
+			elseif(groupFilter:match'TANK') then
+				append = 'MainTank'
+			elseif(groupFilter:match'ASSIST') then
+				append = 'MainAssist'
+			else
+				local _, count = groupFilter:gsub(',', '')
+				if(count == 0) then
+					append = 'Raid' .. groupFilter
+				else
+					append = 'Raid'
+				end
+			end
+		else
+			append = 'Raid'
+		end
+	elseif(party) then
+		append = 'Party'
+	elseif(unit) then
+		append = unit:gsub("^%l", upper)
+	end
+
+	if(append) then
+		name = name .. append
+	end
+
+	-- Change oUF_LilyRaidRaid into oUF_LilyRaid
+	name = name:gsub('(%u%l+)([%u%l]*)%1', '%1')
+	-- Change oUF_LilyTargettarget into oUF_LilyTargetTarget
+	name = name:gsub('t(arget)', 'T%1')
+
+	local base = name
+	local i = 2
+	while(_G[name]) do
+		name = base .. i
+		i = i + 1
+	end
+
+	return name
+end
+
+do
+	local styleProxy = function(self, frame, ...)
+		return walkObject(_G[frame])
+	end
+
+	-- There has to be an easier way to do this.
+	local initialConfigFunction = [[
+		local header = self:GetParent()
+		local frames = table.new()
+		table.insert(frames, self)
+		self:GetChildList(frames)
+		for i=1, #frames do
+			local frame = frames[i]
+			local unit
+			-- There's no need to do anything on frames with onlyProcessChildren
+			if(not frame:GetAttribute'oUF-onlyProcessChildren') then
+				RegisterUnitWatch(frame)
+
+				-- Attempt to guess what the header is set to spawn.
+				local groupFilter = header:GetAttribute'groupFilter'
+
+				if(type(groupFilter) == 'string' and groupFilter:match('MAIN[AT]')) then
+					local role = groupFilter:match('MAIN([AT])')
+					if(role == 'T') then
+						unit = 'maintank'
+					else
+						unit = 'mainassist'
+					end
+				elseif(header:GetAttribute'showRaid') then
+					unit = 'raid'
+				elseif(header:GetAttribute'showParty') then
+					unit = 'party'
+				end
+
+				local headerType = header:GetAttribute'oUF-headerType'
+				local suffix = frame:GetAttribute'unitsuffix'
+				if(unit and suffix) then
+					if(headerType == 'pet' and suffix == 'target') then
+						unit = unit .. headerType .. suffix
+					else
+						unit = unit .. suffix
+					end
+				elseif(unit and headerType == 'pet') then
+					unit = unit .. headerType
+				end
+
+				frame:SetAttribute('*type1', 'target')
+				frame:SetAttribute('*type2', 'togglemenu')
+				frame:SetAttribute('toggleForVehicle', true)
+				frame:SetAttribute('oUF-guessUnit', unit)
+			end
+
+			local body = header:GetAttribute'oUF-initialConfigFunction'
+			if(body) then
+				frame:Run(body, unit)
+			end
+		end
+
+		header:CallMethod('styleFunction', self:GetName())
+
+		local clique = header:GetFrameRef("clickcast_header")
+		if(clique) then
+			clique:SetAttribute("clickcast_button", self)
+			clique:RunAttribute("clickcast_register")
+		end
+	]]
+
+	function oUF:SpawnHeader(overrideName, template, visibility, ...)
+		if(not style) then return error("Unable to create frame. No styles have been registered.") end
+
+		template = (template or 'SecureGroupHeaderTemplate')
+
+		local isPetHeader = template:match'PetHeader'
+		local name = overrideName or generateName(nil, ...)
+		local header = CreateFrame('Frame', name, UIParent, template)
+
+		header:SetAttribute("template", "oUF_ClickCastUnitTemplate")
+		for i=1, select("#", ...), 2 do
+			local att, val = select(i, ...)
+			if(not att) then break end
+			header:SetAttribute(att, val)
+		end
+
+		header.style = style
+		header.styleFunction = styleProxy
+
+		-- We set it here so layouts can't directly override it.
+		header:SetAttribute('initialConfigFunction', initialConfigFunction)
+		header:SetAttribute('oUF-headerType', isPetHeader and 'pet' or 'group')
+
+		if(Clique) then
+			SecureHandlerSetFrameRef(header, 'clickcast_header', Clique.header)
+		end
+
+		if(header:GetAttribute'showParty') then
+			self:DisableBlizzard'party'
+		end
+
+		if(visibility) then
+			local type, list = split(' ', visibility, 2)
+			if(list and type == 'custom') then
+				RegisterAttributeDriver(header, 'state-visibility', list)
+			else
+				local condition = getCondition(split(',', visibility))
+				RegisterAttributeDriver(header, 'state-visibility', condition)
+			end
+		end
+
+		return header
+	end
+end
+
+function oUF:Spawn(unit, overrideName, overrideTemplate)
+	argcheck(unit, 2, 'string')
+	if(not style) then return error("Unable to create frame. No styles have been registered.") end
+
+	unit = unit:lower()
+
+	local name = overrideName or generateName(unit)
+	local object = CreateFrame("Button", name, UIParent, overrideTemplate or "SecureUnitButtonTemplate")
+	Private.UpdateUnits(object, unit)
+
+	self:DisableBlizzard(unit)
+	walkObject(object, unit)
+
+	object:SetAttribute("unit", unit)
+	RegisterUnitWatch(object)
+
+	return object
+end
+
+function oUF:AddElement(name, update, enable, disable)
+	argcheck(name, 2, 'string')
+	argcheck(update, 3, 'function', 'nil')
+	argcheck(enable, 4, 'function', 'nil')
+	argcheck(disable, 5, 'function', 'nil')
+
+	if(elements[name]) then return error('Element [%s] is already registered.', name) end
+	elements[name] = {
+		update = update;
+		enable = enable;
+		disable = disable;
+	}
+end
+
+oUF.version = _VERSION
+oUF.objects = objects
+
+if(global) then
+	if(parent ~= 'oUF' and global == 'oUF') then
+		error("%s is doing it wrong and setting its global to oUF.", parent)
+	else
+		_G[global] = oUF
+	end
+end
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/private.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/private.lua
new file mode 100644
index 0000000..2cb4814
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/private.lua
@@ -0,0 +1,25 @@
+local parent, ns = ...
+local Private = ns.oUF.Private
+
+local match = string.match
+local format = string.format
+
+function Private.argcheck(value, num, ...)
+	assert(type(num) == 'number', "Bad argument #2 to 'argcheck' (number expected, got "..type(num)..")")
+
+	for i=1,select("#", ...) do
+		if type(value) == select(i, ...) then return end
+	end
+
+	local types = strjoin(", ", ...)
+	local name = match(debugstack(2,2,0), ": in function [`<](.-)['>]")
+	error(("Bad argument #%d to '%s' (%s expected, got %s"):format(num, name, types, type(value)), 3)
+end
+
+function Private.print(...)
+	print("|cff33ff99oUF:|r", ...)
+end
+
+function Private.error(...)
+	Private.print("|cffff0000Error:|r "..format(...))
+end
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/units.lua b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/units.lua
new file mode 100644
index 0000000..f90361a
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/units.lua
@@ -0,0 +1,23 @@
+local parent, ns = ...
+local oUF = ns.oUF
+local Private = oUF.Private
+
+local enableTargetUpdate = Private.enableTargetUpdate
+
+-- Handles unit specific actions.
+function oUF:HandleUnit(object, unit)
+	local unit = object.unit or unit
+
+	if(unit == 'target') then
+		object:RegisterEvent('PLAYER_TARGET_CHANGED', object.UpdateAllElements)
+	elseif(unit == 'mouseover') then
+		object:RegisterEvent('UPDATE_MOUSEOVER_UNIT', object.UpdateAllElements)
+	elseif(unit == 'focus') then
+		object:RegisterEvent('PLAYER_FOCUS_CHANGED', object.UpdateAllElements)
+	elseif(unit:match'(boss)%d?$' == 'boss') then
+		object:RegisterEvent('INSTANCE_ENCOUNTER_ENGAGE_UNIT', object.UpdateAllElements, true)
+		object:RegisterEvent('UNIT_TARGETABLE_CHANGED', object.UpdateAllElements)
+	elseif(unit:match'%w+target') then
+		enableTargetUpdate(object)
+	end
+end
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/utils/changelog b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/utils/changelog
new file mode 100644
index 0000000..fdafa94
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF/utils/changelog
@@ -0,0 +1,84 @@
+#!/usr/bin/env lua
+
+local tags = {}
+do
+	for tag in io.popen('git tag'):lines() do
+		local split = tag:gmatch('[^.]+')
+		local release, api, bugfix = split(), split(), split() or 0
+		table.insert(
+			tags,
+			{
+				string = tag,
+				release = release,
+				api = api,
+				bugfix = bugfix,
+			}
+		)
+	end
+
+	table.sort(tags, function(a,b)
+		a = a.release * 1e4 + a.api * 100 + a.bugfix
+		b = b.release * 1e4 + b.api * 100 + b.bugfix
+
+		return a > b
+	end)
+end
+
+local generateLog = function(prevTag, currentTag)
+	local ti = table.insert
+	local sf = string.format
+
+	local out = {}
+
+	ti(out, sf('[b]Changes in %s:[/b]', currentTag))
+	ti(out, '[list]')
+
+	for line in io.popen(sf('git shortlog %s..%s', prevTag, currentTag)):lines() do
+		if(line:sub(1, 6) == '      ') then
+			local offset = line:match('()     ', 7)
+			if(offset) then
+				line = line:sub(7, offset - 1)
+			else
+				line = line:sub(7)
+			end
+
+			ti(out, sf('   [*] %s', line))
+		elseif(#line == 0) then
+			ti(out, '  [/list]')
+		else
+			ti(out, sf(' [*][i]%s[/i]', line))
+			ti(out, '  [list=1]')
+		end
+	end
+
+	ti(out, '[/list]')
+
+	local p = assert(io.popen(sf('git diff --shortstat %s..%s', prevTag, currentTag)))
+	local stat = p:read'*a'
+	p:close()
+
+	ti(out, sf('[indent]%s[/indent]', stat:sub(2, -2)))
+
+	return table.concat(out, '\n')
+end
+
+local stop
+local to = ...
+if(to) then
+	for i=1, #tags do
+		if(tags[i].string == to) then
+			stop = i + 1
+		end
+	end
+
+	if(not stop) then stop = #tags end
+else
+	stop = #tags
+end
+
+for i=2, stop do
+	local current, prev = tags[i -1], tags[i]
+	print(generateLog(prev.string, current.string))
+end
+
+-- vim: set filetype=lua :
diff --git a/Interface/AddOns/SVUI/libs/oUF_Villain/oUF_Villain.xml b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF_Villain.xml
new file mode 100644
index 0000000..902ba11
--- /dev/null
+++ b/Interface/AddOns/SVUI/libs/oUF_Villain/oUF_Villain.xml
@@ -0,0 +1,82 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
+
+	<!-- oUF Core Files -->
+	<Script file='oUF\init.lua' />
+	<Script file='oUF\private.lua' />
+	<Script file='oUF\ouf.lua' />
+	<Script file='oUF\events.lua'/>
+	<Script file='oUF\factory.lua' />
+	<Script file='oUF\blizzard.lua' />
+	<Script file='oUF\units.lua' />
+	<Script file='oUF\colors.lua' />
+	<Script file='oUF\finalize.lua' />
+
+	<Script file='oUF\elements\power.lua' />
+	<Script file='oUF\elements\aura.lua' />
+	<Script file='oUF\elements\health.lua' />
+	<Script file='oUF\elements\cpoints.lua' />
+	<Script file='oUF\elements\ricons.lua' />
+	<Script file='oUF\elements\leader.lua' />
+	<Script file='oUF\elements\combat.lua' />
+	<Script file='oUF\elements\resting.lua' />
+	<Script file='oUF\elements\pvp.lua' />
+	<Script file='oUF\elements\portraits.lua' />
+	<Script file='oUF\elements\range.lua' />
+	<Script file='oUF\elements\castbar.lua' />
+	<Script file='oUF\elements\threat.lua' />
+	<Script file='oUF\elements\tags.lua' />
+	<Script file='oUF\elements\masterlooter.lua' />
+	<Script file='oUF\elements\assistant.lua' />
+	<Script file='oUF\elements\runebar.lua' />
+	<Script file='oUF\elements\lfdrole.lua' />
+	<Script file='oUF\elements\healprediction.lua' />
+	<Script file='oUF\elements\picon.lua' />
+	<Script file='oUF\elements\readycheck.lua' />
+	<Script file='oUF\elements\qicon.lua' />
+	<Script file='oUF\elements\eclipsebar.lua' />
+	<Script file='oUF\elements\altpowerbar.lua' />
+	<Script file='oUF\elements\totems.lua' />
+	<Script file='oUF\elements\resurrect.lua' />
+	<Script file='oUF\elements\druidmana.lua' />
+	<Script file='oUF\elements\stagger.lua' />
+
+	<!-- Clique support -->
+	<Button name="oUF_ClickCastUnitTemplate" virtual="true" inherits="SecureUnitButtonTemplate,SecureHandlerEnterLeaveTemplate">
+		<Attributes>
+			<Attribute name="_onenter" type="string" value="local snippet = self:GetAttribute('clickcast_onenter'); if snippet then self:Run(snippet) end"/>
+			<Attribute name="_onleave" type="string" value="local snippet = self:GetAttribute('clickcast_onleave'); if snippet then self:Run(snippet) end"/>
+		</Attributes>
+	</Button>
+
+	<!-- Pet Battle Hider Frame -->
+	<Frame name="oUF_PetBattleFrameHider" inherits="SecureHandlerStateTemplate" parent="UIParent" setAllPoints="true">
+		<Scripts>
+			<OnLoad>
+				RegisterStateDriver(self, "visibility", "[petbattle] hide; show")
+			</OnLoad>
+		</Scripts>
+	</Frame>
+
+	<!-- Custom oUF Plugins -->
+	<Script file="plugins\oUF_AuraWatch\oUF_AuraWatch.lua"/>
+	<Script file="plugins\oUF_AuraBars\oUF_AuraBars.lua"/>
+	<Script file="plugins\oUF_RaidDebuffs\oUF_RaidDebuffs.lua"/>
+	<Script file="plugins\oUF_Smooth\oUF_Smooth.lua"/>
+	<Script file="plugins\oUF_DruidMana\oUF_DruidMana.lua"/>
+	<Script file="plugins\oUF_CombatFader\oUF_CombatFader.lua"/>
+	<Script file="plugins\oUF_Experience\oUF_Experience.lua"/>
+	<Script file="plugins\oUF_Reputation\oUF_Reputation.lua"/>
+	<Script file="plugins\oUF_Friendship\oUF_Friendship.lua"/>
+	<Script file="plugins\oUF_ArcaneCharge\oUF_ArcaneCharge.lua"/>
+	<Script file="plugins\oUF_ActionPanel\oUF_ActionPanel.lua"/>
+	<Script file="plugins\oUF_Afflicted\oUF_Afflicted.lua"/>
+	<Script file="plugins\oUF_MainTank\oUF_MainTank.lua"/>
+	<Script file="plugins\oUF_PallyPower\oUF_PallyPower.lua"/>
+	<Script file="plugins\oUF_WarlockShards\oUF_WarlockShards.lua"/>
+	<Script file="plugins\oUF_PriestOrbs\oUF_PriestOrbs.lua"/>
+	<Script file="plugins\oUF_MonkHarmony\oUF_MonkHarmony.lua"/>
+	<Script file="plugins\oUF_DrunkenMaster\oUF_DrunkenMaster.lua"/>
+	<Script file="plugins\oUF_TotemBars\oUF_TotemBars.lua"/>
+	<Script file="plugins\oUF_HyperCombo\oUF_HyperCombo.lua"/>
+	<Script file="plugins\oUF_Combatant\oUF_Combatant.lua"/>
+</Ui>
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/packages/actionbar/KeyBind.lua b/Interface/AddOns/SVUI/packages/actionbar/KeyBind.lua
index 300d4ec..1588aef 100644
--- a/Interface/AddOns/SVUI/packages/actionbar/KeyBind.lua
+++ b/Interface/AddOns/SVUI/packages/actionbar/KeyBind.lua
@@ -36,7 +36,8 @@ local tonumber = tonumber;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale();
 local MOD = SV.SVBar;

 local _G = getfenv(0);
diff --git a/Interface/AddOns/SVUI/packages/actionbar/SVBar.lua b/Interface/AddOns/SVUI/packages/actionbar/SVBar.lua
index 29bff9f..6bccfd8 100644
--- a/Interface/AddOns/SVUI/packages/actionbar/SVBar.lua
+++ b/Interface/AddOns/SVUI/packages/actionbar/SVBar.lua
@@ -33,8 +33,11 @@ local ceil = math.ceil;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
-local CONFIGS = SV.Configs
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local LSM = LibStub("LibSharedMedia-3.0")
+local CONFIGS = SV.private
 local MOD = {};
 MOD.ButtonCache = {};
 --[[
@@ -366,7 +369,7 @@ local function ModifyActionButton(parent)
 		count:ClearAllPoints()
 		count:SetPoint("BOTTOMRIGHT",1,1)
 		count:SetShadowOffset(1,-1)
-		count:SetFontTemplate(SV.Shared:Fetch("font",MOD.db.countFont),MOD.db.countFontSize,MOD.db.countFontOutline)
+		count:SetFontTemplate(LSM:Fetch("font",MOD.db.countFont),MOD.db.countFontSize,MOD.db.countFontOutline)
 	end
 	if icon then
 		icon:SetTexCoord(.1,.9,.1,.9)
@@ -377,7 +380,7 @@ local function ModifyActionButton(parent)
 	if MOD.db.hotkeytext then
 		hotkey:ClearAllPoints()
 		hotkey:SetAllPoints()
-		hotkey:SetFontTemplate(SV.Shared:Fetch("font",MOD.db.font),MOD.db.fontSize,MOD.db.fontOutline)
+		hotkey:SetFontTemplate(LSM:Fetch("font",MOD.db.font),MOD.db.fontSize,MOD.db.fontOutline)
 		hotkey:SetJustifyH("RIGHT")
     	hotkey:SetJustifyV("TOP")
 		hotkey:SetShadowOffset(1,-1)
diff --git a/Interface/AddOns/SVUI/packages/aura/SVAura.lua b/Interface/AddOns/SVUI/packages/aura/SVAura.lua
index 6399d93..fc7949e 100644
--- a/Interface/AddOns/SVUI/packages/aura/SVAura.lua
+++ b/Interface/AddOns/SVUI/packages/aura/SVAura.lua
@@ -42,8 +42,11 @@ local tremove, twipe = table.remove, table.wipe;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
-local CONFIGS = SV.Configs
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local LSM = LibStub("LibSharedMedia-3.0")
+local CONFIGS = SV.private
 local MOD = {};
 --[[
 ##########################################################
@@ -289,7 +292,7 @@ do
 			end
 			aura.Skinned = true
 		end
-		local font = SV.Shared:Fetch("font", MOD.db.font)
+		local font = LSM:Fetch("font", MOD.db.font)
 		aura.texture = aura:CreateTexture(nil, "BORDER")
 		aura.texture:FillInner(aura, 2, 2)
 		aura.texture:SetTexCoord(0.1, 0.9, 0.1, 0.9)
@@ -483,7 +486,7 @@ function MOD:UpdateAuraHeader(auraHeader, auraType)

 	local db = self.db[auraType]
 	local showBy = db.showBy
-	local font = SV.Shared:Fetch("font", self.db.font)
+	local font = LSM:Fetch("font", self.db.font)

 	if auraType == "buffs" then
 		auraHeader:SetAttribute("consolidateTo", self.db.hyperBuffs.enable == true and 1 or 0)
diff --git a/Interface/AddOns/SVUI/packages/aura/SVAura.xml b/Interface/AddOns/SVUI/packages/aura/SVAura.xml
index 236367a..7fdba36 100644
--- a/Interface/AddOns/SVUI/packages/aura/SVAura.xml
+++ b/Interface/AddOns/SVUI/packages/aura/SVAura.xml
@@ -8,7 +8,7 @@
         </Attributes>
         <Scripts>
             <OnLoad>
-                SVUI[1].SVAura:CreateIcon(self)
+                SVUI.SVAura:CreateIcon(self)
                 self:RegisterForClicks('RightButtonUp')
             </OnLoad>
             <OnEnter>
diff --git a/Interface/AddOns/SVUI/packages/bag/SVBag.lua b/Interface/AddOns/SVUI/packages/bag/SVBag.lua
index 093b9d7..1dc4d5d 100644
--- a/Interface/AddOns/SVUI/packages/bag/SVBag.lua
+++ b/Interface/AddOns/SVUI/packages/bag/SVBag.lua
@@ -40,8 +40,10 @@ local twipe = table.wipe;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
-local CONFIGS = SV.Configs
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local CONFIGS = SV.private
 local MOD = {};
 local TTIP = SV.SVTip;
 --[[
diff --git a/Interface/AddOns/SVUI/packages/bag/tools/breakstuff.lua b/Interface/AddOns/SVUI/packages/bag/tools/breakstuff.lua
index d32f201..77ab520 100644
--- a/Interface/AddOns/SVUI/packages/bag/tools/breakstuff.lua
+++ b/Interface/AddOns/SVUI/packages/bag/tools/breakstuff.lua
@@ -32,7 +32,8 @@ local tremove, tcopy, twipe, tsort, tcat = table.remove, table.copy, table.wipe,
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale();
 local MOD = SV.SVBag;
 local TTIP = SV.SVTip;
 --[[
diff --git a/Interface/AddOns/SVUI/packages/bag/tools/sorting.lua b/Interface/AddOns/SVUI/packages/bag/tools/sorting.lua
index bfebcc7..4a2213f 100644
--- a/Interface/AddOns/SVUI/packages/bag/tools/sorting.lua
+++ b/Interface/AddOns/SVUI/packages/bag/tools/sorting.lua
@@ -42,7 +42,8 @@ local tremove, tcopy, twipe, tsort = table.remove, table.copy, table.wipe, table
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale();
 local MOD = SV.SVBag;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/chat/SVChat.lua b/Interface/AddOns/SVUI/packages/chat/SVChat.lua
index 0bec632..698c9b9 100644
--- a/Interface/AddOns/SVUI/packages/chat/SVChat.lua
+++ b/Interface/AddOns/SVUI/packages/chat/SVChat.lua
@@ -34,8 +34,11 @@ local twipe = table.wipe;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
-local CONFIGS = SV.Configs
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local LSM = LibStub("LibSharedMedia-3.0")
+local CONFIGS = SV.private
 local MOD = {};
 --[[
 ##########################################################
@@ -907,17 +910,17 @@ function MOD:UpdateLocals()
 	CHAT_ALLOW_URL = self.db.url;
 	CHAT_HOVER_URL = self.db.hyperlinkHover;
 	CHAT_STICKY = self.db.sticky;
-	CHAT_FONT = SV.Shared:Fetch("font", self.db.font);
+	CHAT_FONT = LSM:Fetch("font", self.db.font);
 	CHAT_FONTSIZE = SV.db.media.fonts.size or 12;
 	CHAT_FONTOUTLINE = self.db.fontOutline;
 	TAB_WIDTH = self.db.tabWidth;
 	TAB_HEIGHT = self.db.tabHeight;
 	TAB_SKINS = self.db.tabStyled;
-	TAB_FONT = SV.Shared:Fetch("font", self.db.tabFont);
+	TAB_FONT = LSM:Fetch("font", self.db.tabFont);
 	TAB_FONTSIZE = self.db.tabFontSize;
 	TAB_FONTOUTLINE = self.db.tabFontOutline;
 	CHAT_FADING = self.db.fade;
-	CHAT_PSST = SV.Shared:Fetch("sound", self.db.psst);
+	CHAT_PSST = LSM:Fetch("sound", self.db.psst);
 	TIME_STAMP_MASK = self.db.timeStampFormat;
 	if(CHAT_THROTTLE and CHAT_THROTTLE == 0) then
 		twipe(THROTTLE_CACHE)
diff --git a/Interface/AddOns/SVUI/packages/dock/SVDock.lua b/Interface/AddOns/SVUI/packages/dock/SVDock.lua
index acae141..06aae69 100644
--- a/Interface/AddOns/SVUI/packages/dock/SVDock.lua
+++ b/Interface/AddOns/SVUI/packages/dock/SVDock.lua
@@ -33,8 +33,10 @@ local format, gsub, strfind, strmatch, tonumber = format, gsub, strfind, strmatc
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
-local CONFIGS = SV.Configs
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local CONFIGS = SV.private
 local MOD, DOCKLET_CACHE, TOOL_CACHE, SAFETY_CACHE = {}, {}, {}, {};
 local PREV_TOOL, DEFAULT_DOCKLET;
 --[[
diff --git a/Interface/AddOns/SVUI/packages/gear/SVGear.lua b/Interface/AddOns/SVUI/packages/gear/SVGear.lua
index 496cfcf..479d602 100644
--- a/Interface/AddOns/SVUI/packages/gear/SVGear.lua
+++ b/Interface/AddOns/SVUI/packages/gear/SVGear.lua
@@ -32,8 +32,10 @@ local ceil, floor, round = math.ceil, math.floor, math.round;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
-local CONFIGS = SV.Configs
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local CONFIGS = SV.private
 local MOD = {};
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/henchmen/SVHenchmen.lua b/Interface/AddOns/SVUI/packages/henchmen/SVHenchmen.lua
index 61afd9d..da42f41 100644
--- a/Interface/AddOns/SVUI/packages/henchmen/SVHenchmen.lua
+++ b/Interface/AddOns/SVUI/packages/henchmen/SVHenchmen.lua
@@ -13,8 +13,10 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L, Registry = unpack(select(2, ...));
-local CONFIGS = SV.Configs
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local CONFIGS = SV.private
 local MOD = {}
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/map/SVMap.lua b/Interface/AddOns/SVUI/packages/map/SVMap.lua
index 4dcd9af..fd86ca5 100644
--- a/Interface/AddOns/SVUI/packages/map/SVMap.lua
+++ b/Interface/AddOns/SVUI/packages/map/SVMap.lua
@@ -36,8 +36,10 @@ local parsefloat = math.parsefloat;  -- Uncommon
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
-local CONFIGS = SV.Configs
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local CONFIGS = SV.private
 local MOD = {};
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/override/SVOverride.lua b/Interface/AddOns/SVUI/packages/override/SVOverride.lua
index 46888cf..0ca0d5a 100644
--- a/Interface/AddOns/SVUI/packages/override/SVOverride.lua
+++ b/Interface/AddOns/SVUI/packages/override/SVOverride.lua
@@ -33,8 +33,11 @@ local abs, ceil, floor, round = math.abs, math.ceil, math.floor, math.round;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
-local CONFIGS = SV.Configs
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local LSM = LibStub("LibSharedMedia-3.0")
+local CONFIGS = SV.private
 local MOD = {};
 MOD.LewtRollz = {};
 --[[
@@ -643,7 +646,7 @@ local function MakeSlots(id)
 	slot.count = slot.iconFrame:CreateFontString(nil, "OVERLAY")
 	slot.count:SetJustifyH("RIGHT")
 	slot.count:Point("BOTTOMRIGHT", slot.iconFrame, -2, 2)
-	slot.count:SetFont(SV.Shared:Fetch("font", "Roboto"), 12, "OUTLINE")
+	slot.count:SetFont(LSM:Fetch("font", "Roboto"), 12, "OUTLINE")
 	slot.count:SetText(1)

 	slot.name = slot:CreateFontString(nil, "OVERLAY")
@@ -651,7 +654,7 @@ local function MakeSlots(id)
 	slot.name:SetPoint("LEFT", slot)
 	slot.name:SetPoint("RIGHT", slot.icon, "LEFT")
 	slot.name:SetNonSpaceWrap(true)
-	slot.name:SetFont(SV.Shared:Fetch("font", "Roboto"), 12, "OUTLINE")
+	slot.name:SetFont(LSM:Fetch("font", "Roboto"), 12, "OUTLINE")

 	slot.drop = slot:CreateTexture(nil, "ARTWORK")
 	slot.drop:SetTexture("Interface\\QuestFrame\\UI-QuestLogTitleHighlight")
@@ -687,7 +690,7 @@ local function CreateRollButton(rollFrame, type, locale, anchor)
 	rollButton:SetScript("OnClick", DoDaRoll)
 	rollButton:SetMotionScriptsWhileDisabled(true)
 	local text = rollButton:CreateFontString(nil, nil)
-	text:SetFont(SV.Shared:Fetch("font", "Roboto"),14,"OUTLINE")
+	text:SetFont(LSM:Fetch("font", "Roboto"),14,"OUTLINE")
 	text:Point("CENTER", 0, ((type == 2 and 1) or (type == 0 and -1.2) or 0))
 	return rollButton, text
 end
@@ -741,16 +744,16 @@ local function CreateRollFrame()
 	rollFrame.need,rollFrame.greed,rollFrame.pass,rollFrame.disenchant = needText,greedText,passText,deText;
 	rollFrame.bindText = rollFrame:CreateFontString()
 	rollFrame.bindText:Point("LEFT",passButton,"RIGHT",3,1)
-	rollFrame.bindText:SetFont(SV.Shared:Fetch("font", "SVUI Number Font"),14,"OUTLINE")
+	rollFrame.bindText:SetFont(LSM:Fetch("font", "SVUI Number Font"),14,"OUTLINE")
 	rollFrame.lootText = rollFrame:CreateFontString(nil,"ARTWORK")
-	rollFrame.lootText:SetFont(SV.Shared:Fetch("font", "SVUI Number Font"),14,"OUTLINE")
+	rollFrame.lootText:SetFont(LSM:Fetch("font", "SVUI Number Font"),14,"OUTLINE")
 	rollFrame.lootText:Point("LEFT",rollFrame.bindText,"RIGHT",0,0)
 	rollFrame.lootText:Point("RIGHT",rollFrame,"RIGHT",-5,0)
 	rollFrame.lootText:Size(200,10)
 	rollFrame.lootText:SetJustifyH("LEFT")

 	rollFrame.yourRoll = rollFrame:CreateFontString(nil,"ARTWORK")
-	rollFrame.yourRoll:SetFont(SV.Shared:Fetch("font", "SVUI Number Font"),18,"OUTLINE")
+	rollFrame.yourRoll:SetFont(LSM:Fetch("font", "SVUI Number Font"),18,"OUTLINE")
 	rollFrame.yourRoll:Size(22,22)
 	rollFrame.yourRoll:Point("LEFT",rollFrame,"RIGHT",5,0)
 	rollFrame.yourRoll:SetJustifyH("CENTER")
@@ -1049,7 +1052,7 @@ function MOD:Load()

 	LootFrame:UnregisterAllEvents();
 	SVUI_LootFrame:SetFixedPanelTemplate('Transparent');
-	SVUI_LootFrame.title:SetFont(SV.Shared:Fetch("font", "SVUI Number Font"),18,"OUTLINE")
+	SVUI_LootFrame.title:SetFont(LSM:Fetch("font", "SVUI Number Font"),18,"OUTLINE")
 	SV:SetSVMovable(SVUI_LootFrameHolder, L["Loot Frame"], nil, nil, nil, nil, "SVUI_LootFrame");
 	tinsert(UISpecialFrames, "SVUI_LootFrame");

@@ -1059,7 +1062,13 @@ function MOD:Load()
 	self:RegisterEvent("CONFIRM_DISENCHANT_ROLL", AutoConfirmLoot)
 	self:RegisterEvent("CONFIRM_LOOT_ROLL", AutoConfirmLoot)
 	self:RegisterEvent("LOOT_BIND_CONFIRM", AutoConfirmLoot)
-	self:RegisterEvent("LOOT_OPENED", OpenedLootHandler);
+
+	if(SV.___interface < 60000) then
+		self:RegisterEvent("LOOT_OPENED", OpenedLootHandler)
+	else
+		self:RegisterEvent("LOOT_READY", OpenedLootHandler)
+	end
+
 	self:RegisterEvent("LOOT_SLOT_CLEARED", LootSimpleEventsHandler);
 	self:RegisterEvent("LOOT_CLOSED", LootSimpleEventsHandler);
 	self:RegisterEvent("OPEN_MASTER_LOOT_LIST", LootSimpleEventsHandler);
diff --git a/Interface/AddOns/SVUI/packages/plates/SVPlate.lua b/Interface/AddOns/SVUI/packages/plates/SVPlate.lua
index 62ae4b0..1a6931a 100644
--- a/Interface/AddOns/SVUI/packages/plates/SVPlate.lua
+++ b/Interface/AddOns/SVUI/packages/plates/SVPlate.lua
@@ -49,8 +49,11 @@ local tremove, tcopy, twipe, tsort, tconcat = table.remove, table.copy, table.wi
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
-local CONFIGS = SV.Configs
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local LSM = LibStub("LibSharedMedia-3.0")
+local CONFIGS = SV.private
 local MOD = {};
 --[[
 ##########################################################
@@ -1475,11 +1478,11 @@ function MOD:UpdateLocals()
 	NPBaseAlpha = db.nonTargetAlpha;
 	NPCombatHide = db.combatHide;

-	NPFont = SV.Shared:Fetch("font", db.font);
+	NPFont = LSM:Fetch("font", db.font);
 	NPFSize = db.fontSize;
 	NPFOutline = db.fontOutline;

-	AuraFont = SV.Shared:Fetch("font", db.auras.font);
+	AuraFont = LSM:Fetch("font", db.auras.font);
 	AuraFSize = db.auras.fontSize;
 	AuraFOutline = db.auras.fontOutline;
 	AuraMaxCount = db.auras.numAuras;
@@ -1524,7 +1527,7 @@ function MOD:UpdateLocals()
 	NPReactNeutral = {rc.neutral[1], rc.neutral[2], rc.neutral[3]}
 	NPReactEnemy = {rc.enemy[1], rc.enemy[2], rc.enemy[3]}

-	AuraFont = SV.Shared:Fetch("font", db.auras.font);
+	AuraFont = LSM:Fetch("font", db.auras.font);
 	AuraFSize = db.auras.fontSize;
 	AuraFOutline = db.auras.fontOutline;
 	AuraMaxCount = db.auras.numAuras;
diff --git a/Interface/AddOns/SVUI/packages/stats/SVStats.lua b/Interface/AddOns/SVUI/packages/stats/SVStats.lua
index eac71af..1bef13e 100644
--- a/Interface/AddOns/SVUI/packages/stats/SVStats.lua
+++ b/Interface/AddOns/SVUI/packages/stats/SVStats.lua
@@ -33,8 +33,11 @@ local min = math.min;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
-local CONFIGS = SV.Configs
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local LSM = LibStub("LibSharedMedia-3.0")
+local CONFIGS = SV.private
 local MOD = {};
 MOD.Anchors = {};
 MOD.Statistics = {};
@@ -249,11 +252,11 @@ function MOD:NewAnchor(parent, maxCount, tipAnchor, isTop, customTemplate, isVer
 			parent.holders[position].text = parent.holders[position].textframe:CreateFontString(nil, "OVERLAY", nil, 7)
 			parent.holders[position].text:SetAllPoints()
 			if(MOD.db.showBackground) then
-				parent.holders[position].text:SetFontTemplate(SV.Shared:Fetch("font", MOD.db.font), MOD.db.fontSize, "NONE", "CENTER", "MIDDLE")
+				parent.holders[position].text:SetFontTemplate(LSM:Fetch("font", MOD.db.font), MOD.db.fontSize, "NONE", "CENTER", "MIDDLE")
 				parent.holders[position].text:SetShadowColor(0, 0, 0, 0.5)
 				parent.holders[position].text:SetShadowOffset(2, -4)
 			else
-				parent.holders[position].text:SetFontTemplate(SV.Shared:Fetch("font", MOD.db.font), MOD.db.fontSize, MOD.db.fontOutline)
+				parent.holders[position].text:SetFontTemplate(LSM:Fetch("font", MOD.db.font), MOD.db.fontSize, MOD.db.fontOutline)
 				parent.holders[position].text:SetJustifyH("CENTER")
 				parent.holders[position].text:SetJustifyV("MIDDLE")
 			end
@@ -574,9 +577,9 @@ do
 				parent.holders[position]:SetScript("OnClick", nil)

 				if(db.showBackground) then
-					parent.holders[position].text:SetFont(SV.Shared:Fetch("font", db.font), db.fontSize, "NONE")
+					parent.holders[position].text:SetFont(LSM:Fetch("font", db.font), db.fontSize, "NONE")
 				else
-					parent.holders[position].text:SetFont(SV.Shared:Fetch("font", db.font), db.fontSize, db.fontOutline)
+					parent.holders[position].text:SetFont(LSM:Fetch("font", db.font), db.fontSize, db.fontOutline)
 				end

 				parent.holders[position].text:SetText(nil)
diff --git a/Interface/AddOns/SVUI/packages/stats/stats/bags.lua b/Interface/AddOns/SVUI/packages/stats/stats/bags.lua
index a078d3d..aa9cba7 100644
--- a/Interface/AddOns/SVUI/packages/stats/stats/bags.lua
+++ b/Interface/AddOns/SVUI/packages/stats/stats/bags.lua
@@ -49,7 +49,9 @@ local twipe, tsort = table.wipe, table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
 local MOD = SV.SVStats;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/stats/stats/cta.lua b/Interface/AddOns/SVUI/packages/stats/stats/cta.lua
index d3b9d13..5901ec0 100644
--- a/Interface/AddOns/SVUI/packages/stats/stats/cta.lua
+++ b/Interface/AddOns/SVUI/packages/stats/stats/cta.lua
@@ -49,7 +49,9 @@ local twipe, tsort = table.wipe, table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
 local MOD = SV.SVStats;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/stats/stats/dps.lua b/Interface/AddOns/SVUI/packages/stats/stats/dps.lua
index 2cef27d..c791785 100644
--- a/Interface/AddOns/SVUI/packages/stats/stats/dps.lua
+++ b/Interface/AddOns/SVUI/packages/stats/stats/dps.lua
@@ -31,7 +31,9 @@ local match, sub, join = string.match, string.sub, string.join;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
 local MOD = SV.SVStats;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/stats/stats/durability.lua b/Interface/AddOns/SVUI/packages/stats/stats/durability.lua
index 61014b9..d6fd41e 100644
--- a/Interface/AddOns/SVUI/packages/stats/stats/durability.lua
+++ b/Interface/AddOns/SVUI/packages/stats/stats/durability.lua
@@ -49,7 +49,10 @@ local twipe, tsort = table.wipe, table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local LSM = LibStub("LibSharedMedia-3.0")
 local MOD = SV.SVStats;
 --[[
 ##########################################################
@@ -83,7 +86,7 @@ local function Durability_OnEvent(self, ...)
 		self.text:SetAllPoints(self)
 		self.text:SetJustifyH("CENTER")
 		self.barframe:Hide()
-		self.text:SetFontTemplate(SV.Shared:Fetch("font",SV.db.SVStats.font),SV.db.SVStats.fontSize,SV.db.SVStats.fontOutline)
+		self.text:SetFontTemplate(LSM:Fetch("font",SV.db.SVStats.font),SV.db.SVStats.fontSize,SV.db.SVStats.fontOutline)
 	end
 	for slot,name in pairs(inventoryMap)do
 		local slotID = GetInventorySlotInfo(slot)
@@ -104,7 +107,7 @@ local function DurabilityBar_OnEvent(self, ...)
 	if not self.barframe:IsShown() then
 		self.barframe:Show()
 		self.barframe.icon.texture:SetTexture("Interface\\Addons\\SVUI\\assets\\artwork\\Icons\\STAT-DUR")
-		self.text:SetFontTemplate(SV.Shared:Fetch("font",SV.db.SVStats.font),SV.db.SVStats.fontSize,"NONE")
+		self.text:SetFontTemplate(LSM:Fetch("font",SV.db.SVStats.font),SV.db.SVStats.fontSize,"NONE")
 	end
 	for slot,name in pairs(inventoryMap)do
 		local slotID = GetInventorySlotInfo(slot)
diff --git a/Interface/AddOns/SVUI/packages/stats/stats/experience.lua b/Interface/AddOns/SVUI/packages/stats/stats/experience.lua
index 093f9c9..e28184e 100644
--- a/Interface/AddOns/SVUI/packages/stats/stats/experience.lua
+++ b/Interface/AddOns/SVUI/packages/stats/stats/experience.lua
@@ -32,7 +32,9 @@ local gsub = string.gsub;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale();
+local LSM = LibStub("LibSharedMedia-3.0")
 local MOD = SV.SVStats;
 --[[
 ##########################################################
@@ -66,7 +68,7 @@ local function Experience_OnEvent(self, ...)
 		self.text:SetAllPoints(self)
 		self.text:SetJustifyH("CENTER")
 		self.barframe:Hide()
-		self.text:SetFontTemplate(SV.Shared:Fetch("font",SV.db.SVStats.font),SV.db.SVStats.fontSize,SV.db.SVStats.fontOutline)
+		self.text:SetFontTemplate(LSM:Fetch("font",SV.db.SVStats.font),SV.db.SVStats.fontSize,SV.db.SVStats.fontOutline)
 	end
 	local f, g = getUnitXP("player")
 	local h = GetXPExhaustion()
@@ -88,7 +90,7 @@ local function ExperienceBar_OnEvent(self, ...)
 	if (not self.barframe:IsShown())then
 		self.barframe:Show()
 		self.barframe.icon.texture:SetTexture("Interface\\Addons\\SVUI\\assets\\artwork\\Icons\\STAT-XP")
-		self.text:SetFontTemplate(SV.Shared:Fetch("font",SV.db.SVStats.font),SV.db.SVStats.fontSize,"NONE")
+		self.text:SetFontTemplate(LSM:Fetch("font",SV.db.SVStats.font),SV.db.SVStats.fontSize,"NONE")
 	end
 	if not self.barframe.bar.extra:IsShown() then
 		self.barframe.bar.extra:Show()
diff --git a/Interface/AddOns/SVUI/packages/stats/stats/friends.lua b/Interface/AddOns/SVUI/packages/stats/stats/friends.lua
index 4fbf942..d009f08 100644
--- a/Interface/AddOns/SVUI/packages/stats/stats/friends.lua
+++ b/Interface/AddOns/SVUI/packages/stats/stats/friends.lua
@@ -49,7 +49,9 @@ local twipe, tsort = table.wipe, table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
 local MOD = SV.SVStats;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/stats/stats/gold.lua b/Interface/AddOns/SVUI/packages/stats/stats/gold.lua
index 51e69b8..9976ff6 100644
--- a/Interface/AddOns/SVUI/packages/stats/stats/gold.lua
+++ b/Interface/AddOns/SVUI/packages/stats/stats/gold.lua
@@ -49,7 +49,8 @@ local twipe, tsort = table.wipe, table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale();
 local MOD = SV.SVStats;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/stats/stats/guild.lua b/Interface/AddOns/SVUI/packages/stats/stats/guild.lua
index dba2cf8..81aa645 100644
--- a/Interface/AddOns/SVUI/packages/stats/stats/guild.lua
+++ b/Interface/AddOns/SVUI/packages/stats/stats/guild.lua
@@ -36,7 +36,9 @@ local twipe, tsort = table.wipe, table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
 local MOD = SV.SVStats;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/stats/stats/hps.lua b/Interface/AddOns/SVUI/packages/stats/stats/hps.lua
index 734575f..912b008 100644
--- a/Interface/AddOns/SVUI/packages/stats/stats/hps.lua
+++ b/Interface/AddOns/SVUI/packages/stats/stats/hps.lua
@@ -32,7 +32,9 @@ local max = math.max;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
 local MOD = SV.SVStats;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/stats/stats/reputation.lua b/Interface/AddOns/SVUI/packages/stats/stats/reputation.lua
index 9396f07..58beb27 100644
--- a/Interface/AddOns/SVUI/packages/stats/stats/reputation.lua
+++ b/Interface/AddOns/SVUI/packages/stats/stats/reputation.lua
@@ -33,7 +33,8 @@ local format, gsub = string.format, string.gsub;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale();
 local MOD = SV.SVStats;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/stats/stats/system.lua b/Interface/AddOns/SVUI/packages/stats/stats/system.lua
index f043880..194cc27 100644
--- a/Interface/AddOns/SVUI/packages/stats/stats/system.lua
+++ b/Interface/AddOns/SVUI/packages/stats/stats/system.lua
@@ -37,7 +37,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale();
 local MOD = SV.SVStats;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/stats/stats/time.lua b/Interface/AddOns/SVUI/packages/stats/stats/time.lua
index 2bc1030..3c759d5 100644
--- a/Interface/AddOns/SVUI/packages/stats/stats/time.lua
+++ b/Interface/AddOns/SVUI/packages/stats/stats/time.lua
@@ -35,7 +35,9 @@ local floor = math.floor;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
 local MOD = SV.SVStats;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/stats/stats/tokens.lua b/Interface/AddOns/SVUI/packages/stats/stats/tokens.lua
index 1825913..464ea65 100644
--- a/Interface/AddOns/SVUI/packages/stats/stats/tokens.lua
+++ b/Interface/AddOns/SVUI/packages/stats/stats/tokens.lua
@@ -31,7 +31,8 @@ local twipe     = table.wipe;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale();
 local MOD = SV.SVStats;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/tip/SVTip.lua b/Interface/AddOns/SVUI/packages/tip/SVTip.lua
index d5e7c9a..1384ff4 100644
--- a/Interface/AddOns/SVUI/packages/tip/SVTip.lua
+++ b/Interface/AddOns/SVUI/packages/tip/SVTip.lua
@@ -36,8 +36,11 @@ local twipe, tconcat = table.wipe, table.concat;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
-local CONFIGS = SV.Configs
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local LSM = LibStub("LibSharedMedia-3.0")
+local CONFIGS = SV.private
 local MOD = {};
 --[[
 ##########################################################
@@ -206,97 +209,102 @@ local ClearMaskColors = function(self)
 	self[8]:SetTexture(0, 0, 0)
 end

-local _hook_GameTooltip_ShowCompareItem = function(self, shift)
-	if not self then self = GameTooltip end
-	local _,link = self:GetItem()
-	if not link then return; end
-	local shoppingTooltip1, shoppingTooltip2, shoppingTooltip3 = unpack(self.shoppingTooltips)
-	local item1 = nil;
-	local item2 = nil;
-	local item3 = nil;
-	local side = "left"
-	if shoppingTooltip1:SetHyperlinkCompareItem(link, 1, shift, self) then item1 = true end
-	if shoppingTooltip2:SetHyperlinkCompareItem(link, 2, shift, self) then item2 = true end
-	if shoppingTooltip3:SetHyperlinkCompareItem(link, 3, shift, self) then item3 = true end
-	local rightDist = 0;
-	local leftPos = self:GetLeft()
-	local rightPos = self:GetRight()
-	if not rightPos then rightPos = 0 end
-	if not leftPos then leftPos = 0 end
-	rightDist = GetScreenWidth() - rightPos;
-	if(leftPos and (rightDist < leftPos)) then
-		side = "left"
-	else
-		side = "right"
-	end
-
-	if(self:GetAnchorType() and (self:GetAnchorType() ~= "ANCHOR_PRESERVE")) then
-		local totalWidth = 0;
-		if item1 then
-			totalWidth = totalWidth + shoppingTooltip1:GetWidth()
-		end
-		if item2 then
-			totalWidth = totalWidth + shoppingTooltip2:GetWidth()
-		end
-		if item3 then
-			totalWidth = totalWidth + shoppingTooltip3:GetWidth()
-		end
-		if(side == "left" and (totalWidth > leftPos)) then
-			self:SetAnchorType(self:GetAnchorType(), (totalWidth - leftPos), 0)
-		elseif(side == "right" and ((rightPos + totalWidth) > GetScreenWidth())) then
-			self:SetAnchorType(self:GetAnchorType(), -((rightPos + totalWidth) - GetScreenWidth()), 0)
-		end
-	end
-
-	if item3 then
-		shoppingTooltip3:SetOwner(self, "ANCHOR_NONE")
-		shoppingTooltip3:ClearAllPoints()
-		if(side and side == "left") then
-			shoppingTooltip3:SetPoint("TOPRIGHT", self, "TOPLEFT", -2, -10)
-		else
-			shoppingTooltip3:SetPoint("TOPLEFT", self, "TOPRIGHT", 2, -10)
-		end
-		shoppingTooltip3:SetHyperlinkCompareItem(link, 3, shift, self)
-		shoppingTooltip3:Show()
-	end
-
-	if item1 then
-		if item3 then
-			shoppingTooltip1:SetOwner(shoppingTooltip3, "ANCHOR_NONE")
-		else
-			shoppingTooltip1:SetOwner(self, "ANCHOR_NONE")
-		end
-		shoppingTooltip1:ClearAllPoints()
+-- local _hook_GameTooltip_ShowCompareItem = function(self, shift)
+-- 	if not self then self = GameTooltip end
+-- 	local _,link = self:GetItem()
+-- 	if not link then return; end
+-- 	local shoppingTooltip1, shoppingTooltip2, shoppingTooltip3 = unpack(self.shoppingTooltips)
+-- 	local item1 = nil;
+-- 	local item2 = nil;
+-- 	local item3 = nil;
+-- 	local side = "left"
+
+-- 	if shoppingTooltip1:SetHyperlinkCompareItem(link, 1, shift, self) then item1 = true end
+-- 	if shoppingTooltip2:SetHyperlinkCompareItem(link, 2, shift, self) then item2 = true end
+-- 	if shoppingTooltip3:SetHyperlinkCompareItem(link, 3, shift, self) then item3 = true end
+
+-- 	local rightDist = 0;
+-- 	local leftPos = self:GetLeft()
+-- 	local rightPos = self:GetRight()
+
+-- 	if not rightPos then rightPos = 0 end
+-- 	if not leftPos then leftPos = 0 end
+
+-- 	rightDist = GetScreenWidth() - rightPos;
+
+-- 	if(leftPos and (rightDist < leftPos)) then
+-- 		side = "left"
+-- 	else
+-- 		side = "right"
+-- 	end
+
+-- 	if(self:GetAnchorType() and (self:GetAnchorType() ~= "ANCHOR_PRESERVE")) then
+-- 		local totalWidth = 0;
+-- 		if item1 then
+-- 			totalWidth = totalWidth + shoppingTooltip1:GetWidth()
+-- 		end
+-- 		if item2 then
+-- 			totalWidth = totalWidth + shoppingTooltip2:GetWidth()
+-- 		end
+-- 		if item3 then
+-- 			totalWidth = totalWidth + shoppingTooltip3:GetWidth()
+-- 		end
+-- 		if(side == "left" and (totalWidth > leftPos)) then
+-- 			self:SetAnchorType(self:GetAnchorType(), (totalWidth - leftPos), 0)
+-- 		elseif(side == "right" and ((rightPos + totalWidth) > GetScreenWidth())) then
+-- 			self:SetAnchorType(self:GetAnchorType(), -((rightPos + totalWidth) - GetScreenWidth()), 0)
+-- 		end
+-- 	end
+
+-- 	if item3 then
+-- 		shoppingTooltip3:SetOwner(self, "ANCHOR_NONE")
+-- 		shoppingTooltip3:ClearAllPoints()
+-- 		if(side and side == "left") then
+-- 			shoppingTooltip3:SetPoint("TOPRIGHT", self, "TOPLEFT", -2, -10)
+-- 		else
+-- 			shoppingTooltip3:SetPoint("TOPLEFT", self, "TOPRIGHT", 2, -10)
+-- 		end
+-- 		shoppingTooltip3:SetHyperlinkCompareItem(link, 3, shift, self)
+-- 		shoppingTooltip3:Show()
+-- 	end
+
+-- 	if item1 then
+-- 		if item3 then
+-- 			shoppingTooltip1:SetOwner(shoppingTooltip3, "ANCHOR_NONE")
+-- 		else
+-- 			shoppingTooltip1:SetOwner(self, "ANCHOR_NONE")
+-- 		end
+-- 		shoppingTooltip1:ClearAllPoints()

-		if(side and side == "left") then
-			if item3 then
-				shoppingTooltip1:SetPoint("TOPRIGHT", shoppingTooltip3, "TOPLEFT", -2, 0)
-			else
-				shoppingTooltip1:SetPoint("TOPRIGHT", self, "TOPLEFT", -2, -10)
-			end
-		else
-			if item3 then
-				shoppingTooltip1:SetPoint("TOPLEFT", shoppingTooltip3, "TOPRIGHT", 2, 0)
-			else
-				shoppingTooltip1:SetPoint("TOPLEFT", self, "TOPRIGHT", 2, -10)
-			end
-		end
-		shoppingTooltip1:SetHyperlinkCompareItem(link, 1, shift, self)
-		shoppingTooltip1:Show()
-
-		if item2 then
-			shoppingTooltip2:SetOwner(shoppingTooltip1, "ANCHOR_NONE")
-			shoppingTooltip2:ClearAllPoints()
-			if (side and side == "left") then
-				shoppingTooltip2:SetPoint("TOPRIGHT", shoppingTooltip1, "TOPLEFT", -2, 0)
-			else
-				shoppingTooltip2:SetPoint("TOPLEFT", shoppingTooltip1, "TOPRIGHT", 2, 0)
-			end
-			shoppingTooltip2:SetHyperlinkCompareItem(link, 2, shift, self)
-			shoppingTooltip2:Show()
-		end
-	end
-end
+-- 		if(side and side == "left") then
+-- 			if item3 then
+-- 				shoppingTooltip1:SetPoint("TOPRIGHT", shoppingTooltip3, "TOPLEFT", -2, 0)
+-- 			else
+-- 				shoppingTooltip1:SetPoint("TOPRIGHT", self, "TOPLEFT", -2, -10)
+-- 			end
+-- 		else
+-- 			if item3 then
+-- 				shoppingTooltip1:SetPoint("TOPLEFT", shoppingTooltip3, "TOPRIGHT", 2, 0)
+-- 			else
+-- 				shoppingTooltip1:SetPoint("TOPLEFT", self, "TOPRIGHT", 2, -10)
+-- 			end
+-- 		end
+-- 		shoppingTooltip1:SetHyperlinkCompareItem(link, 1, shift, self)
+-- 		shoppingTooltip1:Show()
+
+-- 		if item2 then
+-- 			shoppingTooltip2:SetOwner(shoppingTooltip1, "ANCHOR_NONE")
+-- 			shoppingTooltip2:ClearAllPoints()
+-- 			if (side and side == "left") then
+-- 				shoppingTooltip2:SetPoint("TOPRIGHT", shoppingTooltip1, "TOPLEFT", -2, 0)
+-- 			else
+-- 				shoppingTooltip2:SetPoint("TOPLEFT", shoppingTooltip1, "TOPRIGHT", 2, 0)
+-- 			end
+-- 			shoppingTooltip2:SetHyperlinkCompareItem(link, 2, shift, self)
+-- 			shoppingTooltip2:Show()
+-- 		end
+-- 	end
+-- end

 function MOD:INSPECT_READY(_,guid)
 	if MOD.lastGUID ~= guid then return end
@@ -967,7 +975,7 @@ function MOD:Load()
 	GameTooltipStatusBar:SetPoint("BOTTOMRIGHT", GameTooltip.SuperBorder, "BOTTOMRIGHT", -3, 3)
 	GameTooltipStatusBar.text = GameTooltipStatusBar:CreateFontString(nil, "OVERLAY")
 	GameTooltipStatusBar.text:Point("CENTER", GameTooltipStatusBar, "CENTER", 0, 0)
-	GameTooltipStatusBar.text:SetFontTemplate(SV.Shared:Fetch("font", MOD.db.healthBar.font), MOD.db.healthBar.fontSize, "OUTLINE")
+	GameTooltipStatusBar.text:SetFontTemplate(LSM:Fetch("font", MOD.db.healthBar.font), MOD.db.healthBar.fontSize, "OUTLINE")

 	if not GameTooltipStatusBar.border then
 		local border = CreateFrame("Frame", nil, GameTooltipStatusBar)
@@ -980,7 +988,9 @@ function MOD:Load()

 	NewHook("GameTooltip_SetDefaultAnchor", _hook_GameTooltip_SetDefaultAnchor)
 	NewHook("GameTooltip_ShowStatusBar", _hook_GameTooltip_ShowStatusBar)
-	NewHook("GameTooltip_ShowCompareItem", _hook_GameTooltip_ShowCompareItem)
+
+	--NewHook("GameTooltip_ShowCompareItem", _hook_GameTooltip_ShowCompareItem) -- BROKEN IN WOD, REMOVING NOW
+
 	NewHook(GameTooltip, "SetUnitAura", _hook_OnSetUnitAura)
 	NewHook(GameTooltip, "SetUnitBuff", _hook_OnSetUnitAura)
 	NewHook(GameTooltip, "SetUnitDebuff", _hook_OnSetUnitAura)
diff --git a/Interface/AddOns/SVUI/packages/unit/SVUnit.lua b/Interface/AddOns/SVUI/packages/unit/SVUnit.lua
index 04c9b48..d57860c 100644
--- a/Interface/AddOns/SVUI/packages/unit/SVUnit.lua
+++ b/Interface/AddOns/SVUI/packages/unit/SVUnit.lua
@@ -41,10 +41,13 @@ local NewHook = hooksecurefunc;
 GET ADDON DATA AND TEST FOR oUF
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 assert(oUF_Villain, "SVUI was unable to locate oUF.")
+
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local LSM = LibStub("LibSharedMedia-3.0")
 --[[
 ##########################################################
 MODULE AND INNER CLASSES
@@ -353,7 +356,7 @@ function MOD:RefreshUnitFrames()
 		end
 	end
 	local _,groupType = IsInInstance()
-	local raidDebuffs = ns.oUF_RaidDebuffs or oUF_RaidDebuffs;
+	local raidDebuffs = SV.oUF_RaidDebuffs or oUF_RaidDebuffs;
 	if raidDebuffs then
 		raidDebuffs:ResetDebuffData()
 		if groupType == "party" or groupType == "raid" then
@@ -379,10 +382,10 @@ function MOD:RefreshUnitMedia(unitName)
     local db = MOD.db
     local key = unitName or self.___key
     if(not (db and db.enable) or not self) then return end
-    local CURRENT_BAR_TEXTURE = SV.Shared:Fetch("statusbar", db.statusbar)
-    local CURRENT_AURABAR_TEXTURE = SV.Shared:Fetch("statusbar", db.auraBarStatusbar);
-    local CURRENT_FONT = SV.Shared:Fetch("font", db.font)
-    local CURRENT_AURABAR_FONT = SV.Shared:Fetch("font", db.auraFont);
+    local CURRENT_BAR_TEXTURE = LSM:Fetch("statusbar", db.statusbar)
+    local CURRENT_AURABAR_TEXTURE = LSM:Fetch("statusbar", db.auraBarStatusbar);
+    local CURRENT_FONT = LSM:Fetch("font", db.font)
+    local CURRENT_AURABAR_FONT = LSM:Fetch("font", db.auraFont);
     local CURRENT_AURABAR_FONTSIZE = db.auraFontSize
     local CURRENT_AURABAR_FONTOUTLINE = db.auraFontOutline
     local unitDB = db[key]
@@ -395,7 +398,7 @@ function MOD:RefreshUnitMedia(unitName)
             		panel.Name:SetShadowOffset(1, -1)
 					panel.Name:SetShadowColor(0, 0, 0, 0.75)
             	else
-                	panel.Name:SetFont(SV.Shared:Fetch("font", unitDB.name.font), unitDB.name.fontSize, unitDB.name.fontOutline)
+                	panel.Name:SetFont(LSM:Fetch("font", unitDB.name.font), unitDB.name.fontSize, unitDB.name.fontOutline)
                 	panel.Name:SetShadowOffset(2, -2)
 					panel.Name:SetShadowColor(0, 0, 0, 1)
                 end
@@ -1458,7 +1461,7 @@ function MOD:Load()
 		CompactUnitFrameProfiles:RegisterEvent("VARIABLES_LOADED")
 	end

-	local rDebuffs = ns.oUF_RaidDebuffs or oUF_RaidDebuffs;
+	local rDebuffs = SV.oUF_RaidDebuffs or oUF_RaidDebuffs;
 	if not rDebuffs then return end
 	rDebuffs.ShowDispelableDebuff = true;
 	rDebuffs.FilterDispellableDebuff = true;
diff --git a/Interface/AddOns/SVUI/packages/unit/config.lua b/Interface/AddOns/SVUI/packages/unit/config.lua
index 043e8ff..96ec2de 100644
--- a/Interface/AddOns/SVUI/packages/unit/config.lua
+++ b/Interface/AddOns/SVUI/packages/unit/config.lua
@@ -25,8 +25,9 @@ local select 	= _G.select;
 GET ADDON DATA AND TEST FOR oUF
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-local CONFIGS = SV.Configs
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale();
+local CONFIGS = SV.private
 --[[
 ##########################################################
 LOCALS
diff --git a/Interface/AddOns/SVUI/packages/unit/elements/auras.lua b/Interface/AddOns/SVUI/packages/unit/elements/auras.lua
index e5ae83c..d27cce4 100644
--- a/Interface/AddOns/SVUI/packages/unit/elements/auras.lua
+++ b/Interface/AddOns/SVUI/packages/unit/elements/auras.lua
@@ -40,15 +40,17 @@ local tremove, tsort, twipe = table.remove, table.sort, table.wipe;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-local MOD = SV.SVUnit
-if(not MOD) then return end
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH"s FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.");

+local L = LibLocale();
+local LSM = LibStub("LibSharedMedia-3.0")
+local MOD = SV.SVUnit
+if(not MOD) then return end
+
 local CustomAuraFilter,CustomBarFilter;
 local AURA_FONT = [[Interface\AddOns\SVUI\assets\fonts\Display.ttf]];
 local AURA_FONTSIZE = 11;
@@ -450,7 +452,7 @@ function MOD:CreateBuffs(frame, unit)
 	aura.CustomFilter = CustomAuraFilter;
 	aura:SetFrameLevel(10)
 	aura.type = "buffs"
-	aura.textFont = SV.Shared:Fetch("font", MOD.db.auraFont)
+	aura.textFont = LSM:Fetch("font", MOD.db.auraFont)
 	aura.textSize = MOD.db.auraFontSize
 	aura.textOutline = MOD.db.auraFontOutline
 	return aura
@@ -465,7 +467,7 @@ function MOD:CreateDebuffs(frame, unit)
 	aura.CustomFilter = CustomAuraFilter;
 	aura.type = "debuffs"
 	aura:SetFrameLevel(10)
-	aura.textFont = SV.Shared:Fetch("font", MOD.db.auraFont)
+	aura.textFont = LSM:Fetch("font", MOD.db.auraFont)
 	aura.textSize = MOD.db.auraFontSize
 	aura.textOutline = MOD.db.auraFontOutline
 	return aura
@@ -491,9 +493,9 @@ function MOD:CreateAuraBarHeader(frame, unitName)
 	auraBarParent.spark = true;
 	auraBarParent.filter = CustomBarFilter;
 	auraBarParent.PostUpdate = ColorizeAuraBars;
-	auraBarParent.barTexture = SV.Shared:Fetch("statusbar", MOD.db.auraBarStatusbar)
-	auraBarParent.timeFont = SV.Shared:Fetch("font", "Roboto")
-	auraBarParent.textFont = SV.Shared:Fetch("font", MOD.db.auraFont)
+	auraBarParent.barTexture = LSM:Fetch("statusbar", MOD.db.auraBarStatusbar)
+	auraBarParent.timeFont = LSM:Fetch("font", "Roboto")
+	auraBarParent.textFont = LSM:Fetch("font", MOD.db.auraFont)
 	auraBarParent.textSize = MOD.db.auraFontSize
 	auraBarParent.textOutline = MOD.db.auraFontOutline
 	return auraBarParent
@@ -605,7 +607,7 @@ function MOD:UpdateAuraWatch(frame, key, override)
 		end
 	end

-	local fontFile = SV.Shared:Fetch("font", self.db.auraFont)
+	local fontFile = LSM:Fetch("font", self.db.auraFont)
 	local fontSize = self.db.auraFontSize
 	local fontOutline = self.db.auraFontOutline

diff --git a/Interface/AddOns/SVUI/packages/unit/elements/castbar.lua b/Interface/AddOns/SVUI/packages/unit/elements/castbar.lua
index e13c52a..d93765f 100644
--- a/Interface/AddOns/SVUI/packages/unit/elements/castbar.lua
+++ b/Interface/AddOns/SVUI/packages/unit/elements/castbar.lua
@@ -40,14 +40,15 @@ local tremove, tcopy, twipe, tsort, tconcat = table.remove, table.copy, table.wi
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-local MOD = SV.SVUnit
-if(not MOD) then return end
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.");
+
+local L = LibLocale();
+local MOD = SV.SVUnit
+if(not MOD) then return end
 --[[
 ##########################################################
 LOCAL VARIABLES
diff --git a/Interface/AddOns/SVUI/packages/unit/elements/essentials.lua b/Interface/AddOns/SVUI/packages/unit/elements/essentials.lua
index bbd9019..b5e12e8 100644
--- a/Interface/AddOns/SVUI/packages/unit/elements/essentials.lua
+++ b/Interface/AddOns/SVUI/packages/unit/elements/essentials.lua
@@ -28,14 +28,16 @@ local random 	= math.random;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-local MOD = SV.SVUnit
-if(not MOD) then return end
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.");
+
+local L = LibLocale();
+local LSM = LibStub("LibSharedMedia-3.0")
+local MOD = SV.SVUnit
+if(not MOD) then return end
 --[[
 ##########################################################
 LOCALS
@@ -306,7 +308,7 @@ local function CreateNameText(frame, unitName)
 		db = MOD.db[unitName].name
 	end
 	local name = frame:CreateFontString(nil, "OVERLAY")
-	name:SetFont(SV.Shared:Fetch("font", db.font), db.fontSize, db.fontOutline)
+	name:SetFont(LSM:Fetch("font", db.font), db.fontSize, db.fontOutline)
 	name:SetShadowOffset(2, -2)
 	name:SetShadowColor(0, 0, 0, 1)
 	if unitNmae == "target" then
@@ -414,7 +416,7 @@ function MOD:SetActionPanel(frame, unit, noHealthText, noPowerText, noMiscText)

 	if(not noHealthText) then
 		frame.InfoPanel.Health = frame.InfoPanel:CreateFontString(nil, "OVERLAY")
-		frame.InfoPanel.Health:SetFont(SV.Shared:Fetch("font", MOD.db.font), MOD.db.fontSize, MOD.db.fontOutline)
+		frame.InfoPanel.Health:SetFont(LSM:Fetch("font", MOD.db.font), MOD.db.fontSize, MOD.db.fontOutline)
 		offset = reverse and 2 or -2;
 		direction = reverse and "LEFT" or "RIGHT";
 		frame.InfoPanel.Health:Point(direction, frame.InfoPanel, direction, offset, 0)
@@ -422,7 +424,7 @@ function MOD:SetActionPanel(frame, unit, noHealthText, noPowerText, noMiscText)

 	if(not noPowerText) then
 		frame.InfoPanel.Power = frame.InfoPanel:CreateFontString(nil, "OVERLAY")
-		frame.InfoPanel.Power:SetFont(SV.Shared:Fetch("font", MOD.db.font), MOD.db.fontSize, MOD.db.fontOutline)
+		frame.InfoPanel.Power:SetFont(LSM:Fetch("font", MOD.db.font), MOD.db.fontSize, MOD.db.fontOutline)
 		offset = reverse and -2 or 2;
 		direction = reverse and "RIGHT" or "LEFT";
 		frame.InfoPanel.Power:Point(direction, frame.InfoPanel, direction, offset, 0)
@@ -430,7 +432,7 @@ function MOD:SetActionPanel(frame, unit, noHealthText, noPowerText, noMiscText)

 	if(not noMiscText) then
 		frame.InfoPanel.Misc = frame.InfoPanel:CreateFontString(nil, "OVERLAY")
-		frame.InfoPanel.Misc:SetFont(SV.Shared:Fetch("font", MOD.db.font), MOD.db.fontSize, MOD.db.fontOutline)
+		frame.InfoPanel.Misc:SetFont(LSM:Fetch("font", MOD.db.font), MOD.db.fontSize, MOD.db.fontOutline)
 		frame.InfoPanel.Misc:Point("CENTER", frame, "CENTER", 0, 0)
 	end

@@ -581,7 +583,7 @@ function MOD:CreateAltPowerBar(frame)
 	altPower.text = altPower:CreateFontString(nil, "OVERLAY")
 	altPower.text:SetPoint("CENTER")
 	altPower.text:SetJustifyH("CENTER")
-	altPower.text:SetFont(SV.Shared:Fetch("font", MOD.db.font), MOD.db.fontSize, MOD.db.fontOutline)
+	altPower.text:SetFont(LSM:Fetch("font", MOD.db.font), MOD.db.fontSize, MOD.db.fontOutline)
 	altPower.PostUpdate = PostUpdateAltPower;
 	return altPower
 end
diff --git a/Interface/AddOns/SVUI/packages/unit/elements/misc.lua b/Interface/AddOns/SVUI/packages/unit/elements/misc.lua
index a2b59fd..e7b0220 100644
--- a/Interface/AddOns/SVUI/packages/unit/elements/misc.lua
+++ b/Interface/AddOns/SVUI/packages/unit/elements/misc.lua
@@ -13,14 +13,15 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(select(2, ...));
-local MOD = SV.SVUnit
-if(not MOD) then return end
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.");
+
+local L = LibLocale();
+local MOD = SV.SVUnit
+if(not MOD) then return end
 --[[
 ##########################################################
 LOCAL VARIABLES
diff --git a/Interface/AddOns/SVUI/packages/unit/elements/tags.lua b/Interface/AddOns/SVUI/packages/unit/elements/tags.lua
index a77812a..53ef010 100644
--- a/Interface/AddOns/SVUI/packages/unit/elements/tags.lua
+++ b/Interface/AddOns/SVUI/packages/unit/elements/tags.lua
@@ -30,9 +30,9 @@ local twipe = table.wipe;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale();
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.")
diff --git a/Interface/AddOns/SVUI/packages/unit/frames.lua b/Interface/AddOns/SVUI/packages/unit/frames.lua
index f90b17c..dfcf07d 100644
--- a/Interface/AddOns/SVUI/packages/unit/frames.lua
+++ b/Interface/AddOns/SVUI/packages/unit/frames.lua
@@ -23,20 +23,22 @@ local type      = _G.type;
 local tostring  = _G.tostring;
 local tinsert   = _G.tinsert;
 local string    = _G.string;
-local math      = _G.math;
+local math      = _G.math, math.ceil;
 --[[ STRING METHODS ]]--
 local find, format, upper = string.find, string.format, string.upper;
 local match, gsub = string.match, string.gsub;
-local numMin = math.min;
+local numMin, ceil = math.min;

-local SV, L = unpack(select(2, ...));
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.")
+
+local L = LibLocale();
+local LSM = LibStub("LibSharedMedia-3.0")
 local MOD = SV.SVUnit
-local ceil,tinsert = math.ceil,table.insert
+if(not MOD) then return end
 --[[
 ##########################################################
 LOCAL DATA
@@ -313,7 +315,7 @@ CONSTRUCTORS["player"] = function(self, unit)
     self.Resting = MOD:CreateRestingIndicator(self)
     self.Combat = MOD:CreateCombatIndicator(self)
     self.PvPText = self.InfoPanel:CreateFontString(nil,'OVERLAY')
-    self.PvPText:SetFontTemplate(SV.Shared:Fetch("font", MOD.db.font), MOD.db.fontSize, MOD.db.fontOutline)
+    self.PvPText:SetFontTemplate(LSM:Fetch("font", MOD.db.font), MOD.db.fontSize, MOD.db.fontOutline)
     self.Afflicted = MOD:CreateAfflicted(self)
     self.HealPrediction = MOD:CreateHealPrediction(self, true)
     self.AuraBars = MOD:CreateAuraBarHeader(self, key)
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/deathknight.lua b/Interface/AddOns/SVUI/packages/unit/resources/deathknight.lua
index 09ea35a..4801c25 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/deathknight.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/deathknight.lua
@@ -35,15 +35,16 @@ local random = math.random;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-if(SV.class ~= "DEATHKNIGHT") then return end
-local MOD = SV.SVUnit
-if(not MOD) then return end
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.")
+
+local L = LibLocale();
+if(SV.class ~= "DEATHKNIGHT") then return end
+local MOD = SV.SVUnit
+if(not MOD) then return end
 --[[
 ##########################################################
 LOCALS
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/druid.lua b/Interface/AddOns/SVUI/packages/unit/resources/druid.lua
index 5d842f2..b0f85c4 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/druid.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/druid.lua
@@ -35,15 +35,17 @@ local random,floor = math.random, math.floor;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-if(SV.class ~= "DRUID") then return end
-local MOD = SV.SVUnit
-if(not MOD) then return end
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.")
+
+local L = LibLocale();
+local LSM = LibStub("LibSharedMedia-3.0")
+if(SV.class ~= "DRUID") then return end
+local MOD = SV.SVUnit
+if(not MOD) then return end
 --[[
 ##########################################################
 DRUID ALT MANA
@@ -93,7 +95,7 @@ local function CreateAltMana(playerFrame, eclipse)
 	bar.bg.multiplier = 0.3;
 	bar.Text = bar.ManaBar:CreateFontString(nil, "OVERLAY")
 	bar.Text:SetAllPoints(bar.ManaBar)
-	bar.Text:SetFont(SV.Shared:Fetch("font", MOD.db.font), MOD.db.fontSize, MOD.db.fontOutline)
+	bar.Text:SetFont(LSM:Fetch("font", MOD.db.font), MOD.db.fontSize, MOD.db.fontOutline)
 	return bar
 end
 --[[
@@ -149,44 +151,6 @@ end
 DRUID ECLIPSE BAR
 ##########################################################
 ]]--
-local directionHandler = {
-	["sun"] = function(b)
-		b.Text:SetJustifyH("LEFT")
-		b.Text:SetText(" >")
-		b.Text:SetTextColor(0.2, 1, 1, 0.5)
-		b.Sun[1]:Hide()
-		b.Sun[1].anim:Finish()
-		b.Moon[1]:Show()
-		b.Moon[1].anim:Play()
-	end,
-	["moon"] = function(b)
-		b.Text:SetJustifyH("RIGHT")
-		b.Text:SetText("< ")
-		b.Text:SetTextColor(1, 0.5, 0, 0.5)
-		b.Moon[1]:Hide()
-		b.Moon[1].anim:Finish()
-		b.Sun[1]:Show()
-		b.Sun[1].anim:Play()
-	end,
-	["none"] = function(b)
-		b.Text:SetJustifyH("CENTER")
-		b.Text:SetText()
-		b.Sun[1]:Hide()
-		b.Sun[1].anim:Finish()
-		b.Moon[1]:Hide()
-		b.Moon[1].anim:Finish()
-	end
-};
-
-local TrackerCallback = function(energy, direction, virtual_energy, virtual_direction, virtual_eclipse)
-	local playerFrame = _G['SVUI_Player'];
-	if(not playerFrame) then return; end
-	if playerFrame.EclipseBar and playerFrame.EclipseBar:IsVisible() then
-		energy, direction, virtual_energy, virtual_direction, virtual_eclipse = LibBalancePowerTracker:GetEclipseEnergyInfo()
-		directionHandler[virtual_direction](playerFrame.EclipseBar)
-	end
-end
-
 function MOD:CreateClassBar(playerFrame)
 	local bar = CreateFrame('Frame', nil, playerFrame)
 	bar:SetFrameLevel(playerFrame.InfoPanel:GetFrameLevel() + 30)
@@ -274,7 +238,34 @@ function MOD:CreateClassBar(playerFrame)
 	playerFrame.MaxClassPower = 1;
 	playerFrame.DruidAltMana = CreateAltMana(playerFrame, bar)

-	bar.callbackid = LibBalancePowerTracker:RegisterCallback(TrackerCallback)
+	bar.PostDirectionChange = {
+		["sun"] = function(this)
+			this.Text:SetJustifyH("LEFT")
+			this.Text:SetText(" >")
+			this.Text:SetTextColor(0.2, 1, 1, 0.5)
+			this.Sun[1]:Hide()
+			this.Sun[1].anim:Finish()
+			this.Moon[1]:Show()
+			this.Moon[1].anim:Play()
+		end,
+		["moon"] = function(this)
+			this.Text:SetJustifyH("RIGHT")
+			this.Text:SetText("< ")
+			this.Text:SetTextColor(1, 0.5, 0, 0.5)
+			this.Moon[1]:Hide()
+			this.Moon[1].anim:Finish()
+			this.Sun[1]:Show()
+			this.Sun[1].anim:Play()
+		end,
+		["none"] = function(this)
+			this.Text:SetJustifyH("CENTER")
+			this.Text:SetText()
+			this.Sun[1]:Hide()
+			this.Sun[1].anim:Finish()
+			this.Moon[1]:Hide()
+			this.Moon[1].anim:Finish()
+		end
+	}

 	local classBarHolder = CreateFrame("Frame", "Player_ClassBar", classBar)
 	classBarHolder:Point("TOPLEFT", playerFrame, "BOTTOMLEFT", 0, -2)
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/hunter.lua b/Interface/AddOns/SVUI/packages/unit/resources/hunter.lua
index 12c98fe..6e870d2 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/hunter.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/hunter.lua
@@ -25,15 +25,16 @@ local select    = _G.select;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-if(SV.class ~= "HUNTER") then return end
-local MOD = SV.SVUnit
-if(not MOD) then return end
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.")
+
+local L = LibLocale();
+if(SV.class ~= "HUNTER") then return end
+local MOD = SV.SVUnit
+if(not MOD) then return end
 --[[
 ##########################################################
 PLACEHOLDER
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/mage.lua b/Interface/AddOns/SVUI/packages/unit/resources/mage.lua
index 4222eac..eaaa29e 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/mage.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/mage.lua
@@ -35,15 +35,16 @@ local random = math.random;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-if(SV.class ~= "MAGE") then return end
-local MOD = SV.SVUnit
-if(not MOD) then return end
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.")
+
+local L = LibLocale();
+if(SV.class ~= "MAGE") then return end
+local MOD = SV.SVUnit
+if(not MOD) then return end
 --[[
 ##########################################################
 POSITIONING
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/monk.lua b/Interface/AddOns/SVUI/packages/unit/resources/monk.lua
index 54129d1..58d37c6 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/monk.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/monk.lua
@@ -35,15 +35,16 @@ local random = math.random;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-if(SV.class ~= "MONK") then return end
-local MOD = SV.SVUnit
-if(not MOD) then return end
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.")
+
+local L = LibLocale();
+if(SV.class ~= "MONK") then return end
+local MOD = SV.SVUnit
+if(not MOD) then return end
 --[[
 ##########################################################
 POSITIONING
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/paladin.lua b/Interface/AddOns/SVUI/packages/unit/resources/paladin.lua
index 21e76b4..2f2fad1 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/paladin.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/paladin.lua
@@ -35,15 +35,16 @@ local random = math.random;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-if(SV.class ~= "PALADIN") then return end
-local MOD = SV.SVUnit
-if(not MOD) then return end
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.")
+
+local L = LibLocale();
+if(SV.class ~= "PALADIN") then return end
+local MOD = SV.SVUnit
+if(not MOD) then return end
 --[[
 ##########################################################
 LOCAL FUNCTIONS
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/priest.lua b/Interface/AddOns/SVUI/packages/unit/resources/priest.lua
index 7ced591..b32d7ed 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/priest.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/priest.lua
@@ -35,15 +35,17 @@ local random = math.random;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-if(SV.class ~= "PRIEST") then return end
-local MOD = SV.SVUnit
-if(not MOD) then return end
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.")
+
+local L = LibLocale();
+if(SV.class ~= "PRIEST") then return end
+local MOD = SV.SVUnit
+if(not MOD) then return end
+
 local ICON_FILE = [[Interface\AddOns\SVUI\assets\artwork\Unitframe\Class\PRIEST]]
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/rogue.lua b/Interface/AddOns/SVUI/packages/unit/resources/rogue.lua
index 6c205e7..3290d26 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/rogue.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/rogue.lua
@@ -35,15 +35,16 @@ local random = math.random;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-if(SV.class ~= "ROGUE") then return end
-local MOD = SV.SVUnit
-if(not MOD) then return end
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.")
+
+local L = LibLocale();
+if(SV.class ~= "ROGUE") then return end
+local MOD = SV.SVUnit
+if(not MOD) then return end
 --[[
 ##########################################################
 LOCALS
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/shaman.lua b/Interface/AddOns/SVUI/packages/unit/resources/shaman.lua
index fb151df..500ea1b 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/shaman.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/shaman.lua
@@ -35,15 +35,16 @@ local random = math.random;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-if(SV.class ~= "SHAMAN") then return end
-local MOD = SV.SVUnit
-if(not MOD) then return end
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.")
+
+local L = LibLocale();
+if(SV.class ~= "SHAMAN") then return end
+local MOD = SV.SVUnit
+if(not MOD) then return end
 --[[
 ##########################################################
 LOCALS
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/warlock.lua b/Interface/AddOns/SVUI/packages/unit/resources/warlock.lua
index a82625a..0db2e3d 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/warlock.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/warlock.lua
@@ -35,15 +35,16 @@ local random = math.random;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-if(SV.class ~= "WARLOCK") then return end
-local MOD = SV.SVUnit
-if(not MOD) then return end
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.")
+
+local L = LibLocale();
+if(SV.class ~= "WARLOCK") then return end
+local MOD = SV.SVUnit
+if(not MOD) then return end
 --[[
 ##########################################################
 LOCAL FUNCTIONS
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/warrior.lua b/Interface/AddOns/SVUI/packages/unit/resources/warrior.lua
index 53f6494..d6fffa0 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/warrior.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/warrior.lua
@@ -25,15 +25,15 @@ local select    = _G.select;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
-if(SV.class ~= "WARRIOR") then return end
-local MOD = SV.SVUnit
-if(not MOD) then return end
-local _, ns = ...
-local oUF_Villain = ns.oUF
+local SVUI_ADDON_NAME, SV = ...
+local oUF_Villain = SV.oUF
 --[[ MUNGLUNCH's FASTER ASSERT FUNCTION ]]--
 local assert = enforce;
 assert(oUF_Villain, "SVUI was unable to locate oUF.")
+local L = LibLocale();
+if(SV.class ~= "WARRIOR") then return end
+local MOD = SV.SVUnit
+if(not MOD) then return end
 --[[
 ##########################################################
 PLACEHOLDER
diff --git a/Interface/AddOns/SVUI/scripts/comix.lua b/Interface/AddOns/SVUI/scripts/comix.lua
index a518a97..f6fcbe0 100644
--- a/Interface/AddOns/SVUI/scripts/comix.lua
+++ b/Interface/AddOns/SVUI/scripts/comix.lua
@@ -28,7 +28,9 @@ local random = math.random;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
 local Comix = CreateFrame("Frame");
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/scripts/misc.lua b/Interface/AddOns/SVUI/scripts/misc.lua
index 29e7965..2b8a639 100644
--- a/Interface/AddOns/SVUI/scripts/misc.lua
+++ b/Interface/AddOns/SVUI/scripts/misc.lua
@@ -31,7 +31,9 @@ local cos, deg, rad, sin = math.cos, math.deg, math.rad, math.sin;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
 local toonclass = select(2, UnitClass('player'))
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/scripts/mounts.lua b/Interface/AddOns/SVUI/scripts/mounts.lua
index 01b0ced..f286bad 100644
--- a/Interface/AddOns/SVUI/scripts/mounts.lua
+++ b/Interface/AddOns/SVUI/scripts/mounts.lua
@@ -33,7 +33,9 @@ local twipe,band 	= table.wipe, bit.band;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
 -- SVUI_Cache.Mounts.types
 -- SVUI_Cache.Mounts.names
 --[[
diff --git a/Interface/AddOns/SVUI/scripts/questwatch.lua b/Interface/AddOns/SVUI/scripts/questwatch.lua
index a34e572..ca7ffb9 100644
--- a/Interface/AddOns/SVUI/scripts/questwatch.lua
+++ b/Interface/AddOns/SVUI/scripts/questwatch.lua
@@ -51,7 +51,9 @@ local tremove, tcopy, twipe, tsort, tconcat = table.remove, table.copy, table.wi
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
 local QuestDocklet = CreateFrame("Frame", "SVQuestFrameEventListener", UIParent)
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/scripts/raid.lua b/Interface/AddOns/SVUI/scripts/raid.lua
index 64c4c5c..be40dd4 100644
--- a/Interface/AddOns/SVUI/scripts/raid.lua
+++ b/Interface/AddOns/SVUI/scripts/raid.lua
@@ -26,7 +26,9 @@ local pairs 	= _G.pairs;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
 --[[
 ##########################################################
 RAID UTILITY By: Elv
diff --git a/Interface/AddOns/SVUI/scripts/reactions.lua b/Interface/AddOns/SVUI/scripts/reactions.lua
index 226352f..bada875 100644
--- a/Interface/AddOns/SVUI/scripts/reactions.lua
+++ b/Interface/AddOns/SVUI/scripts/reactions.lua
@@ -32,7 +32,9 @@ local format, gsub = string.format, string.gsub;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
 --[[
 ##########################################################
 LOCALS (from ShestakUI  by:Shestak)
diff --git a/Interface/AddOns/SVUI/scripts/spellbind.lua b/Interface/AddOns/SVUI/scripts/spellbind.lua
index ebd2163..75af259 100644
--- a/Interface/AddOns/SVUI/scripts/spellbind.lua
+++ b/Interface/AddOns/SVUI/scripts/spellbind.lua
@@ -177,6 +177,7 @@ local SpellBindMask_OnClick = function(self, button)
 end

 local SpellBindDelete_OnClick = function(self)
+	local spell = self.spell
 	for j, k in ipairs(DB.spells) do
 		if k ~= spell then
 			k.checked = false
@@ -229,7 +230,7 @@ METHODS
 ##########################################################
 ]]--
 function SpellBinder:BuildSpells(delete)
-	local oldb
+	local oldb, spellName
 	local scroll = self.list.child
 	scroll:SetPoint("TOPLEFT")
 	scroll:SetSize(270, 300)
@@ -247,8 +248,8 @@ function SpellBinder:BuildSpells(delete)
 	end

 	for i, spell in ipairs(DB.spells) do
-		v = spell.spell
-		if v then
+		spellName = spell.spell
+		if spellName then
 			local bf = _G[i.."_cbs"] or CreateFrame("Button", i.."_cbs", scroll)
 			spell.checked = spell.checked or false

@@ -275,6 +276,7 @@ function SpellBinder:BuildSpells(delete)
 			bf.delete:GetNormalTexture():SetVertexColor(0.8, 0, 0)
 			bf.delete:SetPushedTexture("Interface\\BUTTONS\\UI-GroupLoot-Pass-Up")
 			bf.delete:SetHighlightTexture("Interface\\BUTTONS\\UI-GroupLoot-Pass-Up")
+			bf.delete.spell = spellName
 			bf.delete:SetScript("OnClick", SpellBindDelete_OnClick)

 			bf:SetScript("OnEnter", BoundSpell_OnEnter)
diff --git a/Interface/AddOns/SVUI/system/alerts.lua b/Interface/AddOns/SVUI/system/alerts.lua
index 46740c1..a0a0c4a 100644
--- a/Interface/AddOns/SVUI/system/alerts.lua
+++ b/Interface/AddOns/SVUI/system/alerts.lua
@@ -41,7 +41,8 @@ local assert = enforce;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale();
 --[[
 ##########################################################
 LOCAL VARS
diff --git a/Interface/AddOns/SVUI/system/animate.lua b/Interface/AddOns/SVUI/system/animate.lua
index da06994..f5958f3 100644
--- a/Interface/AddOns/SVUI/system/animate.lua
+++ b/Interface/AddOns/SVUI/system/animate.lua
@@ -25,7 +25,9 @@ local select    = _G.select;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...))
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0")
 --[[
 ##########################################################
 LOCALS
diff --git a/Interface/AddOns/SVUI/system/common.lua b/Interface/AddOns/SVUI/system/common.lua
index 0aa22a4..7ded30a 100644
--- a/Interface/AddOns/SVUI/system/common.lua
+++ b/Interface/AddOns/SVUI/system/common.lua
@@ -42,7 +42,9 @@ local tremove, tcopy, twipe, tsort, tconcat, tdump = table.remove, table.copy, t
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...))
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0")
 --[[
 ##########################################################
 LOCAL VARS
@@ -738,7 +740,8 @@ local _templates = {
         gradient = false,
         texture = [[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-BG1]],
         texupdate = true,
-        padding = 0,
+        padding = 0,
+        forcedOffset = 0,
         shadow = false,
         noupdate = false,
     },
@@ -748,7 +751,8 @@ local _templates = {
         gradient = false,
         texture = [[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-SMALL-BG1]],
         texupdate = true,
-        padding = 0,
+        padding = 0,
+        forcedOffset = 0,
         shadow = false,
         noupdate = false,
     }
diff --git a/Interface/AddOns/SVUI/system/database.lua b/Interface/AddOns/SVUI/system/database.lua
index 3040dc7..2729d3f 100644
--- a/Interface/AddOns/SVUI/system/database.lua
+++ b/Interface/AddOns/SVUI/system/database.lua
@@ -34,12 +34,14 @@ local tremove, tcopy, twipe, tsort, tconcat, tdump = table.remove, table.copy, t
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SV = SVUI
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
 local realm = GetRealmName()
 local name = UnitName("player")
 local pkey = ("%s - %s"):format(name, realm)
 local databaseListener = CreateFrame("Frame", nil)
-local CONFIGS = SV.Configs
+local CONFIGS = SV.private
 --[[
 ##########################################################
 DB BUILD HELPERS
@@ -832,7 +834,7 @@ end
 local function importprofile(t, key)
     local sv = rawget(t, "profile")
     local dv = rawget(t, "defaults")
-    local globals = SV.Global
+    local globals = SV.public
     local src = globals.profiles[key]
     if(not src) then return end
     for k,v in pairs(sv) do
@@ -852,7 +854,7 @@ end
 local function exportprofile(t, key)
     local sv = rawget(t, "profile")
     local dv = rawget(t, "defaults")
-    local globals = SV.Global
+    local globals = SV.public
     if(not globals.profiles[key]) then globals.profiles[key] = {} end
     local saved = globals.profiles[key]
     tablecopy(saved, sv)
@@ -864,7 +866,7 @@ local function exportprofile(t, key)
 end

 local function removeprofile(t, key)
-    local globals = SV.Global
+    local globals = SV.public
     if(globals.profiles[key]) then globals.profiles[key] = nil end
     if(globals.profileKeys[key]) then globals.profileKeys[key] = nil end
     collectgarbage("collect")
@@ -893,7 +895,7 @@ end
 local function SanitizeDatabase()
     if(not SV.db) then return end
     local db = SV.db
-    local src = SV.Configs
+    local src = SV.private
     for k,v in pairs(db) do
         if(src[k]) then
             removedefaults(db[k], src[k])
@@ -935,7 +937,7 @@ local METAPROFILE = function(sv)

     db.profile 	    = sv.STORED[key]
     db.protected    = sv.SAFEDATA
-    db.defaults     = SV.Configs
+    db.defaults     = SV.private
     db.Init         = initializedata
     db.Append       = insertdata
     db.Reset        = resetprofile
@@ -951,16 +953,16 @@ local METAPROFILE = function(sv)
 end

 function SV:AppendDefaults(newIndex, newData)
-    self.Configs[newIndex] = newData
+    self.private[newIndex] = newData
 end

 function SV:GetProfiles()
-    return self.Global.profileKeys or {}
+    return self.public.profileKeys or {}
 end

 function SV:CheckProfiles()
     local hasProfile = false
-    local list = self.Global.profileKeys or {}
+    local list = self.public.profileKeys or {}
     for key,_ in pairs(list) do
         hasProfile = true
     end
@@ -1006,12 +1008,12 @@ end

 function SV:SetDatabaseObjects(init)
     if(init) then
-        self.db = tcopy(self.Configs, true)
+        self.db = tcopy(self.private, true)
     else
-        self.Global = self:TableSplice(SVUI_Global, self.Global)
-        self.Global.profileKeys = {}
-        for k,v in pairs(self.Global.profiles) do
-            self.Global.profileKeys[k] = k
+        self.public = self:TableSplice(SVUI_Global, self.public)
+        self.public.profileKeys = {}
+        for k,v in pairs(self.public.profiles) do
+            self.public.profileKeys[k] = k
         end

         local sv = _G["SVUI_Profile"]
diff --git a/Interface/AddOns/SVUI/system/deepcopy.lua b/Interface/AddOns/SVUI/system/deepcopy.lua
deleted file mode 100644
index 5354fa9..0000000
--- a/Interface/AddOns/SVUI/system/deepcopy.lua
+++ /dev/null
@@ -1,264 +0,0 @@
-do
-    local type = rawtype or type
-    local rawget = rawget
-    local rawset = rawset
-    local next = rawnext or next
-    local getmetatable = debug and debug.getmetatable or getmetatable
-    local setmetatable = debug and debug.setmetatable or setmetatable
-    local debug_getupvalue = debug and debug.getupvalue or nil
-    local debug_setupvalue = debug and debug.setupvalue or nil
-    local debug_upvalueid = debug and debug.upvalueid or nil
-    local debug_upvaluejoin = debug and debug.upvaluejoin or nil
-    local unpack = unpack
-    local table = table
-    table.deepcopy_copyfunc_list = {
-
-        _plainolddata = function(stack, orig, copy, state)
-            return orig, true
-        end,
-        ["table"] = function(stack, orig, copy, state, arg1, arg2, arg3, arg4)
-            local orig_prevkey, grabkey = nil, false
-            if state == nil then -- 'init'
-                -- Initial state, check for metatable, or get first key
-                -- orig, copy:nil, state
-                copy = stack[orig]
-                if copy ~= nil then -- Check if already copied
-                    return copy, true
-                else
-                    copy = {} -- Would be nice if you could preallocate sizes!
-                    stack[orig] = copy
-                    local orig_meta = getmetatable(orig)
-                    if orig_meta ~= nil then -- This table has a metatable, copy it
-                        if not stack.metatable_immutable then
-                            stack:_recurse(orig_meta)
-                            return copy, 'metatable'
-                        else
-                            setmetatable(copy, orig_meta)
-                        end
-                    end
-                end
-                -- No metatable, go straight to copying key-value pairs
-                orig_prevkey = nil -- grab first key
-                grabkey = true --goto grabkey
-            elseif state == 'metatable' then
-                -- Metatable has been copied, set it and get first key
-                -- orig, copy:{}, state, metaorig, metacopy
-                local copy_meta = arg2--select(2, ...)
-                stack:_pop(2)
-
-                if copy_meta ~= nil then
-                    setmetatable(copy, copy_meta)
-                end
-
-                -- Now start copying key-value pairs
-                orig_prevkey = nil -- grab first key
-                grabkey = true --goto grabkey
-            elseif state == 'key' then
-                -- Key has been copied, now copy value
-                -- orig, copy:{}, state, keyorig, keycopy
-                local orig_key = arg1--select(1, ...)
-                local copy_key = arg2--select(2, ...)
-
-                if copy_key ~= nil then
-                    -- leave keyorig and keycopy on the stack
-                    local orig_value = rawget(orig, orig_key)
-                    stack:_recurse(orig_value)
-                    return copy, 'value'
-                else -- key not copied? move onto next
-                    stack:_pop(2) -- pop keyorig, keycopy
-                    orig_prevkey = orig_key
-                    grabkey = true--goto grabkey
-                end
-            elseif state == 'value' then
-                -- Value has been copied, set it and get next key
-                -- orig, copy:{}, state, keyorig, keycopy, valueorig, valuecopy
-                local orig_key   = arg1--select(1, ...)
-                local copy_key   = arg2--select(2, ...)
-              --local orig_value = arg3--select(3, ...)
-                local copy_value = arg4--select(4, ...)
-                stack:_pop(4)
-
-                if copy_value ~= nil then
-                    rawset(copy, copy_key, copy_value)
-                end
-
-                -- Grab next key to copy
-                orig_prevkey = orig_key
-                grabkey = true --goto grabkey
-            end
-            --return
-            --::grabkey::
-            if grabkey then
-                local orig_key, orig_value = next(orig, orig_prevkey)
-                if orig_key ~= nil then
-                    stack:_recurse(orig_key) -- Copy key
-                    return copy, 'key'
-                else
-                    return copy, true -- Key is nil, copying of table is complete
-                end
-            end
-            return
-        end,
-        ["function"] = function(stack, orig, copy, state, arg1, arg2, arg3)
-            local grabupvalue, grabupvalue_idx = false, nil
-            if state == nil then
-                -- .., orig, copy, state
-                copy = stack[orig]
-                if copy ~= nil then
-                    return copy, true
-                elseif stack.function_immutable then
-                    copy = orig
-                    return copy, true
-                else
-                    copy = loadstring(string.dump(orig), nil, nil, stack.function_env)
-                    stack[orig] = copy
-
-                    if debug_getupvalue ~= nil and debug_setupvalue ~= nil then
-                        grabupvalue = true
-                        grabupvalue_idx = 1
-                    else
-                        -- No way to get/set upvalues!
-                        return copy, true
-                    end
-                end
-            elseif this_state == 'upvalue' then
-                -- .., orig, copy, state, uvidx, uvvalueorig, uvvaluecopy
-                local orig_upvalue_idx   = arg1
-              --local orig_upvalue_value = arg2
-                local copy_upvalue_value = arg3
-                stack:_pop(3)
-
-                debug_setupvalue(copy, orig_upvalue_idx, copy_upvalue_value)
-
-                grabupvalue_idx = orig_upvalue_idx+1
-                stack:_push(grabupvalue_idx)
-                grabupvalue = true
-            end
-            if grabupvalue then
-                -- .., orig, copy, retto, state, uvidx
-                local upvalue_idx_curr = grabupvalue_idx
-                for upvalue_idx = upvalue_idx_curr, math.huge do
-                    local upvalue_name, upvalue_value_orig = debug_getupvalue(orig, upvalue_idx)
-                    if upvalue_name ~= nil then
-                        local upvalue_handled = false
-                        if not stack.function_upvalue_isolate and debug_upvalueid ~= nil and debug_upvaluejoin ~= nil then
-                            local upvalue_uid = debug.upvalueid(orig, upvalue_idx)
-                            -- Attempting to store an upvalueid of a function as a child of root is UB!
-                            local other_orig = stack[upvalue_uid]
-                            if other_orig ~= nil then
-                                for other_upvalue_idx = 1, math.huge do
-                                    if upvalue_uid == debug_upvalueid(other_orig, other_upvalue_idx) then
-                                        local other_copy = stack[other_orig]
-                                        debug_upvaluejoin(
-                                            copy, upvalue_idx,
-                                            other_copy, other_upvalue_idx
-                                        )
-                                        break
-                                    end
-                                end
-                                upvalue_handled = true
-                            else
-                                stack[upvalue_uid] = orig
-                            end
-                        end
-                        if not stack.function_upvalue_dontcopy and not upvalue_handled and upvalue_value_orig ~= nil then
-                            stack:_recurse(upvalue_value_orig)
-                            return copy, 'upvalue'
-                        end
-                    else
-                        stack:_pop(1) -- pop uvidx
-                        return copy, true
-                    end
-                end
-            end
-        end,
-        ["userdata"] = nil,
-        ["lightuserdata"] = nil,
-        ["thread"] = nil,
-    }
-    table.deepcopy_copyfunc_list["number" ] = table.deepcopy_copyfunc_list._plainolddata
-    table.deepcopy_copyfunc_list["string" ] = table.deepcopy_copyfunc_list._plainolddata
-    table.deepcopy_copyfunc_list["boolean"] = table.deepcopy_copyfunc_list._plainolddata
-    -- `nil` should never be encounted... but just in case:
-    table.deepcopy_copyfunc_list["nil"    ] = table.deepcopy_copyfunc_list._plainolddata
-
-    do
-        local ORIG, COPY, RETTO, STATE, SIZE = 0, 1, 2, 3, 4
-        function table.deepcopy_push(...)
-            local arg_list_len = select('#', ...)
-            local stack_offset = stack._top+1
-            for arg_i = 1, arg_list_len do
-                stack[stack_offset+arg_i] = select(arg_i, ...)
-            end
-            stack._top = stack_top+arg_list_len
-        end
-        function table.deepcopy_pop(stack, count)
-            stack._top = stack._top-count
-        end
-        function table.deepcopy_recurse(stack, orig)
-            local retto = stack._ptr
-            local stack_top = stack._top
-            local stack_ptr = stack_top+1
-            stack._top = stack_top+SIZE
-            stack._ptr = stack_ptr
-            stack[stack_ptr+ORIG ] = orig
-            stack[stack_ptr+COPY ] = nil
-            stack[stack_ptr+RETTO] = retto
-            stack[stack_ptr+STATE] = nil
-        end
-        function table.deepcopy(root, params, customcopyfunc_list)
-            local stack = params or {}
-            --orig,copy,retto,state,[temp...,] partorig,partcopy,partretoo,partstate
-            stack[1+ORIG ] = root stack[1+COPY ] = nil
-            stack[1+RETTO] = nil  stack[1+STATE] = nil
-            stack._ptr = 1 stack._top = 4
-            stack._push = table.deepcopy_push stack._pop = table.deepcopy_pop
-            stack._recurse = table.deepcopy_recurse
-
-            local copyfunc_list = table.deepcopy_copyfunc_list
-            repeat
-                local stack_ptr = stack._ptr
-                local this_orig = stack[stack_ptr+ORIG]
-                local this_copy, this_state
-                stack[0] = stack[0]
-                if stack.value_ignore and stack.value_ignore[this_orig] then
-                    this_copy = nil
-                    this_state = true --goto valuefound
-                else
-                    if stack.value_translate then
-                        this_copy = stack.value_translate[this_orig]
-                        if this_copy ~= nil then
-                            this_state = true --goto valuefound
-                        end
-                    end
-                    if not this_state then
-                        local this_orig_type = type(this_orig)
-                        local copyfunc = (
-                                customcopyfunc_list and customcopyfunc_list[this_orig_type]
-                            or  copyfunc_list[this_orig_type]
-                            or  error(("cannot copy type %q"):format(this_orig_type), 2)
-                        )
-                        this_copy, this_state = copyfunc(
-                            stack,
-                            this_orig,
-                            stack[stack_ptr+COPY],
-                            unpack(stack--[[_dbg]], stack_ptr+STATE, stack._top)
-                        )
-                    end
-                end
-                stack[stack_ptr+COPY] = this_copy
-                --::valuefound::
-                if this_state == true then
-                    local retto = stack[stack_ptr+RETTO]
-                    stack._top = stack_ptr+1 -- pop retto, state, temp...
-                    -- Leave orig and copy on stack for parent object
-                    stack_ptr = retto -- return to parent's stack frame
-                    stack._ptr = stack_ptr
-                else
-                    stack[stack_ptr+STATE] = this_state
-                end
-            until stack_ptr == nil
-            return stack[1+COPY]
-        end
-    end
-end
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/system/events.xml b/Interface/AddOns/SVUI/system/events.xml
deleted file mode 100644
index 6d95f19..0000000
--- a/Interface/AddOns/SVUI/system/events.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<Ui xmlns="http://www.blizzard.com/wow/ui/">
-	<Frame name="SVUI_EventHandler1" hidden="true" virtual="true">
-        <Scripts>
-            <OnEvent function="SVUI_EventHandler1_OnEvent"/>
-        </Scripts>
-    </Frame>
-    <Frame name="SVUI_EventHandler2" hidden="true" virtual="true">
-        <Scripts>
-            <OnEvent function="SVUI_EventHandler2_OnEvent"/>
-        </Scripts>
-    </Frame>
-</Ui>
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/system/load.lua b/Interface/AddOns/SVUI/system/load.lua
index ddb55fb..2fec16b 100644
--- a/Interface/AddOns/SVUI/system/load.lua
+++ b/Interface/AddOns/SVUI/system/load.lua
@@ -35,7 +35,9 @@ local tcopy = table.copy;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...))
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0")
 --[[
 ##########################################################
 LOCALS
diff --git a/Interface/AddOns/SVUI/system/media.lua b/Interface/AddOns/SVUI/system/media.lua
index 8e7cdcd..c51778a 100644
--- a/Interface/AddOns/SVUI/system/media.lua
+++ b/Interface/AddOns/SVUI/system/media.lua
@@ -37,7 +37,10 @@ local twipe, tsort = table.wipe, table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...))
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0")
+local LSM = LibStub("LibSharedMedia-3.0")
 --[[
 ##########################################################
 LOCALIZED GLOBALS
@@ -74,48 +77,48 @@ end
 DEFINE SHARED MEDIA
 ##########################################################
 ]]--
-SV.Shared = LibStub("LibSharedMedia-3.0")
-
-SV.Shared:Register("background","SVUI Backdrop 1",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\PATTERN1]])
-SV.Shared:Register("background","SVUI Backdrop 2",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\PATTERN2]])
-SV.Shared:Register("background","SVUI Backdrop 3",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\PATTERN3]])
-SV.Shared:Register("background","SVUI Backdrop 4",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\PATTERN4]])
-SV.Shared:Register("background","SVUI Backdrop 5",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\PATTERN5]])
-SV.Shared:Register("background","SVUI Comic 1",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\COMIC1]])
-SV.Shared:Register("background","SVUI Comic 2",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\COMIC2]])
-SV.Shared:Register("background","SVUI Comic 3",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\COMIC3]])
-SV.Shared:Register("background","SVUI Comic 4",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\COMIC4]])
-SV.Shared:Register("background","SVUI Comic 5",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\COMIC5]])
-SV.Shared:Register("background","SVUI Comic 6",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\COMIC6]])
-SV.Shared:Register("background","SVUI Unit BG 1",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-BG1]])
-SV.Shared:Register("background","SVUI Unit BG 2",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-BG2]])
-SV.Shared:Register("background","SVUI Unit BG 3",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-BG3]])
-SV.Shared:Register("background","SVUI Unit BG 4",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-BG4]])
-SV.Shared:Register("background","SVUI Small BG 1",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-SMALL-BG1]])
-SV.Shared:Register("background","SVUI Small BG 2",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-SMALL-BG2]])
-SV.Shared:Register("background","SVUI Small BG 3",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-SMALL-BG3]])
-SV.Shared:Register("background","SVUI Small BG 4",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-SMALL-BG4]])
-SV.Shared:Register("statusbar","SVUI BasicBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\DEFAULT]])
-SV.Shared:Register("statusbar","SVUI MultiColorBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\GRADIENT]])
-SV.Shared:Register("statusbar","SVUI SmoothBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\SMOOTH]])
-SV.Shared:Register("statusbar","SVUI PlainBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\FLAT]])
-SV.Shared:Register("statusbar","SVUI FancyBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\TEXTURED]])
-SV.Shared:Register("statusbar","SVUI GlossBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\GLOSS]])
-SV.Shared:Register("statusbar","SVUI GlowBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\GLOWING]])
-SV.Shared:Register("statusbar","SVUI LazerBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\LAZER]])
-SV.Shared:Register("sound", "Whisper Alert", [[Interface\AddOns\SVUI\assets\sounds\whisper.mp3]])
-SV.Shared:Register("sound", "Toasty", [[Interface\AddOns\SVUI\assets\sounds\toasty.mp3]])
-SV.Shared:Register("font","SVUI Default Font",[[Interface\AddOns\SVUI\assets\fonts\Default.ttf]])
-SV.Shared:Register("font","SVUI System Font",[[Interface\AddOns\SVUI\assets\fonts\System.ttf]])
-SV.Shared:Register("font","SVUI Dialog Font",[[Interface\AddOns\SVUI\assets\fonts\Dialog.ttf]])
-SV.Shared:Register("font","SVUI Narrator Font",[[Interface\AddOns\SVUI\assets\fonts\Narrative.ttf]])
-SV.Shared:Register("font","SVUI Number Font",[[Interface\AddOns\SVUI\assets\fonts\Numbers.ttf]])
-SV.Shared:Register("font","SVUI Combat Font",[[Interface\AddOns\SVUI\assets\fonts\Combat.ttf]])
-SV.Shared:Register("font","SVUI Action Font",[[Interface\AddOns\SVUI\assets\fonts\Action.ttf]])
-SV.Shared:Register("font","SVUI Name Font",[[Interface\AddOns\SVUI\assets\fonts\Names.ttf]])
-SV.Shared:Register("font","SVUI Alert Font",[[Interface\AddOns\SVUI\assets\fonts\Alert.ttf]])
-SV.Shared:Register("font","SVUI Pixel Font",[[Interface\AddOns\SVUI\assets\fonts\Pixel.ttf]],SV.Shared.LOCALE_BIT_ruRU+SV.Shared.LOCALE_BIT_western)
-SV.Shared:Register("font","Roboto",[[Interface\AddOns\SVUI\assets\fonts\Roboto.ttf]],SV.Shared.LOCALE_BIT_ruRU+SV.Shared.LOCALE_BIT_western)
+local LSM = LibStub("LibSharedMedia-3.0")
+
+LSM:Register("background","SVUI Backdrop 1",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\PATTERN1]])
+LSM:Register("background","SVUI Backdrop 2",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\PATTERN2]])
+LSM:Register("background","SVUI Backdrop 3",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\PATTERN3]])
+LSM:Register("background","SVUI Backdrop 4",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\PATTERN4]])
+LSM:Register("background","SVUI Backdrop 5",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\PATTERN5]])
+LSM:Register("background","SVUI Comic 1",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\COMIC1]])
+LSM:Register("background","SVUI Comic 2",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\COMIC2]])
+LSM:Register("background","SVUI Comic 3",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\COMIC3]])
+LSM:Register("background","SVUI Comic 4",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\COMIC4]])
+LSM:Register("background","SVUI Comic 5",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\COMIC5]])
+LSM:Register("background","SVUI Comic 6",[[Interface\AddOns\SVUI\assets\artwork\Template\Background\COMIC6]])
+LSM:Register("background","SVUI Unit BG 1",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-BG1]])
+LSM:Register("background","SVUI Unit BG 2",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-BG2]])
+LSM:Register("background","SVUI Unit BG 3",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-BG3]])
+LSM:Register("background","SVUI Unit BG 4",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-BG4]])
+LSM:Register("background","SVUI Small BG 1",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-SMALL-BG1]])
+LSM:Register("background","SVUI Small BG 2",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-SMALL-BG2]])
+LSM:Register("background","SVUI Small BG 3",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-SMALL-BG3]])
+LSM:Register("background","SVUI Small BG 4",[[Interface\AddOns\SVUI\assets\artwork\Unitframe\Background\UNIT-SMALL-BG4]])
+LSM:Register("statusbar","SVUI BasicBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\DEFAULT]])
+LSM:Register("statusbar","SVUI MultiColorBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\GRADIENT]])
+LSM:Register("statusbar","SVUI SmoothBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\SMOOTH]])
+LSM:Register("statusbar","SVUI PlainBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\FLAT]])
+LSM:Register("statusbar","SVUI FancyBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\TEXTURED]])
+LSM:Register("statusbar","SVUI GlossBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\GLOSS]])
+LSM:Register("statusbar","SVUI GlowBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\GLOWING]])
+LSM:Register("statusbar","SVUI LazerBar",[[Interface\AddOns\SVUI\assets\artwork\Bars\LAZER]])
+LSM:Register("sound", "Whisper Alert", [[Interface\AddOns\SVUI\assets\sounds\whisper.mp3]])
+LSM:Register("sound", "Toasty", [[Interface\AddOns\SVUI\assets\sounds\toasty.mp3]])
+LSM:Register("font","SVUI Default Font",[[Interface\AddOns\SVUI\assets\fonts\Default.ttf]])
+LSM:Register("font","SVUI System Font",[[Interface\AddOns\SVUI\assets\fonts\System.ttf]])
+LSM:Register("font","SVUI Dialog Font",[[Interface\AddOns\SVUI\assets\fonts\Dialog.ttf]])
+LSM:Register("font","SVUI Narrator Font",[[Interface\AddOns\SVUI\assets\fonts\Narrative.ttf]])
+LSM:Register("font","SVUI Number Font",[[Interface\AddOns\SVUI\assets\fonts\Numbers.ttf]])
+LSM:Register("font","SVUI Combat Font",[[Interface\AddOns\SVUI\assets\fonts\Combat.ttf]])
+LSM:Register("font","SVUI Action Font",[[Interface\AddOns\SVUI\assets\fonts\Action.ttf]])
+LSM:Register("font","SVUI Name Font",[[Interface\AddOns\SVUI\assets\fonts\Names.ttf]])
+LSM:Register("font","SVUI Alert Font",[[Interface\AddOns\SVUI\assets\fonts\Alert.ttf]])
+LSM:Register("font","SVUI Pixel Font",[[Interface\AddOns\SVUI\assets\fonts\Pixel.ttf]],LSM.LOCALE_BIT_ruRU+LSM.LOCALE_BIT_western)
+LSM:Register("font","Roboto",[[Interface\AddOns\SVUI\assets\fonts\Roboto.ttf]],LSM.LOCALE_BIT_ruRU+LSM.LOCALE_BIT_western)
 --[[
 ##########################################################
 POPULATE MEDIA TABLE
@@ -129,7 +132,7 @@ do
   local r2,g2,b2 = cColor2.r*.25, cColor2.g*.25, cColor2.b*.25
   local ir1,ig1,ib1 = (1 - r1), (1 - g1), (1 - b1)
   local ir2,ig2,ib2 = (1 - cColor2.r)*.25, (1 - cColor2.g)*.25, (1 - cColor2.b)*.25
-  local Shared = SV.Shared
+  local Shared = LSM

   SV.Media["color"] = {
     ["default"]     = {0.2, 0.2, 0.2, 1},
@@ -221,7 +224,7 @@ function SV:HexColor(arg1,arg2,arg3)
         if(self.Media or self.db.media) then
             t = self.Media.color[arg1] or self.db.media.unitframes[arg1]
         else
-            t = self.Configs.media.colors[arg1] or self.Configs.media.unitframes[arg1]
+            t = self.private.media.colors[arg1] or self.private.media.unitframes[arg1]
         end
         if t then
             r,g,b = t[1],t[2],t[3]
@@ -243,10 +246,10 @@ end
 function SV:MediaUpdate()
   self.Media.color.default  = self.db.media.colors.default
   self.Media.color.special  = self.db.media.colors.special
-  self.Media.bg.pattern     = self.Shared:Fetch("background", self.db.media.textures.pattern)
-  self.Media.bg.comic       = self.Shared:Fetch("background", self.db.media.textures.comic)
-  self.Media.bg.unitlarge   = self.Shared:Fetch("background", self.db.media.textures.unitlarge)
-  self.Media.bg.unitsmall   = self.Shared:Fetch("background", self.db.media.textures.unitsmall)
+  self.Media.bg.pattern     = LSM:Fetch("background", self.db.media.textures.pattern)
+  self.Media.bg.comic       = LSM:Fetch("background", self.db.media.textures.comic)
+  self.Media.bg.unitlarge   = LSM:Fetch("background", self.db.media.textures.unitlarge)
+  self.Media.bg.unitsmall   = LSM:Fetch("background", self.db.media.textures.unitsmall)

   local cColor1 = self.Media.color.special
   local cColor2 = self.Media.color.default
@@ -262,11 +265,11 @@ function SV:RefreshSystemFonts()
   local fontsize = self.db.media.fonts.size
   local unicodesize = self.db.media.fonts.unicodeSize

-  local NUMBER_TEXT_FONT = self.Shared:Fetch("font", self.db.media.fonts.number);
-  local GIANT_TEXT_FONT = self.Shared:Fetch("font", self.db.media.fonts.giant);
-  STANDARD_TEXT_FONT = self.Shared:Fetch("font", self.db.media.fonts.default);
-  UNIT_NAME_FONT = self.Shared:Fetch("font", self.db.media.fonts.name);
-  DAMAGE_TEXT_FONT = self.Shared:Fetch("font", self.db.media.fonts.combat);
+  local NUMBER_TEXT_FONT = LSM:Fetch("font", self.db.media.fonts.number);
+  local GIANT_TEXT_FONT = LSM:Fetch("font", self.db.media.fonts.giant);
+  STANDARD_TEXT_FONT = LSM:Fetch("font", self.db.media.fonts.default);
+  UNIT_NAME_FONT = LSM:Fetch("font", self.db.media.fonts.name);
+  DAMAGE_TEXT_FONT = LSM:Fetch("font", self.db.media.fonts.combat);
   NAMEPLATE_FONT = STANDARD_TEXT_FONT
   CHAT_FONT_HEIGHTS = {8,9,10,11,12,13,14,15,16,17,18,19,20}
   UIDROPDOWNMENU_DEFAULT_TEXT_HEIGHT = fontsize
@@ -335,11 +338,11 @@ function SV:RefreshAllSystemMedia()
   local fontsize = self.db.media.fonts.size
   local unicodesize = self.db.media.fonts.unicodeSize

-  local NUMBER_TEXT_FONT = self.Shared:Fetch("font", self.db.media.fonts.number);
-  local GIANT_TEXT_FONT = self.Shared:Fetch("font", self.db.media.fonts.giant);
-  STANDARD_TEXT_FONT = self.Shared:Fetch("font", self.db.media.fonts.default);
-  UNIT_NAME_FONT = self.Shared:Fetch("font", self.db.media.fonts.name);
-  DAMAGE_TEXT_FONT = self.Shared:Fetch("font", self.db.media.fonts.combat);
+  local NUMBER_TEXT_FONT = LSM:Fetch("font", self.db.media.fonts.number);
+  local GIANT_TEXT_FONT = LSM:Fetch("font", self.db.media.fonts.giant);
+  STANDARD_TEXT_FONT = LSM:Fetch("font", self.db.media.fonts.default);
+  UNIT_NAME_FONT = LSM:Fetch("font", self.db.media.fonts.name);
+  DAMAGE_TEXT_FONT = LSM:Fetch("font", self.db.media.fonts.combat);
   NAMEPLATE_FONT = STANDARD_TEXT_FONT
   CHAT_FONT_HEIGHTS = {8,9,10,11,12,13,14,15,16,17,18,19,20}
   UIDROPDOWNMENU_DEFAULT_TEXT_HEIGHT = fontsize
diff --git a/Interface/AddOns/SVUI/system/mentalo.lua b/Interface/AddOns/SVUI/system/mentalo.lua
index dafd813..ec0a078 100644
--- a/Interface/AddOns/SVUI/system/mentalo.lua
+++ b/Interface/AddOns/SVUI/system/mentalo.lua
@@ -33,7 +33,8 @@ local parsefloat = math.parsefloat;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale();
 SV.MentaloFrames = {}
 local Sticky = {};
 Sticky.scripts = Sticky.scripts or {}
diff --git a/Interface/AddOns/SVUI/system/setup.lua b/Interface/AddOns/SVUI/system/setup.lua
index e2a66a5..bb6f54b 100644
--- a/Interface/AddOns/SVUI/system/setup.lua
+++ b/Interface/AddOns/SVUI/system/setup.lua
@@ -30,7 +30,9 @@ local tcopy = table.copy;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L, Registry = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
 --[[
 ##########################################################
 LOCAL VARS
diff --git a/Interface/AddOns/SVUI/system/slash.lua b/Interface/AddOns/SVUI/system/slash.lua
index 1822cef..f35afed 100644
--- a/Interface/AddOns/SVUI/system/slash.lua
+++ b/Interface/AddOns/SVUI/system/slash.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale();
 --[[
 ##########################################################
 LOCAL VARS
diff --git a/Interface/AddOns/SVUI/system/timers.lua b/Interface/AddOns/SVUI/system/timers.lua
index 7d164c2..a8201e5 100644
--- a/Interface/AddOns/SVUI/system/timers.lua
+++ b/Interface/AddOns/SVUI/system/timers.lua
@@ -36,7 +36,8 @@ local tremove = table.remove;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale();
 --[[
 ##########################################################
 LOCAL VARS
@@ -49,6 +50,8 @@ TIMERS
 ##########################################################
 ExecuteTimer: Create a timer that runs once and CANNOT be stopped
 ExecuteLoop: Create a timer that loops continuously and CAN be removed
+
+NEW IN WOD: local timerloop = C_Timer.NewTicker(duration, callback, [iterations])
 ]]--
 local Timers = CreateFrame("Frame");
 Timers.TimerCount = 0;
@@ -123,7 +126,7 @@ end
 Timers:SetScript("OnUpdate", ExeTimerManager_OnUpdate)
 --[[
 ##########################################################
-TIMER FUNCTIONS
+COOLDOWN FUNCTIONS
 ##########################################################
 ]]--
 local Cooldown_ForceUpdate = function(self)
diff --git a/Interface/AddOns/SVUI/system/utilities.lua b/Interface/AddOns/SVUI/system/utilities.lua
index 1a28bff..b2146cd 100644
--- a/Interface/AddOns/SVUI/system/utilities.lua
+++ b/Interface/AddOns/SVUI/system/utilities.lua
@@ -37,7 +37,8 @@ local iLevelFilter = ITEM_LEVEL:gsub( "%%d", "(%%d+)" )
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...))
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale()
 --[[
 ##########################################################
 MISC UTILITY FUNCTIONS
diff --git a/Interface/AddOns/SVUI/system/visibility.lua b/Interface/AddOns/SVUI/system/visibility.lua
index 02fb146..4a0d18d 100644
--- a/Interface/AddOns/SVUI/system/visibility.lua
+++ b/Interface/AddOns/SVUI/system/visibility.lua
@@ -26,7 +26,8 @@ local pairs     = _G.pairs;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(select(2, ...));
+local SVUI_ADDON_NAME, SV = ...
+local L = LibLocale();
 --[[
 ##########################################################
 LOCALS
diff --git a/Interface/AddOns/SVUI/xml/system.xml b/Interface/AddOns/SVUI/xml/system.xml
new file mode 100644
index 0000000..dc0c93f
--- /dev/null
+++ b/Interface/AddOns/SVUI/xml/system.xml
@@ -0,0 +1,96 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<Frame name="SVUI_PanelTemplate" virtual="true" toplevel="true">
+        <Layers>
+            <Layer level="BACKGROUND">
+                <Texture name="$parentBG" setAllPoints="true"/>
+            </Layer>
+            <Layer level="OVERLAY">
+                <Texture name="$parentTitleBG">
+                    <Anchors>
+                        <Anchor point="BOTTOMLEFT" relativeTo="$parentBG" relativePoint="TOPLEFT"/>
+                        <Anchor point="TOPRIGHT" relativeTo="$parentBG" relativePoint="TOPRIGHT">
+                            <Offset x="0" y="30"/>
+                        </Anchor>
+                    </Anchors>
+                </Texture>
+            </Layer>
+        </Layers>
+    </Frame>
+
+    <Frame name="SVUI_MovingPanelTemplate" virtual="true" movable="true" clampedToScreen="true" toplevel="true">
+        <Layers>
+            <Layer level="BACKGROUND">
+                <Texture name="$parentBG" setAllPoints="true"/>
+            </Layer>
+            <Layer level="OVERLAY">
+                <Texture name="$parentTitleBG">
+                    <Anchors>
+                        <Anchor point="TOPLEFT"/>
+                        <Anchor point="BOTTOMRIGHT" relativePoint="TOPRIGHT">
+                            <Offset x="0" y="-30"/>
+                        </Anchor>
+                    </Anchors>
+                </Texture>
+            </Layer>
+        </Layers>
+        <Frames>
+            <Frame name="$parentTitleButton">
+                <Anchors>
+                    <Anchor point="TOPLEFT" relativeTo="$parentTitleBG"/>
+                    <Anchor point="BOTTOMRIGHT" relativeTo="$parentTitleBG"/>
+                </Anchors>
+            </Frame>
+        </Frames>
+    </Frame>
+
+    <Frame name="SVUI_MessagePanelTemplate" virtual="true" toplevel="true">
+        <Layers>
+            <Layer level="BACKGROUND">
+                <Texture name="$parentBG" setAllPoints="true"/>
+            </Layer>
+            <Layer level="OVERLAY">
+                <Texture name="$parentTitleBG">
+                    <Anchors>
+                        <Anchor point="TOPLEFT">
+                            <Offset x="8" y="-8"/>
+                        </Anchor>
+                        <Anchor point="BOTTOMRIGHT" relativePoint="TOPRIGHT">
+                            <Offset x="-32" y="-24"/>
+                        </Anchor>
+                    </Anchors>
+                </Texture>
+                <Texture name="$parentDialogBG">
+                    <Anchors>
+                        <Anchor point="TOPLEFT">
+                            <Offset x="8" y="-32"/>
+                        </Anchor>
+                        <Anchor point="BOTTOMRIGHT">
+                            <Offset x="-32" y="32"/>
+                        </Anchor>
+                    </Anchors>
+                </Texture>
+            </Layer>
+            <Layer level="ARTWORK">
+                <FontString parentKey="Title" inherits="GameFontNormal">
+                    <Anchors>
+                        <Anchor point="TOPLEFT">
+                            <Offset x="8" y="-8"/>
+                        </Anchor>
+                        <Anchor point="TOPRIGHT">
+                            <Offset x="-32" y="-24"/>
+                        </Anchor>
+                    </Anchors>
+                </FontString>
+            </Layer>
+        </Layers>
+        <Frames>
+            <Button parentKey="Close" inherits="UIPanelCloseButton">
+                <Anchors>
+                    <Anchor point="TOPRIGHT">
+                        <Offset x="-2" y="-2"/>
+                    </Anchor>
+                </Anchors>
+            </Button>
+        </Frames>
+    </Frame>
+</Ui>
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/xml/utility.xml b/Interface/AddOns/SVUI/xml/utility.xml
new file mode 100644
index 0000000..6d95f19
--- /dev/null
+++ b/Interface/AddOns/SVUI/xml/utility.xml
@@ -0,0 +1,12 @@
+<Ui xmlns="http://www.blizzard.com/wow/ui/">
+	<Frame name="SVUI_EventHandler1" hidden="true" virtual="true">
+        <Scripts>
+            <OnEvent function="SVUI_EventHandler1_OnEvent"/>
+        </Scripts>
+    </Frame>
+    <Frame name="SVUI_EventHandler2" hidden="true" virtual="true">
+        <Scripts>
+            <OnEvent function="SVUI_EventHandler2_OnEvent"/>
+        </Scripts>
+    </Frame>
+</Ui>
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI_AnsweringService/SVUI_AnsweringService.lua b/Interface/AddOns/SVUI_AnsweringService/SVUI_AnsweringService.lua
index 691e25d..32b82e1 100644
--- a/Interface/AddOns/SVUI_AnsweringService/SVUI_AnsweringService.lua
+++ b/Interface/AddOns/SVUI_AnsweringService/SVUI_AnsweringService.lua
@@ -48,11 +48,13 @@ GET ADDON DATA
 ##########################################################
 ]]--
 local SVUIAddOnName, PLUGIN = ...;
-local SV, L, Registry = unpack(SVUI);
-local CONFIGS = SV.Configs
+local SV = SVUI
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local CONFIGS = SV.private
 local NewHook = hooksecurefunc;

-PLUGIN = SV:Prototype(SVUIAddOnName)
+PLUGIN = Registry:NewPrototype(SVUIAddOnName)
 local SCHEMA = PLUGIN.___schema;

 _G["WhisperVillain"] = PLUGIN;
diff --git a/Interface/AddOns/SVUI_ArtOfWar/Bindings.xml b/Interface/AddOns/SVUI_ArtOfWar/Bindings.xml
index 05e6324..78f0b62 100644
--- a/Interface/AddOns/SVUI_ArtOfWar/Bindings.xml
+++ b/Interface/AddOns/SVUI_ArtOfWar/Bindings.xml
@@ -1,5 +1,5 @@
 <Bindings>
-  <Binding name="SayIncoming" description="Call Out Incoming" header="SVUIAOW" runOnUp="false">
+  <Binding name="SVUIAOW_RADIO" category="ADDONS" header="SVUIAOW" runOnUp="false">
     SVUISayIncoming()
   </Binding>
 </Bindings>
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI_ArtOfWar/SVUI_ArtOfWar.lua b/Interface/AddOns/SVUI_ArtOfWar/SVUI_ArtOfWar.lua
index 59084a7..328cdde 100644
--- a/Interface/AddOns/SVUI_ArtOfWar/SVUI_ArtOfWar.lua
+++ b/Interface/AddOns/SVUI_ArtOfWar/SVUI_ArtOfWar.lua
@@ -16,7 +16,14 @@ S U P E R - V I L L A I N - U I   By: Munglunch                              #
 LOCALIZED LUA FUNCTIONS
 ##########################################################
 ]]--
+
+--[[  CONSTANTS ]]--
+
+BINDING_HEADER_SVUIAOW = "Supervillain UI: Art of War";
+BINDING_NAME_SVUIAOW_RADIO = "Call Out Incoming";
+
 --[[ GLOBALS ]]--
+
 local _G = _G;
 local unpack    = _G.unpack;
 local select    = _G.select;
@@ -47,11 +54,13 @@ GET ADDON DATA
 ##########################################################
 ]]--
 local SVUIAddOnName, PLUGIN = ...;
-local SV, L, Registry = unpack(SVUI);
-local CONFIGS = SV.Configs
+local SV = SVUI
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local CONFIGS = SV.private
 local NewHook = hooksecurefunc;

-PLUGIN = SV:Prototype(SVUIAddOnName)
+PLUGIN = Registry:NewPrototype(SVUIAddOnName)
 local SCHEMA = PLUGIN.___schema;

 _G["WarVillain"] = PLUGIN;
@@ -60,8 +69,6 @@ _G["WarVillain"] = PLUGIN;
 GLOBAL SLASH FUNCTIONS
 ##########################################################
 ]]--
-BINDING_HEADER_SVUIAOW = "Supervillain UI: Art of War";
-
 function SVUISayIncoming()
 	local subzoneText = GetSubZoneText()
 	local msg = ("{rt8} Incoming %s {rt8}"):format(subzoneText)
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/SVUI_ConfigOMatic.lua b/Interface/AddOns/SVUI_ConfigOMatic/SVUI_ConfigOMatic.lua
index 8a9b8a0..fa7c078 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/SVUI_ConfigOMatic.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/SVUI_ConfigOMatic.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local Ace3Config = LibStub("AceConfig-3.0");
 local Ace3ConfigDialog = LibStub("AceConfigDialog-3.0");
 Ace3Config:RegisterOptionsTable("SVUI", SV.Options);
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/language/generic.lua b/Interface/AddOns/SVUI_ConfigOMatic/language/generic.lua
index 91a6a22..927ef13 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/language/generic.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/language/generic.lua
@@ -16,7 +16,8 @@ S U P E R - V I L L A I N - U I   By: Munglunch                              #
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local gameLocale = GetLocale()
 if gameLocale == "enUS" then
 	L["AURAS_DESC"] = "Configure the aura icons that appear near the minimap."
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/art.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/art.lua
index 903afb3..0691044 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/art.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/art.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 SV.Options.args.SVStyle={
 	type = "group",
 	name = L["UI Styling"],
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/aura.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/aura.lua
index 27443d2..01d30e3 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/aura.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/aura.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVAura;
 local MAP = SV.SVMap;
 --[[
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/bag.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/bag.lua
index a87eb28..34fa3db 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/bag.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/bag.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();

 local MOD = SV.SVBag

diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/bar.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/bar.lua
index 9c29dd3..dd4799c 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/bar.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/bar.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVBar;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/chat.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/chat.lua
index 39d718e..9213842 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/chat.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/chat.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVChat;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/dock.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/dock.lua
index 17c7d67..28a7fa8 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/dock.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/dock.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVDock
 local CHAT = SV.SVChat
 local BAG = SV.SVBag
@@ -53,7 +54,7 @@ SV.Options.args.SVDock.args["common"] = {
 	guiInline = true,
 	args = {
 		bottomPanel = {
-			order = 2,
+			order = 1,
 			type = 'toggle',
 			name = L['Bottom Panel'],
 			desc = L['Display a border across the bottom of the screen.'],
@@ -61,23 +62,27 @@ SV.Options.args.SVDock.args["common"] = {
 			set = function(key,value)MOD:ChangeDBVar(value,key[#key]);MOD:BottomPanelVisibility()end
 		},
 		topPanel = {
-			order = 3,
+			order = 2,
 			type = 'toggle',
 			name = L['Top Panel'],
 			desc = L['Display a border across the top of the screen.'],
 			get = function(j)return SV.db.SVDock.topPanel end,
 			set = function(key,value)MOD:ChangeDBVar(value,key[#key]);MOD:TopPanelVisibility()end
 		},
-		leftDockBackdrop = {
-			order = 3,
-			type = 'toggle',
-			name = L['Left Dock Backdrop'],
-			desc = L['Display a backdrop behind the left-side dock.'],
-			get = function(j)return SV.db.SVDock.leftDockBackdrop end,
+		dockStatWidth = {
+			order = 3,
+			type = "range",
+			name = L["Bottom Stats Width"],
+			desc = L["PANEL_DESC"],
+			min = 150,
+			max = 1200,
+			step = 1,
+			width = "full",
+			get = function()return SV.db.SVDock.dockStatWidth end,
 			set = function(key,value)
 				MOD:ChangeDBVar(value,key[#key]);
-				MOD:UpdateDockBackdrops()
-			end
+				MOD:UpdateSuperDock(true)
+			end,
 		},
 	}
 };
@@ -88,8 +93,19 @@ SV.Options.args.SVDock.args["leftDockGroup"] = {
 		name = L["Left Dock"],
 		guiInline = true,
 		args = {
+			leftDockBackdrop = {
+				order = 1,
+				type = 'toggle',
+				name = L['Left Dock Backdrop'],
+				desc = L['Display a backdrop behind the left-side dock.'],
+				get = function(j)return SV.db.SVDock.leftDockBackdrop end,
+				set = function(key,value)
+					MOD:ChangeDBVar(value,key[#key]);
+					MOD:UpdateDockBackdrops()
+				end
+			},
 			dockLeftHeight = {
-				order = 1,
+				order = 2,
 				type = "range",
 				name = L["Left Dock Height"],
 				desc = L["PANEL_DESC"],
@@ -105,7 +121,7 @@ SV.Options.args.SVDock.args["leftDockGroup"] = {
 				end,
 			},
 			dockLeftWidth = {
-				order = 2,
+				order = 3,
 				type = "range",
 				name = L["Left Dock Width"],
 				desc = L["PANEL_DESC"],
@@ -120,21 +136,6 @@ SV.Options.args.SVDock.args["leftDockGroup"] = {
 					CHAT:RefreshChatFrames(true)
 				end,
 			},
-			dockStatWidth = {
-				order = 3,
-				type = "range",
-				name = L["Bottom Stats Width"],
-				desc = L["PANEL_DESC"],
-				min = 150,
-				max = 1200,
-				step = 1,
-				width = "full",
-				get = function()return SV.db.SVDock.dockStatWidth end,
-				set = function(key,value)
-					MOD:ChangeDBVar(value,key[#key]);
-					MOD:UpdateSuperDock(true)
-				end,
-			},
 		}
 	};

@@ -188,14 +189,26 @@ SV.Options.args.SVDock.args["rightDockGroup"] = {
 	name = L["Right Dock"],
 	guiInline = true,
 	args = {
+		rightDockBackdrop = {
+			order = 1,
+			type = 'toggle',
+			name = L['Right Dock Backdrop'],
+			desc = L['Display a backdrop behind the right-side dock.'],
+			get = function(j)return SV.db.SVDock.rightDockBackdrop end,
+			set = function(key,value)
+				MOD:ChangeDBVar(value,key[#key]);
+				MOD:UpdateDockBackdrops()
+			end
+		},
 		dockRightHeight = {
-			order = 1,
+			order = 2,
 			type = "range",
 			name = L["Right Dock Height"],
 			desc = L["PANEL_DESC"],
 			min = 150,
 			max = 600,
 			step = 1,
+			width = "full",
 			get = function()return SV.db.SVDock.dockRightHeight;end,
 			set = function(key,value)
 				MOD:ChangeDBVar(value,key[#key]);
@@ -204,13 +217,14 @@ SV.Options.args.SVDock.args["rightDockGroup"] = {
 			end,
 		},
 		dockRightWidth = {
-			order = 2,
+			order = 3,
 			type = "range",
 			name = L["Right Dock Width"],
 			desc = L["PANEL_DESC"],
 			min = 150,
 			max = 700,
 			step = 1,
+			width = "full",
 			get = function()return SV.db.SVDock.dockRightWidth;end,
 			set = function(key,value)
 				MOD:ChangeDBVar(value,key[#key]);
@@ -220,17 +234,6 @@ SV.Options.args.SVDock.args["rightDockGroup"] = {
 				BAG:Layout(true)
 			end,
 		},
-		rightDockBackdrop = {
-			order = 3,
-			type = 'toggle',
-			name = L['Right Dock Backdrop'],
-			desc = L['Display a backdrop behind the right-side dock.'],
-			get = function(j)return SV.db.SVDock.rightDockBackdrop end,
-			set = function(key,value)
-				MOD:ChangeDBVar(value,key[#key]);
-				MOD:UpdateDockBackdrops()
-			end
-		},
 		quest = {
 			order = 4,
 			type = "group",
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/dynamic.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/dynamic.lua
index 9de9d75..e2212dd 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/dynamic.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/dynamic.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local queue = SV.DynamicOptions;

 do
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/filter.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/filter.lua
index ad1a140..d66de3b 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/filter.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/filter.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVUnit
 if(not MOD) then return end
 local _, ns = ...;
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/henchmen.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/henchmen.lua
index 1615bd8..97220d5 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/henchmen.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/henchmen.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVHenchmen;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/map.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/map.lua
index 68238b3..1cd9598 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/map.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/map.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVMap
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/mode.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/mode.lua
index 4880bb8..db5409e 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/mode.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/mode.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVLaborer
 SV.Options.args.SVLaborer = {
 	type = 'group',
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/plate.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/plate.lua
index ea753c7..9254132 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/plate.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/plate.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVPlate;
 local _, ns = ...;
 --[[
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/profiles.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/profiles.lua
index 2ea9052..140d844 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/profiles.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/profiles.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();

 SV.Options.args.profiles = {
 	order = 9999,
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/stat.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/stat.lua
index fa05f8d..1a5f238 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/stat.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/stat.lua
@@ -28,7 +28,8 @@ local upper 	 =  string.upper;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVStats;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/tip.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/tip.lua
index 9b8c6b1..0c321a9 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/tip.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/tip.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVTip;
 local LSM = LibStub("LibSharedMedia-3.0");
 --[[
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/core.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/core.lua
index 0507060..8ed9bfe 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/core.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/core.lua
@@ -31,7 +31,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVUnit
 if(not MOD) then return end
 local _, ns = ...;
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/focus.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/focus.lua
index 0cdf607..e1f1b38 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/focus.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/focus.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVUnit
 if(not MOD) then return end
 local _, ns = ...
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/grid.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/grid.lua
index 0205fcd..8f0c089 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/grid.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/grid.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVUnit
 if(not MOD) then return end
 local _, ns = ...
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/other.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/other.lua
index bfc19d9..e594739 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/other.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/other.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVUnit
 if(not MOD) then return end
 local _, ns = ...
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/party.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/party.lua
index 9441a00..6f2449d 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/party.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/party.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVUnit
 if(not MOD) then return end
 local _, ns = ...
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/pet.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/pet.lua
index 36ec8b3..e87bd4e 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/pet.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/pet.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVUnit
 if(not MOD) then return end
 local _, ns = ...
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/player.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/player.lua
index 884c2a9..0148ce6 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/player.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/player.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVUnit
 if(not MOD) then return end
 local _, ns = ...
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/raid.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/raid.lua
index a7f85ca..78b1b9f 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/raid.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/raid.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVUnit
 if(not MOD) then return end
 local _, ns = ...
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/target.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/target.lua
index 350ca1f..69604fe 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/target.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/target.lua
@@ -29,7 +29,8 @@ local tsort = table.sort;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local MOD = SV.SVUnit
 if(not MOD) then return end
 local _, ns = ...
diff --git a/Interface/AddOns/SVUI_Laborer/Bindings.xml b/Interface/AddOns/SVUI_Laborer/Bindings.xml
index 3b81fd2..2a3cd5f 100644
--- a/Interface/AddOns/SVUI_Laborer/Bindings.xml
+++ b/Interface/AddOns/SVUI_Laborer/Bindings.xml
@@ -1,14 +1,14 @@
 <Bindings>
-  <Binding name="FishingMode" description="Fishing Mode" header="SVUILABORER" runOnUp="false">
+  <Binding name="SVUILABORER_FISH" category="ADDONS" header="SVUILABORER" runOnUp="false">
     SVUIFishingMode()
   </Binding>
-   <Binding name="FarmingMode" description="Farming Mode" header="SVUILABORER" runOnUp="false">
+   <Binding name="SVUILABORER_FARM" category="ADDONS" runOnUp="false">
     SVUIFarmingMode()
   </Binding>
-  <Binding name="ArchaeologyMode" description="Archaeology Mode" header="SVUILABORER" runOnUp="false">
+  <Binding name="SVUILABORER_ARCH" category="ADDONS" runOnUp="false">
     SVUIArchaeologyMode()
   </Binding>
-  <Binding name="CookingMode" description="Cooking Mode" header="SVUILABORER" runOnUp="false">
+  <Binding name="SVUILABORER_COOK" category="ADDONS" runOnUp="false">
     SVUICookingMode()
   </Binding>
 </Bindings>
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI_Laborer/SVUI_Laborer.lua b/Interface/AddOns/SVUI_Laborer/SVUI_Laborer.lua
index e1b343e..1a6280b 100644
--- a/Interface/AddOns/SVUI_Laborer/SVUI_Laborer.lua
+++ b/Interface/AddOns/SVUI_Laborer/SVUI_Laborer.lua
@@ -16,7 +16,17 @@ S U P E R - V I L L A I N - U I   By: Munglunch                              #
 LOCALIZED LUA FUNCTIONS
 ##########################################################
 ]]--
+
+--[[  CONSTANTS ]]--
+
+BINDING_HEADER_SVUILABORER = "Supervillain UI: Laborer";
+BINDING_NAME_SVUILABORER_FISH = "Toggle Fishing Mode";
+BINDING_NAME_SVUILABORER_FARM = "Toggle Farming Mode";
+BINDING_NAME_SVUILABORER_COOK = "Toggle Cooking Mode";
+BINDING_NAME_SVUILABORER_ARCH = "Toggle Archaeology Mode";
+
 --[[ GLOBALS ]]--
+
 local _G = _G;
 local unpack 	= _G.unpack;
 local select 	= _G.select;
@@ -33,14 +43,16 @@ GET ADDON DATA
 ##########################################################
 ]]--
 local SVUIAddOnName, PLUGIN = ...;
-local SV, L, Registry = unpack(SVUI);
-local CONFIGS = SV.Configs
+local SV = SVUI
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local CONFIGS = SV.private
 local NewHook = hooksecurefunc;

 local playerGUID = UnitGUID('player')
 local classColor = RAID_CLASS_COLORS

-PLUGIN = SV:Prototype(SVUIAddOnName)
+PLUGIN = Registry:NewPrototype(SVUIAddOnName)
 local SCHEMA = PLUGIN.___schema;

 _G["LaborVillain"] = PLUGIN;
@@ -49,8 +61,6 @@ _G["LaborVillain"] = PLUGIN;
 GLOBAL BINDINGS
 ##########################################################
 ]]--
-BINDING_HEADER_SVUILABORER = "Supervillain UI: Laborer";
-
 function SVUIFishingMode()
 	if InCombatLockdown() then SV:AddonMessage(ERR_NOT_IN_COMBAT); return; end
 	if PLUGIN.CurrentMode and PLUGIN.CurrentMode == "Fishing" then PLUGIN:EndJobModes() else PLUGIN:SetJobMode("Fishing") end
diff --git a/Interface/AddOns/SVUI_Laborer/modes/archaeology.lua b/Interface/AddOns/SVUI_Laborer/modes/archaeology.lua
index 478bc0a..ab29d22 100644
--- a/Interface/AddOns/SVUI_Laborer/modes/archaeology.lua
+++ b/Interface/AddOns/SVUI_Laborer/modes/archaeology.lua
@@ -33,8 +33,9 @@ local min 			= math.min
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI)
-local MOD = _G.LaborVillain
+local SV = _G.SVUI;
+local L = LibLocale();
+local MOD = _G.LaborVillain;
 --[[
 ##########################################################
 LOCAL VARS
diff --git a/Interface/AddOns/SVUI_Laborer/modes/cooking.lua b/Interface/AddOns/SVUI_Laborer/modes/cooking.lua
index ed7e3c0..e1966ae 100644
--- a/Interface/AddOns/SVUI_Laborer/modes/cooking.lua
+++ b/Interface/AddOns/SVUI_Laborer/modes/cooking.lua
@@ -32,8 +32,9 @@ local floor,ceil  = math.floor, math.ceil;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI)
-local MOD = _G.LaborVillain
+local SV = _G.SVUI;
+local L = LibLocale();
+local MOD = _G.LaborVillain;
 --[[
 ##########################################################
 LOCAL VARS
diff --git a/Interface/AddOns/SVUI_Laborer/modes/farming.lua b/Interface/AddOns/SVUI_Laborer/modes/farming.lua
index 734bdc3..124a5bc 100644
--- a/Interface/AddOns/SVUI_Laborer/modes/farming.lua
+++ b/Interface/AddOns/SVUI_Laborer/modes/farming.lua
@@ -32,8 +32,9 @@ local floor,ceil  = math.floor, math.ceil;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI)
-local MOD = _G.LaborVillain
+local SV = _G.SVUI;
+local L = LibLocale();
+local MOD = _G.LaborVillain;
 --[[
 ##########################################################
 LOCAL VARS
diff --git a/Interface/AddOns/SVUI_Laborer/modes/fishing.lua b/Interface/AddOns/SVUI_Laborer/modes/fishing.lua
index cf3eaa5..37467eb 100644
--- a/Interface/AddOns/SVUI_Laborer/modes/fishing.lua
+++ b/Interface/AddOns/SVUI_Laborer/modes/fishing.lua
@@ -32,8 +32,9 @@ local floor,ceil  = math.floor, math.ceil;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI)
-local MOD = _G.LaborVillain
+local SV = _G.SVUI;
+local L = LibLocale();
+local MOD = _G.LaborVillain;
 --[[
 ##########################################################
 LOCAL VARS
diff --git a/Interface/AddOns/SVUI_LogOMatic/SVUI_LogOMatic.lua b/Interface/AddOns/SVUI_LogOMatic/SVUI_LogOMatic.lua
index ef130ef..a95dac1 100644
--- a/Interface/AddOns/SVUI_LogOMatic/SVUI_LogOMatic.lua
+++ b/Interface/AddOns/SVUI_LogOMatic/SVUI_LogOMatic.lua
@@ -38,10 +38,12 @@ GET ADDON DATA
 ##########################################################
 ]]--
 local SVUIAddOnName, PLUGIN = ...;
-local SV, L, Registry = unpack(SVUI)
+local SV = SVUI
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0")
 local NewHook = hooksecurefunc;

-PLUGIN = SV:Prototype(SVUIAddOnName)
+PLUGIN = Registry:NewPrototype(SVUIAddOnName)
 local SCHEMA = PLUGIN.___schema;

 _G["LogVillain"] = PLUGIN;
@@ -346,7 +348,7 @@ function PLUGIN:Load()
 	self:AddOption("saveChats", saveChats)
 end

-SV.Configs[SCHEMA] = {
+SV.private[SCHEMA] = {
 	["enable"] = true,
 	["saveChats"] = false
 }
diff --git a/Interface/AddOns/SVUI_StyleOMatic/SVUI_StyleOMatic.lua b/Interface/AddOns/SVUI_StyleOMatic/SVUI_StyleOMatic.lua
index 46c4143..d7118f7 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/SVUI_StyleOMatic.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/SVUI_StyleOMatic.lua
@@ -38,11 +38,13 @@ GET ADDON DATA
 ##########################################################
 ]]--
 local SVUIAddOnName, PLUGIN = ...;
-local SV, L, Registry = unpack(SVUI);
-local CONFIGS = SV.Configs
+local SV = SVUI
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");
+local CONFIGS = SV.private
 local NewHook = hooksecurefunc;

-PLUGIN = SV:Prototype(SVUIAddOnName)
+PLUGIN = Registry:NewPrototype(SVUIAddOnName)
 local SCHEMA = PLUGIN.___schema;
 local VERSION = PLUGIN.___version;

@@ -130,7 +132,7 @@ function PLUGIN:IsAddonReady(addon, ...)
 		if not IsAddOnLoaded(a) then return false end
 	end

-	local config = SV.db[SCHEMA] or SV.Configs[SCHEMA]
+	local config = SV.db[SCHEMA] or SV.private[SCHEMA]

 	return config.addons[addon]
 end
@@ -146,8 +148,8 @@ function PLUGIN:SaveAddonStyle(addon, fn, force, passive, ...)
 			self:DefineEventFunction(event, addon)
 		end
 	end
-	if(SV.Configs[SCHEMA].addons[addon] == nil) then
-		SV.Configs[SCHEMA].addons[addon] = true
+	if(SV.private[SCHEMA].addons[addon] == nil) then
+		SV.private[SCHEMA].addons[addon] = true
 	end

 	if force then
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/achievement.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/achievement.lua
index 592347a..d022cb9 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/achievement.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/achievement.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/alert.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/alert.lua
index 07e8370..f3fba4a 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/alert.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/alert.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/archeology.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/archeology.lua
index de2c73c..4beb4da 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/archeology.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/archeology.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/auctionhouse.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/auctionhouse.lua
index 3a9616b..5d811ba 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/auctionhouse.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/auctionhouse.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/barbershop.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/barbershop.lua
index 557e700..5cc87c6 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/barbershop.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/barbershop.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/battlefield.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/battlefield.lua
index f4ea85a..834e73f 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/battlefield.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/battlefield.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/blackmarket.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/blackmarket.lua
index 9305856..5904ef5 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/blackmarket.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/blackmarket.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/calendar.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/calendar.lua
index 45ea3b0..f65006b 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/calendar.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/calendar.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/challenges.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/challenges.lua
index ff6b263..0afbba8 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/challenges.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/challenges.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/character.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/character.lua
index 860af88..f6ccd88 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/character.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/character.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/chat.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/chat.lua
index 0a14906..114d33b 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/chat.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/chat.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/dressup.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/dressup.lua
index 460db5d..3d65d8c 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/dressup.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/dressup.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/encounterjournal.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/encounterjournal.lua
index ff0fdd7..d3ab5f5 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/encounterjournal.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/encounterjournal.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/friends.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/friends.lua
index f923df6..358192b 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/friends.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/friends.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/gossip.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/gossip.lua
index 3a4485f..1d06bdb 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/gossip.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/gossip.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/guild.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/guild.lua
index a2655f2..c85f985 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/guild.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/guild.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/help.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/help.lua
index cc98a24..4f026e9 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/help.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/help.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/inspect.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/inspect.lua
index 7c03ee4..1b4c06b 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/inspect.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/inspect.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/itemsocketing.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/itemsocketing.lua
index 54bcc19..4811c79 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/itemsocketing.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/itemsocketing.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/itemupgrade.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/itemupgrade.lua
index ebb78de..2fceea7 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/itemupgrade.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/itemupgrade.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/keybinding.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/keybinding.lua
index e664fdb..f1ceab5 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/keybinding.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/keybinding.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/lfd.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/lfd.lua
index eee4b67..e288acd 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/lfd.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/lfd.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/loothistory.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/loothistory.lua
index cd54324..b194a26 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/loothistory.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/loothistory.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/lossofcontrol.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/lossofcontrol.lua
index 17d99f3..2dd0ada 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/lossofcontrol.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/lossofcontrol.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/macro.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/macro.lua
index 4c4feb2..0ecbfc3 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/macro.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/macro.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/mailbox.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/mailbox.lua
index 4189fbd..6478e3f 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/mailbox.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/mailbox.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/merchant.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/merchant.lua
index 518b12f..f5b7d0a 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/merchant.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/merchant.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/petbattle.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/petbattle.lua
index f3cf0fa..47a2769 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/petbattle.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/petbattle.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
@@ -25,15 +26,15 @@ local PBAB_HEIGHT = 72;
 local PetBattleActionBar = CreateFrame("Frame", "SVUI_PetBattleActionBar", UIParent)

 local function PetBattleButtonHelper(frame)
+	frame:SetPanelTemplate("Blackout")
 	frame:SetNormalTexture("")
 	frame.Icon:SetTexCoord(0.1, 0.9, 0.1, 0.9)
 	frame.Icon:SetDrawLayer('BORDER')
-	frame.checked = true;
-	frame:SetSlotTemplate(true, 1, nil, nil, true)
 	frame.Icon:SetParent(frame.Panel)
-	frame.SelectedHighlight:SetAlpha(0)
-	frame.pushed:FillInner(frame.Panel)
-	frame.hover:FillInner(frame.Panel)
+	if(frame.SelectedHighlight) then frame.SelectedHighlight:SetAlpha(0) end
+	if(frame.checked) then frame.checked = true end
+	if(frame.pushed) then frame.pushed:FillInner(frame.Panel) end
+	if(frame.hover) then frame.hover:FillInner(frame.Panel) end
 	frame:SetFrameStrata('LOW')
 end
 --[[
@@ -185,18 +186,22 @@ local function PetBattleStyle()

 	BottomFrame:RemoveTextures()
 	BottomFrame.TurnTimer:RemoveTextures()
+
+	BottomFrame.TurnTimer.SkipButton:ClearAllPoints()
 	BottomFrame.TurnTimer.SkipButton:SetParent(PetBattleActionBar)
-	BottomFrame.TurnTimer.SkipButton:SetButtonTemplate()
 	BottomFrame.TurnTimer.SkipButton:Size((PBAB_WIDTH * 0.2) - 4, 18)
-	BottomFrame.TurnTimer.SkipButton:ClearAllPoints()
 	BottomFrame.TurnTimer.SkipButton:SetPoint("BOTTOMLEFT", PetBattleActionBar.Panel, "TOPLEFT", 2, 2)
+	BottomFrame.TurnTimer.SkipButton:SetButtonTemplate()
+
 	BottomFrame.TurnTimer:Size(BottomFrame.TurnTimer.SkipButton:GetWidth(), BottomFrame.TurnTimer.SkipButton:GetHeight())
 	BottomFrame.TurnTimer:ClearAllPoints()
 	BottomFrame.TurnTimer:SetPoint("TOP", SV.UIParent, "TOP", 0, -140)
 	BottomFrame.TurnTimer.TimerText:SetPoint("CENTER")
+
 	BottomFrame.FlowFrame:RemoveTextures()
 	BottomFrame.MicroButtonFrame:Die()
 	BottomFrame.Delimiter:RemoveTextures()
+
 	BottomFrame.xpBar:ClearAllPoints()
 	BottomFrame.xpBar:SetParent(PetBattleActionBar)
 	BottomFrame.xpBar:Size((PBAB_WIDTH * 0.8) - 4, 16)
@@ -325,7 +330,7 @@ local function PetBattleStyle()
 	end)

 	hooksecurefunc(BottomFrame.TurnTimer.SkipButton, "SetPoint", function(self, arg1, _, arg2, arg3, arg4)
-		if (arg1 ~= "BOTTOM" or arg2 ~= "TOP" or arg3 ~= 0 or arg4 ~= -1) then
+		if (arg1 ~= "BOTTOMLEFT" or arg2 ~= "TOPLEFT" or arg3 ~= 2 or arg4 ~= 2) then
 			self:ClearAllPoints()
 			self:SetPoint("BOTTOMLEFT", PetBattleActionBar.Panel, "TOPLEFT", 2, 2)
 		end
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/petition.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/petition.lua
index 5f58559..e027b45 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/petition.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/petition.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/petjournal.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/petjournal.lua
index 817957a..0cd1609 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/petjournal.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/petjournal.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/petstable.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/petstable.lua
index d31a85c..ab6ef17 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/petstable.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/petstable.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/pvp.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/pvp.lua
index 74c44e9..ea8accb 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/pvp.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/pvp.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/quest.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/quest.lua
index 2160d9d..fadb29a 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/quest.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/quest.lua
@@ -15,7 +15,8 @@ S U P E R - V I L L A I N - U I   By: Munglunch                              #
 credit: Elv.                      original logic from ElvUI. Adapted to SVUI #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/raid.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/raid.lua
index 92964a8..106a4b4 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/raid.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/raid.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/reforging.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/reforging.lua
index 11a31de..8854ce0 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/reforging.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/reforging.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/spellbook.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/spellbook.lua
index 2812bd9..f1a263f 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/spellbook.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/spellbook.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain
 --[[
 ##########################################################
@@ -156,23 +157,30 @@ local function AbilityButtonHelper(j)
 				end
 			end)
 		end
-		i.styled = true
-	end
-	if x then
-		x:SetTexCoord(0.1, 0.9, 0.1, 0.9)
-		x:ClearAllPoints()
-		x:SetAllPoints()
-		if not i.Panel then
-			 i:SetPanelTemplate("Inset", false, 3, 3, 3)
-		end
-	end
+		i.styled = true
+
+		if x then
+			x:SetTexCoord(0.1, 0.9, 0.1, 0.9)
+			x:ClearAllPoints()
+			x:SetAllPoints()
+			if not i.Panel then
+				 i:SetPanelTemplate("Inset", false, 3, 3, 3)
+			end
+		end
+
+		if(i.Name) then i.Name:SetFontObject(NumberFont_Outline_Large) i.Name:SetTextColor(1,1,0) end
+		if(i.InfoText) then i.InfoText:SetFontObject(NumberFont_Shadow_Small) i.InfoText:SetTextColor(0.9,0.9,0.9) end
+	end
 	i.styled = true
 end

 local function ButtonUpdateHelper(self, strip)
-	for j=1, SPELLS_PER_PAGE do
-		local i = _G["SpellButton"..j]
-		local x = _G["SpellButton"..j.."IconTexture"]
+	for j=1, SPELLS_PER_PAGE do
+		local name = "SpellButton"..j
+		local i = _G[name]
+		local x = _G[name.."IconTexture"]
+		local spellString = _G[name.."SpellName"];
+    	local subSpellString = _G[name.."SubSpellName"];
 		if not InCombatLockdown() then
 			 i:SetFrameLevel(SpellBookFrame:GetFrameLevel() + 5)
 		end
@@ -186,10 +194,10 @@ local function ButtonUpdateHelper(self, strip)
 				end
 			end
 		end
-		if _G["SpellButton"..j.."Highlight"]then
-			_G["SpellButton"..j.."Highlight"]:SetTexture(1, 1, 1, 0.3)
-			_G["SpellButton"..j.."Highlight"]:ClearAllPoints()
-			_G["SpellButton"..j.."Highlight"]:SetAllPoints(x)
+		if _G[name.."Highlight"] then
+			_G[name.."Highlight"]:SetTexture(1, 1, 1, 0.3)
+			_G[name.."Highlight"]:ClearAllPoints()
+			_G[name.."Highlight"]:SetAllPoints(x)
 		end
 		if i.shine then
 			i.shine:ClearAllPoints()
@@ -203,7 +211,9 @@ local function ButtonUpdateHelper(self, strip)
 			if not i.Panel then
 				i:SetPanelTemplate("Slot")
 			end
-		end
+		end
+		if(spellString) then spellString:SetFontObject(NumberFontNormal) spellString:SetTextColor(1,1,0) end
+		if(subSpellString) then subSpellString:SetFontObject(NumberFont_Shadow_Small) subSpellString:SetTextColor(0.9,0.9,0.9) end
 	end
 end
 --[[
@@ -262,6 +272,11 @@ local function SpellBookStyle()
 		local frameMissing = _G[("%sMissing"):format(gName)]
 		if(frame and frame.missingText) then frame.missingText:SetTextColor(0, 0, 0) end
 		if(frameMissing) then frameMissing:SetTextColor(1, 1, 0) end
+    	--frame.skillName
+    	if(frame.missingHeader) then frame.missingHeader:SetFontObject(NumberFont_Outline_Large) frame.missingHeader:SetTextColor(1,1,0) end
+    	if(frame.missingText) then frame.missingText:SetFontObject(NumberFont_Shadow_Small) frame.missingText:SetTextColor(0.9,0.9,0.9) end
+    	if(frame.rank) then frame.rank:SetFontObject(NumberFontNormal) frame.rank:SetTextColor(0.9,0.9,0.9) end
+    	if(frame.professionName) then frame.professionName:SetFontObject(NumberFont_Outline_Large) frame.professionName:SetTextColor(1,1,0) end
 	end

 	for _, gName in pairs(proButtons)do
@@ -278,6 +293,8 @@ local function SpellBookStyle()
 					button.Panel:SetAllPoints()
 				end
 			end
+			if(button.spellString) then button.spellString:SetFontObject(NumberFontNormal) button.spellString:SetTextColor(1,1,0) end
+			if(button.subSpellString) then button.subSpellString:SetFontObject(NumberFont_Shadow_Small) button.subSpellString:SetTextColor(0.9,0.9,0.9) end
 		end
 	end

diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/store.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/store.lua
index dade5fe..54f252b 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/store.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/store.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/supervillain.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/supervillain.lua
index 95cf1db..69c9e02 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/supervillain.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/supervillain.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/system.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/system.lua
index 051dc32..ce85baa 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/system.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/system.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 local ceil = math.ceil
 --[[
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/tabard.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/tabard.lua
index 38d0113..eb8d558 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/tabard.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/tabard.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/talents.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/talents.lua
index 2304091..b9c7fc5 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/talents.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/talents.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/taxi.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/taxi.lua
index 4f272b4..2c935e2 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/taxi.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/taxi.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/ACP.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/ACP.lua
index 78860fe..e91177e 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/ACP.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/ACP.lua
@@ -26,7 +26,8 @@ local pairs 	= _G.pairs;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/AdiBags.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/AdiBags.lua
index c8caaf7..e72fe0e 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/AdiBags.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/AdiBags.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Altoholic.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Altoholic.lua
index 1a47b5a..b25d7df 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Altoholic.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Altoholic.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/AtlasLoot.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/AtlasLoot.lua
index 21be45e..1752b3c 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/AtlasLoot.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/AtlasLoot.lua
@@ -26,7 +26,8 @@ local pairs 	= _G.pairs;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/AuctionLite.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/AuctionLite.lua
index 8d42a1c..82ab2c2 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/AuctionLite.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/AuctionLite.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/BigWigs.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/BigWigs.lua
index 80cee55..504ec57 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/BigWigs.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/BigWigs.lua
@@ -25,7 +25,8 @@ local select 	= _G.select;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain
 --[[
 ##########################################################
@@ -40,7 +41,7 @@ local function freestyle(bar)
 	local bg = bar:Get("bigwigs:elvui:barbg")
 	if bg then
 		bg:ClearAllPoints()
-		bg:SetParent(SVUI[1].UIParent)
+		bg:SetParent(SVUI.UIParent)
 		bg:Hide()
 		FreeBG[#FreeBG + 1] = bg
 	end
@@ -48,7 +49,7 @@ local function freestyle(bar)
 	local ibg = bar:Get("bigwigs:elvui:iconbg")
 	if ibg then
 		ibg:ClearAllPoints()
-		ibg:SetParent(SVUI[1].UIParent)
+		ibg:SetParent(SVUI.UIParent)
 		ibg:Hide()
 		FreeBG[#FreeBG + 1] = ibg
 	end
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Bugsack.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Bugsack.lua
index fff381f..c4a5fed 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Bugsack.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Bugsack.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Clique.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Clique.lua
index bcd10d4..eb578f3 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Clique.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Clique.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Cooline.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Cooline.lua
index 6df4ee9..330ac1f 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Cooline.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Cooline.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/DBM.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/DBM.lua
index d0cfd47..2d3d5ea 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/DBM.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/DBM.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/DXE.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/DXE.lua
index 475f69c..8b6e35f 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/DXE.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/DXE.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 local playerName = UnitName("player");
 local playerRealm = GetRealmName();
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/LightHeaded.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/LightHeaded.lua
index 2a34ea8..b468e1e 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/LightHeaded.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/LightHeaded.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Mogit.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Mogit.lua
index ec5b95b..480a472 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Mogit.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Mogit.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Omen.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Omen.lua
index 30829eb..ba75fb1 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Omen.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Omen.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Outfitter.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Outfitter.lua
index ab94eb7..68b7416 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Outfitter.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Outfitter.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Postal.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Postal.lua
index 045b077..7b986be 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Postal.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Postal.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Quartz.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Quartz.lua
index 3e13c86..40001ad 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Quartz.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Quartz.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Recount.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Recount.lua
index b699629..66a07f6 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Recount.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Recount.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/SexyCooldown.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/SexyCooldown.lua
index b1b6831..7cb9125 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/SexyCooldown.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/SexyCooldown.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Skada.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Skada.lua
index 0d8b30b..9120889 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Skada.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/Skada.lua
@@ -30,7 +30,8 @@ local twipe = table.wipe;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 local activePanels = {};
 --[[
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/TinyDPS.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/TinyDPS.lua
index 1ffb15a..151e4f2 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/TinyDPS.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/TinyDPS.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/TomTom.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/TomTom.lua
index 48a73e4..690e0ef 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/TomTom.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/TomTom.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/TradeSkillDW.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/TradeSkillDW.lua
index 518e5d9..f41d2c6 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/TradeSkillDW.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/TradeSkillDW.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/VEM.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/VEM.lua
index 725366a..4f0acdc 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/VEM.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/VEM.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/alDamageMeter.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/alDamageMeter.lua
index 081e283..75f73c1 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/alDamageMeter.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/thirdparty/alDamageMeter.lua
@@ -29,7 +29,8 @@ local format = string.format;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/timemanager.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/timemanager.lua
index d4d94f8..b7ca7e0 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/timemanager.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/timemanager.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/trade.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/trade.lua
index ef59323..e6b5019 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/trade.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/trade.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/tradeskill.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/tradeskill.lua
index 960e48e..1c339f4 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/tradeskill.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/tradeskill.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/trainer.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/trainer.lua
index 13ec18b..f0f264d 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/trainer.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/trainer.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/transmog.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/transmog.lua
index 29a4d19..6e6b602 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/transmog.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/transmog.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/voidstorage.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/voidstorage.lua
index a49dc10..909a377 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/voidstorage.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/voidstorage.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/worldmap.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/worldmap.lua
index 3f47f77..e96e03e 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/worldmap.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/worldmap.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/worldstate.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/worldstate.lua
index 65f512f..d4f2c44 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/worldstate.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/worldstate.lua
@@ -13,7 +13,8 @@ _____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
 S U P E R - V I L L A I N - U I   By: Munglunch                              #
 ##############################################################################
 --]]
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI_StyleOMatic/common/methods.lua b/Interface/AddOns/SVUI_StyleOMatic/common/methods.lua
index 5d2d83e..4ef8230 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/common/methods.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/common/methods.lua
@@ -35,8 +35,10 @@ local twipe = table.wipe;
 GET ADDON DATA
 ##########################################################
 ]]--
-local SV, L = unpack(SVUI);
+local SV = _G.SVUI;
+local L = LibLocale();
 local STYLE = _G.StyleVillain;
+local LSM = LibStub("LibSharedMedia-3.0")
 local NewHook = hooksecurefunc;
 --[[
 ##########################################################
@@ -190,7 +192,7 @@ function STYLE:ApplyItemButtonStyle(frame, adjust, shrink, noScript)
 		if(countObject) then
 			countObject:SetParent(frame.Riser)
 			countObject:SetAllPoints(frame.Riser)
-			countObject:SetFont(SV.Shared:Fetch("font", SV.db.media.fonts.number), SV.db.media.fonts.size, "OUTLINE")
+			countObject:SetFont(LSM:Fetch("font", SV.db.media.fonts.number), SV.db.media.fonts.size, "OUTLINE")
 			countObject:SetDrawLayer("ARTWORK", 7)
 		end

@@ -200,7 +202,7 @@ function STYLE:ApplyItemButtonStyle(frame, adjust, shrink, noScript)

 		if(levelObject) then
 			levelObject:SetParent(frame.Riser)
-			levelObject:SetFont(SV.Shared:Fetch("font", SV.db.media.fonts.number), SV.db.media.fonts.size, "OUTLINE")
+			levelObject:SetFont(LSM:Fetch("font", SV.db.media.fonts.number), SV.db.media.fonts.size, "OUTLINE")
 			levelObject:SetDrawLayer("ARTWORK", 7)
 		end

diff --git a/Interface/AddOns/SVUI_TrackingDevice/SVUI_TrackingDevice.lua b/Interface/AddOns/SVUI_TrackingDevice/SVUI_TrackingDevice.lua
index 0db6c34..48770b2 100644
--- a/Interface/AddOns/SVUI_TrackingDevice/SVUI_TrackingDevice.lua
+++ b/Interface/AddOns/SVUI_TrackingDevice/SVUI_TrackingDevice.lua
@@ -48,9 +48,11 @@ GET ADDON DATA
 ##########################################################
 ]]--
 local SVUIAddOnName, PLUGIN = ...;
-local SV, L, Registry = unpack(SVUI);
+local SV = SVUI
+local L = LibLocale()
+local Registry = LibStub("LibSystemRegistry-1.0");

-PLUGIN = SV:Prototype(SVUIAddOnName)
+PLUGIN = Registry:NewPrototype(SVUIAddOnName)

 _G["TrackingVillain"] = PLUGIN;
 --[[
@@ -60,7 +62,7 @@ LOCALS AND BINDING
 ]]--
 BINDING_HEADER_SVUITRACK = "Supervillain UI: Tracking Device";

-local CONFIGS = SV.Configs
+local CONFIGS = SV.private
 local NewHook = hooksecurefunc;
 local playerGUID = UnitGUID('player')
 local classColor = RAID_CLASS_COLORS
diff --git a/Interface/AddOns/SVUI_TrackingDevice/SVUI_TrackingDevice.toc b/Interface/AddOns/SVUI_TrackingDevice/SVUI_TrackingDevice.toc
index 59e0b25..06a59d6 100644
--- a/Interface/AddOns/SVUI_TrackingDevice/SVUI_TrackingDevice.toc
+++ b/Interface/AddOns/SVUI_TrackingDevice/SVUI_TrackingDevice.toc
@@ -1,6 +1,6 @@
 ## Interface: 50400
 ## Author: Munglunch
-## Version: 4.084
+## Version: 4.4
 ## Title: |cffFF9900SVUI |r|cffFFEF00Tracking Device|r
 ## Notes: Supervillain UI [|cff9911FFRaid & Party Member Tracking|r].
 ## RequiredDeps: SVUI
diff --git a/Interface/SPELLBOOK/Professions-Book-Left.blp b/Interface/SPELLBOOK/Professions-Book-Left.blp
index d6496a0..baa7515 100644
Binary files a/Interface/SPELLBOOK/Professions-Book-Left.blp and b/Interface/SPELLBOOK/Professions-Book-Left.blp differ
diff --git a/Interface/SPELLBOOK/Professions-Book-Right.blp b/Interface/SPELLBOOK/Professions-Book-Right.blp
index e499938..6b82b3b 100644
Binary files a/Interface/SPELLBOOK/Professions-Book-Right.blp and b/Interface/SPELLBOOK/Professions-Book-Right.blp differ
diff --git a/Interface/SPELLBOOK/Spellbook-Page-1.blp b/Interface/SPELLBOOK/Spellbook-Page-1.blp
index c96119d..96f0473 100644
Binary files a/Interface/SPELLBOOK/Spellbook-Page-1.blp and b/Interface/SPELLBOOK/Spellbook-Page-1.blp differ
diff --git a/Interface/SPELLBOOK/Spellbook-Page-2.blp b/Interface/SPELLBOOK/Spellbook-Page-2.blp
index 97ee489..131cbf0 100644
Binary files a/Interface/SPELLBOOK/Spellbook-Page-2.blp and b/Interface/SPELLBOOK/Spellbook-Page-2.blp differ