Quantcast

update to 4.5.8

Steven Jackson [09-26-14 - 23:59]
update to 4.5.8
Filename
Interface/AddOns/SVUI/SVUI.lua
Interface/AddOns/SVUI/SVUI.xml
Interface/AddOns/SVUI/libs/LibSuperVillain-1.0/LibSuperVillain-1.0.lua
Interface/AddOns/SVUI/packages/actionbar/SVBar.lua
Interface/AddOns/SVUI/packages/aura/SVAura.lua
Interface/AddOns/SVUI/packages/bag/SVBag.lua
Interface/AddOns/SVUI/packages/dock/SVDock.lua
Interface/AddOns/SVUI/packages/map/SVMap.lua
Interface/AddOns/SVUI/packages/override/SVOverride.lua
Interface/AddOns/SVUI/packages/tip/SVTip.lua
Interface/AddOns/SVUI/packages/unit/elements/castbar.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/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/scripts/misc.lua
Interface/AddOns/SVUI/scripts/questwatch.lua
Interface/AddOns/SVUI/scripts/spellbind.lua
Interface/AddOns/SVUI/system/animate.lua
Interface/AddOns/SVUI/system/load.lua
Interface/AddOns/SVUI/system/mentalo.lua
Interface/AddOns/SVUI/system/mentalo.xml
Interface/AddOns/SVUI/system/moveable.lua
Interface/AddOns/SVUI/system/setup.lua
Interface/AddOns/SVUI/system/slash.lua
Interface/AddOns/SVUI_ArtOfWar/SVUI_ArtOfWar.lua
Interface/AddOns/SVUI_ConfigOMatic/SVUI_ConfigOMatic.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/bar.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/profiles.lua
Interface/AddOns/SVUI_ConfigOMatic/modules/units/focus.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/modes/farming.lua
Interface/AddOns/SVUI_StyleOMatic/SVUI_StyleOMatic.lua
Interface/AddOns/SVUI_StyleOMatic/addons/archeology.lua
Interface/AddOns/SVUI_StyleOMatic/addons/encounterjournal.lua
Interface/AddOns/SVUI_StyleOMatic/addons/spellbook.lua
Interface/AddOns/SVUI_StyleOMatic/addons/supervillain.lua
Interface/AddOns/SVUI_StyleOMatic/addons/talents.lua
Interface/AddOns/SVUI_StyleOMatic/common/methods.lua
diff --git a/Interface/AddOns/SVUI/SVUI.lua b/Interface/AddOns/SVUI/SVUI.lua
index 262b6c3..d37988e 100644
--- a/Interface/AddOns/SVUI/SVUI.lua
+++ b/Interface/AddOns/SVUI/SVUI.lua
@@ -262,7 +262,6 @@ end
 -- has no method for parsing them in LUA.
 local SVUI = SVLib:NewCore("SVUI_Global", "SVUI_Profile", "SVUI_Cache")

-SVUI.Snap               = {}
 SVUI.Media              = {}
 SVUI.DisplayAudit       = {}
 SVUI.DynamicOptions     = {}
@@ -294,7 +293,6 @@ SVUI.UIParent = CreateFrame("Frame", "SVUIParent", UIParent);
 SVUI.UIParent:SetFrameLevel(UIParent:GetFrameLevel());
 SVUI.UIParent:SetPoint("CENTER", UIParent, "CENTER");
 SVUI.UIParent:SetSize(UIParent:GetSize());
-SVUI.Snap[1] = SVUI.UIParent;

 SVUI.Cloaked = CreateFrame("Frame", nil, UIParent);
 SVUI.Cloaked:Hide();
diff --git a/Interface/AddOns/SVUI/SVUI.xml b/Interface/AddOns/SVUI/SVUI.xml
index e328db9..603ab4b 100644
--- a/Interface/AddOns/SVUI/SVUI.xml
+++ b/Interface/AddOns/SVUI/SVUI.xml
@@ -26,6 +26,7 @@
     <Script file="system\timers.lua"/>
     <Script file="system\slash.lua"/>
     <Script file="system\alerts.lua"/>
+    <Script file="system\moveable.lua"/>
     <Include file="system\mentalo.xml"/>
     <Script file="system\setup.lua"/>

diff --git a/Interface/AddOns/SVUI/libs/LibSuperVillain-1.0/LibSuperVillain-1.0.lua b/Interface/AddOns/SVUI/libs/LibSuperVillain-1.0/LibSuperVillain-1.0.lua
index e0f235d..a6fca35 100644
--- a/Interface/AddOns/SVUI/libs/LibSuperVillain-1.0/LibSuperVillain-1.0.lua
+++ b/Interface/AddOns/SVUI/libs/LibSuperVillain-1.0/LibSuperVillain-1.0.lua
@@ -359,21 +359,21 @@ local function removedefaults(db, src, nometa)
     end
 end

-local function setDefault(t, sub, sub2)
-    local data = t.db
+local ResetToDefaults = function(self, sub, sub2)
+    local data = self.db
     local sv = rawget(data, "data")
     local src = rawget(data, "defaults")
-    local savedProfile
+    local targetData
     if(sub2 and sv and sv[sub]) then
-        savedProfile = sv[sub][sub2]
+        targetData = sv[sub][sub2]
     elseif(sub and sv) then
-        savedProfile = sv[sub]
+        targetData = sv[sub]
     else
-        savedProfile = sv
+        targetData = sv
     end
-    if(savedProfile) then
-        for k,v in pairs(savedProfile) do
-            savedProfile[k] = nil
+    if(targetData) then
+        for k,v in pairs(targetData) do
+            targetData[k] = nil
         end
     else
         sv = {}
@@ -411,7 +411,6 @@ function lib:Remove(key)
     for k,v in pairs(GLOBAL_SV.profiles) do
         GLOBAL_SV.profileKeys[k] = k
     end
-    collectgarbage("collect")
 end

 function lib:GetProfiles()
@@ -467,6 +466,18 @@ function lib:WipeDatabase()
     end
 end

+function lib:WipeCache()
+    for k,v in pairs(CACHE_SV) do
+        CACHE_SV[k] = nil
+    end
+end
+
+function lib:WipeGlobal()
+    for k,v in pairs(GLOBAL_SV) do
+        GLOBAL_SV[k] = nil
+    end
+end
+
 function lib:UpdateDatabase(event)
     if event == "PLAYER_LOGOUT" then
         local sv = rawget(CoreObject.db, "data")
@@ -499,19 +510,15 @@ function lib:UpdateDatabase(event)
 end

 function lib:GetSafeData(index)
-    return PROFILE_SV.SAFEDATA[index]
+    if(index) then
+        return PROFILE_SV.SAFEDATA[index]
+    else
+        return PROFILE_SV.SAFEDATA
+    end
 end

 function lib:SaveSafeData(index, value)
     PROFILE_SV.SAFEDATA[index] = value
-    if(index == "dualSpecEnabled") then
-        if(value) then
-            self.EventManager:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED")
-            self:UpdateDatabase()
-        else
-            self.EventManager:UnregisterEvent("ACTIVE_TALENT_GROUP_CHANGED")
-        end
-    end
 end

 function lib:CheckData(schema, key)
@@ -524,7 +531,6 @@ end
 function lib:NewDatabase(obj)
     local schema = obj.Schema
     obj.db = CoreObject.db[schema] or {}
-    obj.ResetData = setDefault
 end

 function lib:NewCache(index)
@@ -813,9 +819,9 @@ function lib:RunCallbacks()
     end
 end

-function lib:Update(schema, dataOnly)
+function lib:Update(schema)
     local obj = CoreObject[schema]
-    if obj and obj.ReLoad and not dataOnly then
+    if obj and obj.ReLoad then
         obj:ReLoad()
     end
 end
@@ -858,6 +864,19 @@ function lib:GetPlugins()
     return PluginString
 end

+function lib:CheckDualProfile()
+    return PROFILE_SV.SAFEDATA.dualSpecEnabled
+end
+
+function lib:ToggleDualProfile(enabled)
+    PROFILE_SV.SAFEDATA.dualSpecEnabled = enabled
+    if(enabled) then
+        self.EventManager:RegisterEvent("ACTIVE_TALENT_GROUP_CHANGED")
+        self:UpdateDatabase()
+    else
+        self.EventManager:UnregisterEvent("ACTIVE_TALENT_GROUP_CHANGED")
+    end
+end

 --[[ CONSTRUCTORS ]]--

@@ -1040,7 +1059,7 @@ function lib:Initialize()
     db.data     = PROFILE_SV.STORED[SOURCE_KEY]
     db.defaults = CoreObject.configs

-    CoreObject.ResetData = setDefault
+    CoreObject.ResetData = ResetToDefaults
     CoreObject.db = db

     --check for LOD plugins
diff --git a/Interface/AddOns/SVUI/packages/actionbar/SVBar.lua b/Interface/AddOns/SVUI/packages/actionbar/SVBar.lua
index 2b8871d..61e07c7 100644
--- a/Interface/AddOns/SVUI/packages/actionbar/SVBar.lua
+++ b/Interface/AddOns/SVUI/packages/actionbar/SVBar.lua
@@ -848,7 +848,7 @@ do
 				bar:Hide()
 				UnregisterStateDriver(bar, "visibility")
 			end
-			SV:SetSnapOffset(("SVUI_Action%d_MOVE"):format(id), (space  /  2))
+			SV.Mentalo:ChangeSnapOffset(("SVUI_Action%d_MOVE"):format(id), (space  /  2))
 		end
 	end
 end
@@ -1039,7 +1039,7 @@ CreateActionBars = function(self)
 		]])

 		self:RefreshBar(barID)
-		SV:SetSVMovable(thisBar, L[barID], nil, nil, nil, "ALL, ACTIONBARS")
+		SV.Mentalo:Add(thisBar, L[barID], nil, nil, nil, "ALL, ACTIONBARS")
 	end
 end

@@ -1191,7 +1191,7 @@ do
 	  self:RegisterEvent("UPDATE_SHAPESHIFT_FORM", SetStanceBarButtons)
 	  self:RegisterEvent("ACTIONBAR_PAGE_CHANGED", SetStanceBarButtons)
 	  UpdateShapeshiftForms()
-	  SV:SetSVMovable(stanceBar, L["Stance Bar"], nil, -3, nil, "ALL, ACTIONBARS")
+	  SV.Mentalo:Add(stanceBar, L["Stance Bar"], nil, -3, nil, "ALL, ACTIONBARS")
 	  self:RefreshBar("Stance")
 	  SetStanceBarButtons()
 	  self:UpdateBarBindings(false, true)
@@ -1309,7 +1309,7 @@ do
 		self:RegisterEvent("PLAYER_FARSIGHT_FOCUS_CHANGED", RefreshPet)
 		self:RegisterEvent("PET_BAR_UPDATE_COOLDOWN", PetActionBar_UpdateCooldowns)

-		SV:SetSVMovable(petBar, L["Pet Bar"], nil, nil, nil, "ALL, ACTIONBARS")
+		SV.Mentalo:Add(petBar, L["Pet Bar"], nil, nil, nil, "ALL, ACTIONBARS")
 	end
 end

@@ -1378,7 +1378,7 @@ CreateMicroBar = function(self)
 	SVUIMicroButtonsParent(microBar)
 	SVUIMicroButton_SetNormal()

-	SV:SetSVMovable(microBar, L["Micro Bar"])
+	SV.Mentalo:Add(microBar, L["Micro Bar"])

 	RefreshMicrobar()

@@ -1426,7 +1426,7 @@ local CreateExtraBar = function(self)
 	if HasExtraActionBar()then
 		ExtraActionBarFrame:Show()
 	end
-	SV:SetSVMovable(specialBar, L["Boss Button"], nil, nil, nil, "ALL, ACTIONBAR")
+	SV.Mentalo:Add(specialBar, L["Boss Button"], nil, nil, nil, "ALL, ACTIONBAR")
 end
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/aura/SVAura.lua b/Interface/AddOns/SVUI/packages/aura/SVAura.lua
index b5da832..bcd22d2 100644
--- a/Interface/AddOns/SVUI/packages/aura/SVAura.lua
+++ b/Interface/AddOns/SVUI/packages/aura/SVAura.lua
@@ -594,7 +594,7 @@ function MOD:Load()

 	self:Update_ConsolidatedBuffsSettings()

-	SV:SetSVMovable(auras, L["Auras Frame"])
+	SV.Mentalo:Add(auras, L["Auras Frame"])
 end
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/bag/SVBag.lua b/Interface/AddOns/SVUI/packages/bag/SVBag.lua
index 236ccfd..81af5ec 100644
--- a/Interface/AddOns/SVUI/packages/bag/SVBag.lua
+++ b/Interface/AddOns/SVUI/packages/bag/SVBag.lua
@@ -694,7 +694,7 @@ do

 	    if not SVUI_BagBar_MOVE then
 	    	SVUI_BagBar:SetPanelTemplate("Default")
-	        SV:SetSVMovable(SVUI_BagBar, L["Bags Bar"])
+	        SV.Mentalo:Add(SVUI_BagBar, L["Bags Bar"])
 	    end

 	    if self.db.bagBar.showBackdrop then
diff --git a/Interface/AddOns/SVUI/packages/dock/SVDock.lua b/Interface/AddOns/SVUI/packages/dock/SVDock.lua
index eb4e1fe..6555e17 100644
--- a/Interface/AddOns/SVUI/packages/dock/SVDock.lua
+++ b/Interface/AddOns/SVUI/packages/dock/SVDock.lua
@@ -114,12 +114,12 @@ end

 local ToggleDocks = function(self)
 	GameTooltip:Hide()
-	if SVUI_Cache.Docks.SuperDockFaded then
-		SVUI_Cache.Docks.SuperDockFaded = nil;
+	if MOD.Cache.SuperDockFaded then
+		MOD.Cache.SuperDockFaded = nil;
 		SV:SecureFadeIn(LeftSuperDock, 0.2, LeftSuperDock:GetAlpha(), 1)
 		SV:SecureFadeIn(RightSuperDock, 0.2, RightSuperDock:GetAlpha(), 1)
 	else
-		SVUI_Cache.Docks.SuperDockFaded = true;
+		MOD.Cache.SuperDockFaded = true;
 		SV:SecureFadeOut(LeftSuperDock, 0.2, LeftSuperDock:GetAlpha(), 0, true)
 		SV:SecureFadeOut(RightSuperDock, 0.2, RightSuperDock:GetAlpha(), 0, true)
 	end
@@ -156,7 +156,7 @@ local DockButtonDeactivate = function(self)
 end

 local DockletButton_OnEnter = function(self, ...)
-	if SVUI_Cache.Docks.SuperDockFaded then
+	if MOD.Cache.SuperDockFaded then
 		LeftSuperDock:Show()
 		SV:SecureFadeIn(LeftSuperDock, 0.2, LeftSuperDock:GetAlpha(), 1)
 		RightSuperDock:Show()
@@ -177,7 +177,7 @@ local DockletButton_OnEnter = function(self, ...)
 end

 local DockletButton_OnLeave = function(self, ...)
-	if SVUI_Cache.Docks.SuperDockFaded then
+	if MOD.Cache.SuperDockFaded then
 		SV:SecureFadeOut(LeftSuperDock, 0.2, LeftSuperDock:GetAlpha(), 0, true)
 		SV:SecureFadeOut(RightSuperDock, 0.2, RightSuperDock:GetAlpha(), 0, true)
 	end
@@ -469,7 +469,7 @@ function MOD:CreateDockPanels()
 	leftdock:SetFrameStrata("BACKGROUND")
 	leftdock:Point("BOTTOMLEFT", SV.UIParent, "BOTTOMLEFT", 1, buttonsize + 10)
 	leftdock:Size(leftWidth, leftHeight)
-	SV:SetSVMovable(leftdock, L["Left Dock"])
+	SV.Mentalo:Add(leftdock, L["Left Dock"])

 	leftalert:SetParent(leftdock)
 	leftalert:SetFrameStrata("BACKGROUND")
@@ -513,7 +513,7 @@ function MOD:CreateDockPanels()
 	rightdock:SetFrameStrata("BACKGROUND")
 	rightdock:Point("BOTTOMRIGHT", SV.UIParent, "BOTTOMRIGHT", -1, buttonsize + 10)
 	rightdock:Size(rightWidth, rightHeight)
-	SV:SetSVMovable(rightdock, L["Right Dock"])
+	SV.Mentalo:Add(rightdock, L["Right Dock"])

 	rightalert:SetParent(rightdock)
 	rightalert:SetFrameStrata("BACKGROUND")
@@ -529,7 +529,7 @@ function MOD:CreateDockPanels()
 	rightwindow:Size(rightWidth, rightHeight)
 	rightdock.backdrop = SetSuperDockStyle(rightwindow)

-	if SVUI_Cache.Docks.SuperDockFaded then LeftSuperDock:Hide() RightSuperDock:Hide() end
+	if self.Cache.SuperDockFaded then LeftSuperDock:Hide() RightSuperDock:Hide() end

 	local toolbarTop = CreateFrame("Frame", "SuperDockToolBarTop", SV.UIParent)
 	toolbarTop:Point("TOPLEFT", SV.UIParent, "TOPLEFT", 2, -4)
@@ -958,8 +958,10 @@ function MOD:ReLoad()
 end

 function MOD:Load()
-	SVUI_Cache = SVUI_Cache or {}
-	SVUI_Cache.Docks = SVUI_Cache.Docks or { SuperDockFaded = false }
+	self.Cache = SVLib:NewCache("Docks")
+	if(not self.Cache.SuperDockFaded) then
+		self.Cache.SuperDockFaded = false
+	end
 	self:CreateSuperBorders()
 	self:CreateDockPanels()
 	local width = RightSuperDock:GetWidth();
diff --git a/Interface/AddOns/SVUI/packages/map/SVMap.lua b/Interface/AddOns/SVUI/packages/map/SVMap.lua
index 547b5b1..6be534a 100644
--- a/Interface/AddOns/SVUI/packages/map/SVMap.lua
+++ b/Interface/AddOns/SVUI/packages/map/SVMap.lua
@@ -632,7 +632,7 @@ function MOD:RefreshMiniMap()

 	if SVUI_AurasAnchor then
 		SVUI_AurasAnchor:Height(MM_HEIGHT)
-		if SVUI_AurasAnchor_MOVE and not SV:TestMovableMoved('SVUI_AurasAnchor_MOVE') and not SV:TestMovableMoved('SVUI_MinimapFrame_MOVE') then
+		if SVUI_AurasAnchor_MOVE and not SV.Mentalo:HasMoved('SVUI_AurasAnchor_MOVE') and not SV.Mentalo:HasMoved('SVUI_MinimapFrame_MOVE') then
 			SVUI_AurasAnchor_MOVE:ClearAllPoints()
 			SVUI_AurasAnchor_MOVE:Point("TOPRIGHT", SVUI_MinimapFrame_MOVE, "TOPLEFT", -8, 0)
 		end
@@ -872,9 +872,7 @@ function MOD:Load()
 		PetJournalParent:SetAttribute("UIPanelLayout-"..name, value);
 	end
 	PetJournalParent:SetAttribute("UIPanelLayout-defined", true);
-	SV:SetSVMovable(mapHolder, L["Minimap"])
-
-	setfenv(WorldMapFrame_OnShow, setmetatable({ UpdateMicroButtons = SV.fubar }, { __index = _G }))
+	SV.Mentalo:Add(mapHolder, L["Minimap"])

 	if(SV.GameVersion < 60000) then
 		WorldMapShowDropDown:Point('BOTTOMRIGHT',WorldMapPositioningGuide,'BOTTOMRIGHT',-2,-4)
@@ -884,13 +882,15 @@ function MOD:Load()
 		WorldMapZoneDropDownButton:HookScript('OnClick', _hook_WorldMapZoneDropDownButton_OnClick)
 	end

