diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp
index 59d89824f6c66dd40b98a6f49558a70dee83772c..90d358f99227f094c5a459b3e9102b9705d6e783 100644
--- a/src/core/web_contents_adapter.cpp
+++ b/src/core/web_contents_adapter.cpp
@@ -326,6 +326,48 @@ QString WebContentsAdapter::selectedText() const
     return toQt(d->webContents->GetRenderViewHost()->GetView()->GetSelectedText());
 }
 
+void WebContentsAdapter::undo()
+{
+    Q_D(const WebContentsAdapter);
+    d->webContents->GetRenderViewHost()->Undo();
+}
+
+void WebContentsAdapter::redo()
+{
+    Q_D(const WebContentsAdapter);
+    d->webContents->GetRenderViewHost()->Redo();
+}
+
+void WebContentsAdapter::cut()
+{
+    Q_D(const WebContentsAdapter);
+    d->webContents->GetRenderViewHost()->Cut();
+}
+
+void WebContentsAdapter::copy()
+{
+    Q_D(const WebContentsAdapter);
+    d->webContents->GetRenderViewHost()->Copy();
+}
+
+void WebContentsAdapter::paste()
+{
+    Q_D(const WebContentsAdapter);
+    d->webContents->GetRenderViewHost()->Paste();
+}
+
+void WebContentsAdapter::pasteAndMatchStyle()
+{
+    Q_D(const WebContentsAdapter);
+    d->webContents->GetRenderViewHost()->PasteAndMatchStyle();
+}
+
+void WebContentsAdapter::selectAll()
+{
+    Q_D(const WebContentsAdapter);
+    d->webContents->GetRenderViewHost()->SelectAll();
+}
+
 void WebContentsAdapter::navigateToIndex(int offset)
 {
     Q_D(WebContentsAdapter);
diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h
index 4cef56103f41b80a1a0d616a764e08b8838f56cc..3e5a0e24bf59fc30ab66931c64a33c6fc12caba2 100644
--- a/src/core/web_contents_adapter.h
+++ b/src/core/web_contents_adapter.h
@@ -73,6 +73,14 @@ public:
     QString pageTitle() const;
     QString selectedText() const;
 
+    void undo();
+    void redo();
+    void cut();
+    void copy();
+    void paste();
+    void pasteAndMatchStyle();
+    void selectAll();
+
     void navigateToIndex(int);
     void navigateToOffset(int);
     int navigationEntryCount();
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index ca1c203dd0957e86f71f2c0699b17a4da01ad87d..74b74abf111db94b71c5e66c4326f28f063548d8 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -289,7 +289,7 @@ void QWebEnginePagePrivate::updateAction(QWebEnginePage::WebAction action) const
     if (!a)
         return;
 
-    bool enabled = false;
+    bool enabled = true;
 
     switch (action) {
     case QWebEnginePage::Back:
@@ -405,6 +405,27 @@ QAction *QWebEnginePage::action(WebAction action) const
         text = tr("Reload");
         icon = style->standardIcon(QStyle::SP_BrowserReload);
         break;
+    case Cut:
+        text = tr("Cut");
+        break;
+    case Copy:
+        text = tr("Copy");
+        break;
+    case Paste:
+        text = tr("Paste");
+        break;
+    case Undo:
+        text = tr("Undo");
+        break;
+    case Redo:
+        text = tr("Redo");
+        break;
+    case SelectAll:
+        text = tr("Select All");
+        break;
+    case PasteAndMatchStyle:
+        text = tr("Paste and Match Style");
+        break;
     default:
         break;
     }
@@ -438,6 +459,27 @@ void QWebEnginePage::triggerAction(WebAction action, bool)
     case Reload:
         d->adapter->reload();
         break;
+    case Cut:
+        d->adapter->cut();
+        break;
+    case Copy:
+        d->adapter->copy();
+        break;
+    case Paste:
+        d->adapter->paste();
+        break;
+    case Undo:
+        d->adapter->undo();
+        break;
+    case Redo:
+        d->adapter->redo();
+        break;
+    case SelectAll:
+        d->adapter->selectAll();
+        break;
+    case PasteAndMatchStyle:
+        d->adapter->pasteAndMatchStyle();
+        break;
     default:
         Q_UNREACHABLE();
     }