diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp
index 357f95bc4551bffa0bf4e41d1173cf0208a09968..6b3614fc556c3fbc41e2e4ad8d7b168a888d7edd 100644
--- a/src/webengine/api/qquickwebengineview.cpp
+++ b/src/webengine/api/qquickwebengineview.cpp
@@ -86,6 +86,27 @@
 QT_BEGIN_NAMESPACE
 using namespace QtWebEngineCore;
 
+QQuickWebEngineView::WebAction editorActionForKeyEvent(QKeyEvent* event)
+{
+    static struct {
+        QKeySequence::StandardKey standardKey;
+        QQuickWebEngineView::WebAction action;
+    } editorActions[] = {
+        { QKeySequence::Cut, QQuickWebEngineView::Cut },
+        { QKeySequence::Copy, QQuickWebEngineView::Copy },
+        { QKeySequence::Paste, QQuickWebEngineView::Paste },
+        { QKeySequence::Undo, QQuickWebEngineView::Undo },
+        { QKeySequence::Redo, QQuickWebEngineView::Redo },
+        { QKeySequence::SelectAll, QQuickWebEngineView::SelectAll },
+        { QKeySequence::UnknownKey, QQuickWebEngineView::NoWebAction }
+    };
+    for (int i = 0; editorActions[i].standardKey != QKeySequence::UnknownKey; ++i)
+        if (event == editorActions[i].standardKey)
+            return editorActions[i].action;
+
+    return QQuickWebEngineView::NoWebAction;
+}
+
 #ifndef QT_NO_ACCESSIBILITY
 static QAccessibleInterface *webAccessibleFactory(const QString &, QObject *object)
 {
@@ -489,6 +510,18 @@ void QQuickWebEngineViewPrivate::focusContainer()
 void QQuickWebEngineViewPrivate::unhandledKeyEvent(QKeyEvent *event)
 {
     Q_Q(QQuickWebEngineView);
+#ifdef Q_OS_OSX
+    if (event->type() == QEvent::KeyPress) {
+        QQuickWebEngineView::WebAction action = editorActionForKeyEvent(event);
+        if (action != QQuickWebEngineView::NoWebAction) {
+            // Try triggering a registered short-cut
+            if (QGuiApplicationPrivate::instance()->shortcutMap.tryShortcut(event))
+                return;
+            q->triggerWebAction(action);
+            return;
+        }
+    }
+#endif
     if (q->parentItem())
         q->window()->sendEvent(q->parentItem(), event);
 }
diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h
index 2a6c2c8790b04b7e0cd0fdf454f7554b7102ad48..aab86bc3a33debf19f2bdb15312fbc3de7528404 100644
--- a/src/webengine/api/qquickwebengineview_p_p.h
+++ b/src/webengine/api/qquickwebengineview_p_p.h
@@ -68,6 +68,8 @@ class QQmlComponent;
 class QQmlContext;
 class QQuickWebEngineSettings;
 
+QQuickWebEngineView::WebAction editorActionForKeyEvent(QKeyEvent* event);
+
 #ifdef ENABLE_QML_TESTSUPPORT_API
 class QQuickWebEngineTestSupport;
 #endif
diff --git a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
index cd8fc54b90aa76b2b02c61677da2369d4b27d748..b10ca8bdb379f9436f1c675b48f16a8fd5801948 100644
--- a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
+++ b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp
@@ -207,6 +207,18 @@ void RenderWidgetHostViewQtDelegateQuick::inputMethodStateChanged(bool editorVis
 
 }
 
+bool RenderWidgetHostViewQtDelegateQuick::event(QEvent *event)
+{
+    if (event->type() == QEvent::ShortcutOverride) {
+        if (editorActionForKeyEvent(static_cast<QKeyEvent*>(event)) != QQuickWebEngineView::NoWebAction) {
+            event->accept();
+            return true;
+        }
+    }
+
+    return QQuickItem::event(event);
+}
+
 void RenderWidgetHostViewQtDelegateQuick::focusInEvent(QFocusEvent *event)
 {
     m_client->forwardEvent(event);
diff --git a/src/webengine/render_widget_host_view_qt_delegate_quick.h b/src/webengine/render_widget_host_view_qt_delegate_quick.h
index 7c44da9b978f77994788bfc9e0182193a4ac70db..dc0e481dbc3a93caa7719488e3be1429d62f57e7 100644
--- a/src/webengine/render_widget_host_view_qt_delegate_quick.h
+++ b/src/webengine/render_widget_host_view_qt_delegate_quick.h
@@ -74,6 +74,7 @@ public:
     virtual void setClearColor(const QColor &) Q_DECL_OVERRIDE { }
 
 protected:
+    virtual bool event(QEvent *event) Q_DECL_OVERRIDE;
     virtual void focusInEvent(QFocusEvent *event) Q_DECL_OVERRIDE;
     virtual void focusOutEvent(QFocusEvent *event) Q_DECL_OVERRIDE;
     virtual void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index 0279c9343a387dba4534decb211f60868cee7724..45177d8d8715f204842254e95141b9b948fcd77e 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -77,6 +77,8 @@
 #include <QStyle>
 #include <QUrl>
 
+#include <private/qguiapplication_p.h>
+
 QT_BEGIN_NAMESPACE
 
 using namespace QtWebEngineCore;
@@ -96,6 +98,27 @@ static QWebEnginePage::WebWindowType toWindowType(WebContentsAdapterClient::Wind
     }
 }
 
+QWebEnginePage::WebAction editorActionForKeyEvent(QKeyEvent* event)
+{
+    static struct {
+        QKeySequence::StandardKey standardKey;
+        QWebEnginePage::WebAction action;
+    } editorActions[] = {
+        { QKeySequence::Cut, QWebEnginePage::Cut },
+        { QKeySequence::Copy, QWebEnginePage::Copy },
+        { QKeySequence::Paste, QWebEnginePage::Paste },
+        { QKeySequence::Undo, QWebEnginePage::Undo },
+        { QKeySequence::Redo, QWebEnginePage::Redo },
+        { QKeySequence::SelectAll, QWebEnginePage::SelectAll },
+        { QKeySequence::UnknownKey, QWebEnginePage::NoWebAction }
+    };
+    for (int i = 0; editorActions[i].standardKey != QKeySequence::UnknownKey; ++i)
+        if (event == editorActions[i].standardKey)
+            return editorActions[i].action;
+
+    return QWebEnginePage::NoWebAction;
+}
+
 QWebEnginePagePrivate::QWebEnginePagePrivate(QWebEngineProfile *_profile)
     : adapter(new WebContentsAdapter)
     , history(new QWebEngineHistory(new QWebEngineHistoryPrivate(this)))
@@ -226,6 +249,19 @@ void QWebEnginePagePrivate::focusContainer()
 
 void QWebEnginePagePrivate::unhandledKeyEvent(QKeyEvent *event)
 {
+#ifdef Q_OS_OSX
+    Q_Q(QWebEnginePage);
+    if (event->type() == QEvent::KeyPress) {
+        QWebEnginePage::WebAction action = editorActionForKeyEvent(event);
+        if (action != QWebEnginePage::NoWebAction) {
+            // Try triggering a registered short-cut
+            if (QGuiApplicationPrivate::instance()->shortcutMap.tryShortcut(event))
+                return;
+            q->triggerAction(action);
+            return;
+        }
+    }
+#endif
     if (view && view->parentWidget())
         QGuiApplication::sendEvent(view->parentWidget(), event);
 }
diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h
index 7b16ed6678ce4ad8dad2d38785417a50d340725e..d0023d7bb23b0fcc6d557da15881f2601ada3c05 100644
--- a/src/webenginewidgets/api/qwebenginepage_p.h
+++ b/src/webenginewidgets/api/qwebenginepage_p.h
@@ -67,6 +67,8 @@ class QWebEngineProfile;
 class QWebEngineSettings;
 class QWebEngineView;
 
+QWebEnginePage::WebAction editorActionForKeyEvent(QKeyEvent* event);
+
 class QWebEnginePagePrivate : public QtWebEngineCore::WebContentsAdapterClient
 {
 public:
diff --git a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
index 78840085fda38faed8055634900ad560619fcf62..2937c94b72f89450a7725be8438ebe4058f085ea 100644
--- a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
+++ b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp
@@ -323,6 +323,13 @@ bool RenderWidgetHostViewQtDelegateWidget::event(QEvent *event)
         }
     }
 
+    if (event->type() == QEvent::ShortcutOverride) {
+        if (editorActionForKeyEvent(static_cast<QKeyEvent*>(event)) != QWebEnginePage::NoWebAction) {
+            event->accept();
+            return true;
+        }
+    }
+
     if (event->type() == QEvent::MouseButtonDblClick) {
         // QWidget keeps the Qt4 behavior where the DblClick event would replace the Press event.
         // QtQuick is different by sending both the Press and DblClick events for the second press