diff --git a/src/lib/drag-recognizer.js b/src/lib/drag-recognizer.js
index 1f507785ae0474938de79abfe02e3f9d5f19107d..da7173f8bc4e34546f51853df64bb2363cddfbf9 100644
--- a/src/lib/drag-recognizer.js
+++ b/src/lib/drag-recognizer.js
@@ -109,8 +109,10 @@ class DragRecognizer {
     }
 
     _handleEnd () {
-        this._onDragEnd();
         this.reset();
+        // Call the callback after reset to make sure if gestureInProgress()
+        // is used in response, it get the correct value (i.e. no gesture in progress)
+        this._onDragEnd();
     }
 
     _isDrag () {
diff --git a/test/unit/util/drag-recognizer.test.js b/test/unit/util/drag-recognizer.test.js
index 825917ba8eddb75e2278808166581eec552e5c06..643ded52815bcc1b7bd8b180f8be449214d47d72 100644
--- a/test/unit/util/drag-recognizer.test.js
+++ b/test/unit/util/drag-recognizer.test.js
@@ -56,6 +56,17 @@ describe('DragRecognizer', () => {
         expect(onDrag).toHaveBeenCalledTimes(1); // Still 1
     });
 
+    test('start -> end calls dragEnd callback after resetting internal state', done => {
+        onDragEnd = () => {
+            expect(dragRecognizer.gestureInProgress()).toBe(false);
+            done();
+        };
+        dragRecognizer = new DragRecognizer({onDrag, onDragEnd});
+        dragRecognizer.start({clientX: 100, clientY: 100});
+        window.dispatchEvent(new MouseEvent('touchmove', {clientX: 150, clientY: 106}));
+        window.dispatchEvent(new MouseEvent('touchend', {clientX: 150, clientY: 106}));
+    });
+
     test('start -> reset unbinds', () => {
         dragRecognizer.start({clientX: 100, clientY: 100});
         window.dispatchEvent(new MouseEvent('touchmove', {clientX: 150, clientY: 106}));