diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp
index 4129e8c335f3cb7fd195076d5b41f5b6fdda35f4..3f223f733fcdcb51dfb3546c834d0f56d6156c27 100644
--- a/src/core/web_contents_adapter.cpp
+++ b/src/core/web_contents_adapter.cpp
@@ -448,7 +448,7 @@ void WebContentsAdapter::setContent(const QByteArray &data, const QString &mimeT
 QUrl WebContentsAdapter::activeUrl() const
 {
     Q_D(const WebContentsAdapter);
-    return toQt(d->webContents->GetVisibleURL());
+    return toQt(d->webContents->GetLastCommittedURL());
 }
 
 QUrl WebContentsAdapter::requestedUrl() const
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp
index b466c856602d7e590378f53985dda33305b5d173..ad850e84e8b7cab467c2199f38f73b7758c6008c 100644
--- a/src/webengine/api/qquickwebengineview.cpp
+++ b/src/webengine/api/qquickwebengineview.cpp
@@ -241,6 +241,7 @@ void QQuickWebEngineViewPrivate::urlChanged(const QUrl &url)
 {
     Q_Q(QQuickWebEngineView);
     Q_UNUSED(url);
+    explicitUrl = QUrl();
     Q_EMIT q->urlChanged();
 }
 
@@ -309,6 +310,7 @@ void QQuickWebEngineViewPrivate::loadFinished(bool success, const QUrl &url, int
         return;
     }
     if (success) {
+        explicitUrl = QUrl();
         QQuickWebEngineLoadRequest loadRequest(url, QQuickWebEngineView::LoadSucceededStatus);
         Q_EMIT q->loadingChanged(&loadRequest);
         return;
@@ -506,7 +508,7 @@ QQuickWebEngineView::~QQuickWebEngineView()
 QUrl QQuickWebEngineView::url() const
 {
     Q_D(const QQuickWebEngineView);
-    return d->adapter->activeUrl();
+    return d->explicitUrl.isValid() ? d->explicitUrl : d->adapter->activeUrl();
 }
 
 void QQuickWebEngineView::setUrl(const QUrl& url)
@@ -515,6 +517,7 @@ void QQuickWebEngineView::setUrl(const QUrl& url)
         return;
 
     Q_D(QQuickWebEngineView);
+    d->explicitUrl = url;
     d->adapter->load(url);
 }
 
diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h
index ac8b8564f4189d69c94a5550ae4d4fd099f6a95c..6662f1f021a0aa3215e0bea03a64ed5c46be67dc 100644
--- a/src/webengine/api/qquickwebengineview_p_p.h
+++ b/src/webengine/api/qquickwebengineview_p_p.h
@@ -188,6 +188,7 @@ public:
     QScopedPointer<QQuickWebEngineHistory> m_history;
     QScopedPointer<QQuickWebEngineSettings> m_settings;
     QQmlComponent *contextMenuExtraItems;
+    QUrl explicitUrl;
     QUrl icon;
     int loadProgress;
     bool inspectable;
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index 8c3c2bb4527e71ee983c664b229b84be1fa4d549..d6782974bfd7a40e6ea4df4148f94141771839a8 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -196,7 +196,7 @@ void QWebEnginePagePrivate::titleChanged(const QString &title)
 void QWebEnginePagePrivate::urlChanged(const QUrl &url)
 {
     Q_Q(QWebEnginePage);
-    m_explicitUrl = QUrl();
+    explicitUrl = QUrl();
     Q_EMIT q->urlChanged(url);
 }
 
@@ -256,7 +256,7 @@ void QWebEnginePagePrivate::loadFinished(bool success, const QUrl &url, int erro
     Q_UNUSED(errorDescription);
     isLoading = false;
     if (success)
-        m_explicitUrl = QUrl();
+        explicitUrl = QUrl();
     Q_EMIT q->loadFinished(success);
     updateNavigationActions();
 }
@@ -825,14 +825,14 @@ QString QWebEnginePage::title() const
 void QWebEnginePage::setUrl(const QUrl &url)
 {
     Q_D(QWebEnginePage);
-    d->m_explicitUrl = url;
+    d->explicitUrl = url;
     load(url);
 }
 
 QUrl QWebEnginePage::url() const
 {
     Q_D(const QWebEnginePage);
-    return d->m_explicitUrl.isValid() ? d->m_explicitUrl : d->adapter->activeUrl();
+    return d->explicitUrl.isValid() ? d->explicitUrl : d->adapter->activeUrl();
 }
 
 QUrl QWebEnginePage::requestedUrl() const
diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h
index ccbfb2bc131bc1f7e669366334925417a807dff2..54129229f8850ce468188fd4a1bd39f4990b8283 100644
--- a/src/webenginewidgets/api/qwebenginepage_p.h
+++ b/src/webenginewidgets/api/qwebenginepage_p.h
@@ -151,7 +151,7 @@ public:
     QWebEngineSettings *settings;
     QWebEngineView *view;
     QSize viewportSize;
-    QUrl m_explicitUrl;
+    QUrl explicitUrl;
     WebEngineContextMenuData m_menuData;
     bool isLoading;
 
diff --git a/tests/auto/quick/qmltests/data/tst_loadUrl.qml b/tests/auto/quick/qmltests/data/tst_loadUrl.qml
index 41faa6bc37151d04cbf3cd57d7af581a6965f341..5f51e90364a58a9e33d6df94c649a0baef9baf51 100644
--- a/tests/auto/quick/qmltests/data/tst_loadUrl.qml
+++ b/tests/auto/quick/qmltests/data/tst_loadUrl.qml
@@ -125,7 +125,9 @@ TestWebEngineView {
             var handleLoadFailed = function(loadRequest) {
                 if (loadRequest.status == WebEngineView.LoadFailedStatus) {
                     webEngineView.loadHtml("load failed", bogusSite)
-                    compare(webEngineView.url, bogusSite)
+                    // Since the load did not succeed the active url is the
+                    // url of the previous successful load.
+                    compare(webEngineView.url, "about:blank")
                     compare(loadRequest.url, bogusSite)
                 }
             }
diff --git a/tests/auto/widgets/qwebengineframe/tst_qwebengineframe.cpp b/tests/auto/widgets/qwebengineframe/tst_qwebengineframe.cpp
index 1a8745f25422ba209d888d56a1ab7368b0ff040b..9901bcd76dce13ed85e0d4b4837bbe2b056df696 100644
--- a/tests/auto/widgets/qwebengineframe/tst_qwebengineframe.cpp
+++ b/tests/auto/widgets/qwebengineframe/tst_qwebengineframe.cpp
@@ -1549,7 +1549,6 @@ void tst_QWebEngineFrame::setUrlThenLoads()
 
     // Just after first load. URL didn't changed yet.
     m_page->load(urlToLoad1);
-    QEXPECT_FAIL("", "Slight change: url() will return the loaded URL immediately.", Continue);
     QCOMPARE(m_page->url(), url);
     QCOMPARE(m_page->requestedUrl(), urlToLoad1);
     // baseUrlSync spins an event loop and this sometimes return the next result.
@@ -1566,7 +1565,6 @@ void tst_QWebEngineFrame::setUrlThenLoads()
 
     // Just after second load. URL didn't changed yet.
     m_page->load(urlToLoad2);
-    QEXPECT_FAIL("", "Slight change: url() will return the loaded URL immediately.", Continue);
     QCOMPARE(m_page->url(), urlToLoad1);
     QCOMPARE(m_page->requestedUrl(), urlToLoad2);
     QCOMPARE(baseUrlSync(m_page), extractBaseUrl(urlToLoad1));