-	WorldMapFrame:SetParent(SV.UIParent)
-	WorldMapFrame:SetFrameLevel(4)
-	WorldMapFrame:SetFrameStrata('HIGH')
-	WorldMapDetailFrame:SetFrameLevel(6)
-
-	WorldMapFrame:HookScript('OnShow', _hook_WorldMapFrame_OnShow)
-	WorldMapFrame:HookScript('OnHide', _hook_WorldMapFrame_OnHide)
+	if(self.db.tinyWorldMap) then
+		setfenv(WorldMapFrame_OnShow, setmetatable({ UpdateMicroButtons = SV.fubar }, { __index = _G }))
+		WorldMapFrame:SetParent(SV.UIParent)
+		WorldMapFrame:SetFrameLevel(4)
+		WorldMapFrame:SetFrameStrata('HIGH')
+		WorldMapDetailFrame:SetFrameLevel(6)
+		WorldMapFrame:HookScript('OnShow', _hook_WorldMapFrame_OnShow)
+		WorldMapFrame:HookScript('OnHide', _hook_WorldMapFrame_OnHide)
+	end

 	local CoordsHolder = CreateFrame('Frame', 'SVUI_WorldMapCoords', WorldMapFrame)
 	CoordsHolder:SetFrameLevel(WorldMapDetailFrame:GetFrameLevel()+1)
@@ -973,7 +973,7 @@ function MOD:Load()
 		MMBBar:SetPoint("CENTER", MMBHolder, "CENTER", 0, 0)
 		MMBBar:SetScript("OnEnter", MMB_OnEnter)
 		MMBBar:SetScript("OnLeave", MMB_OnLeave)
-		SV:SetSVMovable(MMBHolder, L["Minimap Button Bar"])
+		SV.Mentalo:Add(MMBHolder, L["Minimap Button Bar"])
 		self:UpdateMinimapButtonSettings()
 	end

diff --git a/Interface/AddOns/SVUI/packages/override/SVOverride.lua b/Interface/AddOns/SVUI/packages/override/SVOverride.lua
index 5872aa5..0b27674 100644
--- a/Interface/AddOns/SVUI/packages/override/SVOverride.lua
+++ b/Interface/AddOns/SVUI/packages/override/SVOverride.lua
@@ -142,7 +142,7 @@ local Vehicle_OnSetPoint = function(self,_,parent)
 			VehicleSeatIndicator:Point("BOTTOM", VehicleSeatIndicator_MOVE, "BOTTOM", 0, 0)
 		else
 			VehicleSeatIndicator:Point("TOPLEFT", SV.UIParent, "TOPLEFT", 22, -45)
-			SV:SetSVMovable(VehicleSeatIndicator, L["Vehicle Seat Frame"])
+			SV.Mentalo:Add(VehicleSeatIndicator, L["Vehicle Seat Frame"])
 		end
 		VehicleSeatIndicator:SetScale(0.8)
 	end
@@ -1020,7 +1020,7 @@ function MOD:Load()

 	TicketStatusFrame:ClearAllPoints()
 	TicketStatusFrame:SetPoint("TOPLEFT", SV.UIParent, "TOPLEFT", 250, -5)
-	SV:SetSVMovable(TicketStatusFrame, L["GM Ticket Frame"], nil, nil, nil, nil, "GM")
+	SV.Mentalo:Add(TicketStatusFrame, L["GM Ticket Frame"], nil, nil, nil, nil, "GM")
 	HelpOpenTicketButton:SetParent(Minimap)
 	HelpOpenTicketButton:ClearAllPoints()
 	HelpOpenTicketButton:SetPoint("TOPRIGHT", Minimap, "TOPRIGHT")
@@ -1036,7 +1036,7 @@ function MOD:Load()

 	SVUI_AlertFrame:SetParent(SV.UIParent)
 	SVUI_AlertFrame:SetPoint("TOP", SV.UIParent, "TOP", 0, -18);
-	SV:SetSVMovable(SVUI_AlertFrame, L["Loot  /  Alert Frames"], nil, nil, AlertFramePostMove_Hook)
+	SV.Mentalo:Add(SVUI_AlertFrame, L["Loot  /  Alert Frames"], nil, nil, AlertFramePostMove_Hook)
 	NewHook('AlertFrame_FixAnchors', AlertFramePostMove_Hook)
 	NewHook('AlertFrame_SetLootAnchors', _hook_AlertFrame_SetLootAnchors)
 	NewHook('AlertFrame_SetLootWonAnchors', _hook_AlertFrame_SetLootWonAnchors)
@@ -1052,7 +1052,7 @@ function MOD:Load()
 	LootFrame:UnregisterAllEvents();
 	SVUI_LootFrame:SetFixedPanelTemplate('Transparent');
 	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");
+	SV.Mentalo:Add(SVUI_LootFrameHolder, L["Loot Frame"], nil, nil, nil, nil, "SVUI_LootFrame");
 	tinsert(UISpecialFrames, "SVUI_LootFrame");

 	UIParent:UnregisterEvent("LOOT_BIND_CONFIRM")
@@ -1106,7 +1106,7 @@ function MOD:Load()
  	exit:SetScript("OnEvent", BailOut_OnEvent)
  	exit:Hide()

-	SV:SetSVMovable(exit, L["Bail Out"])
+	SV.Mentalo:Add(exit, L["Bail Out"])

 	local altPower = CreateFrame("Frame", "SVUI_AltPowerBar", UIParent)
 	altPower:SetPoint("TOP", SV.UIParent, "TOP", 0, -18)
@@ -1115,15 +1115,15 @@ function MOD:Load()
 	PlayerPowerBarAlt:SetPoint("CENTER", altPower, "CENTER")
 	PlayerPowerBarAlt:SetParent(altPower)
 	PlayerPowerBarAlt.ignoreFramePositionManager = true;
-	SV:SetSVMovable(altPower, L["Alternative Power"])
+	SV.Mentalo:Add(altPower, L["Alternative Power"])

 	local wsc = CreateFrame("Frame", "SVUI_WorldStateHolder", SV.UIParent)
 	wsc:SetSize(200, 45)
 	wsc:SetPoint("TOP", SV.UIParent, "TOP", 0, -100)
-	SV:SetSVMovable(wsc, L["Capture Bars"])
+	SV.Mentalo:Add(wsc, L["Capture Bars"])
 	NewHook("UIParent_ManageFramePositions", CaptureBarHandler)

