diff --git a/esoui/ingame/group/zo_groupingtools_shared.lua b/esoui/ingame/group/zo_groupingtools_shared.lua
deleted file mode 100755
index 4e02ed5..0000000
--- a/esoui/ingame/group/zo_groupingtools_shared.lua
+++ /dev/null
@@ -1,514 +0,0 @@
-local ACTIVITY_DATA = {
-    [LFG_ACTIVITY_CYRODIIL] = {
-        name = GetString("SI_LFGACTIVITY", LFG_ACTIVITY_CYRODIIL),
-        type = LFG_ACTIVITY_CYRODIIL,
-
-        texture = "EsoUI/Art/LFG/Keyboard/LFG_activityArt_cyrodiil_keyboard.dds",
-        textureGamepad = "EsoUI/Art/LFG/Gamepad/LFG_activityArt_cyrodiil_gamepad.dds",
-    },
-    [LFG_ACTIVITY_IMPERIAL_CITY] = {
-        name = GetString("SI_LFGACTIVITY", LFG_ACTIVITY_IMPERIAL_CITY),
-        type = LFG_ACTIVITY_IMPERIAL_CITY,
-
-        texture = "EsoUI/Art/LFG/Keyboard/LFG_activityArt_imperialCity_keyboard.dds",
-        textureGamepad = "EsoUI/Art/LFG/Gamepad/LFG_activityArt_imperialCity_gamepad.dds",
-    },
-    [LFG_ACTIVITY_DUNGEON] = {
-        name = GetString("SI_LFGACTIVITY", LFG_ACTIVITY_DUNGEON),
-        type = LFG_ACTIVITY_DUNGEON,
-
-        texture = "EsoUI/Art/LFG/Keyboard/LFG_activityArt_dungeon_keyboard.dds",
-        textureGamepad = "EsoUI/Art/LFG/Gamepad/LFG_activityArt_dungeon_gamepad.dds",
-
-        allText = GetString(SI_LFG_ANY_DUNGEON),
-        allDescription = GetString(SI_LFG_ANY_DUNGEON_DESCRIPTION),
-    },
-    [LFG_ACTIVITY_MASTER_DUNGEON] = {
-        name = GetString("SI_LFGACTIVITY", LFG_ACTIVITY_MASTER_DUNGEON),
-        type = LFG_ACTIVITY_MASTER_DUNGEON,
-
-        texture = "EsoUI/Art/LFG/Keyboard/LFG_activityArt_vetDungeon_keyboard.dds",
-        textureGamepad = "EsoUI/Art/LFG/Gamepad/LFG_activityArt_vetDungeon_gamepad.dds",
-
-        allText = GetString(SI_LFG_ANY_VETERAN_DUNGEON),
-        allDescription = GetString(SI_LFG_ANY_VETERAN_DUNGEON_DESCRIPTION),
-    },
-}
-
-local NO_TEXTURE_FILE = "/esoui/art/icons/icon_missing.dds"
-
-ZO_GROUP_TYPE_TO_SIZE = {
-    [LFG_GROUP_TYPE_REGULAR] = SMALL_GROUP_SIZE_THRESHOLD,
-    [LFG_GROUP_TYPE_MEDIUM] = RAID_GROUP_SIZE_THRESHOLD,
-    [LFG_GROUP_TYPE_LARGE] = GROUP_SIZE_MAX,
-}
-
-LFG_LOCATIONS_ALL_INDEX = 1
-local FIRST_LOCATION_INDEX = 2
-
-
-function LFGLevelSort(entry1, entry2)
-    if entry1.veteranRankMin ~= entry2.veteranRankMin then
-        return entry1.veteranRankMin < entry2.veteranRankMin
-    elseif entry1.levelMin ~= entry2.levelMin then
-        return entry1.levelMin < entry2.levelMin
-    elseif entry1.veteranRankMax ~= entry2.veteranRankMax then
-        return entry1.veteranRankMax < entry2.veteranRankMax
-    elseif entry1.levelMax ~= entry2.levelMax then
-        return entry1.levelMax < entry2.levelMax
-    else
-        return entry1.name < entry2.name
-    end
-end
-
-local function CreateLocationData(activityType, lfgIndex)
-    local name, levelMin, levelMax, veteranRankMin, veteranRankMax, groupType, passedReqs, description, descriptionTexture, descriptionTextureGamepad = GetLFGOption(activityType, lfgIndex)
-
-    --Default to 'all' art if one doesn't exist for this location
-    if descriptionTexture == NO_TEXTURE_FILE then
-        descriptionTexture = ACTIVITY_DATA[activityType].texture
-    end
-    if descriptionTextureGamepad == NO_TEXTURE_FILE then
-        descriptionTextureGamepad = ACTIVITY_DATA[activityType].textureGamepad
-    end
-
-    return {
-        name = zo_strformat(SI_LFG_ACTIVITY_NAME, name),
-        rawName = name,
-        description = description,
-        descriptionTexture = descriptionTexture,
-        descriptionTextureGamepad = descriptionTextureGamepad,
-        activityType = activityType,
-        levelMin = levelMin,
-        levelMax = levelMax,
-        veteranRankMin = veteranRankMin,
-        veteranRankMax = veteranRankMax,
-        groupType = groupType,
-        isSelected = false,
-        lfgIndex = lfgIndex
-    }
-end
-
-local function IsPreferredRoleSelected()
-    local isDPS, isHeal, isTank = GetPlayerRoles()
-    return isDPS or isHeal or isTank
-end
-
-
-
---------------------------------------------
--- Grouping Tools Manager Shared
---------------------------------------------
-ZO_GroupingToolsManager_Shared = ZO_Object:Subclass()
-
-
-function ZO_GroupingToolsManager_Shared:New(control)
-    local manager = ZO_Object.New(self)
-    manager:Initialize(control)
-    return manager
-end
-
-function ZO_GroupingToolsManager_Shared:Initialize(control)
-    self.control = control
-
-    self:InitializeActivityData()
-    self:InitializeLocationData()
-    self:RegisterForEvents()
-
-    self:OnPreferredCampaignChanged(GetPreferredCampaign())
-
-    self.selectedGroupType = nil
-end
-
-local ACTIVITY_ORDER = {
-    [LFG_ACTIVITY_DUNGEON]          = 0,
-    [LFG_ACTIVITY_MASTER_DUNGEON]   = 1,
-    [LFG_ACTIVITY_TRIAL]            = 2,
-    [LFG_ACTIVITY_CYRODIIL]         = 3,
-    [LFG_ACTIVITY_IMPERIAL_CITY]    = 4,
-}
-
-local function ActivitySort(entry1, entry2)
-    return ACTIVITY_ORDER[entry1.type] < ACTIVITY_ORDER[entry2.type]
-end
-
-function ZO_GroupingToolsManager_Shared:InitializeActivityData()
-    local activitiesData = {}
-
-    for type, data in pairs(ACTIVITY_DATA) do
-        table.insert(activitiesData, data)
-    end
-    table.sort(activitiesData, ActivitySort)
-
-    self.activitiesData = activitiesData
-end
-
-function ZO_GroupingToolsManager_Shared:InitializeLocationData()
-    local locationsData = {}
-
-    for i = 1, #self.activitiesData do
-        local activityType = self.activitiesData[i].type
-        locationsData[activityType] = {}
-
-        for lfgIndex = 1, GetNumLFGOptions(activityType) do
-            local passedRequirements = select(7, GetLFGOption(activityType, lfgIndex))
-            if passedRequirements then --this should only need to be checked at initialization, the current requirements don't change between sessions
-                local data = CreateLocationData(activityType, lfgIndex)
-                table.insert(locationsData[activityType], data)
-            end
-        end
-        
-        table.sort(locationsData[activityType], LFGLevelSort)
-
-        --Insert the all selection
-        if DoesLFGActivityHasAllOption(activityType) then
-            local activityData = ACTIVITY_DATA[activityType]
-            local data = {
-                    name = activityData.allText,
-                    description = activityData.allDescription,
-                    descriptionTexture = activityData.texture,
-                    descriptionTextureGamepad = activityData.textureGamepad,
-                    activityType = activityType,
-                    groupType = locationsData[activityType][LFG_LOCATIONS_ALL_INDEX].groupType, --there should not be an all option unless the group types are the same for all locations
-                    isSelected = false,
-                    isAllOption = true,
-                }
-            table.insert(locationsData[activityType], LFG_LOCATIONS_ALL_INDEX, data)
-        end
-    end
-
-    self.locationsData = locationsData
-
-    self:UpdateLocations()
-end
-
-function ZO_GroupingToolsManager_Shared:RegisterForEvents()
-
-    local function ClearUpdate()
-        self:ClearUpdate()
-    end
-
-
-    self.control:RegisterForEvent(EVENT_PLAYER_ACTIVATED, ClearUpdate)
-    self.control:RegisterForEvent(EVENT_GROUPING_TOOLS_STATUS_UPDATE, function(event, ...) self:OnGroupingToolsStatusUpdate(...) end)
-    self.control:RegisterForEvent(EVENT_PREFERRED_CAMPAIGN_CHANGED, function(event, ...) self:OnPreferredCampaignChanged(...) end)
-
-    self.control:RegisterForEvent(EVENT_LEVEL_UPDATE, function(eventCode, ...) self:OnLevelUpdate(...) end)
-    self.control:RegisterForEvent(EVENT_VETERAN_RANK_UPDATE, function(eventCode, ...) self:OnVeteranRankUpdate(...) end)
-    self.control:RegisterForEvent(EVENT_GROUP_MEMBER_LEFT, ClearUpdate)
-    self.control:RegisterForEvent(EVENT_GROUP_MEMBER_JOINED, ClearUpdate)
-    self.control:RegisterForEvent(EVENT_GROUP_UPDATE, ClearUpdate)
-
-    self.control:RegisterForEvent(EVENT_LEADER_UPDATE, ClearUpdate)
-end
-
-function ZO_GroupingToolsManager_Shared:ClearUpdate()
-    --  A clear and update is required when the selections may change due to requirement changes. (Ex: a group member
-    --joins that doesn't meet the level requirement of a location already selected. The location needs to be unselected
-    --and locked, and then all other locations need to be refreshed again in case they are now unlocked. Instead of
-    --nesting refreshes, just clear and update when an event occurs that can lead to this.)
-
-    self:ClearSelections()
-    self:UpdateLocations()
-end
-
-do
-    local function IsAnyGroupMemberVeteran()
-        for i = 1, GROUP_SIZE_MAX do
-            local unitTag = ZO_Group_GetUnitTagForGroupIndex(i)
-            if IsUnitVeteran(unitTag) then
-                return true
-            end
-        end
-
-        return false
-    end
-
-    local function GetLevelRankRequirementText(levelMin, levelMax, rankMin, rankMax)
-        local playerRank = GetUnitVeteranRank("player")
-    
-        if playerRank > 0 or levelMin == GetMaxLevel() then
-            if playerRank < rankMin then
-                return zo_strformat(SI_LFG_LOCK_REASON_PLAYER_MIN_RANK_REQUIREMENT, rankMin)
-            elseif playerRank > rankMax then
-                return zo_strformat(SI_LFG_LOCK_REASON_PLAYER_MAX_RANK_REQUIREMENT, rankMax)
-            end
-        else
-            local playerLevel = GetUnitLevel("player")
-    
-            if playerLevel < levelMin then
-                return zo_strformat(SI_LFG_LOCK_REASON_PLAYER_MIN_LEVEL_REQUIREMENT, levelMin)
-            elseif playerLevel > levelMax then
-                return zo_strformat(SI_LFG_LOCK_REASON_PLAYER_MAX_LEVEL_REQUIREMENT, levelMax)
-            end
-        end
-    end
-
-    function ZO_GroupingToolsManager_Shared:UpdateLocations()
-        if IsCurrentlySearchingForGroup() then
-            self:UpdateLocationsFromSearch()
-            return
-        end
-
-        --Determine lock status for each location
-        for activityType, locationsByActivity in pairs(self.locationsData) do
-            local allAreLocked = true
-            local inAGroup = IsUnitGrouped("player")
-            local groupSize = GetGroupSize()
-            local isRoleSelected = IsPreferredRoleSelected()
-            local activityIsAvA = activityType == LFG_ACTIVITY_CYRODIIL or activityType == LFG_ACTIVITY_IMPERIAL_CITY
-
-            for index = #locationsByActivity, 1, -1 do --reversed so we know the 'all locked' status for the all entry at index 1
-                local location = locationsByActivity[index]
-                location.isLocked = true
-                
-                if inAGroup and not IsUnitGroupLeader("player") then
-                    location.lockReasonText = GetString(SI_LFG_LOCK_REASON_NOT_LEADER)
-                elseif not isRoleSelected then
-                    location.lockReasonText = GetString(SI_LFG_LOCK_REASON_NO_ROLES_SELECTED)
-                elseif activityIsAvA and not IsInAvAZone() then
-                    location.lockReasonText = GetString(SI_LFG_LOCK_REASON_NOT_IN_AVA)
-                elseif activityIsAvA and not IsInLFGAVAZone(activityType, location.lfgIndex) then
-                    location.lockReasonText = zo_strformat(SI_LFG_LOCK_REASON_NOT_IN_AVA_ZONE, location.rawName)
-                elseif not activityIsAvA and IsInAvAZone() then
-                    location.lockReasonText = GetString(SI_LFG_LOCK_REASON_IN_AVA)
-                elseif IsInAvAZone() and IsInLFGGroup() then
-                    location.lockReasonText = GetString(SI_LFG_LOCK_REASON_AVA_CROSS_ALLIANCE)
-                else
-                    if location.isAllOption then
-                        if inAGroup then
-                            location.lockReasonText = GetString(SI_LFG_LOCK_REASON_SELECTION_LIMIT_MEMBER_SEARCH)
-                        elseif allAreLocked then
-                            location.lockReasonText = zo_strformat(SI_LFG_LOCK_REASON_ALL_LOCATIONS_LOCKED, GetString("SI_LFGACTIVITY", activityType))
-                        else
-                            location.isLocked = false
-                            location.lockReasonText = ""
-                        end
-                    else
-                        local lfgIndex = location.lfgIndex
-                        location.playerMeetsRequirements = DoesPlayerMeetLFGLevelRequirements(activityType, lfgIndex)
-                        location.groupMeetsLevelRequirements = DoesGroupMeetLFGLevelRequirements(activityType, lfgIndex)
-    
-                        local isAnotherLocationSelected = self:IsAnyLocationSelected() and not location.isSelected
-                        local groupTooLarge = groupSize > ZO_GROUP_TYPE_TO_SIZE[location.groupType]
-                        local groupFull = groupSize == ZO_GROUP_TYPE_TO_SIZE[location.groupType]
-                        local isDifferentGroupType = self.selectedGroupType and (location.groupType ~= self.selectedGroupType) or false
-                        local requiredCollectible = GetRequiredLFGCollectibleId(activityType, lfgIndex)
-
-                        if inAGroup and isAnotherLocationSelected then --enforce having only one selection for LFM
-                            location.lockReasonText = GetString(SI_LFG_LOCK_REASON_SELECTION_LIMIT_MEMBER_SEARCH)
-                        elseif groupTooLarge then
-                            location.lockReasonText = GetString(SI_LFG_LOCK_REASON_GROUP_TOO_LARGE)
-                        elseif groupFull then
-                            location.lockReasonText = GetString(SI_LFG_LOCK_REASON_GROUP_FULL)
-                        elseif not location.playerMeetsRequirements then
-                            location.lockReasonText = GetLevelRankRequirementText(location.levelMin, location.levelMax, location.veteranRankMin, location.veteranRankMax)
-                        elseif not location.groupMeetsLevelRequirements and inAGroup then
-                            location.lockReasonText = GetString(SI_LFG_LOCK_REASON_GROUP_LOCATION_LEVEL_REQUIREMENTS)
-                        elseif isDifferentGroupType then
-                            location.lockReasonText = GetString(SI_LFG_LOCK_REASON_SELECTIONS_GROUP_SIZE)
-                        elseif requiredCollectible ~= 0 and not IsCollectibleUnlocked(requiredCollectible) then
-                            location.lockReasonText = zo_strformat(SI_LFG_LOCK_REASON_DLC_NOT_UNLOCKED, GetCollectibleName(requiredCollectible))
-                        else
-                            location.isLocked = false
-                            location.lockReasonText = ""
-                            allAreLocked = false
-                        end
-                    end
-                end
-            end
-        end
-    
-        self:RefreshLocationsList()
-    end
-end
-
-function ZO_GroupingToolsManager_Shared:UpdateLocationsFromSearch()
-    --Populate data from any existing search
-    local numLFGRequests = GetNumLFGRequests()
-    if numLFGRequests > 0 then
-        --Update locations
-        for i = 1, numLFGRequests do
-            local activityType, lfgIndex, isDPS, isHealer, isTank = GetLFGRequestInfo(i)
-            local location = self:GetLocationFromLFGIndex(activityType, lfgIndex)
-            location.isSelected = true
-        end
-
-        --Update 'all' option
-        for activityType, locationsByActivity in pairs(self.locationsData) do
-            if DoesLFGActivityHasAllOption(activityType) then
-                local numberAvailable = 0
-                local numberSelected = 0
-
-                for index = FIRST_LOCATION_INDEX, #locationsByActivity do
-                    local location = locationsByActivity[index]
-                    local playerMeetsRequirements = DoesPlayerMeetLFGLevelRequirements(activityType, location.lfgIndex)
-
-                    if playerMeetsRequirements then
-                        numberAvailable = numberAvailable + 1
-                    end
-                    if location.isSelected then
-                        numberSelected = numberSelected + 1
-                    end
-                end
-
-                local allAreSelected = numberAvailable > 0 and numberSelected == numberAvailable
-                if allAreSelected then
-                    local allLocation = locationsByActivity[LFG_LOCATIONS_ALL_INDEX]
-                    allLocation.isSelected = true
-                end
-            end
-        end
-    end
-
-    self:RefreshLocationsList()
-end
-
-function ZO_GroupingToolsManager_Shared:ClearSelections()
-    for activityType, locationsByActivity in pairs(self.locationsData) do
-        for index = 1, #locationsByActivity do
-            local location = locationsByActivity[index]
-            location.isSelected = false
-            location.isLocked = false
-        end
-    end
-
-    self.selectedGroupType = nil
-end
-
-local function IsRoleSelected(roles)
-    return roles[LFG_ROLE_DPS] or roles[LFG_ROLE_HEAL] or roles[LFG_ROLE_TANK]
-end
-
-local function CheckAddLocation(activityType, lfgIndex, roles)
-    if not IsRoleSelected(roles) then
-        local alertEnum = IsUnitGrouped("player") and LFG_ERROR_NO_ROLES_SELECTED or LFG_ERROR_NO_ROLES_SELECTED_MULTIPLE
-        ZO_AlertEvent(EVENT_GROUPING_TOOLS_ERROR, alertEnum)    
-    	return false
-    end
-
-    AddGroupFinderSearchEntry(activityType, lfgIndex, roles[LFG_ROLE_DPS], roles[LFG_ROLE_HEAL], roles[LFG_ROLE_TANK])
-    return true
-end
-
-function ZO_GroupingToolsManager_Shared:StartSearch()
-    if IsCurrentlySearchingForGroup() then
-        return
-    end
-    ClearGroupFinderSearch()
-
-    local preferredRoles = GAMEPAD_GROUP_ROLES_BAR:GetRoles()
-
-    --Add locations
-    for activityType, locationsByActivity in pairs(self.locationsData) do
-
-        for index = 1, #locationsByActivity do
-            local location = locationsByActivity[index]
-            if location.isSelected and not location.isAllOption then
-                local lfgIndex = location.lfgIndex
-                if not CheckAddLocation(activityType, lfgIndex, preferredRoles) then
-                    return
-                end
-            end
-        end
-    end
-
-    StartGroupFinderSearch()
-end
-
-function ZO_GroupingToolsManager_Shared:ToggleLocationSelected(location)
-    if location.isLocked then
-        return
-    end
-
-    if location.isAllOption then
-        local locationsByActivity = self.locationsData[location.activityType]
-
-        location.isSelected = not location.isSelected
-        for i = 1, #locationsByActivity do
-            locationsByActivity[i].isSelected = location.isSelected and not locationsByActivity[i].isLocked
-        end
-
-    else
-        --Don't allow toggling individual locations when All option is selected
-        if self:IsAllOptionSelected(location.activityType) then
-            return
-        end
-        
-        location.isSelected = not location.isSelected
-    end
-
-    --Set group type. This should only ever be cleared or re-set to the same type since locations of different types are locked.
-    if self:IsAnyLocationSelected() then
-        self.selectedGroupType = location.groupType
-    else
-        self.selectedGroupType = nil
-    end
-
-    self:UpdateLocations()
-end
-
-function ZO_GroupingToolsManager_Shared:IsAllOptionSelected(activityType)
-    if DoesLFGActivityHasAllOption(activityType) then
-        local locationsByActivity = self.locationsData[activityType]
-        return locationsByActivity[LFG_LOCATIONS_ALL_INDEX].isSelected
-    end
-
-    return false
-end
-
-function ZO_GroupingToolsManager_Shared:IsAnyLocationSelected()
-    --TODO: maybe keep an ongoing count of selected activities instead, and return > 0
-    for activityType, locationsByActivity in pairs(self.locationsData) do
-        for i = 1, #locationsByActivity do
-            if locationsByActivity[i].isSelected then
-                return true
-            end
-        end
-    end
-
-    return false
-end
-
-function ZO_GroupingToolsManager_Shared:GetLocationFromLFGIndex(activityType, lfgIndex)
-    local locationsByActivity = self.locationsData[activityType]
-
-    for i = 1, #locationsByActivity do
-        if locationsByActivity[i].lfgIndex == lfgIndex then
-            return locationsByActivity[i]
-        end
-    end
-end
-
--- Event callbacks
-function ZO_GroupingToolsManager_Shared:OnGroupingToolsStatusUpdate()
-    self:ClearUpdate()
-end
-
-function ZO_GroupingToolsManager_Shared:OnPreferredCampaignChanged(preferredCampaignId)
-    self.currentCampaignName = GetCampaignName(preferredCampaignId)
-end
-
-function ZO_GroupingToolsManager_Shared:OnLevelUpdate(unitTag)
-    if ZO_Group_IsGroupUnitTag(unitTag) or unitTag == "player" then
-        self:ClearUpdate()
-    end
-end
-
-function ZO_GroupingToolsManager_Shared:OnVeteranRankUpdate(unitTag)
-    self:OnLevelUpdate(unitTag)
-end
-
--- 'Virtual' functions
-function ZO_GroupingToolsManager_Shared:RefreshLocationsList()
-    assert(false) --needs to be overridden
-end
-
-
-do
-    EVENT_MANAGER:RegisterForEvent("ZO_GroupingToolsManager_Shared_OnGroupingToolsStatusUpdate", EVENT_GROUPING_TOOLS_STATUS_UPDATE,
-        function(event, isSearching)
-            PlaySound(isSearching and SOUNDS.LFG_SEARCH_STARTED or SOUNDS.LFG_SEARCH_FINISHED)
-        end
-    )
-end