diff --git a/src/history/base.js b/src/history/base.js
index ce98f18e9..4eb85a55e 100644
--- a/src/history/base.js
+++ b/src/history/base.js
@@ -200,7 +200,7 @@ export class History {
       const queue = enterGuards.concat(this.router.resolveHooks)
       runQueue(queue, iterator, () => {
         if (this.pending !== route) {
-          return abort()
+          return abort(createNavigationCancelledError(current, route))
         }
         this.pending = null
         onComplete(route)
diff --git a/test/unit/specs/error-handling.spec.js b/test/unit/specs/error-handling.spec.js
index 8d41bca18..d73a89d95 100644
--- a/test/unit/specs/error-handling.spec.js
+++ b/test/unit/specs/error-handling.spec.js
@@ -9,7 +9,7 @@ describe('error handling', () => {
     const router = new VueRouter()
     const err = new Error('foo')
     router.beforeEach(() => { throw err })
-    router.onError(() => {})
+    router.onError(() => { })
 
     const onReady = jasmine.createSpy('ready')
     const onError = jasmine.createSpy('error')
@@ -65,6 +65,26 @@ describe('error handling', () => {
     router.push('/')
   })
 
+  it('NavigationCancelled error for nested async navigation', (done) => {
+    const component = {
+      template: `<img />`,
+      beforeRouteEnter (to, from, next) {
+        setTimeout(() => next(), 100)
+      }
+    }
+    const router = new VueRouter({
+      routes: [
+        { path: '/a', component }
+      ]
+    })
+
+    router.push('/a').catch(err => {
+      expect(err.type).toBe(NavigationFailureType.cancelled)
+      done()
+    })
+    router.push('/')
+  })
+
   it('NavigationRedirected error', done => {
     const router = new VueRouter()
 
@@ -105,7 +125,7 @@ describe('error handling', () => {
     })
 
     router.onError(spy1)
-    router.onReady(() => {}, spy2)
+    router.onReady(() => { }, spy2)
 
     router.push('/').catch(spy3).finally(() => {
       expect(spy1).toHaveBeenCalledWith(err)