-	SV:SetSVMovable(LossOfControlFrame, L["Loss Control Icon"], nil, nil, nil, nil, "LoC")
+	SV.Mentalo:Add(LossOfControlFrame, L["Loss Control Icon"], nil, nil, nil, nil, "LoC")
 end
 --[[
 ##########################################################
diff --git a/Interface/AddOns/SVUI/packages/tip/SVTip.lua b/Interface/AddOns/SVUI/packages/tip/SVTip.lua
index bc8d31a..5e92b92 100644
--- a/Interface/AddOns/SVUI/packages/tip/SVTip.lua
+++ b/Interface/AddOns/SVUI/packages/tip/SVTip.lua
@@ -580,7 +580,7 @@ local _hook_GameTooltip_SetDefaultAnchor = function(self, parent)
 			self:SetOwner(parent, "ANCHOR_NONE")
 		end
 	end
-	if not SV:TestMovableMoved("SVUI_ToolTip_MOVE")then
+	if not SV.Mentalo:HasMoved("SVUI_ToolTip_MOVE")then
 		if(SVUI_ContainerFrame and SVUI_ContainerFrame:IsShown()) then
 			self:SetPoint("BOTTOMLEFT", SVUI_ContainerFrame, "TOPLEFT", 0, 18)
 		elseif(RightSuperDock:GetAlpha() == 1 and RightSuperDock:IsShown()) then
@@ -856,7 +856,7 @@ end

 function MOD:Load()
 	BNToastFrame:Point("TOPRIGHT", SVUI_MinimapFrame, "BOTTOMLEFT", 0, -10)
-	SV:SetSVMovable(BNToastFrame, L["BNet Frame"], nil, nil, nil, nil, "BNET")
+	SV.Mentalo:Add(BNToastFrame, L["BNet Frame"], nil, nil, nil, nil, "BNET")
 	NewHook(BNToastFrame, "SetPoint", _hook_BNToastOnShow)
 	if not self.db.enable then return end

@@ -864,7 +864,7 @@ function MOD:Load()
 	anchor:Point("BOTTOMRIGHT", RightSuperDock, "TOPRIGHT", 0, 60)
 	anchor:Size(130, 20)
 	anchor:SetFrameLevel(anchor:GetFrameLevel()  +  50)
-	SV:SetSVMovable(anchor, L["Tooltip"])
+	SV.Mentalo:Add(anchor, L["Tooltip"])

 	local barHeight = self.db.healthBar.height

diff --git a/Interface/AddOns/SVUI/packages/unit/elements/castbar.lua b/Interface/AddOns/SVUI/packages/unit/elements/castbar.lua
index 04feec8..bd4c163 100644
--- a/Interface/AddOns/SVUI/packages/unit/elements/castbar.lua
+++ b/Interface/AddOns/SVUI/packages/unit/elements/castbar.lua
@@ -697,7 +697,7 @@ function MOD:CreateCastbar(frame, reversed, moverName, ryu, useFader, isBoss)
 	castbar.SparkColor = oUF_Villain.colors.spark

 	if moverName then
-		SV:SetSVMovable(castbar.Holder, moverName, nil, -6, nil, "ALL, SOLO")
+		SV.Mentalo:Add(castbar.Holder, moverName, nil, -6, nil, "ALL, SOLO")
 	end

 	if useFader then
diff --git a/Interface/AddOns/SVUI/packages/unit/frames.lua b/Interface/AddOns/SVUI/packages/unit/frames.lua
index dad25bf..06a2194 100644
--- a/Interface/AddOns/SVUI/packages/unit/frames.lua
+++ b/Interface/AddOns/SVUI/packages/unit/frames.lua
@@ -321,7 +321,7 @@ CONSTRUCTORS["player"] = function(self, unit)
     self.AuraBars = MOD:CreateAuraBarHeader(self, key)
     self.CombatFade = true;
     self:Point("BOTTOMLEFT", SV.UIParent, "BOTTOM", -413, 182)
-    SV:SetSVMovable(self, L["Player Frame"], nil, nil, nil, "ALL, SOLO")
+    SV.Mentalo:Add(self, L["Player Frame"], nil, nil, nil, "ALL, SOLO")

     self.MediaUpdate = MOD.RefreshUnitMedia
     self.Update = UpdatePlayerFrame
@@ -437,7 +437,7 @@ CONSTRUCTORS["target"] = function(self, unit)
     self.XRay = MOD:CreateXRay(self)
     self.XRay:SetPoint("TOPRIGHT", 12, 12)
     self:Point("BOTTOMRIGHT", SV.UIParent, "BOTTOM", 413, 182)
-    SV:SetSVMovable(self, L["Target Frame"], nil, nil, nil, "ALL, SOLO")
+    SV.Mentalo:Add(self, L["Target Frame"], nil, nil, nil, "ALL, SOLO")

     self.MediaUpdate = MOD.RefreshUnitMedia
     self.Update = UpdateTargetFrame
@@ -479,7 +479,7 @@ CONSTRUCTORS["targettarget"] = function(self, unit)
     self.RaidIcon = MOD:CreateRaidIcon(self)
     self.Range = { insideAlpha = 1, outsideAlpha = 1 }
     self:Point("BOTTOM", SV.UIParent, "BOTTOM", 0, 213)
-    SV:SetSVMovable(self, L["TargetTarget Frame"], nil, nil, nil, "ALL, SOLO")
+    SV.Mentalo:Add(self, L["TargetTarget Frame"], nil, nil, nil, "ALL, SOLO")

     self.MediaUpdate = MOD.RefreshUnitMedia
     self.Update = UpdateTargetTargetFrame
@@ -530,7 +530,7 @@ CONSTRUCTORS["pet"] = function(self, unit)
     self.RaidIcon = MOD:CreateRaidIcon(self)
     self.Range = { insideAlpha = 1, outsideAlpha = 1 }
     self:Point("BOTTOM", SV.UIParent, "BOTTOM", 0, 182)
-    SV:SetSVMovable(self, L["Pet Frame"], nil, nil, nil, "ALL, SOLO")
+    SV.Mentalo:Add(self, L["Pet Frame"], nil, nil, nil, "ALL, SOLO")
     self.MediaUpdate = MOD.RefreshUnitMedia
     self.Update = UpdatePetFrame
     return self
@@ -574,7 +574,7 @@ CONSTRUCTORS["pettarget"] = function(self, unit)
     self.Debuffs = MOD:CreateDebuffs(self, key)
     self.Range = { insideAlpha = 1, outsideAlpha = 1 }
     self:Point("BOTTOM", SVUI_Pet, "TOP", 0, 7)
-    SV:SetSVMovable(self, L["PetTarget Frame"], nil, -7, nil, "ALL, SOLO")
+    SV.Mentalo:Add(self, L["PetTarget Frame"], nil, -7, nil, "ALL, SOLO")

     self.MediaUpdate = MOD.RefreshUnitMedia
     self.Update = UpdatePetTargetFrame
@@ -638,7 +638,7 @@ CONSTRUCTORS["focus"] = function(self, unit)
     self.XRay = MOD:CreateXRay_Closer(self)
     self.XRay:SetPoint("RIGHT", 20, 0)
     self:Point("BOTTOMRIGHT", SVUI_Target, "TOPRIGHT", 0, 220)
-    SV:SetSVMovable(self, L["Focus Frame"], nil, nil, nil, "ALL, SOLO")
+    SV.Mentalo:Add(self, L["Focus Frame"], nil, nil, nil, "ALL, SOLO")

     self.MediaUpdate = MOD.RefreshUnitMedia
     self.Update = UpdateFocusFrame
@@ -679,7 +679,7 @@ CONSTRUCTORS["focustarget"] = function(self, unit)
     self.RaidIcon = MOD:CreateRaidIcon(self)
     self.Range = { insideAlpha = 1, outsideAlpha = 1 }
     self:Point("BOTTOM", SVUI_Focus, "TOP", 0, 7)
-    SV:SetSVMovable(self, L["FocusTarget Frame"], nil, -7, nil, "ALL, SOLO")
+    SV.Mentalo:Add(self, L["FocusTarget Frame"], nil, -7, nil, "ALL, SOLO")

     self.MediaUpdate = MOD.RefreshUnitMedia
     self.Update = UpdateFocusTargetFrame
@@ -752,7 +752,7 @@ CONSTRUCTORS["boss"] = function(self, unit)

     if(not _G["SVUI_Boss_MOVE"]) then
         self:Point("RIGHT", SV.UIParent, "RIGHT", -105, 0)
-        SV:SetSVMovable(self, L["Boss Frames"], nil, nil, nil, "ALL, PARTY, RAID10, RAID25, RAID40", "SVUI_Boss")
+        SV.Mentalo:Add(self, L["Boss Frames"], nil, nil, nil, "ALL, PARTY, RAID10, RAID25, RAID40", "SVUI_Boss")
     else
         self:Point("TOPRIGHT", lastBossFrame, "BOTTOMRIGHT", 0, -20)
     end
@@ -919,7 +919,7 @@ CONSTRUCTORS["arena"] = function(self, unit)

     if(not _G["SVUI_Arena_MOVE"]) then
         self:Point("RIGHT", SV.UIParent, "RIGHT", -105, 0)
-        SV:SetSVMovable(self, L["Arena Frames"], nil, nil, nil, "ALL, ARENA", "SVUI_Arena")
+        SV.Mentalo:Add(self, L["Arena Frames"], nil, nil, nil, "ALL, ARENA", "SVUI_Arena")
     else
         self:Point("TOPRIGHT", lastArenaFrame, "BOTTOMRIGHT", 0, -20)
     end
@@ -1210,7 +1210,7 @@ GROUP_UPDATES["raid10"] = function(self)
     if not frame.positioned then
         frame:ClearAllPoints()
         frame:Point("LEFT", SV.UIParent, "LEFT", 4, 0)
-        SV:SetSVMovable(frame, L["Raid 10 Frames"], nil, nil, nil, "ALL, RAID"..10)
+        SV.Mentalo:Add(frame, L["Raid 10 Frames"], nil, nil, nil, "ALL, RAID"..10)
         frame:RegisterEvent("PLAYER_ENTERING_WORLD")
         frame:SetScript("OnEvent", Raid10Visibility)
         PROXY_UPDATES["raid10"] = function() Raid10Visibility(frame) end;
@@ -1239,7 +1239,7 @@ GROUP_UPDATES["raid25"] = function(self)
     if not frame.positioned then
         frame:ClearAllPoints()
         frame:Point("LEFT", SV.UIParent, "LEFT", 4, 0)
-        SV:SetSVMovable(frame, L["Raid 25 Frames"], nil, nil, nil, "ALL, RAID"..25)
+        SV.Mentalo:Add(frame, L["Raid 25 Frames"], nil, nil, nil, "ALL, RAID"..25)
         frame:RegisterEvent("PLAYER_ENTERING_WORLD")
         frame:SetScript("OnEvent", Raid25Visibility)
         PROXY_UPDATES["raid25"] = function() Raid25Visibility(frame) end;
@@ -1268,7 +1268,7 @@ GROUP_UPDATES["raid40"] = function(self)
     if not frame.positioned then
         frame:ClearAllPoints()
         frame:Point("LEFT", SV.UIParent, "LEFT", 4, 0)
-        SV:SetSVMovable(frame, L["Raid 40 Frames"], nil, nil, nil, "ALL, RAID"..40)
+        SV.Mentalo:Add(frame, L["Raid 40 Frames"], nil, nil, nil, "ALL, RAID"..40)
         frame:RegisterEvent("PLAYER_ENTERING_WORLD")
         frame:SetScript("OnEvent", Raid40Visibility)
         PROXY_UPDATES["raid40"] = function() Raid40Visibility(frame) end;
@@ -1401,7 +1401,7 @@ GROUP_UPDATES["raidpet"] = function(self)
     if not raidPets.positioned then
         raidPets:ClearAllPoints()
         raidPets:Point("BOTTOMLEFT", SV.UIParent, "BOTTOMLEFT", 4, 433)
-        SV:SetSVMovable(raidPets, L["Raid Pet Frames"], nil, nil, nil, "ALL, RAID10, RAID25, RAID40")
+        SV.Mentalo:Add(raidPets, L["Raid Pet Frames"], nil, nil, nil, "ALL, RAID10, RAID25, RAID40")
         raidPets:RegisterEvent("PLAYER_ENTERING_WORLD")
         raidPets:SetScript("OnEvent", RaidPetVisibility)
         PROXY_UPDATES["raidpet"] = function() RaidPetVisibility(raidPets) end;
@@ -1545,7 +1545,7 @@ GROUP_UPDATES["party"] = function(self)
     if not group.positioned then
         group:ClearAllPoints()
         group:Point("LEFT",SV.UIParent,"LEFT",40,0)
-        SV:SetSVMovable(group, L['Party Frames'], nil, nil, nil, 'ALL,PARTY,ARENA');
+        SV.Mentalo:Add(group, L['Party Frames'], nil, nil, nil, 'ALL,PARTY,ARENA');
         group:RegisterEvent("PLAYER_ENTERING_WORLD")
         group:SetScript("OnEvent", PartyVisibility)
         PROXY_UPDATES["party"] = function() PartyVisibility(group) end;
@@ -1689,7 +1689,7 @@ local UpdateTankFrame = function(self)
     if not self.positioned then
         self:ClearAllPoints()
         self:Point("TOPLEFT", SV.UIParent, "TOPLEFT", 4, -40)
-        SV:SetSVMovable(self, L["Tank Frames"], nil, nil, nil, "ALL, RAID10, RAID25, RAID40")
+        SV.Mentalo:Add(self, L["Tank Frames"], nil, nil, nil, "ALL, RAID10, RAID25, RAID40")
         self.Avatar.positionOverride = "TOPLEFT"
         self:SetAttribute("minHeight", self.dirtyHeight)
         self:SetAttribute("minWidth", self.dirtyWidth)
@@ -1784,7 +1784,7 @@ local UpdateAssistFrame = function(self)
     if not self.positioned then
         self:ClearAllPoints()
         self:Point("TOPLEFT", SV.UIParent, "TOPLEFT", 4, -140)
-        SV:SetSVMovable(self, L["Assist Frames"], nil, nil, nil, "ALL, RAID10, RAID25, RAID40")
+        SV.Mentalo:Add(self, L["Assist Frames"], nil, nil, nil, "ALL, RAID10, RAID25, RAID40")
         self.Avatar.positionOverride = "TOPLEFT"
         self:SetAttribute("minHeight", self.dirtyHeight)
         self:SetAttribute("minWidth", self.dirtyWidth)
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/deathknight.lua b/Interface/AddOns/SVUI/packages/unit/resources/deathknight.lua
index cd4569e..e98e970 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/deathknight.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/deathknight.lua
@@ -72,7 +72,7 @@ local Reposition = function(self)

 	bar.Holder:Size(width, size)
     if(not db.classbar.detachFromFrame) then
-    	SV:ResetMovables(L["Classbar"])
+    	SV.Mentalo:Reset(L["Classbar"])
     end
     local holderUpdate = bar.Holder:GetScript('OnSizeChanged')
     if holderUpdate then
@@ -125,7 +125,7 @@ function MOD:CreateClassBar(playerFrame)
 	classBarHolder:Point("TOPLEFT", playerFrame, "BOTTOMLEFT", 0, -2)
 	bar:SetPoint("TOPLEFT", classBarHolder, "TOPLEFT", 0, 0)
 	bar.Holder = classBarHolder
-	SV:SetSVMovable(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")
+	SV.Mentalo:Add(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")

 	playerFrame.MaxClassPower = max;
 	playerFrame.ClassBarRefresh = Reposition;
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/druid.lua b/Interface/AddOns/SVUI/packages/unit/resources/druid.lua
index 3393b92..4504f67 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/druid.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/druid.lua
@@ -116,7 +116,7 @@ local Reposition = function(self)

 	bar.Holder:Size(width, height)
     if(not db.classbar.detachFromFrame) then
-    	SV:ResetMovables(L["Classbar"])
+    	SV.Mentalo:Reset(L["Classbar"])
     end
     local holderUpdate = bar.Holder:GetScript('OnSizeChanged')
     if holderUpdate then
@@ -271,7 +271,7 @@ function MOD:CreateClassBar(playerFrame)
 	classBarHolder:Point("TOPLEFT", playerFrame, "BOTTOMLEFT", 0, -2)
 	bar:SetPoint("TOPLEFT", classBarHolder, "TOPLEFT", 0, 0)
 	bar.Holder = classBarHolder
-	SV:SetSVMovable(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")
+	SV.Mentalo:Add(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")

 	playerFrame.ClassBarRefresh = Reposition;
 	playerFrame.EclipseBar = bar
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/mage.lua b/Interface/AddOns/SVUI/packages/unit/resources/mage.lua
index e7333c4..a6d33a6 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/mage.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/mage.lua
@@ -58,7 +58,7 @@ local Reposition = function(self)
 	local width = size * max;
 	bar.Holder:Size(width, size)
     if(not db.classbar.detachFromFrame) then
-    	SV:ResetMovables(L["Classbar"])
+    	SV.Mentalo:Reset(L["Classbar"])
     end
     local holderUpdate = bar.Holder:GetScript('OnSizeChanged')
     if holderUpdate then
@@ -191,7 +191,7 @@ function MOD:CreateClassBar(playerFrame)
 	classBarHolder:Point("TOPLEFT", playerFrame, "BOTTOMLEFT", 0, -2)
 	bar:SetPoint("TOPLEFT", classBarHolder, "TOPLEFT", 0, 0)
 	bar.Holder = classBarHolder
-	SV:SetSVMovable(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")
+	SV.Mentalo:Add(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")

 	playerFrame.MaxClassPower = max;
 	playerFrame.ClassBarRefresh = Reposition;
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/monk.lua b/Interface/AddOns/SVUI/packages/unit/resources/monk.lua
index a0a4a1b..792fb30 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/monk.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/monk.lua
@@ -58,7 +58,7 @@ local Reposition = function(self)
 	local width = size * max;
 	bar.Holder:Size(width, size)
     if(not db.classbar.detachFromFrame) then
-    	SV:ResetMovables(L["Classbar"])
+    	SV.Mentalo:Reset(L["Classbar"])
     end
     local holderUpdate = bar.Holder:GetScript('OnSizeChanged')
     if holderUpdate then
@@ -154,7 +154,7 @@ function MOD:CreateClassBar(playerFrame)
 	classBarHolder:Point("TOPLEFT", playerFrame, "BOTTOMLEFT", 0, -2)
 	bar:SetPoint("TOPLEFT", classBarHolder, "TOPLEFT", 0, 0)
 	bar.Holder = classBarHolder
-	SV:SetSVMovable(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")
+	SV.Mentalo:Add(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")

 	playerFrame.MaxClassPower = max
 	playerFrame.DrunkenMaster = CreateDrunkenMasterBar(playerFrame)
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/paladin.lua b/Interface/AddOns/SVUI/packages/unit/resources/paladin.lua
index ede5682..9c897a9 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/paladin.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/paladin.lua
@@ -64,7 +64,7 @@ local Reposition = function(self)
 	local width = size * max;
 	bar.Holder:Size(width, size)
     if(not db.classbar.detachFromFrame) then
-    	SV:ResetMovables(L["Classbar"])
+    	SV.Mentalo:Reset(L["Classbar"])
     end
     local holderUpdate = bar.Holder:GetScript('OnSizeChanged')
     if holderUpdate then
@@ -183,7 +183,7 @@ function MOD:CreateClassBar(playerFrame)
 	classBarHolder:Point("TOPLEFT", playerFrame, "BOTTOMLEFT", 0, -2)
 	bar:SetPoint("TOPLEFT", classBarHolder, "TOPLEFT", 0, 0)
 	bar.Holder = classBarHolder
-	SV:SetSVMovable(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")
+	SV.Mentalo:Add(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")

 	playerFrame.MaxClassPower = max;
 	playerFrame.ClassBarRefresh = Reposition;
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/priest.lua b/Interface/AddOns/SVUI/packages/unit/resources/priest.lua
index 2e28227..f33b6b2 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/priest.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/priest.lua
@@ -61,7 +61,7 @@ local Reposition = function(self)

 	bar.Holder:Size(width, size)
     if(not db.classbar.detachFromFrame) then
-    	SV:ResetMovables(L["Classbar"])
+    	SV.Mentalo:Reset(L["Classbar"])
     end
     local holderUpdate = bar.Holder:GetScript('OnSizeChanged')
     if holderUpdate then
@@ -155,7 +155,7 @@ function MOD:CreateClassBar(playerFrame)
 	classBarHolder:Point("TOPLEFT", playerFrame, "BOTTOMLEFT", 0, -2)
 	bar:SetPoint("TOPLEFT", classBarHolder, "TOPLEFT", 0, 0)
 	bar.Holder = classBarHolder
-	SV:SetSVMovable(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")
+	SV.Mentalo:Add(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")

 	playerFrame.MaxClassPower = max;
 	playerFrame.ClassBarRefresh = Reposition;
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/rogue.lua b/Interface/AddOns/SVUI/packages/unit/resources/rogue.lua
index d424cbe..8da527f 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/rogue.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/rogue.lua
@@ -179,7 +179,7 @@ local RepositionTracker = function(self)
 	local textwidth = size * 1.25;
 	bar.Holder:Size(width, size)
     if(not db.classbar.detachFromFrame) then
-    	SV:ResetMovables(L["Classbar"])
+    	SV.Mentalo:Reset(L["Classbar"])
     end
     local holderUpdate = bar.Holder:GetScript('OnSizeChanged')
     if holderUpdate then
@@ -258,7 +258,7 @@ function MOD:CreateClassBar(playerFrame)
 	classBarHolder:Point("TOPLEFT", playerFrame, "BOTTOMLEFT", 0, -2)
 	bar:SetPoint("TOPLEFT", classBarHolder, "TOPLEFT", 0, 0)
 	bar.Holder = classBarHolder
-	SV:SetSVMovable(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")
+	SV.Mentalo:Add(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")

 	playerFrame.MaxClassPower = 5;
 	playerFrame.ClassBarRefresh = RepositionTracker;
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/shaman.lua b/Interface/AddOns/SVUI/packages/unit/resources/shaman.lua
index e25ec32..bbc1340 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/shaman.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/shaman.lua
@@ -70,7 +70,7 @@ local Reposition = function(self)
 	local width = size * totemMax
 	bar.Holder:Size(width, size)
     if(not db.classbar.detachFromFrame) then
-    	SV:ResetMovables(L["Classbar"])
+    	SV.Mentalo:Reset(L["Classbar"])
     end
     local holderUpdate = bar.Holder:GetScript('OnSizeChanged')
     if holderUpdate then
@@ -117,7 +117,7 @@ function MOD:CreateClassBar(playerFrame)
 	classBarHolder:Point("TOPLEFT", playerFrame, "BOTTOMLEFT", 0, -2)
 	bar:SetPoint("TOPLEFT", classBarHolder, "TOPLEFT", 0, 0)
 	bar.Holder = classBarHolder
-	SV:SetSVMovable(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")
+	SV.Mentalo:Add(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")

 	playerFrame.MaxClassPower = totemMax;
 	playerFrame.ClassBarRefresh = Reposition;
diff --git a/Interface/AddOns/SVUI/packages/unit/resources/warlock.lua b/Interface/AddOns/SVUI/packages/unit/resources/warlock.lua
index f61250c..08f9aec 100644
--- a/Interface/AddOns/SVUI/packages/unit/resources/warlock.lua
+++ b/Interface/AddOns/SVUI/packages/unit/resources/warlock.lua
@@ -87,7 +87,7 @@ local Reposition = function(self)
 	local dbOffset = (size * 0.15)
 	bar.Holder:Size(width, size)
     if(not db.classbar.detachFromFrame) then
-    	SV:ResetMovables(L["Classbar"])
+    	SV.Mentalo:Reset(L["Classbar"])
     end
     local holderUpdate = bar.Holder:GetScript('OnSizeChanged')
     if holderUpdate then
@@ -360,7 +360,7 @@ function MOD:CreateClassBar(playerFrame)
 	classBarHolder:Point("TOPLEFT", playerFrame, "BOTTOMLEFT", 0, -2)
 	bar:SetPoint("TOPLEFT", classBarHolder, "TOPLEFT", 0, 0)
 	bar.Holder = classBarHolder
-	SV:SetSVMovable(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")
+	SV.Mentalo:Add(bar.Holder, L["Classbar"], nil, nil, nil, "ALL, SOLO")

 	playerFrame.MaxClassPower = max;
 	playerFrame.ClassBarRefresh = Reposition;
diff --git a/Interface/AddOns/SVUI/scripts/misc.lua b/Interface/AddOns/SVUI/scripts/misc.lua
index f1dea36..4dfd981 100644
--- a/Interface/AddOns/SVUI/scripts/misc.lua
+++ b/Interface/AddOns/SVUI/scripts/misc.lua
@@ -539,7 +539,7 @@ local function CreateTotemBar()
 	else
 		frame_name = L["Totem Bar"]
 	end
-	SV:SetSVMovable(TotemBar, frame_name)
+	SV.Mentalo:Add(TotemBar, frame_name)
 end

 SVLib:NewScript(CreateTotemBar)
@@ -649,7 +649,7 @@ local function LoadThreatBar()
 		ThreatBar:RegisterEvent('GROUP_ROSTER_UPDATE')
 		ThreatBar:RegisterEvent('UNIT_PET')
 		ThreatBar:SetScript("OnEvent", ThreatBar_OnEvent)
-		SV:SetSVMovable(ThreatBar, "Threat Bar");
+		SV.Mentalo:Add(ThreatBar, "Threat Bar");
 	end
 end

diff --git a/Interface/AddOns/SVUI/scripts/questwatch.lua b/Interface/AddOns/SVUI/scripts/questwatch.lua
index 02f331a..7374e5c 100644
--- a/Interface/AddOns/SVUI/scripts/questwatch.lua
+++ b/Interface/AddOns/SVUI/scripts/questwatch.lua
@@ -347,7 +347,7 @@ local function CreateQuestDocklet()
 		ObjectiveTrackerFrame.HeaderMenu:RemoveTextures(true)
 		ObjectiveTrackerFrame.BlockDropDown:RemoveTextures(true)

-		SV:SetSVMovable(frame, "Quest Watch");
+		SV.Mentalo:Add(frame, "Quest Watch");
 	elseif(not SV.db.general.questWatch) then
 		local frame = CreateFrame("Frame", "SVUI_QuestFrame", UIParent);
 		frame:SetSize(200, WatchFrame:GetHeight());
@@ -364,7 +364,7 @@ local function CreateQuestDocklet()
 		WatchFrameLines.SetPoint = SV.fubar;
 		WatchFrameLines.SetAllPoints = SV.fubar;

-		SV:SetSVMovable(frame, "Quest Watch");
+		SV.Mentalo:Add(frame, "Quest Watch");
 	else
 		local bgTex = [[Interface\BUTTONS\WHITE8X8]]
 		local bdTex = SV.Media.bar.glow
diff --git a/Interface/AddOns/SVUI/scripts/spellbind.lua b/Interface/AddOns/SVUI/scripts/spellbind.lua
index c8262b2..0451c15 100644
--- a/Interface/AddOns/SVUI/scripts/spellbind.lua
+++ b/Interface/AddOns/SVUI/scripts/spellbind.lua
@@ -82,11 +82,6 @@ SpellBinder.list:SetPoint("BOTTOMRIGHT", _G["SVUI_SpellBinderInset"], "BOTTOMRIG
 SpellBinder.list:SetScrollChild(SpellBinder.list.child)

 local SpellBinderCache;
--- SVUI_Cache = SVUI_Cache or {}
--- SpellBinderCache = SpellBinderCache or {}
--- SpellBinderCache.spells = SpellBinderCache.spells or {}
--- SpellBinderCache.frames = SpellBinderCache.frames or {}
--- SpellBinderCache.keys = SpellBinderCache.keys or {}
 --[[
 ##########################################################
 SCRIPT HANDLERS
diff --git a/Interface/AddOns/SVUI/system/animate.lua b/Interface/AddOns/SVUI/system/animate.lua
index c28cc87..76ff815 100644
--- a/Interface/AddOns/SVUI/system/animate.lua
+++ b/Interface/AddOns/SVUI/system/animate.lua
@@ -356,7 +356,7 @@ end

 function Animate:Flash(frame, speed, looped)
 	if not frame.anim then
-		Animate:SetTemplate(frame, 'Flash', false, speed, looped)
+		self:SetTemplate(frame, 'Flash', false, speed, looped)
 	end
 	if not frame.anim:IsPlaying() then
 		frame.anim:Play()
diff --git a/Interface/AddOns/SVUI/system/load.lua b/Interface/AddOns/SVUI/system/load.lua
index 315839d..9c597e7 100644
--- a/Interface/AddOns/SVUI/system/load.lua
+++ b/Interface/AddOns/SVUI/system/load.lua
@@ -53,52 +53,32 @@ local playerClass = select(2,UnitClass("player"));

 local function DeleteOldSavedVars()
 	--[[ BEGIN DEPRECATED ]]--
-    if SVUI_DATA then SVUI_DATA = nil end
-    if SVUI_SAFE_DATA then SVUI_SAFE_DATA = nil end
-    if SVUI_TRACKER then SVUI_TRACKER = nil end
-    if SVUI_ENEMIES then SVUI_ENEMIES = nil end
-    if SVUI_JOURNAL then SVUI_JOURNAL = nil end
-    if SVUI_CHARACTER_LOG then SVUI_CHARACTER_LOG = nil end
-    if SVUI_MOVED_FRAMES then SVUI_MOVED_FRAMES = nil end
-    if SVUI_SystemData then SVUI_SystemData = nil end
-    if SVUI_ProfileData then SVUI_ProfileData = nil end
-    if SVUI_Filters then SVUI_Filters = nil end
-    if SVUI_AuraFilters then SVUI_AuraFilters = nil end
-    if SVUI_AuraWatch then SVUI_AuraWatch = nil end
-    if SVUI_Cache["Mentalo"]["Blizzard"] then SVUI_Cache["Mentalo"]["Blizzard"] = nil end
-    if SVUI_Cache["Mentalo"]["UI"] then SVUI_Cache["Mentalo"]["UI"] = nil end
-    if(SVUI_Profile.SAFEDATA.install_complete) then SVUI_Profile.SAFEDATA.install_complete = nil end
+
     --[[ END DEPRECATED ]]--
 end

 function SV:VersionCheck()
 	local minimumVersion = 4.06;
-	local installedVersion = SVUI_Profile.SAFEDATA.install_version
+	local installedVersion = SVLib:GetSafeData("install_version");
 	if(installedVersion) then
 		if(type(installedVersion) == "string") then
-			installedVersion = tonumber(SVUI_Profile.SAFEDATA.install_version)
+			installedVersion = tonumber(installedVersion)
 		end
 		if(type(installedVersion) == "number" and installedVersion < minimumVersion) then
-			DeleteOldSavedVars()
+			--DeleteOldSavedVars()  -- No current deprecated entries to remove
 			self.Setup:Install(true)
 		end
 	else
-		DeleteOldSavedVars()
 		self.Setup:Install(true)
 	end
 end

 function SV:RefreshEverything(bypass)
 	self:RefreshAllSystemMedia();
-
-	SV.UIParent:Hide();
-
-	self:SetSVMovablesPositions();
-	SVLib:Update('SVUnit');
+	self.UIParent:Hide();
+	self.Mentalo:SetPositions();
 	SVLib:UpdateAll();
-
-	SV.UIParent:Show();
-
+	self.UIParent:Show();
 	if not bypass then
 		self:VersionCheck()
 	end
@@ -116,7 +96,8 @@ function SV:Load()
 	local gxWidth = tonumber(match(rez,"(%d+)x%d+"));

     SVLib:Initialize()
-
+    self.Mentalo:Initialize()
+
     self.DisplaySettings = SVLib:NewCache("Display")
     if(not self.DisplaySettings.screenheight or (self.DisplaySettings.screenheight and type(self.DisplaySettings.screenheight) ~= "number")) then
     	self.DisplaySettings.screenheight = gxHeight
@@ -125,8 +106,6 @@ function SV:Load()
     	self.DisplaySettings.screenwidth = gxWidth
     end

-    self:InitializeMentalo()
-
 	self:ScreenCalibration();
 	self:RefreshSystemFonts();
 	self:LoadSystemAlerts();
@@ -140,8 +119,9 @@ function SV:Launch()

 	self:ScreenCalibration("PLAYER_LOGIN");
 	self:DefinePlayerRole();
-	self:LoadMovables();
-	self:SetSVMovablesPositions();
+
+	self.Mentalo:Launch()
+	self.Mentalo:SetPositions()

 	self:VersionCheck()

@@ -163,12 +143,8 @@ function SV:Launch()
 	self.UIParent:RegisterEvent("SPELLS_CHANGED");

 	SVLib:Update("SVMap");
-	SVLib:Update("SVUnit", true);
-	collectgarbage("collect")

-	_G["SVUI_Mentalo"]:SetFixedPanelTemplate("Component")
-	_G["SVUI_Mentalo"]:SetPanelColor("yellow")
-	_G["SVUI_MentaloPrecision"]:SetPanelTemplate("Transparent")
+	collectgarbage("collect")

 	if self.db.general.loginmessage then
 		local logMsg = (L["LOGIN_MSG"]):format("|cffFFFF1A", "|cffAA78FF", self.Version)
@@ -242,8 +218,8 @@ local SVUISystem_OnEvent = function(self, event, arg, ...)
 				forceClosed = true
 			end
 		end
-		if SV.MentaloFrames then
-			for frame,_ in pairs(SV.MentaloFrames) do
+		if SV.Mentalo.Frames then
+			for frame,_ in pairs(SV.Mentalo.Frames) do
 				if _G[frame] and _G[frame]:IsShown() then
 					forceClosed = true;
 					_G[frame]:Hide()
diff --git a/Interface/AddOns/SVUI/system/mentalo.lua b/Interface/AddOns/SVUI/system/mentalo.lua
index 2ad66a3..f432a8f 100644
--- a/Interface/AddOns/SVUI/system/mentalo.lua
+++ b/Interface/AddOns/SVUI/system/mentalo.lua
@@ -37,12 +37,17 @@ local SVUI_ADDON_NAME, SV = ...
 local SVLib = LibStub("LibSuperVillain-1.0")
 local L = SVLib:Lang();

-SV.MentaloFrames = {}
+local Mentalo = {}

-local MentaloMover = CreateFrame("Frame", nil)
-local MentaloCache, AnchorCache;
+Mentalo.Frames = {}
+Mentalo.Anchors = {}
+Mentalo.Blizzard = {}
+
+local MentaloEventHandler = CreateFrame("Frame", nil)

 local Sticky = {};
+Sticky.Frames = {};
+Sticky.Frames[1] = SV.UIParent;
 Sticky.scripts = Sticky.scripts or {}
 Sticky.rangeX = 15
 Sticky.rangeY = 15
@@ -130,7 +135,7 @@ local function SnapStickyFrame(frameA, frameB, left, top, right, bottom)
 	end
 end

-local function GetStickyUpdate(frame, frameList, xoffset, yoffset, left, top, right, bottom)
+function Sticky:GetStickyUpdate(frame, xoffset, yoffset, left, top, right, bottom)
 	return function()
 		local x, y = GetCursorPosition()
 		local s = frame:GetEffectiveScale()
@@ -138,12 +143,12 @@ local function GetStickyUpdate(frame, frameList, xoffset, yoffset, left, top, ri
 		x, y = x / s, y / s
 		frame:ClearAllPoints()
 		frame:SetPoint("CENTER", UIParent, "BOTTOMLEFT", x + xoffset, y + yoffset)
-		Sticky.sticky[frame] = nil
-		for i = 1, #frameList do
-			local v = frameList[i]
-			if frame  ~= v and frame  ~= v:GetParent() and not IsShiftKeyDown() and v:IsVisible() then
+		self.sticky[frame] = nil
+		for i = 1, #Sticky.Frames do
+			local v = Sticky.Frames[i]
+			if(frame ~= v and frame ~= v:GetParent() and not IsShiftKeyDown() and v:IsVisible()) then
 				if SnapStickyFrame(frame, v, left, top, right, bottom) then
-					Sticky.sticky[frame] = v
+					self.sticky[frame] = v
 					break
 				end
 			end
@@ -151,14 +156,14 @@ local function GetStickyUpdate(frame, frameList, xoffset, yoffset, left, top, ri
 	end
 end

-function Sticky:StartMoving(frame, frameList, left, top, right, bottom)
+function Sticky:StartMoving(frame, left, top, right, bottom)
 	local x, y = GetCursorPosition()
 	local aX, aY = frame:GetCenter()
 	local aS = frame:GetEffectiveScale()
 	aX, aY = aX * aS, aY * aS
 	local xoffset, yoffset = (aX - x), (aY - y)
 	self.scripts[frame] = frame:GetScript("OnUpdate")
-	frame:SetScript("OnUpdate", GetStickyUpdate(frame, frameList, xoffset, yoffset, left, top, right, bottom))
+	frame:SetScript("OnUpdate", Sticky.GetStickyUpdate(Sticky, frame, xoffset, yoffset, left, top, right, bottom))
 end

 function Sticky:StopMoving(frame)
@@ -179,82 +184,6 @@ LOCAL VARS
 ]]--
 local CurrentFrameTarget = false;
 local UpdateFrameTarget = false;
-local userHolding = false;
-local HandledFrames = {};
-local DraggableFrames = {
-	"AchievementFrame",
-	"AuctionFrame",
-	"ArchaeologyFrame",
-	"BattlefieldMinimap",
-	"BarberShopFrame",
-	"BlackMarketFrame",
-	"CalendarFrame",
-	"CharacterFrame",
-	"ClassTrainerFrame",
-	"DressUpFrame",
-	"EncounterJournal",
-	"FriendsFrame",
-	"GameMenuFrame",
-	"GMSurveyFrame",
-	"GossipFrame",
-	"GuildFrame",
-	"GuildBankFrame",
-	"GuildRegistrarFrame",
-	"HelpFrame",
-	"InterfaceOptionsFrame",
-	"ItemUpgradeFrame",
-	"KeyBindingFrame",
-	"LFGDungeonReadyPopup",
-	"MacOptionsFrame",
-	"MacroFrame",
-	"MailFrame",
-	"MerchantFrame",
-	"PlayerTalentFrame",
-	"PetJournalParent",
-	"PVEFrame",
-	"PVPFrame",
-	"QuestFrame",
-	"QuestLogFrame",
-	"RaidBrowserFrame",
-	"ReadyCheckFrame",
-	"ReforgingFrame",
-	"ReportCheatingDialog",
-	"ReportPlayerNameDialog",
-	"RolePollPopup",
-	"ScrollOfResurrectionSelectionFrame",
-	"SpellBookFrame",
-	"TabardFrame",
-	"TaxiFrame",
-	"TimeManagerFrame",
-	"TradeSkillFrame",
-	"TradeFrame",
-	"TransmorgifyFrame",
-	"TutorialFrame",
-	"VideoOptionsFrame",
-	"VoidStorageFrame",
-	--"WorldStateAlwaysUpFrame"
-};
--- local MentaloUIFrames = {
--- 	"ArcheologyDigsiteProgressBar",
--- };
-local theHand = CreateFrame("Frame", "SVUI_HandOfMentalo", SV.UIParent)
-theHand:SetFrameStrata("DIALOG")
-theHand:SetFrameLevel(99)
-theHand:SetClampedToScreen(true)
-theHand:SetSize(128,128)
-theHand:SetPoint("CENTER")
-theHand.bg = theHand:CreateTexture(nil, "OVERLAY")
-theHand.bg:SetAllPoints(theHand)
-theHand.bg:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-HAND-OFF]])
-theHand.energy = theHand:CreateTexture(nil, "OVERLAY")
-theHand.energy:SetAllPoints(theHand)
-theHand.energy:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-ENERGY]])
-SV.Animate:Orbit(theHand.energy, 10)
-theHand.flash = theHand.energy.anim;
-theHand.energy:Hide()
-theHand.elapsedTime = 0;
-theHand.flash:Stop()
-theHand:Hide()
 --[[
 ##########################################################
 LOCAL FUNCTIONS
@@ -292,12 +221,95 @@ local function Pinpoint(parent)
         result = "CENTER"
     end
     return result
-end
+end
+
+local function CurrentPosition(frame)
+	if not frame then return end
+	local anchor1, parent, anchor2, x, y = frame:GetPoint()
+	local parentName
+	if not parent then
+		parentName = "SVUIParent"
+	elseif not parent:GetName() then
+		parentName = "SVUI_Player"
+	else
+		parentName = parent:GetName()
+	end
+	return ("%s\031%s\031%s\031%d\031%d"):format(anchor1, parentName, anchor2, parsefloat(x), parsefloat(y))
+end

-local function TheHand_SetPos(frame)
-	theHand:SetPoint("CENTER", frame, "TOP", 0, 0)
+local function GrabUsableRegions(frame)
+	local parent = frame or SV.UIParent
+	local right = parent:GetRight()
+	local top = parent:GetTop()
+	local center = parent:GetCenter()
+	return right, top, center
 end

+local function CalculateOffsets(frame)
+	if(not CurrentFrameTarget) then return end
+	local right, top, center = GrabUsableRegions()
+	local xOffset, yOffset = CurrentFrameTarget:GetCenter()
+	local screenLeft = (right * 0.33);
+	local screenRight = (right * 0.66);
+	local topMedian = (top * 0.5);
+	local anchor, a1, a2;
+
+	if(yOffset >= (top * 0.5)) then
+		a1 = "TOP"
+		yOffset = -(top - CurrentFrameTarget:GetTop())
+	else
+		a1 = "BOTTOM"
+		yOffset = CurrentFrameTarget:GetBottom()
+	end
+
+	if xOffset >= screenRight then
+		a2 = "RIGHT"
+		xOffset = (CurrentFrameTarget:GetRight() - right)
+	elseif xOffset <= screenLeft then
+		a2 = "LEFT"
+		xOffset = CurrentFrameTarget:GetLeft()
+	else
+		a2 = ""
+		xOffset = (xOffset - center)
+	end
+
+	xOffset = parsefloat(xOffset, 0)
+	yOffset = parsefloat(yOffset, 0)
+	anchor = ("%s%s"):format(a1,a2)
+	return xOffset, yOffset, anchor
+end
+
+--[[
+ /$$$$$$$$/$$   /$$ /$$$$$$$$       /$$   /$$  /$$$$$$  /$$   /$$ /$$$$$$$
+|__  $$__/ $$  | $$| $$_____/      | $$  | $$ /$$__  $$| $$$ | $$| $$__  $$
+   | $$  | $$  | $$| $$            | $$  | $$| $$  \ $$| $$$$| $$| $$  \ $$
+   | $$  | $$$$$$$$| $$$$$         | $$$$$$$$| $$$$$$$$| $$ $$ $$| $$  | $$
+   | $$  | $$__  $$| $$__/         | $$__  $$| $$__  $$| $$  $$$$| $$  | $$
+   | $$  | $$  | $$| $$            | $$  | $$| $$  | $$| $$\  $$$| $$  | $$
+   | $$  | $$  | $$| $$$$$$$$      | $$  | $$| $$  | $$| $$ \  $$| $$$$$$$/
+   |__/  |__/  |__/|________/      |__/  |__/|__/  |__/|__/  \__/|_______/
+--]]
+
+local TheHand = CreateFrame("Frame", "SVUI_HandOfMentalo", SV.UIParent)
+TheHand:SetFrameStrata("DIALOG")
+TheHand:SetFrameLevel(99)
+TheHand:SetClampedToScreen(true)
+TheHand:SetSize(128,128)
+TheHand:SetPoint("CENTER")
+TheHand.bg = TheHand:CreateTexture(nil, "OVERLAY")
+TheHand.bg:SetAllPoints(TheHand)
+TheHand.bg:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-HAND-OFF]])
+TheHand.energy = TheHand:CreateTexture(nil, "OVERLAY")
+TheHand.energy:SetAllPoints(TheHand)
+TheHand.energy:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-ENERGY]])
+SV.Animate:Orbit(TheHand.energy, 10)
+TheHand.flash = TheHand.energy.anim;
+TheHand.energy:Hide()
+TheHand.elapsedTime = 0;
+TheHand.flash:Stop()
+TheHand:Hide()
+TheHand.UserHeld = false;
+
 local TheHand_OnUpdate = function(self, elapsed)
 	self.elapsedTime = self.elapsedTime  +  elapsed
 	if self.elapsedTime > 0.1 then
@@ -308,390 +320,320 @@ local TheHand_OnUpdate = function(self, elapsed)
 	end
 end

-local function EnableTheHand()
-	theHand:Show()
-	theHand.bg:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-HAND-ON]])
-	theHand.energy:Show()
-	theHand.flash:Play()
-	theHand:SetScript("OnUpdate", TheHand_OnUpdate)
+function TheHand:Enable()
+	self:Show()
+	self.bg:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-HAND-ON]])
+	self.energy:Show()
+	self.flash:Play()
+	self:SetScript("OnUpdate", TheHand_OnUpdate)
 end

-local function DisableTheHand()
-	theHand.flash:Stop()
-	theHand.energy:Hide()
-	theHand.bg:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-HAND-OFF]])
-	theHand:SetScript("OnUpdate", nil)
-	theHand.elapsedTime = 0
-	theHand:Hide()
+function TheHand:Disable()
+	self.flash:Stop()
+	self.energy:Hide()
+	self.bg:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-HAND-OFF]])
+	self:SetScript("OnUpdate", nil)
+	self.elapsedTime = 0
+	self:Hide()
 end
