diff --git a/cypress/component/ResponsiveActions.cy.tsx b/cypress/component/ResponsiveActions.cy.tsx
new file mode 100644
index 00000000..adaa506b
--- /dev/null
+++ b/cypress/component/ResponsiveActions.cy.tsx
@@ -0,0 +1,76 @@
+import React from 'react';
+import { ResponsiveActions } from '@patternfly/react-component-groups/dist/dynamic/ResponsiveActions';
+import { ResponsiveAction } from '@patternfly/react-component-groups/dist/dynamic/ResponsiveAction';
+
+describe('ResponsiveActions', () => {
+ beforeEach(() => {
+ cy.viewport(1280, 2000);
+ })
+
+ it('renders persistent, pinned, and overflow actions', () => {
+ cy.mount(
+
+
+ Persistent action
+
+
+ Pinned action
+
+
+ Overflow action
+
+
+ );
+
+ cy.get('[data-ouia-component-id="ResponsiveActions-action-0"]').should('be.visible');
+ cy.get('[data-ouia-component-id="ResponsiveActions-action-1"]').should('be.visible');
+ cy.get('[data-ouia-component-id="ResponsiveActions-action-2"]').should('not.exist');
+
+ cy.get('[data-ouia-component-id="ResponsiveActions-menu-dropdown-toggle"]').click();
+ cy.get('[data-ouia-component-id="ResponsiveActions-action-2"]').should('be.visible');
+ });
+
+ it('handles click events on actions', () => {
+ const onClickSpy = cy.spy().as('actionClickSpy');
+
+ cy.mount(
+
+
+ Persistent action
+
+
+ Pinned action
+
+
+ Overflow action
+
+
+ );
+
+ cy.get('[data-ouia-component-id="ResponsiveActions-action-0"]').click();
+ cy.get('@actionClickSpy').should('have.been.calledOnce');
+
+ cy.get('[data-ouia-component-id="ResponsiveActions-action-1"]').click();
+ cy.get('@actionClickSpy').should('have.been.calledTwice');
+
+ cy.get('[data-ouia-component-id="ResponsiveActions-menu-dropdown-toggle"]').click();
+ cy.get('[data-ouia-component-id="ResponsiveActions-action-2"]').click();
+ cy.get('@actionClickSpy').should('have.been.calledThrice');
+ });
+
+ it('renders no persistent or pinned actions without flags', () => {
+ cy.mount(
+
+
+ Overflow action
+
+
+ );
+
+ cy.get('[data-ouia-component-id="menu-persistent-content"]').should('not.exist');
+ cy.get('[data-ouia-component-id="menu-pinned-content"]').should('not.exist');
+
+ cy.get('[data-ouia-component-id="ResponsiveActions-menu-dropdown-toggle"]').click();
+ cy.contains('Overflow action').should('be.visible');
+ });
+});
diff --git a/packages/module/patternfly-docs/content/extensions/component-groups/examples/ResponsiveActions/ResponsiveActions.md b/packages/module/patternfly-docs/content/extensions/component-groups/examples/ResponsiveActions/ResponsiveActions.md
new file mode 100644
index 00000000..35e80be8
--- /dev/null
+++ b/packages/module/patternfly-docs/content/extensions/component-groups/examples/ResponsiveActions/ResponsiveActions.md
@@ -0,0 +1,44 @@
+---
+# Sidenav top-level section
+# should be the same for all markdown files
+section: extensions
+subsection: Component groups
+# Sidenav secondary level section
+# should be the same for all markdown files
+id: Responsive actions
+# Tab (react | react-demos | html | html-demos | design-guidelines | accessibility)
+source: react
+# If you use typescript, the name of the interface to display props for
+# These are found through the sourceProps function provided in patternfly-docs.source.js
+propComponents: ['ResponsiveAction', 'ResponsiveActions']
+sourceLink: https://github.com/patternfly/react-component-groups/blob/main/packages/module/patternfly-docs/content/extensions/component-groups/examples/ResponsiveActions/ResponsiveActions.md
+---
+import { useState } from 'react';
+import { ResponsiveAction } from '@patternfly/react-component-groups/dist/dynamic/ResponsiveAction';
+import { ResponsiveActions } from '@patternfly/react-component-groups/dist/dynamic/ResponsiveActions';
+
+The **responsive actions** component allows for the display of actions in a responsive layout. Actions can be presented as persistent, pinned or collapsed to dropdown.
+
+The `ResponsiveAction` component is used to declare individual actions within the `ResponsiveActions` wrapper. Each action can be displayed as a standalone button or dropdown based on `isPinned` and `isPersistent` properties. Persistent actions are always separate buttons no matter of the screen size. Pinned actions are rendered as buttons as well, but when the screen size is below the defined breakpoint, they get collapsed to the actions dropdown. Other actions render in a dropdown on all screen sizes.
+
+## Examples
+
+### Basic responsive actions
+
+This example demonstrates how to create responsive actions with persistent and pinned actions.
+
+
+```js file="./ResponsiveActionsExample.tsx"
+
+```
+
+### Breakpoint on container
+
+By passing in the `breakpointReference` property, the overflow menu's breakpoint will be relative to the width of the reference container rather than the viewport width.
+
+You can change the container width in this example by adjusting the slider. As the container width changes, the actions will change their layout despite the viewport width not changing.
+
+
+```js file="./ResponsiveActionsBreakpointExample.tsx"
+
+```
diff --git a/packages/module/patternfly-docs/content/extensions/component-groups/examples/ResponsiveActions/ResponsiveActionsBreakpointExample.tsx b/packages/module/patternfly-docs/content/extensions/component-groups/examples/ResponsiveActions/ResponsiveActionsBreakpointExample.tsx
new file mode 100644
index 00000000..6fe7bf4c
--- /dev/null
+++ b/packages/module/patternfly-docs/content/extensions/component-groups/examples/ResponsiveActions/ResponsiveActionsBreakpointExample.tsx
@@ -0,0 +1,60 @@
+import React from 'react';
+import {
+ Slider,
+ SliderOnChangeEvent,
+} from '@patternfly/react-core';
+import { ResponsiveActions } from '@patternfly/react-component-groups/dist/dynamic/ResponsiveActions';
+import { ResponsiveAction } from '@patternfly/react-component-groups/dist/dynamic/ResponsiveAction';
+
+export const ResponsiveActionsBreakpointExample: React.FunctionComponent = () => {
+ const [ containerWidth, setContainerWidth ] = React.useState(100);
+ const containerRef = React.useRef(null);
+
+ const onChange = (_event: SliderOnChangeEvent, value: number) => {
+ setContainerWidth(value);
+ };
+
+ const containerStyles = {
+ width: `${containerWidth}%`,
+ padding: '1rem',
+ borderWidth: '2px',
+ borderStyle: 'dashed'
+ };
+
+ return (
+ <>
+