diff --git a/esoui/ingame/voicechat/console/zo_voicechat_gamepad.lua b/esoui/ingame/voicechat/console/zo_voicechat_gamepad.lua
index a8e0c76..d5eb58f 100755
--- a/esoui/ingame/voicechat/console/zo_voicechat_gamepad.lua
+++ b/esoui/ingame/voicechat/console/zo_voicechat_gamepad.lua
@@ -1,69 +1,29 @@
---------------------------------------------
--- VoiceChat Gamepad
---------------------------------------------
+----------------------------------------------------------------------------------------
+-- Voice Chat Social Options Gamepad
+--  Class for displaying voice chat related social options for a voice chat
+--  participant. Registers social keybinds with scenes that display it.
+----------------------------------------------------------------------------------------
 
-ZO_VoiceChat_Gamepad = ZO_SocialOptionsDialogGamepad:Subclass()
+ZO_VoiceChatSocialOptions_Gamepad = ZO_SocialOptionsDialogGamepad:Subclass()
 
-function ZO_VoiceChat_Gamepad:New(...)
-	local voiceChatGamepad = ZO_Object.New(self)
-	voiceChatGamepad:Initialize(...)
-	return voiceChatGamepad
+function ZO_VoiceChatSocialOptions_Gamepad:New(...)
+	local object = ZO_Object.New(self)
+	object:Initialize(...)
+	return object
 end
 
-function ZO_VoiceChat_Gamepad:Initialize(control)
+function ZO_VoiceChatSocialOptions_Gamepad:Initialize(control)
     self.control = control
     ZO_SocialOptionsDialogGamepad.Initialize(self)
 
-    GAMEPAD_VOICECHAT_SCENE = ZO_Scene:New("gamepad_voice_chat", SCENE_MANAGER)
-    GAMEPAD_VOICECHAT_PARTICIPANT_OPTIONS_SCENE = ZO_Scene:New("gamepad_voice_chat_participant_options", SCENE_MANAGER)
+    assert(VOICE_CHAT_CHANNELS_GAMEPAD)
+    assert(VOICE_CHAT_PARTICIPANTS_GAMEPAD)
 
-    VOICE_CHAT_CHANNELS_GAMEPAD = ZO_VoiceChatChannelsGamepad:New(self.control:GetNamedChild("Channels"))
     self:AddSocialOptionsKeybind(VOICE_CHAT_CHANNELS_GAMEPAD.historyKeybinds)
-    VOICE_CHAT_PARTICIPANT_OPTIONS_GAMEPAD = ZO_VoiceChatParticipantOptionsGamepad:New(self.control:GetNamedChild("ParticipantOptions"))
-    self:AddSocialOptionsKeybind(VOICE_CHAT_PARTICIPANT_OPTIONS_GAMEPAD.keybindStripDescriptor)
-
-    self:InitializeEvents()
-end
-
-function ZO_VoiceChat_Gamepad:InitializeEvents()
-    local function OnVoiceTransmitChannelChanged(channelName)
-        --Special case: Area is rejoined when zoning, and we don't want to play the alert for this situation
-        local channelData = ZO_VoiceChat_GetChannelDataFromName(channelName)
-
-        if not VOICE_CHAT_MANAGER:DoesChannelExist(channelData) then
-            return
-        end
-
-        local channelType = channelData.channelType
-        if channelType == VOICE_CHANNEL_AREA and self.desiredAreaBecameUnavailable then
-            self.desiredAreaBecameUnavailable = nil
-            return
-        end
-
-        --Display an alert if not on a Voice Chat menu
-        if VOICE_CHAT_CHANNELS_GAMEPAD:IsHidden() and VOICE_CHAT_PARTICIPANT_OPTIONS_GAMEPAD:IsHidden() then
-            local channel = VOICE_CHAT_MANAGER:GetChannel(channelData)
-
-            local soundId = SOUNDS.VOICE_CHAT_ALERT_CHANNEL_MADE_ACTIVE
-            local text = zo_strformat(SI_GAMEPAD_VOICECHAT_ALERT_CHANNEL_ACTIVE, channel.name)
-            ZO_Alert(UI_ALERT_CATEGORY_ALERT, soundId, text)
-        end
-
-        self.desiredAreaBecameUnavailable = nil
+    self:AddSocialOptionsKeybind(VOICE_CHAT_PARTICIPANTS_GAMEPAD.keybindStripDescriptor)
 end
-    local function OnVoiceChannelUnavailable(channelName)
-        local channelData = ZO_VoiceChat_GetChannelDataFromName(channelName)
 
-        --Special case: Area is rejoined when zoning, and we don't want to play the alert for this situation
-        if channelData.channelType == VOICE_CHANNEL_AREA and VOICE_CHAT_MANAGER:GetDesiredActiveChannelType() == VOICE_CHANNEL_AREA then
-            self.desiredAreaBecameUnavailable = true
-        end
-    end
-    self.control:RegisterForEvent(EVENT_VOICE_TRANSMIT_CHANNEL_CHANGED, function(eventCode, ...) OnVoiceTransmitChannelChanged(...) end)
-    self.control:RegisterForEvent(EVENT_VOICE_CHANNEL_UNAVAILABLE, function(eventCode, ...) OnVoiceChannelUnavailable(...) end)
-end
-
-function ZO_VoiceChat_Gamepad:BuildInviteToGuildOption(guildIndex)
+function ZO_VoiceChatSocialOptions_Gamepad:BuildInviteToGuildOption(guildIndex)
     local guildId = GetGuildId(guildIndex)
     if guildId == 0 or not DoesPlayerHaveGuildPermission(guildId, GUILD_PERMISSION_INVITE) then
         return