+--[[
+##########################################################
+HANDLERS
+##########################################################
+]]--
+local Movable_OnMouseUp = function(self)
+	CurrentFrameTarget = self;
+	local xOffset, yOffset, anchor = CalculateOffsets()
+	SVUI_MentaloPrecisionSetX:SetText(xOffset)
+	SVUI_MentaloPrecisionSetY:SetText(yOffset)
+	SVUI_MentaloPrecisionSetX.CurrentValue = xOffset;
+	SVUI_MentaloPrecisionSetY.CurrentValue = yOffset;
+	SVUI_MentaloPrecision.Title:SetText(self.textString)
+end

-local function Mentalo_OnSizeChanged(frame)
+local Movable_OnSizeChanged = function(self)
 	if InCombatLockdown()then return end
-	if frame.dirtyWidth and frame.dirtyHeight then
-		frame.Avatar:Size(frame.dirtyWidth, frame.dirtyHeight)
+	if self.dirtyWidth and self.dirtyHeight then
+		self.Avatar:Size(self.dirtyWidth, self.dirtyHeight)
 	else
-		frame.Avatar:Size(frame:GetSize())
+		self.Avatar:Size(self:GetSize())
 	end
 end

-function MentaloMover:MakeMovable(frame)
-	if HandledFrames then
-		for _, f in pairs(HandledFrames)do
-			if frame:GetName() == f then return end
-		end
-	end
-	if SVUI and frame:GetName() == "LossOfControlFrame" then return end
-	frame:EnableMouse(true)
-	if frame:GetName() == "LFGDungeonReadyPopup" then
-		LFGDungeonReadyDialog:EnableMouse(false)
+local Movable_OnDragStart = function(self)
+	if InCombatLockdown() then SV:AddonMessage(ERR_NOT_IN_COMBAT)return end
+	if SV.db.general.stickyFrames then
+		Sticky:StartMoving(self, self.snapOffset, self.snapOffset, self.snapOffset, self.snapOffset)
+	else
+		self:StartMoving()
 	end
-	frame:SetMovable(true)
-	frame:RegisterForDrag("LeftButton")
-	frame:SetClampedToScreen(true)
-	frame:HookScript("OnUpdate", function(this)
-		if InCombatLockdown() or this:GetName() == "GameMenuFrame" then return end
-		if this.IsMoving then return end
-		this:ClearAllPoints()
-		if this:GetName() == "QuestFrame" then
-			if MentaloCache["GossipFrame"].Points  ~= nil then
-				this:SetPoint(unpack(MentaloCache["GossipFrame"].Points))
-			end
-		elseif MentaloCache[this:GetName()].Points  ~= nil then
-			this:SetPoint(unpack(MentaloCache[this:GetName()].Points))
-		end
-	end)
-	frame:SetScript("OnDragStart", function(this)
-		if not this:IsMovable() then return end
-		this:StartMoving()
-		this.IsMoving = true
-	end)
-	frame:SetScript("OnDragStop", function(this)
-		if not this:IsMovable() then return end
-		this.IsMoving = false;
-		this:StopMovingOrSizing()
-		if this:GetName() == "GameMenuFrame"then return end
-		local anchor1, parent, anchor2, x, y = this:GetPoint()
-		parent = this:GetParent():GetName()
-		this:ClearAllPoints()
-		this:SetPoint(anchor1, parent, anchor2, x, y)
-		if this:GetName() == "QuestFrame" then
-			MentaloCache["GossipFrame"].Points = {anchor1, parent, anchor2, x, y}
-		else
-			MentaloCache[this:GetName()].Points = {anchor1, parent, anchor2, x, y}
-		end
-	end)
-	tinsert(HandledFrames, frame:GetName())
+	UpdateFrameTarget = self;
+	MentaloEventHandler:Show()
+	TheHand:Enable()
+	TheHand.UserHeld = true
 end

-local Movable_OnEvent = function(self)
-	for _, frame in pairs(DraggableFrames)do
-		if _G[frame] then
-			if MentaloCache[frame] == nil then
-				MentaloCache[frame] = {}
-			end
-			MentaloCache["GameMenuFrame"] = {}
-			MakeMovable(_G[frame])
-		end
+local Movable_OnDragStop = function(self)
+	if InCombatLockdown()then SV:AddonMessage(ERR_NOT_IN_COMBAT)return end
+	TheHand.UserHeld = false;
+	if SV.db.general.stickyFrames then
+		Sticky:StopMoving(self)
+	else
+		self:StopMovingOrSizing()
+	end
+	local pR, pT, pC = GrabUsableRegions()
+	local cX, cY = self:GetCenter()
+	local newAnchor;
+	if cY >= (pT * 0.5) then
+		newAnchor = "TOP";
+		cY = (-(pT - self:GetTop()))
+	else
+		newAnchor = "BOTTOM"
+		cY = self:GetBottom()
+	end
+	if cX >= (pR * 0.66) then
+		newAnchor = newAnchor.."RIGHT"
+		cX = self:GetRight() - pR
+	elseif cX <= (pR * 0.33) then
+		newAnchor = newAnchor.."LEFT"
+		cX = self:GetLeft()
+	else
+		cX = cX - pC
+	end
+	if self.positionOverride then
+		self.parent:ClearAllPoints()
+		self.parent:Point(self.positionOverride, self, self.positionOverride)
 	end
-end

-local function GrabUsableRegions(frame)
-	local parent = frame or SV.UIParent
-	local right = parent:GetRight()
-	local top = parent:GetTop()
-	local center = parent:GetCenter()
-	return right, top, center
-end
+	self:ClearAllPoints()
+	self:Point(newAnchor, SV.UIParent, newAnchor, cX, cY)

-local function FindLoc(frame)
-	if not frame then return end
-	local anchor1, parent, anchor2, x, y = frame:GetPoint()
-	local parentName
-	if not parent then
-		parentName = "SVUIParent"
-	elseif not parent:GetName() then
-		parentName = "SVUI_Player"
-	else
-		parentName = parent:GetName()
+	Mentalo:SaveMovable(moveName)
+
+	if SVUI_MentaloPrecision then
+		Movable_OnMouseUp(self)
 	end
-	return ("%s\031%s\031%s\031%d\031%d"):format(anchor1, parentName, anchor2, parsefloat(x), parsefloat(y))
+
+	UpdateFrameTarget = nil;
+	MentaloEventHandler:Hide()
+	if(dragStopFunc ~= nil and type(dragStopFunc) == "function") then
+		dragStopFunc(self, Pinpoint(self))
+	end
+	self:SetUserPlaced(false)
+	TheHand:Disable()
+end
+
+local Movable_OnEnter = function(self)
+	if TheHand.UserHeld then return end
+	self:SetAlpha(1)
+	self.text:SetTextColor(1, 1, 1)
+	UpdateFrameTarget = self;
+	MentaloEventHandler:GetScript("OnUpdate")(MentaloEventHandler)
+	SVUI_Mentalo.Avatar:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-ON]])
+	TheHand:SetPoint("CENTER", self, "TOP", 0, 0)
+	TheHand:Show()
+	if CurrentFrameTarget ~= self then
+		SVUI_MentaloPrecision:Hide()
+		Movable_OnMouseUp(self)
+	end
 end

-local function ghost(list, alpha)
-	local frame;
-	for f, _ in pairs(list)do
-		frame = _G[f]
-		if frame then
-			frame:SetAlpha(alpha)
+local Movable_OnLeave = function(self)
+	if TheHand.UserHeld then return end
+	self:SetAlpha(0.4)
+	self.text:SetTextColor(0.1, 0.8, 0.8)
+	SVUI_Mentalo.Avatar:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-OFF]])
+	TheHand:Hide()
+end
+
+local Movable_OnMouseDown = function(self, arg)
+	if arg == "RightButton"then
+		TheHand.UserHeld = false;
+		SVUI_MentaloPrecision:Show()
+		if SV.db.general.stickyFrames then
+			Sticky:StopMoving(self)
+		else
+			self:StopMovingOrSizing()
 		end
 	end
