diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp
index 232d63b305b8b489565440decdfb5157a04cfef0..85d400cafdafd7003e1d91f8da6b2eb66c462b37 100644
--- a/src/webengine/api/qquickwebengineview.cpp
+++ b/src/webengine/api/qquickwebengineview.cpp
@@ -253,7 +253,8 @@ void QQuickWebEngineViewPrivate::allowCertificateError(const QSharedPointer<Cert
 
 void QQuickWebEngineViewPrivate::runGeolocationPermissionRequest(const QUrl &url)
 {
-    Q_EMIT e->featurePermissionRequested(url, QQuickWebEngineViewExperimental::Geolocation);
+    Q_Q(QQuickWebEngineView);
+    Q_EMIT q->featurePermissionRequested(url, QQuickWebEngineView::Geolocation);
 }
 
 void QQuickWebEngineViewPrivate::runFileChooser(FileChooserMode mode, const QString &defaultFileName, const QStringList &acceptedMimeTypes)
@@ -452,16 +453,17 @@ void QQuickWebEngineViewPrivate::javaScriptConsoleMessage(JavaScriptConsoleMessa
 
 void QQuickWebEngineViewPrivate::runMediaAccessPermissionRequest(const QUrl &securityOrigin, WebContentsAdapterClient::MediaRequestFlags requestFlags)
 {
-   if (!requestFlags)
-       return;
-   QQuickWebEngineViewExperimental::Feature feature;
-   if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture) && requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture))
-       feature = QQuickWebEngineViewExperimental::MediaAudioVideoCapture;
-   else if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture))
-       feature = QQuickWebEngineViewExperimental::MediaAudioCapture;
-   else // WebContentsAdapterClient::MediaVideoCapture
-       feature = QQuickWebEngineViewExperimental::MediaVideoCapture;
-   Q_EMIT e->featurePermissionRequested(securityOrigin, feature);
+    Q_Q(QQuickWebEngineView);
+    if (!requestFlags)
+        return;
+    QQuickWebEngineView::Feature feature;
+    if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture) && requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture))
+        feature = QQuickWebEngineView::MediaAudioVideoCapture;
+    else if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture))
+        feature = QQuickWebEngineView::MediaAudioCapture;
+    else // WebContentsAdapterClient::MediaVideoCapture
+        feature = QQuickWebEngineView::MediaVideoCapture;
+    Q_EMIT q->featurePermissionRequested(securityOrigin, feature);
 }
 
 void QQuickWebEngineViewPrivate::runMouseLockPermissionRequest(const QUrl &securityOrigin)
@@ -923,7 +925,7 @@ void QQuickWebEngineView::setWebChannel(QQmlWebChannel *webChannel)
         Q_EMIT webChannelChanged();
 }
 