@@ -79,9 +39,8 @@ function ZO_VoiceChat_Gamepad:BuildInviteToGuildOption(guildIndex)
     return entry
 end
 
-
 -- ZO_SocialOptionsDialogGamepad Overrides
-function ZO_VoiceChat_Gamepad:SetupOptions(data)
+function ZO_VoiceChatSocialOptions_Gamepad:SetupOptions(data)
     local channelType = data.channel.channelType
 
     self.playerAlliance = GetUnitAlliance("player")
@@ -108,7 +67,7 @@ function ZO_VoiceChat_Gamepad:SetupOptions(data)
     ZO_SocialOptionsDialogGamepad.SetupOptions(self, socialData)
 end
 
-function ZO_VoiceChat_Gamepad:BuildOptionsList()
+function ZO_VoiceChatSocialOptions_Gamepad:BuildOptionsList()
     local groupId = self:AddOptionTemplateGroup()
     self:AddOptionTemplate(groupId, ZO_SocialOptionsDialogGamepad.BuildInviteToGroupOption, function() return self.socialData.voiceChannelType ~= VOICE_CHANNEL_GROUP end)
 
@@ -137,6 +96,73 @@ function ZO_VoiceChat_Gamepad:BuildOptionsList()
     self:AddOptionTemplate(groupId, ZO_SocialOptionsDialogGamepad.BuildIgnoreOption)
 end
 
+
+
+----------------------------------------------------------------------------------------
+-- Voice Chat Gamepad
+--      Manages creation of voice chat related scenes and objects.
+----------------------------------------------------------------------------------------
+
+ZO_VoiceChat_Gamepad = ZO_Object:Subclass()
+
+function ZO_VoiceChat_Gamepad:New(...)
+	local object = ZO_Object.New(self)
+	object:Initialize(...)
+	return object
+end
+
+function ZO_VoiceChat_Gamepad:Initialize(control)
+    self.control = control
+
+    GAMEPAD_VOICECHAT_CHANNELS_SCENE = ZO_Scene:New("gamepad_voice_chat", SCENE_MANAGER)
+    GAMEPAD_VOICECHAT_PARTICIPANTS_SCENE = ZO_Scene:New("gamepad_voice_chat_participants", SCENE_MANAGER)
+
+    VOICE_CHAT_CHANNELS_GAMEPAD = ZO_VoiceChatChannelsGamepad:New(self.control:GetNamedChild("Channels"))
+    VOICE_CHAT_PARTICIPANTS_GAMEPAD = ZO_VoiceChatParticipantsGamepad:New(self.control:GetNamedChild("Participants"))
+    VOICE_CHAT_SOCIAL_OPTIONS = ZO_VoiceChatSocialOptions_Gamepad:New(self.control:GetNamedChild("SocialOptions"))
+
+    self:InitializeEventAlerts()
+end
+
+function ZO_VoiceChat_Gamepad:InitializeEventAlerts()
+    --Area is left and rejoined when zoning, but we don't want to play a second alert when this happens. To prevent this,
+    --flag when it becomes unavailable and is the desired channel, and skip showing the alert later on if it's true.
+    self.desiredAreaBecameUnavailable = nil
+
+    local function OnVoiceTransmitChannelChanged(channelName)
+        local channelData = ZO_VoiceChat_GetChannelDataFromName(channelName)
+        if not VOICE_CHAT_MANAGER:DoesChannelExist(channelData) then
+            return
+        end
+
+        local channelType = channelData.channelType
+        if channelType == VOICE_CHANNEL_AREA and self.desiredAreaBecameUnavailable then
+            self.desiredAreaBecameUnavailable = nil
+            return
+        end
+
+        --Display an alert if not on a Voice Chat menu
+        if VOICE_CHAT_CHANNELS_GAMEPAD:IsHidden() and VOICE_CHAT_PARTICIPANTS_GAMEPAD:IsHidden() then
+            local channel = VOICE_CHAT_MANAGER:GetChannel(channelData)
+
+            local soundId = SOUNDS.VOICE_CHAT_ALERT_CHANNEL_MADE_ACTIVE
+            local text = zo_strformat(SI_GAMEPAD_VOICECHAT_ALERT_CHANNEL_ACTIVE, channel.name)
+            ZO_Alert(UI_ALERT_CATEGORY_ALERT, soundId, text)
+        end
+
+        self.desiredAreaBecameUnavailable = nil
+    end
+    local function OnVoiceChannelUnavailable(channelName)
+        local channelData = ZO_VoiceChat_GetChannelDataFromName(channelName)
+        if channelData.channelType == VOICE_CHANNEL_AREA and VOICE_CHAT_MANAGER:GetDesiredActiveChannelType() == VOICE_CHANNEL_AREA then
+            self.desiredAreaBecameUnavailable = true
+        end
+    end
+
+    self.control:RegisterForEvent(EVENT_VOICE_TRANSMIT_CHANNEL_CHANGED, function(eventCode, ...) OnVoiceTransmitChannelChanged(...) end)
+    self.control:RegisterForEvent(EVENT_VOICE_CHANNEL_UNAVAILABLE, function(eventCode, ...) OnVoiceChannelUnavailable(...) end)
+end
+
 -- XML Calls
 function ZO_VoiceChatGamepad_OnInitialize(control)
 	VOICE_CHAT_GAMEPAD = ZO_VoiceChat_Gamepad:New(control)