-end
+end

-local function SetSVMovable(frame, moveName, title, raised, snap, dragStopFunc)
+local Movable_OnShow = function(self)
+	self:SetBackdropBorderColor(0.1, 0.8, 0.8)
+end
+--[[
+##########################################################
+CONSTRUCTS
+##########################################################
+]]--
+function Mentalo:New(frame, moveName, title, raised, snap, dragStopFunc)
 	if(not frame) then return end
-	if SV.MentaloFrames[moveName].Created then return end
+	if self.Frames[moveName].Created then return end
 	if raised == nil then raised = true end
+
 	local movable = CreateFrame("Button", moveName, SV.UIParent)
 	movable:SetFrameLevel(frame:GetFrameLevel() + 1)
 	movable:SetClampedToScreen(true)
 	movable:SetWidth(frame:GetWidth())
 	movable:SetHeight(frame:GetHeight())
+
 	movable.parent = frame;
 	movable.name = moveName;
 	movable.textString = title;
 	movable.postdrag = dragStopFunc;
 	movable.overlay = raised;
 	movable.snapOffset = snap or -2;
-	SV.MentaloFrames[moveName].Avatar = movable;
-	SV["Snap"][#SV["Snap"] + 1] = movable;
+
 	if raised == true then
 		movable:SetFrameStrata("DIALOG")
 	else
 		movable:SetFrameStrata("BACKGROUND")
 	end
-	local anchor1, anchorParent, anchor2, xPos, yPos = split("\031", FindLoc(frame))
-	if AnchorCache and AnchorCache[moveName] then
-		if type(AnchorCache[moveName]) == "table"then
-			movable:SetPoint(AnchorCache[moveName]["p"], SV.UIParent, AnchorCache[moveName]["p2"], AnchorCache[moveName]["p3"], AnchorCache[moveName]["p4"])
-			AnchorCache[moveName] = FindLoc(movable)
+
+	local anchor1, anchorParent, anchor2, xPos, yPos = split("\031", CurrentPosition(frame))
+	if(self.Anchors and self.Anchors[moveName]) then
+		if(type(self.Anchors[moveName]) == "table") then
+			movable:SetPoint(self.Anchors[moveName]["p"], SV.UIParent, self.Anchors[moveName]["p2"], self.Anchors[moveName]["p3"], self.Anchors[moveName]["p4"])
+			self.Anchors[moveName] = CurrentPosition(movable)
 			movable:ClearAllPoints()
 		end
-		anchor1, anchorParent, anchor2, xPos, yPos = split("\031", AnchorCache[moveName])
+		anchor1, anchorParent, anchor2, xPos, yPos = split("\031", self.Anchors[moveName])
 		movable:SetPoint(anchor1, anchorParent, anchor2, xPos, yPos)
 	else
 		movable:SetPoint(anchor1, anchorParent, anchor2, xPos, yPos)
 	end
+
 	movable:SetFixedPanelTemplate("Transparent")
 	movable:SetAlpha(0.4)
-	movable:RegisterForDrag("LeftButton", "RightButton")
-	movable:SetScript("OnDragStart", function(this)
-		if InCombatLockdown()then SV:AddonMessage(ERR_NOT_IN_COMBAT)return end
-		if SV.db.general.stickyFrames then
-			Sticky:StartMoving(this, SV["Snap"], movable.snapOffset, movable.snapOffset, movable.snapOffset, movable.snapOffset)
-		else
-			this:StartMoving()
-		end
-		UpdateFrameTarget = this;
-		_G["SVUI_MentaloEventHandler"]:Show()
-		EnableTheHand()
-		userHolding = true
-	end)
-	movable:SetScript("OnMouseUp", SV.MovableFocused)
-	movable:SetScript("OnDragStop", function(this)
-		if InCombatLockdown()then SV:AddonMessage(ERR_NOT_IN_COMBAT)return end
-		userHolding = false;
-		if SV.db.general.stickyFrames then
-			Sticky:StopMoving(this)
-		else
-			this:StopMovingOrSizing()
-		end
-		local pR, pT, pC = GrabUsableRegions()
-		local cX, cY = this:GetCenter()
-		local newAnchor;
-		if cY   >= (pT   /   2) then
-			newAnchor = "TOP";
-			cY = (-(pT - this:GetTop()))
-		else
-			newAnchor = "BOTTOM"
-			cY = this:GetBottom()
-		end
-		if cX   >= ((pR   *   2)   /   3) then
-			newAnchor = newAnchor.."RIGHT"
-			cX = this:GetRight() - pR
-		elseif cX   <= (pR   /   3) then
-			newAnchor = newAnchor.."LEFT"
-			cX = this:GetLeft()
-		else
-			cX = cX - pC
-		end
-		if this.positionOverride then
-			this.parent:ClearAllPoints()
-			this.parent:Point(this.positionOverride, this, this.positionOverride)
-		end
-		this:ClearAllPoints()
-		this:Point(newAnchor, SV.UIParent, newAnchor, cX, cY)
-		SV:SaveMovableLoc(moveName)
-		if SVUI_MentaloPrecision then
-			SV:MentaloFocusUpdate(this)
-		end
-		UpdateFrameTarget = nil;
-		_G["SVUI_MentaloEventHandler"]:Hide()
-		if dragStopFunc  ~= nil and type(dragStopFunc) == "function" then
-			dragStopFunc(this, Pinpoint(this))
-		end
-		this:SetUserPlaced(false)
-		DisableTheHand()
-	end)

-	frame:SetScript("OnSizeChanged", Mentalo_OnSizeChanged)
+	self.Frames[moveName].Avatar = movable;
+	Sticky.Frames[#Sticky.Frames + 1] = movable;
+
+	frame:SetScript("OnSizeChanged", Movable_OnSizeChanged)
 	frame.Avatar = movable;
 	frame:ClearAllPoints()
 	frame:SetPoint(anchor1, movable, 0, 0)

-	local u = movable:CreateFontString(nil, "OVERLAY")
-	u:SetFontTemplate()
-	u:SetJustifyH("CENTER")
-	u:SetPoint("CENTER")
-	u:SetText(title or moveName)
-	u:SetTextColor(unpack(SV.Media.color.highlight))
-
-	movable:SetFontString(u)
-	movable.text = u;
-	movable:SetScript("OnEnter", function(this)
-		if userHolding then return end
-		this:SetAlpha(1)
-		this.text:SetTextColor(1, 1, 1)
-		UpdateFrameTarget = this;
-		_G["SVUI_MentaloEventHandler"]:GetScript("OnUpdate")(_G["SVUI_MentaloEventHandler"])
-		SVUI_Mentalo.Avatar:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-ON]])
-		TheHand_SetPos(this)
-		theHand:Show()
-		if CurrentFrameTarget  ~= this then
-			SVUI_MentaloPrecision:Hide()
-			SV.MovableFocused(this)
-		end
-	end)
-	movable:SetScript("OnMouseDown", function(this, arg)
-		if arg == "RightButton"then
-			userHolding = false;
-			SVUI_MentaloPrecision:Show()
-			if SV.db.general.stickyFrames then
-				Sticky:StopMoving(this)
-			else
-				this:StopMovingOrSizing()
-			end
-		end
-	end)
-	movable:SetScript("OnLeave", function(this)
-		if userHolding then return end
-		this:SetAlpha(0.4)
-		this.text:SetTextColor(unpack(SV.Media.color.highlight))
-		SVUI_Mentalo.Avatar:SetTexture([[Interface\AddOns\SVUI\assets\artwork\Doodads\MENTALO-OFF]])
-		theHand:Hide()
-	end)
-	movable:SetScript("OnShow", function(this)this:SetBackdropBorderColor(unpack(SV.Media.color.highlight))end)
+	local mtext = movable:CreateFontString(nil, "OVERLAY")
+	mtext:SetFontTemplate()
+	mtext:SetJustifyH("CENTER")
+	mtext:SetPoint("CENTER")
+	mtext:SetText(title or moveName)
+	mtext:SetTextColor(0.1, 0.8, 0.8)
+
+	movable:SetFontString(mtext)
+	movable.text = mtext;
+
+	movable:RegisterForDrag("LeftButton", "RightButton")
+	movable:SetScript("OnMouseUp", Movable_OnMouseUp)
+	movable:SetScript("OnDragStart", Movable_OnDragStart)
+	movable:SetScript("OnDragStop", Movable_OnDragStop)
+	movable:SetScript("OnEnter", Movable_OnEnter)
+	movable:SetScript("OnMouseDown", Movable_OnMouseDown)
+	movable:SetScript("OnLeave", Movable_OnLeave)
+	movable:SetScript("OnShow", Movable_OnShow)
+
 	movable:SetMovable(true)
 	movable:Hide()
-	if dragStopFunc  ~= nil and type(dragStopFunc) == "function"then
+
+	if dragStopFunc ~= nil and type(dragStopFunc) == "function" then
 		movable:RegisterEvent("PLAYER_ENTERING_WORLD")
 		movable:SetScript("OnEvent", function(this, event)
-			dragStopFunc(movable, Pinpoint(movable))
+			local point = Pinpoint(this)
+			dragStopFunc(this, point)
 			this:UnregisterAllEvents()
 		end)
 	end
-	SV.MentaloFrames[moveName].Created = true
-end
---[[
-##########################################################
-GLOBAL/MODULE FUNCTIONS
-##########################################################
-]]--
-function SV:MentaloForced(frame)
-	if _G[frame] and _G[frame]:GetScript("OnDragStop") then
-		_G[frame]:GetScript("OnDragStop")(_G[frame])
-	end
-end

-function SV:TestMovableMoved(frame)
-	if AnchorCache and AnchorCache[frame] then
+	self.Frames[moveName].Created = true
+end
+
+function Mentalo:HasMoved(frame)
+	if self.Anchors and self.Anchors[frame] then
 		return true
 	else
 		return false
 	end
 end

-function SV:SaveMovableLoc(frame)
+function Mentalo:SaveMovable(frame)
 	if not _G[frame] then return end
-	if not AnchorCache then
-		AnchorCache = {}
+	if not self.Anchors then
+		self.Anchors = {}
 	end
-	AnchorCache[frame] = FindLoc(_G[frame])
+	self.Anchors[frame] = CurrentPosition(_G[frame])
 end

-function SV:SetSnapOffset(frame, snapOffset)
-	if not _G[frame] or not SV.MentaloFrames[frame] then return end
-	SV.MentaloFrames[frame].Avatar.snapOffset = snapOffset or -2;
-	SV.MentaloFrames[frame]["snapoffset"] = snapOffset or -2
+function Mentalo:ChangeSnapOffset(frame, snapOffset)
+	if not _G[frame] or not self.Frames[frame] then return end
+	self.Frames[frame].Avatar.snapOffset = snapOffset or -2;
+	self.Frames[frame]["snapoffset"] = snapOffset or -2
 end

-function SV:SaveMovableOrigin(frame)
-	if not _G[frame] then return end
-	SV.MentaloFrames[frame]["point"] = FindLoc(_G[frame])
-	SV.MentaloFrames[frame]["postdrag"](_G[frame], Pinpoint(_G[frame]))
-end
-
-function SV:SetSVMovable(frame, title, raised, snapOffset, dragStopFunc, movableGroup, overrideName)
+function Mentalo:Add(frame, title, raised, snapOffset, dragStopFunc, movableGroup, overrideName)
 	if(not frame or (not overrideName and not frame:GetName())) then return end
 	local frameName = overrideName or frame:GetName()
 	local moveName = ("%s_MOVE"):format(frameName)
 	if not movableGroup then movableGroup = "ALL, GENERAL" end
-	if SV.MentaloFrames[moveName] == nil then
-		SV.MentaloFrames[moveName] = {}
-		SV.MentaloFrames[moveName]["parent"] = frame;
-		SV.MentaloFrames[moveName]["text"] = title;
-		SV.MentaloFrames[moveName]["overlay"] = raised;
-		SV.MentaloFrames[moveName]["postdrag"] = dragStopFunc;
-		SV.MentaloFrames[moveName]["snapoffset"] = snapOffset;
-		SV.MentaloFrames[moveName]["point"] = FindLoc(frame)
-		SV.MentaloFrames[moveName]["type"] = {}
+	if self.Frames[moveName] == nil then
+		self.Frames[moveName] = {}
+		self.Frames[moveName]["parent"] = frame;
+		self.Frames[moveName]["text"] = title;
+		self.Frames[moveName]["overlay"] = raised;
+		self.Frames[moveName]["postdrag"] = dragStopFunc;
+		self.Frames[moveName]["snapoffset"] = snapOffset;
+		self.Frames[moveName]["point"] = CurrentPosition(frame)
+		self.Frames[moveName]["type"] = {}
 		local group = {split(", ", movableGroup)}
 		for i = 1, #group do
 			local this = group[i]
-			SV.MentaloFrames[moveName]["type"][this] = true
+			self.Frames[moveName]["type"][this] = true
 		end
-	end
-	SetSVMovable(frame, moveName, title, raised, snapOffset, dragStopFunc)
-end
+	end

-function SV:ToggleMovables(enabled, configType)
-	for frameName, _ in pairs(SV.MentaloFrames)do
-		if(_G[frameName]) then
-			local movable = _G[frameName]
-			if(not enabled) then
-				movable:Hide()
-			else
-				if SV.MentaloFrames[frameName]["type"][configType]then
-					movable:Show()
-				else
-					movable:Hide()
-				end
-			end
+	self:New(frame, moveName, title, raised, snapOffset, dragStopFunc)
+
+	local ghost;
+	for entry,_ in pairs(self.Frames) do
+		ghost = _G[entry]
+		if(ghost) then
+			ghost:SetAlpha(0.5)
 		end
 	end
-end
+end

-function SV:ResetMovables(request)
+function Mentalo:Reset(request)
 	if request == "" or request == nil then
-		for name, _ in pairs(SV.MentaloFrames)do
+		for name, _ in pairs(self.Frames)do
 			local frame = _G[name];
-			if SV.MentaloFrames[name]["point"] then
-				local u, v, w, x, y = split("\031", SV.MentaloFrames[name]["point"])
+			if self.Frames[name]["point"] then
+				local u, v, w, x, y = split("\031", self.Frames[name]["point"])
 				frame:ClearAllPoints()
 				frame:SetPoint(u, v, w, x, y)
-				for arg, func in pairs(SV.MentaloFrames[name])do
+				for arg, func in pairs(self.Frames[name])do
 					if arg == "postdrag" and type(func) == "function" then
 						func(frame, Pinpoint(frame))
 					end
 				end
 			end
 		end
-		MentaloCache:Reset("anchors")
+		wipe(self.Anchors)
 	else
-		for name, _ in pairs(SV.MentaloFrames)do
-			if SV.MentaloFrames[name]["point"] then
-				for arg1, arg2 in pairs(SV.MentaloFrames[name])do
+		for name, _ in pairs(self.Frames)do
+			if self.Frames[name]["point"] then
+				for arg1, arg2 in pairs(self.Frames[name])do
 					local mover;
 					if arg1 == "text" then
 						if request == arg2 then
 							local frame = _G[name]
-							local u, v, w, x, y = split("\031", SV.MentaloFrames[name]["point"])
+							local u, v, w, x, y = split("\031", self.Frames[name]["point"])
 							frame:ClearAllPoints()
 							frame:SetPoint(u, v, w, x, y)
-							if AnchorCache then
-								AnchorCache[name] = nil
+							if self.Anchors then
+								self.Anchors[name] = nil
 							end
-							if (SV.MentaloFrames[name]["postdrag"] ~= nil and type(SV.MentaloFrames[name]["postdrag"]) == "function")then
-								SV.MentaloFrames[name]["postdrag"](frame, Pinpoint(frame))
+							if (self.Frames[name]["postdrag"] ~= nil and type(self.Frames[name]["postdrag"]) == "function")then
+								self.Frames[name]["postdrag"](frame, Pinpoint(frame))
 							end
 						end
 					end
@@ -701,17 +643,17 @@ function SV:ResetMovables(request)
 	end
 end

-function SV:SetSVMovablesPositions()
-	for name, _ in pairs(SV.MentaloFrames)do
+function Mentalo:SetPositions()
+	for name, _ in pairs(self.Frames)do
 		local frame = _G[name];
 		local anchor1, parent, anchor2, x, y;
 		if frame then
-			if (AnchorCache and AnchorCache[name] and type(AnchorCache[name]) == "string") then
-				anchor1, parent, anchor2, x, y = split("\031", AnchorCache[name])
+			if (self.Anchors and self.Anchors[name] and type(self.Anchors[name]) == "string") then
+				anchor1, parent, anchor2, x, y = split("\031", self.Anchors[name])
 				frame:ClearAllPoints()
 				frame:SetPoint(anchor1, parent, anchor2, x, y)
-			elseif SV.MentaloFrames[name]["point"] then
-				anchor1, parent, anchor2, x, y = split("\031", SV.MentaloFrames[name]["point"])
+			elseif self.Frames[name]["point"] then
+				anchor1, parent, anchor2, x, y = split("\031", self.Frames[name]["point"])
 				frame:ClearAllPoints()
 				frame:SetPoint(anchor1, parent, anchor2, x, y)
 			end
@@ -719,10 +661,10 @@ function SV:SetSVMovablesPositions()
 	end
 end

-function SV:LoadMovables()
-	for name, _ in pairs(self.MentaloFrames)do
+function Mentalo:Initialize()
+	for name, _ in pairs(self.Frames)do
 		local parent, text, overlay, snapoffset, postdrag;
-		for key, value in pairs(self.MentaloFrames[name])do
+		for key, value in pairs(self.Frames[name])do
 			if(key == "parent") then
 				parent = value
 			elseif(key == "text") then
@@ -735,12 +677,11 @@ function SV:LoadMovables()
 				postdrag = value
 			end
 		end
-		self:SetMentaloAlphas()
-		SetSVMovable(parent, name, text, overlay, snapoffset, postdrag)
+		self:New(parent, name, text, overlay, snapoffset, postdrag)
 	end
 end

-function SV:UseMentalo(isConfigMode, configType)
+function Mentalo:Toggle(isConfigMode, configType)
 	if(InCombatLockdown()) then return end
 	local enabled = false;
 	if(isConfigMode  ~= nil and isConfigMode  ~= "") then
@@ -768,116 +709,61 @@ function SV:UseMentalo(isConfigMode, configType)

 	if(not configType or (configType and type(configType)  ~= "string")) then
 		configType = "ALL"
-	end
+	end

-	self:ToggleMovables(enabled, configType)
+	for frameName, _ in pairs(self.Frames)do
+		if(_G[frameName]) then
+			local movable = _G[frameName]
+			if(not enabled) then
+				movable:Hide()
+			else
+				if self.Frames[frameName]["type"][configType]then
+					movable:Show()
+				else
+					movable:Hide()
+				end
+			end
+		end
+	end
 end

-function SV:MentaloFocus()
+function Mentalo:Focus()
 	local frame = CurrentFrameTarget;
-	local s, t, u = GrabUsableRegions()
-	local v, w = frame:GetCenter()
-	local x;
-	local y = s / 3;
-	local z = s * 2 / 3;
-	local A = t / 2;
-	if w >= A then x = "TOP"else x = "BOTTOM"end
-	if v >= z then x = x.."RIGHT"elseif v <= y then x = x.."LEFT"end
-	v = tonumber(SVUI_MentaloPrecisionSetX.CurrentValue)
-	w = tonumber(SVUI_MentaloPrecisionSetY.CurrentValue)
+	local xOffset, yOffset, anchor = CalculateOffsets()
 	frame:ClearAllPoints()