-void QQuickWebEngineViewExperimental::grantFeaturePermission(const QUrl &securityOrigin, QQuickWebEngineViewExperimental::Feature feature, bool granted)
+void QQuickWebEngineView::grantFeaturePermission(const QUrl &securityOrigin, QQuickWebEngineView::Feature feature, bool granted)
 {
     if (!d_ptr->adapter)
         return;
diff --git a/src/webengine/api/qquickwebengineview_p.h b/src/webengine/api/qquickwebengineview_p.h
index 248ee62b6d7d47278ab12e04ec9b188d4b0b46ef..c84a65805c5fc978309a6c025c5d6aa6af647fec 100644
--- a/src/webengine/api/qquickwebengineview_p.h
+++ b/src/webengine/api/qquickwebengineview_p.h
@@ -99,6 +99,7 @@ class Q_WEBENGINE_PRIVATE_EXPORT QQuickWebEngineView : public QQuickItem {
     Q_ENUMS(LoadStatus);
     Q_ENUMS(ErrorDomain);
     Q_ENUMS(NewViewDestination);
+    Q_ENUMS(Feature);
     Q_ENUMS(JavaScriptConsoleMessageLevel);
     Q_FLAGS(FindFlags);
 
@@ -162,6 +163,13 @@ public:
         NewViewInBackgroundTab
     };
 
+    enum Feature {
+        MediaAudioCapture,
+        MediaVideoCapture,
+        MediaAudioVideoCapture,
+        Geolocation
+    };
+
     // must match WebContentsAdapterClient::JavaScriptConsoleMessageLevel
     enum JavaScriptConsoleMessageLevel {
         InfoMessageLevel = 0,
@@ -202,6 +210,7 @@ public Q_SLOTS:
     void stop();
     Q_REVISION(1) void findText(const QString &subString, FindFlags options = 0, const QJSValue &callback = QJSValue());
     Q_REVISION(1) void fullScreenCancelled();
+    Q_REVISION(1) void grantFeaturePermission(const QUrl &securityOrigin, Feature, bool granted);
 
 Q_SIGNALS:
     void titleChanged();
@@ -215,6 +224,7 @@ Q_SIGNALS:
     Q_REVISION(1) void certificateError(QQuickWebEngineCertificateError *error);
     Q_REVISION(1) void fullScreenRequested(const QQuickWebEngineFullScreenRequest &request);
     Q_REVISION(1) void isFullScreenChanged();
+    Q_REVISION(1) void featurePermissionRequested(const QUrl &securityOrigin, Feature feature);
     Q_REVISION(1) void newViewRequested(QQuickWebEngineNewViewRequest *request);
     Q_REVISION(1) void zoomFactorChanged(qreal arg);
     Q_REVISION(1) void webChannelChanged();
diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h
index ec8f83468ba25b19c2b427d6769a234bfc8c94f1..edc8c1a92e92c6c2ea603ae3e48cf57afaf49aed 100644
--- a/src/webengine/api/qquickwebengineview_p_p.h
+++ b/src/webengine/api/qquickwebengineview_p_p.h
@@ -83,26 +83,13 @@ class Q_WEBENGINE_PRIVATE_EXPORT QQuickWebEngineViewExperimental : public QObjec
     Q_OBJECT
     Q_PROPERTY(QQuickWebEngineViewport *viewport READ viewport)
     Q_PROPERTY(QQmlComponent *extraContextMenuEntriesComponent READ extraContextMenuEntriesComponent WRITE setExtraContextMenuEntriesComponent NOTIFY extraContextMenuEntriesComponentChanged)
-    Q_ENUMS(Feature)
-
-public:
-    enum Feature {
-        MediaAudioCapture,
-        MediaVideoCapture,
-        MediaAudioVideoCapture,
-        Geolocation
-    };
 
     QQuickWebEngineViewport *viewport() const;
     void setExtraContextMenuEntriesComponent(QQmlComponent *);
     QQmlComponent *extraContextMenuEntriesComponent() const;
 
-public Q_SLOTS:
-    void grantFeaturePermission(const QUrl &securityOrigin, Feature, bool granted);
-
 Q_SIGNALS:
     void extraContextMenuEntriesComponentChanged();
-    void featurePermissionRequested(const QUrl &securityOrigin, Feature feature);
     void loadVisuallyCommitted();
 
 private:
diff --git a/src/webengine/doc/src/qquickwebengineview_lgpl.qdoc b/src/webengine/doc/src/qquickwebengineview_lgpl.qdoc
index 73c084dab6fcf03d7d141e518a8ffcdb18481346..035d4a3823369f6bbc7c6c02487635c33565892a 100644
--- a/src/webengine/doc/src/qquickwebengineview_lgpl.qdoc
+++ b/src/webengine/doc/src/qquickwebengineview_lgpl.qdoc
@@ -244,6 +244,23 @@
     \endcode
 */
 
+/*!
+    \qmlmethod void WebEngineView::grantFeaturePermission(url securityOrigin, WebEngineView::Feature feature, bool granted)
+
+    Sets the permission for the web site identified by \a securityOrigin to use \a feature.
+
+    \sa featurePermissionRequested()
+*/
+
+/*!
+    \qmlsignal void WebEngineView::featurePermissionRequested(url securityOrigin, WebEngineView::Feature feature)
+
+    This is signal is emitted when the web site identified by \a securityOrigin requests
+    to make use of the resource or device identified by \a feature.
+
+    \sa grantFeaturePermission()
+*/
+
 /*!
     \qmlsignal WebEngineView::loadingChanged(loadRequest)
 
@@ -416,3 +433,17 @@
 
     \sa WebEngineView::findText()
 */
+
+/*!
+    \qmlproperty enumeration WebEngineView::Feature
+
+    This enum describes the platform feature access categories that the user may be asked to grant or deny access to.
+
+    \value Geolocation Access to location hardware or service
+    \value MediaAudioCapture Audio capture devices such a microphones
+    \value MediaVideoCapture Video devices, e.g. cameras
+    \value MediaAudioVideoCapture Both Audio and Video capture devices.
+
+    \sa featurePermissionRequested(), grantFeaturePermission()
+
+*/
diff --git a/tests/auto/quick/publicapi/tst_publicapi.cpp b/tests/auto/quick/publicapi/tst_publicapi.cpp
index 1cf2e37c485b530a47e935212a9f31b3a2e2f03a..1ac5a3111b11d47597cbc0f78eab2a9aa0eab70e 100644
--- a/tests/auto/quick/publicapi/tst_publicapi.cpp
+++ b/tests/auto/quick/publicapi/tst_publicapi.cpp
@@ -120,6 +120,10 @@ static QStringList expectedAPI = QStringList()
     << "QQuickWebEngineView.NewViewInTab --> NewViewDestination"
     << "QQuickWebEngineView.NewViewInDialog --> NewViewDestination"
     << "QQuickWebEngineView.NewViewInBackgroundTab --> NewViewDestination"
+    << "QQuickWebEngineView.MediaAudioCapture --> Feature"
+    << "QQuickWebEngineView.MediaVideoCapture --> Feature"
+    << "QQuickWebEngineView.MediaAudioVideoCapture --> Feature"
+    << "QQuickWebEngineView.Geolocation --> Feature"
     << "QQuickWebEngineView.InfoMessageLevel --> JavaScriptConsoleMessageLevel"
     << "QQuickWebEngineView.WarningMessageLevel --> JavaScriptConsoleMessageLevel"
     << "QQuickWebEngineView.ErrorMessageLevel --> JavaScriptConsoleMessageLevel"
@@ -143,6 +147,8 @@ static QStringList expectedAPI = QStringList()
     << "QQuickWebEngineView.fullScreenRequested(QQuickWebEngineFullScreenRequest) --> void"
     << "QQuickWebEngineView.isFullScreenChanged() --> void"
     << "QQuickWebEngineView.fullScreenCancelled() --> void"
+    << "QQuickWebEngineView.featurePermissionRequested(QUrl,Feature) --> void"
+    << "QQuickWebEngineView.grantFeaturePermission(QUrl,Feature,bool) --> void"
     << "QQuickWebEngineView.runJavaScript(QString,QJSValue) --> void"
     << "QQuickWebEngineView.runJavaScript(QString) --> void"
     << "QQuickWebEngineView.loadHtml(QString,QUrl) --> void"
diff --git a/tests/quicktestbrowser/BrowserWindow.qml b/tests/quicktestbrowser/BrowserWindow.qml
index 3f7897f0472f6df2bb979fc2bbb17c6e33416a25..45fad8d9c4d932b8b63ed63c5065cb13246db192 100644
--- a/tests/quicktestbrowser/BrowserWindow.qml
+++ b/tests/quicktestbrowser/BrowserWindow.qml
@@ -397,12 +397,13 @@ ApplicationWindow {
                         request.accept()
                     }
 
+                    onFeaturePermissionRequested: {
+                        permBar.securityOrigin = securityOrigin;
+                        permBar.requestedFeature = feature;
+                        permBar.visible = true;
+                    }
+
                     experimental {
-                        onFeaturePermissionRequested: {
-                            permBar.securityOrigin = securityOrigin;
-                            permBar.requestedFeature = feature;
-                            permBar.visible = true;
-                        }
                         extraContextMenuEntriesComponent: ContextMenuExtras {}
                     }
                 }
diff --git a/tests/quicktestbrowser/FeaturePermissionBar.qml b/tests/quicktestbrowser/FeaturePermissionBar.qml
index 135df9abdecc267f13665e1ddddf3fa93449324f..c9b15dfd2b580089f420bcd7d0abf3fc1eac5670 100644
--- a/tests/quicktestbrowser/FeaturePermissionBar.qml
+++ b/tests/quicktestbrowser/FeaturePermissionBar.qml
@@ -40,8 +40,7 @@
 
 import QtQuick 2.1
 import QtQuick.Controls 1.0
-import QtWebEngine 1.0
-import QtWebEngine.experimental 1.0
+import QtWebEngine 1.1
 import QtQuick.Layouts 1.0
 
 Rectangle {
@@ -69,13 +68,13 @@ Rectangle {
             Layout.fillWidth: true
 
             function textForFeature(feature) {
-                if (feature === WebEngineViewExperimental.MediaAudioCapture)
+                if (feature === WebEngineView.MediaAudioCapture)
                     return "your microphone"
-                if (feature === WebEngineViewExperimental.MediaVideoCapture)
+                if (feature === WebEngineView.MediaVideoCapture)
                     return "your camera"
-                if (feature === WebEngineViewExperimental.MediaAudioVideoCapture)
+                if (feature === WebEngineView.MediaAudioVideoCapture)
                     return "your camera and microphone"
-                if (feature === WebEngineViewExperimental.Geolocation)
+                if (feature === WebEngineView.Geolocation)
                     return "your position"
             }
         }
@@ -85,7 +84,7 @@ Rectangle {
             text: "Accept"
             Layout.alignment: Qt.AlignRight
             onClicked: {
-                view.experimental.grantFeaturePermission(securityOrigin, requestedFeature, true);
+                view.grantFeaturePermission(securityOrigin, requestedFeature, true);
                 permissionBar.visible = false;
             }
         }
@@ -94,7 +93,7 @@ Rectangle {
             text: "Deny"
             Layout.alignment: Qt.AlignRight
             onClicked: {
-                view.experimental.grantFeaturePermission(securityOrigin, requestedFeature, false);
+                view.grantFeaturePermission(securityOrigin, requestedFeature, false);
                 permissionBar.visible = false
             }
         }