diff --git a/wax-prosemirror-components/src/components/UndoRedoButton.js b/wax-prosemirror-components/src/components/UndoRedoButton.js
new file mode 100644
index 0000000000000000000000000000000000000000..834b053ff3cacc0b0b0cd1ddf8eed7ca5ad88388
--- /dev/null
+++ b/wax-prosemirror-components/src/components/UndoRedoButton.js
@@ -0,0 +1,51 @@
+/* eslint react/prop-types: 0 */
+import React, { useContext, useMemo } from 'react';
+import { WaxContext } from 'wax-prosemirror-core';
+import MenuButton from '../ui/buttons/MenuButton';
+
+const UndoRedoButton = ({ view = {}, item }) => {
+  const { active, icon, label, run, select, title } = item;
+
+  const {
+    view: { main },
+    activeViewId,
+    activeView,
+  } = useContext(WaxContext);
+
+  const isEditable = main.props.editable(editable => {
+    return editable;
+  });
+
+  const { state } = view;
+
+  const handleMouseDown = (e, editorState, editorDispatch) => {
+    e.preventDefault();
+    run(editorState, editorDispatch);
+  };
+
+  const isActive = !!(
+    active(activeView.state, activeViewId) &&
+    select(state, activeViewId, activeView)
+  );
+
+  let isDisabled = !select(state, activeViewId, activeView);
+  if (!isEditable) isDisabled = true;
+
+  const UndoRedoButtonComponent = useMemo(
+    () => (
+      <MenuButton
+        active={isActive || false}
+        disabled={isDisabled}
+        iconName={icon}
+        label={label}
+        onMouseDown={e => handleMouseDown(e, main.state, main.dispatch)}
+        title={title}
+      />
+    ),
+    [isActive, isDisabled],
+  );
+
+  return UndoRedoButtonComponent;
+};
+
+export default UndoRedoButton;