-	frame:Point(x, SV.UIParent, x, v, w)
-	SV:SaveMovableLoc(frame.name)
-end
-
-function SV:MentaloFocusUpdate(frame)
-	local s, t, u = GrabUsableRegions()
-	local v, w = frame:GetCenter()
-	local y = (s / 3);
-	local z = ((s * 2) / 3);
-	local A = (t / 2);
-	if w  >= A then w = -(t - frame:GetTop())else w = frame:GetBottom()end
-	if v >= z then v = (frame:GetRight() - s) elseif v  <= y then v = frame:GetLeft()else v = (v - u) end
-	v = parsefloat(v, 0)
-	w = parsefloat(w, 0)
-	SVUI_MentaloPrecisionSetX:SetText(v)
-	SVUI_MentaloPrecisionSetY:SetText(w)
-	SVUI_MentaloPrecisionSetX.CurrentValue = v;
-	SVUI_MentaloPrecisionSetY.CurrentValue = w;
-	SVUI_MentaloPrecision.Title:SetText(frame.textString)
-end
+	frame:Point(anchor, SV.UIParent, anchor, xOffset, yOffset)
+	self:SaveMovable(frame.name)
+end

-function SV:MovableFocused()
-	CurrentFrameTarget = self;
-	SV:MentaloFocusUpdate(self)
-end
+function Mentalo:Launch()
+	SVUI_Mentalo:SetFixedPanelTemplate("Component")
+	SVUI_Mentalo:SetPanelColor("yellow")
+	SVUI_MentaloPrecision:SetPanelTemplate("Transparent")

-function SV:SetMentaloAlphas()
-	hooksecurefunc(SV, "SetSVMovable", function(_, frame)
-		frame.Avatar:SetAlpha(0.5)
-	end)
-	ghost(SV.MentaloFrames, 0.5)
+	self.Anchors = SVLib:NewCache("Anchors")
 end

-function SV:InitializeMentalo()
-	MentaloCache = SVLib:NewCache("Mentalo")
-	AnchorCache = SVLib:NewCache("Anchors")
-	MentaloMover:SetScript("OnEvent", Movable_OnEvent)
-end
+SV.Mentalo = Mentalo
 --[[
 ##########################################################
 XML FRAME SCRIPT HANDLERS
 ##########################################################
 ]]--
-function SVUI_MentaloEventHandler_Update(self)
-	_G["SVUI_MentaloEventHandler"] = self;
-	local frame = UpdateFrameTarget;
-	local rightPos, topPos, centerPos = GrabUsableRegions()
-	local centerX, centerY = frame:GetCenter()
-	local calc1 = rightPos  /  3;
-	local calc2 = ((rightPos  *  2)  /  3);
-	local calc3 = topPos  /  2;
-	local anchor1, anchor2;
-	if centerY  >= calc3 then
-		anchor1 = "TOP"
-		anchor2 = "BOTTOM"
-		centerY = -(topPos - frame:GetTop())
-	else
-		anchor1 = "BOTTOM"
-		anchor2 = "TOP"
-		centerY = frame:GetBottom()
-	end
-	if centerX  >= calc2 then
-		anchor1 = "RIGHT"
-		anchor2 = "LEFT"
-		centerX = (frame:GetRight() - rightPos)
-	elseif centerX  <= calc1 then
-		anchor1 = "LEFT"
-		anchor2 = "RIGHT"
-		centerX = frame:GetLeft()
-	else
-		centerX = (centerX - centerPos)
-	end
-	SVUI_MentaloPrecision:ClearAllPoints()
-	SVUI_MentaloPrecision:SetPoint(anchor1, frame, anchor2, 0, 0)
-	SV:MentaloFocusUpdate(frame)
-end
-
-function SVUI_Mentalo_OnLoad()
-	_G["SVUI_Mentalo"]:RegisterEvent("PLAYER_REGEN_DISABLED")
-	_G["SVUI_Mentalo"]:RegisterForDrag("LeftButton");
-	_G["SVUI_Mentalo"]:SetButtonTemplate()
+function SVUI_Mentalo_OnLoad(self)
+	self:RegisterEvent("PLAYER_REGEN_DISABLED")
+	self:RegisterForDrag("LeftButton");
+	self:SetButtonTemplate()
 end

-function SVUI_Mentalo_OnEvent()
-	if _G["SVUI_Mentalo"]:IsShown() then
-		_G["SVUI_Mentalo"]:Hide()
-		SV:UseMentalo(true)
+function SVUI_Mentalo_OnEvent(self)
+	if self:IsShown() then
+		self:Hide()
+		SV.Mentalo:Toggle(true)
 	end
 end

 function SVUI_MentaloLockButton_OnClick()
-	SV:UseMentalo(true)
+	SV.Mentalo:Toggle(true)
 	if IsAddOnLoaded("SVUI_ConfigOMatic")then
 		LibStub("AceConfigDialog-3.0"):Open("SVUI")
 	end
@@ -885,7 +771,7 @@ end

 function SVUI_MentaloPrecisionResetButton_OnClick()
 	local name = CurrentFrameTarget.name
-	SV:ResetMovables(name)
+	SV.Mentalo:Reset(name)
 end

 function SVUI_MentaloPrecisionInput_EscapePressed(self)
@@ -897,7 +783,7 @@ function SVUI_MentaloPrecisionInput_EnterPressed(self)
 	local txt = tonumber(self:GetText())
 	if(txt) then
 		self.CurrentValue = txt;
-		SV:MentaloFocus()
+		SV.Mentalo:Focus()
 	end
 	self:SetText(parsefloat(self.CurrentValue))
 	EditBox_ClearFocus(self)
@@ -923,4 +809,44 @@ function SVUI_MentaloPrecision_OnLoad()
 	_G["SVUI_MentaloPrecisionLeftButton"]:SetButtonTemplate()
 	_G["SVUI_MentaloPrecisionRightButton"]:SetButtonTemplate()
 	CurrentFrameTarget = false;
-end
\ No newline at end of file
+end
+--[[
+##########################################################
+EVENT HANDLER
+##########################################################
+]]--
+local MentaloEventHandler_OnUpdate = function(self)
+	local frame = UpdateFrameTarget;
+	if not frame then return end
+	local rightPos, topPos, centerPos = GrabUsableRegions()
+	local centerX, centerY = frame:GetCenter()
+	local calc1 = rightPos  /  3;
+	local calc2 = ((rightPos  *  2)  /  3);
+	local calc3 = topPos  /  2;
+	local anchor1, anchor2;
+	if centerY  >= calc3 then
+		anchor1 = "TOP"
+		anchor2 = "BOTTOM"
+		centerY = -(topPos - frame:GetTop())
+	else
+		anchor1 = "BOTTOM"
+		anchor2 = "TOP"
+		centerY = frame:GetBottom()
+	end
+	if centerX  >= calc2 then
+		anchor1 = "RIGHT"
+		anchor2 = "LEFT"
+		centerX = (frame:GetRight() - rightPos)
+	elseif centerX  <= calc1 then
+		anchor1 = "LEFT"
+		anchor2 = "RIGHT"
+		centerX = frame:GetLeft()
+	else
+		centerX = (centerX - centerPos)
+	end
+	SVUI_MentaloPrecision:ClearAllPoints()
+	SVUI_MentaloPrecision:SetPoint(anchor1, frame, anchor2, 0, 0)
+	Movable_OnMouseUp(frame)
+end
+
+MentaloEventHandler:SetScript("OnUpdate", MentaloEventHandler_OnUpdate)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/system/mentalo.xml b/Interface/AddOns/SVUI/system/mentalo.xml
index 57c4409..ab55fac 100644
--- a/Interface/AddOns/SVUI/system/mentalo.xml
+++ b/Interface/AddOns/SVUI/system/mentalo.xml
@@ -1,31 +1,6 @@
 <Ui xmlns="http://www.blizzard.com/wow/ui/">
     <Script file="mentalo.lua"/>

-    <Frame name="SVUI_MoveEventHandler" hidden="true">
-        <Scripts>
-            <OnLoad>
-                self:RegisterEvent("PLAYER_LOGIN")
-                self:RegisterEvent("ADDON_LOADED")
-                self:RegisterEvent("LFG_UPDATE")
-                self:RegisterEvent("ROLE_POLL_BEGIN")
-                self:RegisterEvent("READY_CHECK")
-                self:RegisterEvent("UPDATE_WORLD_STATES")
-                self:RegisterEvent("WORLD_STATE_TIMER_START")
-                self:RegisterEvent("WORLD_STATE_UI_TIMER_UPDATE")
-            </OnLoad>
-            <OnEvent function="SVUI_MoveEventHandler_OnEvent"/>
-        </Scripts>
-    </Frame>
-
-    <Frame name="SVUI_MentaloEventHandler" hidden="true">
-        <Scripts>
-            <OnLoad>
-                self.UpdateFrameTarget = false;
-            </OnLoad>
-            <OnUpdate function="SVUI_MentaloEventHandler_Update"/>
-        </Scripts>
-    </Frame>
-
     <Frame name="SVUI_MentaloPrecision" inherits="SVUI_PanelTemplate" hidden="true" frameStrata="DIALOG">
         <Size x="130" y="60"/>
         <Anchors>
