diff --git a/esoui/ingame/voicechat/console/zo_voicechatparticipants_gamepad.lua b/esoui/ingame/voicechat/console/zo_voicechatparticipants_gamepad.lua
new file mode 100644
index 0000000..e40ef20
--- /dev/null
+++ b/esoui/ingame/voicechat/console/zo_voicechatparticipants_gamepad.lua
@@ -0,0 +1,120 @@
+--------------------------------------------------------------------------------
+-- Voice Chat Participants
+--  Participants list for a selected voice chat channel. Displays
+--  information about the speakers, and allows performing social actions
+--  on them.
+--------------------------------------------------------------------------------
+
+
+ZO_VoiceChatParticipantsGamepad = ZO_Gamepad_ParametricList_Screen:Subclass()
+
+function ZO_VoiceChatParticipantsGamepad:New(...)
+	local object = ZO_Object.New(self)
+	object:Initialize(...)
+	return object
+end
+
+function ZO_VoiceChatParticipantsGamepad:Initialize(control)
+    ZO_Gamepad_ParametricList_Screen.Initialize(self, control)
+    self:SetListsUseTriggerKeybinds(true)
+
+    self:InitializeHeader()
+
+    self.control = control
+    self:InitializeFragment(control)
+
+    self.channel = nil --the channel set externally that we'll update for
+
+    self:InitializeEvents()
+end
+
+function ZO_VoiceChatParticipantsGamepad:InitializeHeader()
+    local headerData = {
+        titleText = GetString(SI_GAMEPAD_VOICECHAT_PARTICIPANT_OPTIONS_TITLE)
+    }
+    ZO_GamepadGenericHeader_Refresh(self.header, headerData)
+end
+
+function ZO_VoiceChatParticipantsGamepad:InitializeFragment(control)
+    local function OnStateChange(oldState, newState)
+        ZO_Gamepad_ParametricList_Screen.OnStateChanged(self, oldState, newState)
+    end
+
+    GAMEPAD_VOICECHAT_PARTICIPANTS_FRAGMENT = ZO_FadeSceneFragment:New(control)
+    self.fragment = GAMEPAD_VOICECHAT_PARTICIPANTS_FRAGMENT
+    self.fragment:RegisterCallback("StateChange", OnStateChange)
+end
+
+function ZO_VoiceChatParticipantsGamepad:InitializeEvents()
+    VOICE_CHAT_MANAGER:RegisterCallback("MuteUpdate", function() self:Update() end)
+end
+
+function ZO_VoiceChatParticipantsGamepad:SetChannel(channel)
+    self.channel = channel
+end
+
+function ZO_VoiceChatParticipantsGamepad:IsHidden()
+    return self.control:IsControlHidden()
+end
+
+
+--ZO_Gamepad_ParametricList_Screen overrides
+function ZO_VoiceChatParticipantsGamepad:SetupList(list)
+    self.list = list
+    list:AddDataTemplate("ZO_VoiceChatParticipantsEntryGamepad", ZO_SharedGamepadEntry_OnSetup, ZO_GamepadMenuEntryTemplateParametricListFunction)
+end
+
+function ZO_VoiceChatParticipantsGamepad:OnSelectionChanged(list, selectedData, oldSelectedData)
+    if selectedData then
+        local speakerData = selectedData.speakerData
+
+        local displayName = speakerData.displayName
+        local channelName = selectedData.channelName
+        local lastTimeSpoken = speakerData.lastTimeSpoken
+        GAMEPAD_TOOLTIPS:ClearStatusLabel(GAMEPAD_LEFT_TOOLTIP)
+        GAMEPAD_TOOLTIPS:LayoutVoiceChatParticipantHistory(GAMEPAD_LEFT_TOOLTIP, displayName, channelName, lastTimeSpoken)
+        VOICE_CHAT_SOCIAL_OPTIONS:SetupOptions({speakerData = speakerData, channel = selectedData.channel})
+    end
+end
+
+function ZO_VoiceChatParticipantsGamepad:OnShowing()
+    self:PerformUpdate()
+end
+
+do
+    local function RequestDelayEnabled()
+        return VOICE_CHAT_MANAGER:AreRequestsAllowed()
+    end
+    function ZO_VoiceChatParticipantsGamepad:InitializeKeybindStripDescriptors()
+        self.keybindStripDescriptor = {} --ZO_VoiceChatSocialOptions_Gamepad will add the social keybinds
+        ZO_Gamepad_AddBackNavigationKeybindDescriptors(self.keybindStripDescriptor, GAME_NAVIGATION_TYPE_BUTTON)
+    end
+end
+
+function ZO_VoiceChatParticipantsGamepad:PerformUpdate()
+    self.dirty = false
+    self.list:Clear()
+
+    local channel = self.channel
+    if not channel then
+        return
+    end
+
+    local participantDataList = VOICE_CHAT_MANAGER:GetParticipantDataList(channel)
+
+    --Populate list
+    for i = 1, #participantDataList do
+        local speakerData = participantDataList[i]
+        local displayName = speakerData.displayName
+        if not ZO_VoiceChat_IsNameLocalPlayers(displayName) then
+            local newEntry = ZO_GamepadEntryData:New(ZO_FormatUserFacingDisplayName(displayName), speakerData.isMuted and VOICE_CHAT_ICON_MUTED_PLAYER)
+            newEntry.speakerData = speakerData
+            newEntry.channelName = channel.fullName or channel.name
+            newEntry.channel = channel
+            self.list:AddEntry("ZO_VoiceChatParticipantsEntryGamepad", newEntry)
+        end
+    end
+    
+
+    self.list:Commit()
+end