diff --git a/esoui/ingame/lfg/gamepad/zo_grouprolesbar_gamepad.lua b/esoui/ingame/lfg/gamepad/zo_grouprolesbar_gamepad.lua
new file mode 100644
index 0000000..bba1dca
--- /dev/null
+++ b/esoui/ingame/lfg/gamepad/zo_grouprolesbar_gamepad.lua
@@ -0,0 +1,183 @@
+ZO_GAMEPAD_LFG_OPTION_INFO =
+{
+    [LFG_ROLE_DPS] =
+    {
+        optionName = GetString("SI_LFGROLE", LFG_ROLE_DPS),
+        icon = "EsoUI/Art/LFG/Gamepad/LFG_roleIcon_dps.dds",
+        iconUp = "EsoUI/Art/LFG/Gamepad/gp_LFG_roleIcon_dps_up.dds",
+        iconDown = "EsoUI/Art/LFG/Gamepad/gp_LFG_roleIcon_dps_down.dds",
+        role = LFG_ROLE_DPS,
+        tooltip = GetString(SI_GROUP_PREFERRED_ROLE_DPS_TOOLTIP),
+    },
+
+    [LFG_ROLE_HEAL] =
+    {
+        optionName = GetString("SI_LFGROLE", LFG_ROLE_HEAL),
+        icon = "EsoUI/Art/LFG/Gamepad/LFG_roleIcon_healer.dds",
+        iconUp = "EsoUI/Art/LFG/Gamepad/gp_LFG_roleIcon_healer_up.dds",
+        iconDown = "EsoUI/Art/LFG/Gamepad/gp_LFG_roleIcon_healer_down.dds",
+        role = LFG_ROLE_HEAL,
+        tooltip = GetString(SI_GROUP_PREFERRED_ROLE_HEAL_TOOLTIP),
+    },
+
+    [LFG_ROLE_TANK] =
+    {
+        optionName = GetString("SI_LFGROLE", LFG_ROLE_TANK),
+        icon = "EsoUI/Art/LFG/Gamepad/LFG_roleIcon_tank.dds",
+        iconUp = "EsoUI/Art/LFG/Gamepad/gp_LFG_roleIcon_tank_up.dds",
+        iconDown = "EsoUI/Art/LFG/Gamepad/gp_LFG_roleIcon_tank_down.dds",
+        role = LFG_ROLE_TANK,
+        tooltip = GetString(SI_GROUP_PREFERRED_ROLE_TANK_TOOLTIP),
+    },
+}
+
+ZO_GAMEPAD_ROLES_BAR_BUTTON_DIMENSIONS = 64
+ZO_GAMEPAD_ROLES_BAR_HEADER_BUTTONS_PADDING_Y = 40
+local ROLES_HEADER_HEIGHT = 24
+ZO_GAMEPAD_ROLES_BAR_ADDITIONAL_HEADER_SPACE = ROLES_HEADER_HEIGHT + ZO_GAMEPAD_ROLES_BAR_HEADER_BUTTONS_PADDING_Y + ZO_GAMEPAD_ROLES_BAR_BUTTON_DIMENSIONS
+
+--------------------------------------------
+-- GroupRolesBarGamepad Gamepad
+--------------------------------------------
+
+local ZO_GroupRolesBar_Gamepad = ZO_GamepadButtonTabBar:Subclass()
+
+function ZO_GroupRolesBar_Gamepad:New(...)
+    return ZO_GamepadButtonTabBar.New(self, ...)
+end
+
+function ZO_GroupRolesBar_Gamepad:Initialize(control)
+    local function OnSelected(control)
+        control.selectedFrame:SetHidden(false)
+        
+        local roleType = control.data.role
+        local roleData = ZO_GAMEPAD_LFG_OPTION_INFO[roleType]
+        GAMEPAD_TOOLTIPS:LayoutGroupRole(GAMEPAD_LEFT_TOOLTIP, roleData.optionName, roleData.tooltip)
+    end
+    local function OnUnselected(control)
+        control.selectedFrame:SetHidden(true)
+    end
+    local function OnPressed(control)
+        local roleType = control.data.role
+        local isSelected = not self.roles[roleType].isSelected
+        UpdatePlayerRole(roleType, isSelected)
+        self:RefreshRoles()
+    end
+
+    ZO_GamepadButtonTabBar.Initialize(self, control, OnSelected, OnUnselected, OnPressed)
+
+    local tankControl = control:GetNamedChild("Tank")
+    local healerControl = control:GetNamedChild("Healer")
+    local dpsControl = control:GetNamedChild("DPS")
+    self.roles = {
+        [LFG_ROLE_TANK] = {button = tankControl},
+        [LFG_ROLE_HEAL] = {button = healerControl},
+        [LFG_ROLE_DPS] = {button = dpsControl},
+    }
+    self:AddButton(tankControl, ZO_GAMEPAD_LFG_OPTION_INFO[LFG_ROLE_TANK])
+    self:AddButton(healerControl, ZO_GAMEPAD_LFG_OPTION_INFO[LFG_ROLE_HEAL])
+    self:AddButton(dpsControl, ZO_GAMEPAD_LFG_OPTION_INFO[LFG_ROLE_DPS])
+
+    self:RefreshRoles()
+
+    --The fragment needs to be manually added and removed for the animation to work between the two group scenes
+    GAMEPAD_GROUP_ROLES_FRAGMENT = ZO_ConveyorSceneFragment:New(ZO_GroupRolesBarGamepadMaskContainer, ZO_Anchor:New(TOPLEFT, nil, TOPLEFT))
+    GAMEPAD_GROUP_ROLES_FRAGMENT:RegisterCallback("StateChange", function(oldState, newState)
+	    if newState == SCENE_FRAGMENT_SHOWING then
+	 	    self:RefreshRoles()
+        elseif(newState == SCENE_HIDDEN) then
+            self:Deactivate()
+	    end
+    end)
+    GAMEPAD_GROUP_ROLES_FRAGMENT:SetForceRefresh(true)
+
+    self.isManuallyDimmed = false
+
+    self:InitializeEvents()
+end
+
+function ZO_GroupRolesBar_Gamepad:InitializeEvents()
+    local function OnGroupingToolsStatusUpdate(isSearching)
+        self.isLockedFromSearch = isSearching
+        self:UpdateDimming()
+    end
+
+    local function OnPlayerActivated()
+        OnGroupingToolsStatusUpdate(IsCurrentlySearchingForGroup())
+    end
+
+    self.control:RegisterForEvent(EVENT_GROUPING_TOOLS_STATUS_UPDATE, function(event, ...) OnGroupingToolsStatusUpdate(...) end)
+    self.control:RegisterForEvent(EVENT_PLAYER_ACTIVATED, function(event, ...) OnPlayerActivated(...) end)
+    OnGroupingToolsStatusUpdate(IsCurrentlySearchingForGroup())
+end
+
+function ZO_GroupRolesBar_Gamepad:ToggleSelected()
+    if self.selectedIndex and not self.isLockedFromSearch then
+        local selectedButton = self.buttons[self.selectedIndex]
+        self.onPressedCallback(selectedButton)
+        PlaySound(SOUNDS.DEFAULT_CLICK)
+    end
+end
+
+function ZO_GroupRolesBar_Gamepad:SetRoleSelected(roleType, isSelected)
+    local role = self.roles[roleType]
+    local button = role.button
+
+    role.isSelected = isSelected
+    local roleData = ZO_GAMEPAD_LFG_OPTION_INFO[roleType]
+    button.icon:SetTexture(isSelected and roleData.iconDown or roleData.iconUp)
+    button.pressedFrame:SetHidden(not isSelected)
+end
+
+function ZO_GroupRolesBar_Gamepad:RefreshRoles()
+    local isDPS, isHeal, isTank = GetPlayerRoles()
+
+    self:SetRoleSelected(LFG_ROLE_DPS, isDPS)
+    self:SetRoleSelected(LFG_ROLE_HEAL, isHeal)
+    self:SetRoleSelected(LFG_ROLE_TANK, isTank)
+end
+
+function ZO_GroupRolesBar_Gamepad:SetIsManuallyDimmed(isDimmed)
+    self.isManuallyDimmed = isDimmed
+    self:UpdateDimming()
+end
+
+function ZO_GroupRolesBar_Gamepad:UpdateDimming()
+    local isDimmed = self.isLockedFromSearch or self.isManuallyDimmed
+    local alpha = isDimmed and ZO_GAMEPAD_ICON_UNSELECTED_ALPHA or ZO_GAMEPAD_ICON_SELECTED_ALPHA
+
+    for roleType, data in pairs(self.roles) do
+        data.button:SetAlpha(alpha)
+    end
+end
+
+function ZO_GroupRolesBar_Gamepad:GetRoles()
+    local roles = self.roles
+    return {
+        [LFG_ROLE_DPS] = roles[LFG_ROLE_DPS].isSelected,
+        [LFG_ROLE_HEAL] = roles[LFG_ROLE_HEAL].isSelected,
+        [LFG_ROLE_TANK] = roles[LFG_ROLE_TANK].isSelected,
+    }
+end
+
+function ZO_GroupRolesBar_Gamepad:IsRoleSelected()
+    local roles = self.roles
+    return roles[LFG_ROLE_DPS].isSelected or roles[LFG_ROLE_HEAL].isSelected or roles[LFG_ROLE_TANK].isSelected
+end
+
+--ZO_GamepadButtonTabBar Overrides
+function ZO_GroupRolesBar_Gamepad:Activate()
+    ZO_GamepadButtonTabBar.Activate(self)
+end
+
+function ZO_GroupRolesBar_Gamepad:Deactivate()
+    if self:IsActivated() then
+        ZO_GamepadButtonTabBar.Deactivate(self)
+        GAMEPAD_TOOLTIPS:Reset(GAMEPAD_LEFT_TOOLTIP)
+    end
+end
+
+--XML Calls
+function ZO_GroupRolesBar_Gamepad_OnInitialized(control)
+    GAMEPAD_GROUP_ROLES_BAR = ZO_GroupRolesBar_Gamepad:New(control)
+end
\ No newline at end of file