diff --git a/Interface/AddOns/SVUI/system/moveable.lua b/Interface/AddOns/SVUI/system/moveable.lua
new file mode 100644
index 0000000..00c384a
--- /dev/null
+++ b/Interface/AddOns/SVUI/system/moveable.lua
@@ -0,0 +1,176 @@
+--[[
+##############################################################################
+_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_       #
+ ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__      #
+  __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____     #
+   ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____    #
+    ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____   #
+     _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____  #
+      __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ #
+       _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_#
+        ___\///////////___________\///___________\/////////_____\///////////_#
+##############################################################################
+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 math 		= _G.math;
+--[[ STRING METHODS ]]--
+local format, split = string.format, string.split;
+--[[ MATH METHODS ]]--
+local min, floor = math.min, math.floor;
+local parsefloat = math.parsefloat;
+--[[
+##########################################################
+GET ADDON DATA
+##########################################################
+]]--
+local SVUI_ADDON_NAME, SV = ...
+local SVLib = LibStub("LibSuperVillain-1.0")
+local L = SVLib:Lang();
+
+local Movable = CreateFrame("Frame", nil)
+Movable.Frames = {}
+--[[
+##########################################################
+LOCAL VARS
+##########################################################
+]]--
+local DraggableFrames = {
+	"AchievementFrame",
+	"AuctionFrame",
+	"ArchaeologyFrame",
+	"BattlefieldMinimap",
+	"BarberShopFrame",
+	"BlackMarketFrame",
+	"CalendarFrame",
+	"CharacterFrame",
+	"ClassTrainerFrame",
+	"DressUpFrame",
+	"EncounterJournal",
+	"FriendsFrame",
+	"GameMenuFrame",
+	"GMSurveyFrame",
+	"GossipFrame",
+	"GuildFrame",
+	"GuildBankFrame",
+	"GuildRegistrarFrame",
+	"HelpFrame",
+	"InterfaceOptionsFrame",
+	"ItemUpgradeFrame",
+	"KeyBindingFrame",
+	"LFGDungeonReadyPopup",
+	"MacOptionsFrame",
+	"MacroFrame",
+	"MailFrame",
+	"MerchantFrame",
+	"PlayerTalentFrame",
+	"PetJournalParent",
+	"PVEFrame",
+	"PVPFrame",
+	"QuestFrame",
+	"QuestLogFrame",
+	"RaidBrowserFrame",
+	"ReadyCheckFrame",
+	"ReforgingFrame",
+	"ReportCheatingDialog",
+	"ReportPlayerNameDialog",
+	"RolePollPopup",
+	"ScrollOfResurrectionSelectionFrame",
+	"SpellBookFrame",
+	"TabardFrame",
+	"TaxiFrame",
+	"TimeManagerFrame",
+	"TradeSkillFrame",
+	"TradeFrame",
+	"TransmorgifyFrame",
+	"TutorialFrame",
+	"VideoOptionsFrame",
+	"VoidStorageFrame",
+	--"WorldStateAlwaysUpFrame"
+};
+--[[
+##########################################################
+LOCAL FUNCTIONS
+##########################################################
+]]--
+local BlizzardFrame_OnUpdate = function(self)
+	if InCombatLockdown() or self:GetName() == "GameMenuFrame" then return end
+	if self.IsMoving then return end
+	self:ClearAllPoints()
+	if self:GetName() == "QuestFrame" then
+		if Movable.Frames["GossipFrame"].Points  ~= nil then
+			self:SetPoint(unpack(Movable.Frames["GossipFrame"].Points))
+		end
+	elseif Movable.Frames[self:GetName()].Points  ~= nil then
+		self:SetPoint(unpack(Movable.Frames[self:GetName()].Points))
+	end
+end
+
+local BlizzardFrame_OnDragStart = function(self)
+	print(self:GetName())
+	if not self:IsMovable() then return end
+	self:StartMoving()
+	self.IsMoving = true
+end
+
+local BlizzardFrame_OnDragStop = function(self)
+	if not self:IsMovable() then return end
+	self.IsMoving = false;
+	self:StopMovingOrSizing()
+	if self:GetName() == "GameMenuFrame" then return end
+	local anchor1, parent, anchor2, x, y = self:GetPoint()
+	parent = self:GetParent():GetName()
+	self:ClearAllPoints()
+	self:SetPoint(anchor1, parent, anchor2, x, y)
+	if self:GetName() == "QuestFrame" then
+		Movable.Frames["GossipFrame"].Points = {anchor1, parent, anchor2, x, y}
+	else
+		Movable.Frames[self:GetName()].Points = {anchor1, parent, anchor2, x, y}
+	end
+end
+
+local Movable_OnEvent = function(self)
+	for _, frameName in pairs(DraggableFrames) do
+		local frame = _G[frameName]
+		if(frame) then
+			if(frameName ~= "LossOfControlFrame" and (not Movable.Frames[frameName])) then
+				frame:EnableMouse(true)
+
+				if(frameName == "LFGDungeonReadyPopup") then
+					LFGDungeonReadyDialog:EnableMouse(false)
+				end
+
+				frame:SetMovable(true)
+				frame:RegisterForDrag("LeftButton")
+				frame:SetClampedToScreen(true)
+				frame:HookScript("OnUpdate", BlizzardFrame_OnUpdate)
+				frame:SetScript("OnDragStart", BlizzardFrame_OnDragStart)
+				frame:SetScript("OnDragStop", BlizzardFrame_OnDragStop)
+				Movable.Frames[frameName] = {}
+			end
+		end
+	end
+	if(not Movable.Frames["GameMenuFrame"]) then
+		Movable.Frames["GameMenuFrame"] = {}
+	end
+end
+
+Movable:RegisterEvent("PLAYER_LOGIN")
+Movable:RegisterEvent("ADDON_LOADED")
+Movable:RegisterEvent("LFG_UPDATE")
+Movable:RegisterEvent("ROLE_POLL_BEGIN")
+Movable:RegisterEvent("READY_CHECK")
+Movable:RegisterEvent("UPDATE_WORLD_STATES")
+Movable:RegisterEvent("WORLD_STATE_TIMER_START")
+Movable:RegisterEvent("WORLD_STATE_UI_TIMER_UPDATE")
+
+Movable:SetScript("OnEvent", Movable_OnEvent)
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/system/setup.lua b/Interface/AddOns/SVUI/system/setup.lua
index 961cc36..83f638e 100644
--- a/Interface/AddOns/SVUI/system/setup.lua
+++ b/Interface/AddOns/SVUI/system/setup.lua
@@ -1214,104 +1214,105 @@ local function BarShuffle()
 	local tH = SV.db.SVBar.Bar1.buttonsize  +  (base - bS);
 	local b2h = bar2 and tH or base;
 	local sph = (400 - b2h);
-	if not SVUI_Cache.anchors then SVUI_Cache.anchors = {} end
-	SVUI_Cache.anchors.SVUI_SpecialAbility_MOVE = "BOTTOMSVUIParentBOTTOM0"..sph;
-	SVUI_Cache.anchors.SVUI_ActionBar2_MOVE = "BOTTOMSVUI_ActionBar1TOP0"..(-bS);
-	SVUI_Cache.anchors.SVUI_ActionBar3_MOVE = "BOTTOMLEFTSVUI_ActionBar1BOTTOMRIGHT40";
-	SVUI_Cache.anchors.SVUI_ActionBar5_MOVE = "BOTTOMRIGHTSVUI_ActionBar1BOTTOMLEFT-40";
+	local anchors = SV.Mentalo.Anchors
+	if not anchors then anchors = {} end
+	anchors.SVUI_SpecialAbility_MOVE = "BOTTOMSVUIParentBOTTOM0"..sph;
+	anchors.SVUI_ActionBar2_MOVE = "BOTTOMSVUI_ActionBar1TOP0"..(-bS);
+	anchors.SVUI_ActionBar3_MOVE = "BOTTOMLEFTSVUI_ActionBar1BOTTOMRIGHT40";
+	anchors.SVUI_ActionBar5_MOVE = "BOTTOMRIGHTSVUI_ActionBar1BOTTOMLEFT-40";
 	if bar2 then
-		SVUI_Cache.anchors.SVUI_PetActionBar_MOVE = "BOTTOMLEFTSVUI_ActionBar2TOPLEFT04"
-		SVUI_Cache.anchors.SVUI_StanceBar_MOVE = "BOTTOMRIGHTSVUI_ActionBar2TOPRIGHT04";
+		anchors.SVUI_PetActionBar_MOVE = "BOTTOMLEFTSVUI_ActionBar2TOPLEFT04"
+		anchors.SVUI_StanceBar_MOVE = "BOTTOMRIGHTSVUI_ActionBar2TOPRIGHT04";
 	else
-		SVUI_Cache.anchors.SVUI_PetActionBar_MOVE = "BOTTOMLEFTSVUI_ActionBar1TOPLEFT04"
-		SVUI_Cache.anchors.SVUI_StanceBar_MOVE = "BOTTOMRIGHTSVUI_ActionBar1TOPRIGHT04";
+		anchors.SVUI_PetActionBar_MOVE = "BOTTOMLEFTSVUI_ActionBar1TOPLEFT04"
+		anchors.SVUI_StanceBar_MOVE = "BOTTOMRIGHTSVUI_ActionBar1TOPRIGHT04";
 	end
 end

 local function UFMoveBottomQuadrant(toggle)
-	if not SVUI_Cache.anchors then SVUI_Cache.anchors = {} end
+	local anchors = SV.Mentalo.Anchors
 	if not toggle then
-		SVUI_Cache.anchors.SVUI_Player_MOVE = "BOTTOMSVUIParentBOTTOM-278182"
-		SVUI_Cache.anchors.SVUI_PlayerCastbar_MOVE = "BOTTOMSVUIParentBOTTOM-278122"
-		SVUI_Cache.anchors.SVUI_Target_MOVE = "BOTTOMSVUIParentBOTTOM278182"
-		SVUI_Cache.anchors.SVUI_TargetCastbar_MOVE = "BOTTOMSVUIParentBOTTOM278122"
-		SVUI_Cache.anchors.SVUI_Pet_MOVE = "BOTTOMSVUIParentBOTTOM0181"
-		SVUI_Cache.anchors.SVUI_TargetTarget_MOVE = "BOTTOMSVUIParentBOTTOM0214"
-		SVUI_Cache.anchors.SVUI_Focus_MOVE = "BOTTOMSVUIParentBOTTOM310432"
-		SVUI_Cache.anchors.SVUI_ThreatBar_MOVE = "BOTTOMRIGHTSVUIParentBOTTOMRIGHT-495182"
+		anchors.SVUI_Player_MOVE = "BOTTOMSVUIParentBOTTOM-278182"
+		anchors.SVUI_PlayerCastbar_MOVE = "BOTTOMSVUIParentBOTTOM-278122"
+		anchors.SVUI_Target_MOVE = "BOTTOMSVUIParentBOTTOM278182"
+		anchors.SVUI_TargetCastbar_MOVE = "BOTTOMSVUIParentBOTTOM278122"
+		anchors.SVUI_Pet_MOVE = "BOTTOMSVUIParentBOTTOM0181"
+		anchors.SVUI_TargetTarget_MOVE = "BOTTOMSVUIParentBOTTOM0214"
+		anchors.SVUI_Focus_MOVE = "BOTTOMSVUIParentBOTTOM310432"
+		anchors.SVUI_ThreatBar_MOVE = "BOTTOMRIGHTSVUIParentBOTTOMRIGHT-495182"
 	elseif toggle == "shift" then
-		SVUI_Cache.anchors.SVUI_Player_MOVE = "BOTTOMSVUIParentBOTTOM-278210"
-		SVUI_Cache.anchors.SVUI_PlayerCastbar_MOVE = "BOTTOMSVUIParentBOTTOM-278150"
-		SVUI_Cache.anchors.SVUI_Target_MOVE = "BOTTOMSVUIParentBOTTOM278210"
-		SVUI_Cache.anchors.SVUI_TargetCastbar_MOVE = "BOTTOMSVUIParentBOTTOM278150"
-		SVUI_Cache.anchors.SVUI_Pet_MOVE = "BOTTOMSVUIParentBOTTOM0209"
-		SVUI_Cache.anchors.SVUI_TargetTarget_MOVE = "BOTTOMSVUIParentBOTTOM0242"
-		SVUI_Cache.anchors.SVUI_Focus_MOVE = "BOTTOMSVUIParentBOTTOM310432"
-		SVUI_Cache.anchors.SVUI_ThreatBar_MOVE = "BOTTOMRIGHTSVUIParentBOTTOMRIGHT-495210"
+		anchors.SVUI_Player_MOVE = "BOTTOMSVUIParentBOTTOM-278210"
+		anchors.SVUI_PlayerCastbar_MOVE = "BOTTOMSVUIParentBOTTOM-278150"
+		anchors.SVUI_Target_MOVE = "BOTTOMSVUIParentBOTTOM278210"
+		anchors.SVUI_TargetCastbar_MOVE = "BOTTOMSVUIParentBOTTOM278150"
+		anchors.SVUI_Pet_MOVE = "BOTTOMSVUIParentBOTTOM0209"
+		anchors.SVUI_TargetTarget_MOVE = "BOTTOMSVUIParentBOTTOM0242"
+		anchors.SVUI_Focus_MOVE = "BOTTOMSVUIParentBOTTOM310432"
+		anchors.SVUI_ThreatBar_MOVE = "BOTTOMRIGHTSVUIParentBOTTOMRIGHT-495210"
 	else
 		local c = 136;
 		local d = 135;
 		local e = 80;
-		SVUI_Cache.anchors.SVUI_Player_MOVE = "BOTTOMSVUIParentBOTTOM"..-c..""..d;
-		SVUI_Cache.anchors.SVUI_PlayerCastbar_MOVE = "BOTTOMSVUIParentBOTTOM"..-c..""..(d-60);
-		SVUI_Cache.anchors.SVUI_Target_MOVE = "BOTTOMSVUIParentBOTTOM"..c..""..d;
-		SVUI_Cache.anchors.SVUI_TargetCastbar_MOVE = "BOTTOMSVUIParentBOTTOM"..c..""..(d-60);
-		SVUI_Cache.anchors.SVUI_Pet_MOVE = "BOTTOMSVUIParentBOTTOM"..-c..""..e;
-		SVUI_Cache.anchors.SVUI_TargetTarget_MOVE = "BOTTOMSVUIParentBOTTOM"..c..""..e;
-		SVUI_Cache.anchors.SVUI_Focus_MOVE = "BOTTOMSVUIParentBOTTOM"..c..""..(d + 150);
-		SVUI_Cache.anchors.SVUI_ThreatBar_MOVE = "BOTTOMRIGHTSVUIParentBOTTOMRIGHT-495"..d;
+		anchors.SVUI_Player_MOVE = "BOTTOMSVUIParentBOTTOM"..-c..""..d;
+		anchors.SVUI_PlayerCastbar_MOVE = "BOTTOMSVUIParentBOTTOM"..-c..""..(d-60);
+		anchors.SVUI_Target_MOVE = "BOTTOMSVUIParentBOTTOM"..c..""..d;
+		anchors.SVUI_TargetCastbar_MOVE = "BOTTOMSVUIParentBOTTOM"..c..""..(d-60);
+		anchors.SVUI_Pet_MOVE = "BOTTOMSVUIParentBOTTOM"..-c..""..e;
+		anchors.SVUI_TargetTarget_MOVE = "BOTTOMSVUIParentBOTTOM"..c..""..e;
+		anchors.SVUI_Focus_MOVE = "BOTTOMSVUIParentBOTTOM"..c..""..(d + 150);
+		anchors.SVUI_ThreatBar_MOVE = "BOTTOMRIGHTSVUIParentBOTTOMRIGHT-495"..d;
 	end
 end

 local function UFMoveLeftQuadrant(toggle)
-	if not SVUI_Cache.anchors then SVUI_Cache.anchors = {} end
+	local anchors = SV.Mentalo.Anchors
 	if not toggle then
-		SVUI_Cache.anchors.SVUI_Assist_MOVE = "TOPLEFTSVUIParentTOPLEFT"..XOFF.."-250"
-		SVUI_Cache.anchors.SVUI_Tank_MOVE = "TOPLEFTSVUIParentTOPLEFT"..XOFF.."-175"
-		SVUI_Cache.anchors.SVUI_Raidpet_MOVE = "TOPLEFTSVUIParentTOPLEFT"..XOFF.."-325"
-		SVUI_Cache.anchors.SVUI_Party_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT"..XOFF.."400"
-		SVUI_Cache.anchors.SVUI_Raid10_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT"..XOFF.."400"
-		SVUI_Cache.anchors.SVUI_Raid25_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT"..XOFF.."400"
-		SVUI_Cache.anchors.SVUI_Raid40_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT"..XOFF.."400"
+		anchors.SVUI_Assist_MOVE = "TOPLEFTSVUIParentTOPLEFT"..XOFF.."-250"
+		anchors.SVUI_Tank_MOVE = "TOPLEFTSVUIParentTOPLEFT"..XOFF.."-175"
+		anchors.SVUI_Raidpet_MOVE = "TOPLEFTSVUIParentTOPLEFT"..XOFF.."-325"
+		anchors.SVUI_Party_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT"..XOFF.."400"
+		anchors.SVUI_Raid10_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT"..XOFF.."400"
+		anchors.SVUI_Raid25_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT"..XOFF.."400"
+		anchors.SVUI_Raid40_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT"..XOFF.."400"
 	else
-		SVUI_Cache.anchors.SVUI_Assist_MOVE = "TOPLEFTSVUIParentTOPLEFT4-250"
-		SVUI_Cache.anchors.SVUI_Tank_MOVE = "TOPLEFTSVUIParentTOPLEFT4-175"
-		SVUI_Cache.anchors.SVUI_Raidpet_MOVE = "TOPLEFTSVUIParentTOPLEFT4-325"
-		SVUI_Cache.anchors.SVUI_Party_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT4300"
-		SVUI_Cache.anchors.SVUI_Raid40_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT4300"
-		SVUI_Cache.anchors.SVUI_Raid10_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT4300"
-		SVUI_Cache.anchors.SVUI_Raid25_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT4300"
+		anchors.SVUI_Assist_MOVE = "TOPLEFTSVUIParentTOPLEFT4-250"
+		anchors.SVUI_Tank_MOVE = "TOPLEFTSVUIParentTOPLEFT4-175"
+		anchors.SVUI_Raidpet_MOVE = "TOPLEFTSVUIParentTOPLEFT4-325"
+		anchors.SVUI_Party_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT4300"
+		anchors.SVUI_Raid40_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT4300"
+		anchors.SVUI_Raid10_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT4300"
+		anchors.SVUI_Raid25_MOVE = "BOTTOMLEFTSVUIParentBOTTOMLEFT4300"
 	end
 end

 local function UFMoveTopQuadrant(toggle)
-	if not SVUI_Cache.anchors then SVUI_Cache.anchors = {} end
+	local anchors = SV.Mentalo.Anchors
 	if not toggle then
-		SVUI_Cache.anchors.GM_MOVE = "TOPLEFTSVUIParentTOPLEFT250-25"
-		SVUI_Cache.anchors.SVUI_LootFrame_MOVE = "BOTTOMSVUIParentBOTTOM0350"
-		SVUI_Cache.anchors.SVUI_AltPowerBar_MOVE = "TOPSVUIParentTOP0-40"
-		SVUI_Cache.anchors.LoC_MOVE = "BOTTOMSVUIParentBOTTOM0350"
-		SVUI_Cache.anchors.BNET_MOVE = "TOPRIGHTSVUIParentTOPRIGHT-4-250"
+		anchors.GM_MOVE = "TOPLEFTSVUIParentTOPLEFT250-25"
+		anchors.SVUI_LootFrame_MOVE = "BOTTOMSVUIParentBOTTOM0350"
+		anchors.SVUI_AltPowerBar_MOVE = "TOPSVUIParentTOP0-40"
+		anchors.LoC_MOVE = "BOTTOMSVUIParentBOTTOM0350"
+		anchors.BNET_MOVE = "TOPRIGHTSVUIParentTOPRIGHT-4-250"
 	else
-		SVUI_Cache.anchors.GM_MOVE = "TOPLEFTSVUIParentTOPLEFT344-25"
-		SVUI_Cache.anchors.SVUI_LootFrame_MOVE = "BOTTOMSVUIParentBOTTOM0254"
-		SVUI_Cache.anchors.SVUI_AltPowerBar_MOVE = "TOPSVUIParentTOP0-39"
-		SVUI_Cache.anchors.LoC_MOVE = "BOTTOMSVUIParentBOTTOM0443"
-		SVUI_Cache.anchors.BNET_MOVE = "TOPRIGHTSVUIParentTOPRIGHT-4-248"
+		anchors.GM_MOVE = "TOPLEFTSVUIParentTOPLEFT344-25"
+		anchors.SVUI_LootFrame_MOVE = "BOTTOMSVUIParentBOTTOM0254"
+		anchors.SVUI_AltPowerBar_MOVE = "TOPSVUIParentTOP0-39"
+		anchors.LoC_MOVE = "BOTTOMSVUIParentBOTTOM0443"
+		anchors.BNET_MOVE = "TOPRIGHTSVUIParentTOPRIGHT-4-248"
 	end
 end

 local function UFMoveRightQuadrant(toggle)
-	if not SVUI_Cache.anchors then SVUI_Cache.anchors = {} end
+	local anchors = SV.Mentalo.Anchors
 	local dH = SV.db.SVDock.dockRightHeight  +  60
 	if not toggle or toggle == "high" then
-		SVUI_Cache.anchors.SVUI_BossHolder_MOVE = "RIGHTSVUIParentRIGHT-1050"
-		SVUI_Cache.anchors.SVUI_ArenaHolder_MOVE = "RIGHTSVUIParentRIGHT-1050"
-		SVUI_Cache.anchors.Tooltip_MOVE = "BOTTOMRIGHTSVUIParentBOTTOMRIGHT-284"..dH;
+		anchors.SVUI_BossHolder_MOVE = "RIGHTSVUIParentRIGHT-1050"
+		anchors.SVUI_ArenaHolder_MOVE = "RIGHTSVUIParentRIGHT-1050"
+		anchors.Tooltip_MOVE = "BOTTOMRIGHTSVUIParentBOTTOMRIGHT-284"..dH;
 	else
-		SVUI_Cache.anchors.SVUI_BossHolder_MOVE = "RIGHTSVUIParentRIGHT-1050"
-		SVUI_Cache.anchors.SVUI_ArenaHolder_MOVE = "RIGHTSVUIParentRIGHT-1050"
-		SVUI_Cache.anchors.Tooltip_MOVE = "BOTTOMRIGHTSVUIParentBOTTOMRIGHT-284"..dH;
+		anchors.SVUI_BossHolder_MOVE = "RIGHTSVUIParentRIGHT-1050"
+		anchors.SVUI_ArenaHolder_MOVE = "RIGHTSVUIParentRIGHT-1050"
+		anchors.Tooltip_MOVE = "BOTTOMRIGHTSVUIParentBOTTOMRIGHT-284"..dH;
 	end
 end

@@ -1431,8 +1432,8 @@ local function InitializeChatFrames(mungs)
 	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
+			if SV.SVDock.Cache.RightSuperDockFaded  == true then RightSuperDockToggleButton:Click()end
+			if SV.SVDock.Cache.LeftSuperDockFaded  == true then LeftSuperDockToggleButton:Click()end
 		end
 		SV:SavedPopup()
 	end
@@ -1441,13 +1442,12 @@ end
 local function SetUserScreen(rez, preserve)
 	if not preserve then
 		if okToResetMOVE then
-			SV:ResetMovables("")
+			SV.Mentalo:Reset("")
 			okToResetMOVE = false;
 		end
-		SV.SVUnit:ResetData()
+		SV:ResetData("SVUnit")
 	end

-	if not SVUI_Cache.anchors then SVUI_Cache.anchors = {} end
 	if rez == "low" then
 		if not preserve then
 			SV.db.SVDock.dockLeftWidth = 350;
@@ -1483,8 +1483,8 @@ local function SetUserScreen(rez, preserve)
 		end
 		SV.ghettoMonitor = true
 	else
-		SV.SVDock:ResetData()
-		SV.SVAura:ResetData()
+		SV:ResetData("SVDock")
+		SV:ResetData("SVAura")
 		if not mungs then
 			UFMoveBottomQuadrant()
 			UFMoveLeftQuadrant()
@@ -1496,7 +1496,7 @@ local function SetUserScreen(rez, preserve)

 	if(not preserve and not mungs) then
 		BarShuffle()
-    	SV:SetSVMovablesPositions()
+    	SV.Mentalo:SetPositions()
 		SVLib:Update('SVDock')
 		SVLib:Update('SVAura')
 		SVLib:Update('SVBar')
@@ -1553,13 +1553,11 @@ end
 local function SetUnitframeLayout(style, preserve)
 	style = style or "default";

-	if not SVUI_Cache.anchors then SVUI_Cache.anchors = {} end
-
 	if not preserve then
-		SV.SVUnit:ResetData()
-		SV.SVStats:ResetData()
+		SV:ResetData("SVUnit")
+		SV:ResetData("SVStats")
 		if okToResetMOVE then
-			SV:ResetMovables('')
+			SV.Mentalo:Reset('')
 			okToResetMOVE = false
 		end
 	end
@@ -1578,7 +1576,7 @@ local function SetUnitframeLayout(style, preserve)
 			else
 				UFMoveBottomQuadrant()
 			end
-			SV:SetSVMovablesPositions()
+			SV.Mentalo:SetPositions()
 		end
 		SVLib:Update('SVStats')
 		SVLib:Update('SVUnit')
@@ -1605,11 +1603,10 @@ end
 local function SetupBarLayout(style, preserve)
 	style = style or "default";

-	if not SVUI_Cache.anchors then SVUI_Cache.anchors = {} end
 	if not preserve then
-		SV.SVBar:ResetData()
+		SV:ResetData("SVBar")
 		if okToResetMOVE then
-			SV:ResetMovables('')
+			SV.Mentalo:Reset('')
 			okToResetMOVE=false
 		end
 	end
@@ -1627,7 +1624,7 @@ local function SetupBarLayout(style, preserve)
 		end
 		if(not preserve) then
 			BarShuffle()
-			SV:SetSVMovablesPositions()
+			SV.Mentalo:SetPositions()
 		end
 		SVLib:Update('SVStats')
 		SVLib:Update('SVBar')
@@ -1664,7 +1661,7 @@ local function PlayThemeSong()
 end

 local function InstallComplete()
-	SVUI_Profile.SAFEDATA.install_version = SV.Version;
+	SVLib:SaveSafeData("install_version", SV.Version)
 	StopMusic()
 	SetCVar("Sound_MusicVolume",user_music_vol)
 	okToResetMOVE = false;
@@ -1683,7 +1680,7 @@ local function InstallMungsChoice()
 	SV.db.LAYOUT.barstyle = nil;
 	SetupBarLayout();
 	SetupAuralayout();
-	SVUI_Profile.SAFEDATA.install_version = SV.Version;
+	SVLib:SaveSafeData("install_version", SV.Version)
 	StopMusic()
 	SetCVar("Sound_MusicVolume",user_music_vol)
 	ReloadUI()
@@ -1747,7 +1744,7 @@ local function SetPage(newPage)
 	]]--
 	ShowLayout()
 	if newPage == 1 then
-		local hasOldConfig = SVUI_Profile.SAFEDATA.install_version
+		local hasOldConfig = SVLib:GetSafeData("install_version")
 		SVUI_InstallPrevButton:Disable()
 		SVUI_InstallPrevButton:Hide()
 		okToResetMOVE = true
@@ -2024,12 +2021,6 @@ local function PreviousPage()
 		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()
@@ -2037,7 +2028,7 @@ function Setup:Reset()
 	okToResetMOVE = false;
 	InitializeChatFrames(true);
 	SVLib:WipeDatabase()
-	SetUserScreen();
+	SetUserScreen()

 	if SV.db.LAYOUT.mediastyle then
         SetColorTheme(SV.db.LAYOUT.mediastyle)
@@ -2067,8 +2058,8 @@ function Setup:Reset()
     	SetupAuralayout()
     end

-	SVUI_Profile.SAFEDATA.install_version = SV.Version;
-	ResetGlobalVariables()
+    SVLib:WipeCache()
+	SVLib:SaveSafeData("install_version", SV.Version);
 	ReloadUI()
 end

@@ -2077,7 +2068,7 @@ function Setup:Install(autoLoaded)
 		user_music_vol = GetCVar("Sound_MusicVolume")
 	end

-	local old = SVUI_Profile.SAFEDATA
+	local old = SVLib:GetSafeData()
     local media = old.mediastyle or ""
     local bars = old.barstyle or ""
     local units = old.unitstyle or ""
diff --git a/Interface/AddOns/SVUI/system/slash.lua b/Interface/AddOns/SVUI/system/slash.lua
index 1213c4e..493bd8f 100644
--- a/Interface/AddOns/SVUI/system/slash.lua
+++ b/Interface/AddOns/SVUI/system/slash.lua
@@ -48,7 +48,7 @@ local function SVUIMasterCommand(msg)
 		if (msg == "install") then
 			SV.Setup:Install()
 		elseif (msg == "move" or msg == "mentalo") then
-			SV:UseMentalo()
+			SV.Mentalo:Toggle()
 		elseif (msg == "kb" or msg == "bind") and SV.db.SVBar.enable then
 			SV.SVBar:ToggleKeyBindingMode()
 		elseif (msg == "reset" or msg == "resetui") then
diff --git a/Interface/AddOns/SVUI_ArtOfWar/SVUI_ArtOfWar.lua b/Interface/AddOns/SVUI_ArtOfWar/SVUI_ArtOfWar.lua
index 06aa8f5..ca4db9e 100644
--- a/Interface/AddOns/SVUI_ArtOfWar/SVUI_ArtOfWar.lua
+++ b/Interface/AddOns/SVUI_ArtOfWar/SVUI_ArtOfWar.lua
@@ -547,9 +547,10 @@ function PLUGIN:UpdateCommunicator()
 end

 function PLUGIN:UpdateZoneStatus()
+	if PLUGIN.ZoneTimer then return end
 	local zoneText = GetRealZoneText() or GetZoneText()
 	if(not zoneText or zoneText == "") then
-		self.ZoneTimer = SV.Timers:ExecuteTimer(PLUGIN.UpdateZoneStatus, 5)
+		PLUGIN.ZoneTimer = SV.Timers:ExecuteTimer(PLUGIN.UpdateZoneStatus, 5)
 		return
 	end
 	if(zoneText ~= ACTIVE_ZONE) then
@@ -576,6 +577,7 @@ function PLUGIN:UpdateZoneStatus()
 			end
 		end
 	end
+	PLUGIN.ZoneTimer = nil
 end

 local function ParseIncomingLog(timestamp, event, eGuid, eName, pGuid)
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/SVUI_ConfigOMatic.lua b/Interface/AddOns/SVUI_ConfigOMatic/SVUI_ConfigOMatic.lua
index 26a4ac9..e95bf49 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/SVUI_ConfigOMatic.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/SVUI_ConfigOMatic.lua
@@ -170,7 +170,7 @@ SV.Options.args.primary = {
 					type = "execute",
 					name = L["Move Frames"],
 					desc = L["Unlock various elements of the UI to be repositioned."],
-					func = function() SV:UseMentalo() end
+					func = function() SV.Mentalo:Toggle() end
 				},
 				ResetAllMovers = {
 					order = 5,
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/bar.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/bar.lua
index 6e07bca..056aabd 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/bar.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/bar.lua
@@ -83,7 +83,7 @@ local function BarConfigLoader()
 					desc = L["Restore the actionbars default settings"],
 					func = function()
 						MOD.db:Reset("Bar"..d)
-						SV:ResetMovables("Bar "..d)
+						SV.Mentalo:Reset("Bar "..d)
 						MOD:RefreshBar("Bar"..d)
 					end,
 					disabled = function()return not SV.db.SVBar["Bar"..d].enable end,
@@ -329,7 +329,7 @@ local function BarConfigLoader()
 				desc = L["Restore the actionbars default settings"],
 				func = function()
 					MOD.db:Reset("Pet")
-					SV:ResetMovables("Pet Bar")
+					SV.Mentalo:Reset("Pet Bar")
 					MOD:RefreshBar("Pet")
 				end,
 				disabled = function()return not SV.db.SVBar["Pet"].enable end,
@@ -482,7 +482,7 @@ local function BarConfigLoader()
 				desc = L["Restore the actionbars default settings"],
 				func = function()
 					SVLib:SetDefault("SVBar","Stance")
-					SV:ResetMovables("Stance Bar")
+					SV.Mentalo:Reset("Stance Bar")
 					MOD:RefreshBar("Stance")
 				end,
 				disabled = function()return not SV.db.SVBar["Stance"].enable end,
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/profiles.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/profiles.lua
index 6914aa3..e01449a 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/profiles.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/profiles.lua
@@ -133,12 +133,12 @@ SV.Options.args.profiles = {
 			name = "",
 			width = "full",
 		},
-		dualSpecEnabled = {
+		dualSpec = {
 			order = 14,
 			type = "toggle",
 			name = "Dual-Spec Switching",
-			get = function() return SVLib:GetSafeData("dualSpecEnabled") end,
-			set = function(key, value) SVLib:SaveSafeData("dualSpecEnabled", value) end,
+			get = function() return SVLib:CheckDualProfile() end,
+			set = function(key, value) SVLib:ToggleDualProfile(value) end,
 		},
 	}
 }
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/focus.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/focus.lua
index 6dc7b4c..1707c3b 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/focus.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/focus.lua
@@ -48,7 +48,7 @@ SV.Options.args.SVUnit.args.focus = {
 	set = function(l, m)MOD:ChangeDBVar(m, l[#l], "focus");MOD:SetUnitFrame("focus")end,
 	args = {
 		enable = {type = "toggle", order = 1, name = L["Enable"]},
-		resetSettings = {type = "execute", order = 2, name = L["Restore Defaults"], func = function(l, m)MOD:ResetUnitOptions("focus");SV:ResetMovables("Focus Frame")end},
+		resetSettings = {type = "execute", order = 2, name = L["Restore Defaults"], func = function(l, m)MOD:ResetUnitOptions("focus");SV.Mentalo:Reset("Focus Frame")end},
 		tabGroups = {
 			order = 3,
 			type = "group",
@@ -161,7 +161,7 @@ SV.Options.args.SVUnit.args.focustarget = {
 	set = function(l, m)MOD:ChangeDBVar(m, l[#l], "focustarget");MOD:SetUnitFrame("focustarget")end,
 	args = {
 		enable = {type = "toggle", order = 1, name = L["Enable"]},
-		resetSettings = {type = "execute", order = 2, name = L["Restore Defaults"], func = function(l, m)MOD:ResetUnitOptions("focustarget")SV:ResetMovables("FocusTarget Frame")end},
+		resetSettings = {type = "execute", order = 2, name = L["Restore Defaults"], func = function(l, m)MOD:ResetUnitOptions("focustarget")SV.Mentalo:Reset("FocusTarget Frame")end},
 		tabGroups = {
 			order = 3,
 			type = "group",
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/other.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/other.lua
index 96ef690..f6bb01c 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/other.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/other.lua
@@ -49,7 +49,7 @@ SV.Options.args.SVUnit.args.boss = {
 	args = {
 		enable = {type = "toggle", order = 1, name = L["Enable"]},
 		displayFrames = {type = "execute", order = 2, name = L["Display Frames"], desc = L["Force the frames to show, they will act as if they are the player frame."], func = function()MOD:SwapElement("boss", 4)end},
-		resetSettings = {type = "execute", order = 3, name = L["Restore Defaults"], func = function(l, m)MOD:ResetUnitOptions("boss")SV:ResetMovables("Boss Frames")end},
+		resetSettings = {type = "execute", order = 3, name = L["Restore Defaults"], func = function(l, m)MOD:ResetUnitOptions("boss")SV.Mentalo:Reset("Boss Frames")end},
 		tabGroups = {
 			order = 3,
 			type = "group",
@@ -118,7 +118,7 @@ SV.Options.args.SVUnit.args.arena = {
 	args = {
 		enable = {type = "toggle", order = 1, name = L["Enable"]},
 		displayFrames = {type = "execute", order = 2, name = L["Display Frames"], desc = L["Force the frames to show, they will act as if they are the player frame."], func = function()MOD:SwapElement("arena", 5)end},
-		resetSettings = {type = "execute", order = 3, name = L["Restore Defaults"], func = function(l, m)MOD:ResetUnitOptions("arena")SV:ResetMovables("Arena Frames")end},
+		resetSettings = {type = "execute", order = 3, name = L["Restore Defaults"], func = function(l, m)MOD:ResetUnitOptions("arena")SV.Mentalo:Reset("Arena Frames")end},
 		tabGroups = {
 			order = 3,
 			type = "group",
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/party.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/party.lua
index 43952c5..2ddde96 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/party.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/party.lua
@@ -61,7 +61,7 @@ SV.Options.args.SVUnit.args.party = {
 			type = 'execute',
 			order = 3,
 			name = L['Restore Defaults'],
-			func = function(l, m)MOD:ResetUnitOptions('party')SV:ResetMovables('Party Frames')end,
+			func = function(l, m)MOD:ResetUnitOptions('party')SV.Mentalo:Reset('Party Frames')end,
 		},
 		tabGroups= {
 			order=3,
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/pet.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/pet.lua
index bbbaed3..7d11fc5 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/pet.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/pet.lua
@@ -48,7 +48,7 @@ SV.Options.args.SVUnit.args.pet = {
 	set = function(l, m)MOD:ChangeDBVar(m, l[#l], "pet");MOD:SetUnitFrame("pet")end,
 	args = {
 		enable = {type = "toggle", order = 1, name = L["Enable"]},
-		resetSettings = {type = "execute", order = 2, name = L["Restore Defaults"], func = function(l, m)MOD:ResetUnitOptions("pet")SV:ResetMovables("Pet Frame")end},
+		resetSettings = {type = "execute", order = 2, name = L["Restore Defaults"], func = function(l, m)MOD:ResetUnitOptions("pet")SV.Mentalo:Reset("Pet Frame")end},
 		tabGroups = {
 			order = 3,
 			type = "group",
@@ -159,7 +159,7 @@ SV.Options.args.SVUnit.args.pettarget = {
 	set = function(l, m)MOD:ChangeDBVar(m, l[#l], "pettarget");MOD:SetUnitFrame("pettarget")end,
 	args = {
 		enable = {type = "toggle", order = 1, name = L["Enable"]},
-		resetSettings = {type = "execute", order = 2, name = L["Restore Defaults"], func = function(l, m)MOD:ResetUnitOptions("pettarget")SV:ResetMovables("PetTarget Frame")end},
+		resetSettings = {type = "execute", order = 2, name = L["Restore Defaults"], func = function(l, m)MOD:ResetUnitOptions("pettarget")SV.Mentalo:Reset("PetTarget Frame")end},
 		tabGroups = {
 			order = 3,
 			type = "group",
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/player.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/player.lua
index f181254..e1f897b 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/player.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/player.lua
@@ -58,7 +58,7 @@ SV.Options.args.SVUnit.args.player={
 			name = L['Restore Defaults'],
 			func = function(l,m)
 				MOD:ResetUnitOptions('player')
-				SV:ResetMovables('Player Frame')
+				SV.Mentalo:Reset('Player Frame')
 			end
 		},
 		tabGroups = {
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/raid.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/raid.lua
index 7006bca..68d07cb 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/raid.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/raid.lua
@@ -62,7 +62,7 @@ for w=10,40,15 do
 				type = "execute",
 				order = 3,
 				name = L["Restore Defaults"],
-				func = function(l, m)MOD:ResetUnitOptions("raid" .. w)SV:ResetMovables("Raid 1-" .. w .. " Frames")end,
+				func = function(l, m)MOD:ResetUnitOptions("raid" .. w)SV.Mentalo:Reset("Raid 1-" .. w .. " Frames")end,
 			},
 			tabGroups = {
 				order = 3,
@@ -447,7 +447,7 @@ SV.Options.args.SVUnit.args.raidpet ={
 			type = 'execute',
 			order = 3,
 			name = L['Restore Defaults'],
-			func = function(l, m)MOD:ResetUnitOptions('raidpet')SV:ResetMovables('Raid Pet Frames')MOD:SetGroupFrame('raidpet', nil, nil, true)end,
+			func = function(l, m)MOD:ResetUnitOptions('raidpet')SV.Mentalo:Reset('Raid Pet Frames')MOD:SetGroupFrame('raidpet', nil, nil, true)end,
 		},
 		tabGroups={
 			order=3,
diff --git a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/target.lua b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/target.lua
index ca18836..d32874d 100644
--- a/Interface/AddOns/SVUI_ConfigOMatic/modules/units/target.lua
+++ b/Interface/AddOns/SVUI_ConfigOMatic/modules/units/target.lua
@@ -48,7 +48,7 @@ SV.Options.args.SVUnit.args.target={
 	set=function(l,m)MOD:ChangeDBVar(m, l[#l], "target");MOD:SetUnitFrame('target')end,
 	args={
 		enable={type='toggle',order=1,name=L['Enable']},
-		resetSettings={type='execute',order=2,name=L['Restore Defaults'],func=function(l,m)MOD:ResetUnitOptions('target')SV:ResetMovables('Target Frame')end},
+		resetSettings={type='execute',order=2,name=L['Restore Defaults'],func=function(l,m)MOD:ResetUnitOptions('target')SV.Mentalo:Reset('Target Frame')end},
 		tabGroups={
 			order=3,
 			type='group',
@@ -213,7 +213,7 @@ SV.Options.args.SVUnit.args.targettarget={
 	set=function(l,m)MOD:ChangeDBVar(m, l[#l], "targettarget");MOD:SetUnitFrame('targettarget')end,
 	args={
 		enable={type='toggle',order=1,name=L['Enable']},
-		resetSettings={type='execute',order=2,name=L['Restore Defaults'],func=function(l,m)MOD:ResetUnitOptions('targettarget')SV:ResetMovables('TargetTarget Frame')end},
+		resetSettings={type='execute',order=2,name=L['Restore Defaults'],func=function(l,m)MOD:ResetUnitOptions('targettarget')SV.Mentalo:Reset('TargetTarget Frame')end},
 		tabGroups={
 			order=3,
 			type='group',
diff --git a/Interface/AddOns/SVUI_Laborer/modes/farming.lua b/Interface/AddOns/SVUI_Laborer/modes/farming.lua
index a0d993a..29b0865 100644
--- a/Interface/AddOns/SVUI_Laborer/modes/farming.lua
+++ b/Interface/AddOns/SVUI_Laborer/modes/farming.lua
@@ -589,7 +589,7 @@ function MOD:PrepareFarmingTools()
 			seedBar:SetPoint("TOPRIGHT", _G["FarmSeedBarAnchor"], "TOPRIGHT", (horizontal and 0 or -((BUTTONSIZE + BUTTONSPACE) * i)), (horizontal and -((BUTTONSIZE + BUTTONSPACE) * i) or 0))
 			seedBar.ButtonSize = BUTTONSIZE;
 		end
-		SV:SetSVMovable(farmSeedBarAnchor, "Farming Seeds")
+		SV.Mentalo:Add(farmSeedBarAnchor, "Farming Seeds")

 		-- FARM TOOLS
 		local farmToolBarAnchor = CreateFrame("Frame", "FarmToolBarAnchor", SV.UIParent)
@@ -599,7 +599,7 @@ function MOD:PrepareFarmingTools()
 		farmToolBar:Size(horizontal and ((BUTTONSIZE + BUTTONSPACE) * 4) or (BUTTONSIZE + BUTTONSPACE), horizontal and (BUTTONSIZE + BUTTONSPACE) or ((BUTTONSIZE + BUTTONSPACE) * 4))
 		farmToolBar:SetPoint("TOPRIGHT", farmToolBarAnchor, "TOPRIGHT", (horizontal and -BUTTONSPACE or -(BUTTONSIZE + BUTTONSPACE)), (horizontal and -(BUTTONSIZE + BUTTONSPACE) or -BUTTONSPACE))
 		farmToolBar.ButtonSize = BUTTONSIZE;
-		SV:SetSVMovable(farmToolBarAnchor, "Farming Tools")
+		SV.Mentalo:Add(farmToolBarAnchor, "Farming Tools")

 		-- PORTALS
 		local farmPortalBarAnchor = CreateFrame("Frame", "FarmPortalBarAnchor", SV.UIParent)
@@ -609,6 +609,6 @@ function MOD:PrepareFarmingTools()
 		farmPortalBar:Size(horizontal and ((BUTTONSIZE + BUTTONSPACE) * 4) or (BUTTONSIZE + BUTTONSPACE), horizontal and (BUTTONSIZE + BUTTONSPACE) or ((BUTTONSIZE + BUTTONSPACE) * 4))
 		farmPortalBar:SetPoint("TOPRIGHT", farmPortalBarAnchor, "TOPRIGHT", (horizontal and -BUTTONSPACE or -(BUTTONSIZE + BUTTONSPACE)), (horizontal and -(BUTTONSIZE + BUTTONSPACE) or -BUTTONSPACE))
 		farmPortalBar.ButtonSize = BUTTONSIZE;
-		SV:SetSVMovable(farmPortalBarAnchor, "Farming Portals")
+		SV.Mentalo:Add(farmPortalBarAnchor, "Farming Portals")
 	end
 end
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI_StyleOMatic/SVUI_StyleOMatic.lua b/Interface/AddOns/SVUI_StyleOMatic/SVUI_StyleOMatic.lua
index 0c5d962..b5c9489 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/SVUI_StyleOMatic.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/SVUI_StyleOMatic.lua
@@ -262,8 +262,6 @@ function PLUGIN:PLAYER_ENTERING_WORLD(event, ...)
 			self:Style(name, fn, event, ...)
 		end
 	end
-
-	collectgarbage("collect")
 end

 function PLUGIN:ADDON_LOADED(event, addon)
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/archeology.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/archeology.lua
index 00e9bec..03128d8 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/archeology.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/archeology.lua
@@ -25,7 +25,7 @@ ARCHEOLOGYFRAME STYLER
 local progressBarHolder = CreateFrame("Frame", "SVUI_ArcheologyProgressBar", nil)
 progressBarHolder:SetSize(240, 24)
 progressBarHolder:SetPoint("BOTTOM", CastingBarFrame, "TOP", 0, 10)
-SV:SetSVMovable(progressBarHolder, "Archeology Progress Bar")
+SV.Mentalo:Add(progressBarHolder, "Archeology Progress Bar")

 local function ArchaeologyStyle()
 	if SV.db.SVStyle.blizzard.enable ~= true or SV.db.SVStyle.blizzard.archaeology ~= true then return end
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/encounterjournal.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/encounterjournal.lua
index 1de787b..c667ef4 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/encounterjournal.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/encounterjournal.lua
@@ -25,7 +25,7 @@ local PVP_LOST = [[Interface\WorldMap\Skull_64Red]]

 local function Tab_OnEnter(this)
   this.backdrop:SetPanelColor("highlight")
-  this.backdrop:SetBackdropBorderColor(unpack(SV.Media.color.highlight))
+  this.backdrop:SetBackdropBorderColor(0.1, 0.8, 0.8)
 end

 local function Tab_OnLeave(this)
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/spellbook.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/spellbook.lua
index de686ad..cba9e52 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/spellbook.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/spellbook.lua
@@ -65,8 +65,8 @@ HELPERS
 ##########################################################
 ]]--
 local function Tab_OnEnter(this)
-	this.backdrop:SetBackdropColor(unpack(SV.Media.color.highlight))
-	this.backdrop:SetBackdropBorderColor(unpack(SV.Media.color.highlight))
+	this.backdrop:SetBackdropColor(0.1, 0.8, 0.8)
+	this.backdrop:SetBackdropBorderColor(0.1, 0.8, 0.8)
 end

 local function Tab_OnLeave(this)
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/supervillain.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/supervillain.lua
index 01530b6..da9b217 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/supervillain.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/supervillain.lua
@@ -41,7 +41,7 @@ local ProxyType = {
 }

 local function Widget_OnEnter(b)
-	b:SetBackdropBorderColor(unpack(SV.Media.color.highlight))
+	b:SetBackdropBorderColor(0.1, 0.8, 0.8)
 end

 local function Widget_OnLeave(b)
diff --git a/Interface/AddOns/SVUI_StyleOMatic/addons/talents.lua b/Interface/AddOns/SVUI_StyleOMatic/addons/talents.lua
index b677fb5..9f90deb 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/addons/talents.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/addons/talents.lua
@@ -31,7 +31,7 @@ local SpecButtonList = {

 local function Tab_OnEnter(this)
 	this.backdrop:SetPanelColor("highlight")
-	this.backdrop:SetBackdropBorderColor(unpack(SV.Media.color.highlight))
+	this.backdrop:SetBackdropBorderColor(0.1, 0.8, 0.8)
 end

 local function Tab_OnLeave(this)
diff --git a/Interface/AddOns/SVUI_StyleOMatic/common/methods.lua b/Interface/AddOns/SVUI_StyleOMatic/common/methods.lua
index f31ad44..7cd2c58 100644
--- a/Interface/AddOns/SVUI_StyleOMatic/common/methods.lua
+++ b/Interface/AddOns/SVUI_StyleOMatic/common/methods.lua
@@ -109,7 +109,7 @@ end
 ##########################################################
 ]]--
 local Button_OnEnter = function(self)
-    self:SetBackdropColor(unpack(SV.Media.color.highlight))
+    self:SetBackdropColor(0.1, 0.8, 0.8)
 end

 local Button_OnLeave = function(self)
@@ -122,7 +122,7 @@ function STYLE:ApplyButtonStyle(this)
 end

 local ArrowButton_OnEnter = function(self)
-    self:SetBackdropBorderColor(unpack(SV.Media.color.highlight))
+    self:SetBackdropBorderColor(0.1, 0.8, 0.8)
 end

 local ArrowButton_OnLeave = function(self)
@@ -147,7 +147,7 @@ end

 --[[ CLOSE BUTTON ]]--
 local CloseButton_OnEnter = function(self)
-    self:SetBackdropBorderColor(unpack(SV.Media.color.highlight))
+    self:SetBackdropBorderColor(0.1, 0.8, 0.8)
 end

 local CloseButton_OnLeave = function(self)
@@ -364,7 +364,7 @@ end
 --]]
 local Tab_OnEnter = function(self)
 	self.backdrop:SetPanelColor("highlight")
-	self.backdrop:SetBackdropBorderColor(unpack(SV.Media.color.highlight))
+	self.backdrop:SetBackdropBorderColor(0.1, 0.8, 0.8)
 end

 local Tab_OnLeave = function(self)