diff --git a/frontend/src/components/Map.vue b/frontend/src/components/Map.vue
index 40af5ee..1bc8f13 100644
--- a/frontend/src/components/Map.vue
+++ b/frontend/src/components/Map.vue
@@ -51,7 +51,7 @@
                         :devices="devices"
                         :disabled="loading"
                         :resolution="resolutionMeters"
-                        @refresh="locationQuery = $event"
+                        @refresh="onFormUpdate"
                         @set-resolution="setResolution" />
           </div>
           <FilterButton @input="showControls = !showControls"
@@ -284,7 +284,7 @@ export default {
         return
       }
 
-      this.locationQuery = nextPageQuery
+      this.locationQuery = new LocationQuery(nextPageQuery)
     },
 
     fetchPrevPage() {
@@ -293,7 +293,7 @@ export default {
         return
       }
 
-      this.locationQuery = prevPageQuery
+      this.locationQuery = new LocationQuery(prevPageQuery)
     },
 
     async resetPage() {
@@ -410,6 +410,10 @@ export default {
       this.locationQuery.maxId = null
     },
 
+    onFormUpdate(event: any) {
+      this.locationQuery = new LocationQuery(event)
+    },
+
     onTimelinePointHover(point: GPSPoint) {
       if (!this.pointsLayer) {
         return
@@ -450,7 +454,7 @@ export default {
         Math.max(startPoint[1], endPoint[1]),
       ]
 
-      this.locationQuery = {
+      this.locationQuery = new LocationQuery({
         ...this.locationQuery,
         startDate: null,
         endDate: null,
@@ -460,14 +464,14 @@ export default {
         minLatitude: startLat,
         maxLongitude: endLon,
         maxLatitude: endLat,
-      }
+      })
     },
 
     onSelectOverlayButtonClick() {
       if (!this.hasSelectionBox) {
         this.showSelectOverlay = true
       } else {
-        this.locationQuery = {
+        this.locationQuery = new LocationQuery({
           ...this.locationQuery,
           minId: null,
           maxId: null,
@@ -475,7 +479,7 @@ export default {
           minLatitude: null,
           maxLongitude: null,
           maxLatitude: null,
-        }
+        })
       }
     },
 
diff --git a/frontend/src/components/MapSelectOverlay.vue b/frontend/src/components/MapSelectOverlay.vue
index 094ec29..630c310 100644
--- a/frontend/src/components/MapSelectOverlay.vue
+++ b/frontend/src/components/MapSelectOverlay.vue
@@ -6,13 +6,13 @@
     </div>
     <div class="overlay"
          ref="overlay"
-         @mousedown="onOverlayDragStart"
-         @mouseup="onOverlayDragEnd"
-         @mousemove="onOverlayMove"
-         @touchstart="onOverlayDragStart"
-         @touchend="onOverlayDragEnd"
-         @touchmove="onOverlayMove"
-         @click="onOverlayDragEnd">
+         @mousedown="onSelectionStart"
+         @mouseup="onSelectionEnd"
+         @mousemove="onSelectionEdit"
+         @touchstart.stop.prevent="onSelectionStart"
+         @touchend.stop.prevent="onSelectionEnd"
+         @touchmove.stop.prevent="onSelectionEdit"
+         @click="onSelectionEnd">
       <div class="box"
            :style="selectionBoxStyle"
            v-if="selectionBox.length > 1" />
@@ -86,21 +86,30 @@ export default {
     },
 
     getXY(event: MouseEvent | TouchEvent): number[] {
-      if (event instanceof MouseEvent) {
-        return [event.clientX, event.clientY]
-      }
-
+      let [x, y] = [null, null]
       if (event instanceof TouchEvent) {
-        const touches = event.touches?.length ? event.touches : this.latestTouchEvent?.touches
-        if (!touches?.length) {
-          return []
+        if (event.touches?.length) {
+          x = event.touches[0].clientX
+          y = event.touches[0].clientY
+        } else if (event.changedTouches?.length) {
+          x = event.changedTouches[0].clientX
+          y = event.changedTouches[0].clientY
+        } else if (this.latestTouchEvent) {
+          x = this.latestTouchEvent.changedTouches[0].clientX
+          y = this.latestTouchEvent.changedTouches[0].clientY
+        } else {
+          return
         }
-
-        this.latestTouchEvent = null
-        return [touches[0].clientX, touches[0].clientY]
+      } else {
+        x = event.clientX
+        y = event.clientY
       }
 
-      return []
+      if (x == null || y == null) {
+        return []
+      }
+
+      return [x, y]
     },
 
     setSelectionBoxCoordinates(event: MouseEvent | TouchEvent) {
@@ -117,13 +126,21 @@ export default {
       this.selectionBox = newBox
     },
 
-    onOverlayDragStart(event: MouseEvent | TouchEvent) {
+    onSelectionStart(event: MouseEvent | TouchEvent) {
       this.selectionBox = []
       this.setSelectionBoxCoordinates(event)
       this.overlayDragging = true
     },
 
-    onOverlayDragEnd(event: MouseEvent | TouchEvent) {
+    onSelectionEdit(event: MouseEvent | TouchEvent) {
+      if (!this.overlayDragging || this.selectionBox.length < 1) {
+        return
+      }
+
+      this.setSelectionBoxCoordinates(event)
+    },
+
+    onSelectionEnd(event: MouseEvent | TouchEvent) {
       if (this.selectionBox.length < 1) {
         this.selectionBox = []
         return
@@ -135,6 +152,7 @@ export default {
 
       this.setSelectionBoxCoordinates(event)
       this.overlayDragging = false
+      this.latestTouchEvent = null
 
       if (this.hasDistinctPoints) {
         this.$emit(
@@ -148,18 +166,6 @@ export default {
         )
       }
     },
-
-    onOverlayMove(event: MouseEvent | TouchEvent) {
-      if (!this.overlayDragging || this.selectionBox.length < 1) {
-        return
-      }
-
-      this.setSelectionBoxCoordinates(event)
-      if (event instanceof TouchEvent) {
-        this.latestTouchEvent = event
-      }
-    },
-
   }
 }
 </script>
diff --git a/frontend/src/mixins/SelectionBox.vue b/frontend/src/mixins/SelectionBox.vue
deleted file mode 100644
index d717dde..0000000
--- a/frontend/src/mixins/SelectionBox.vue
+++ /dev/null
@@ -1,85 +0,0 @@
-<script lang="ts">
-export default {
-  data() {
-    return {
-      selectionBox: [] as number[][],
-    }
-  },
-
-  computed: {
-    selectionBoxStyle(): Record<string, string> {
-      if (this.selectionBox.length < 2) {
-        return {}
-      }
-
-      const [minX, minY, maxX, maxY] = [
-        Math.min(this.selectionBox[0][0], this.selectionBox[1][0]),
-        Math.min(this.selectionBox[0][1], this.selectionBox[1][1]),
-        Math.max(this.selectionBox[0][0], this.selectionBox[1][0]),
-        Math.max(this.selectionBox[0][1], this.selectionBox[1][1]),
-      ]
-
-      return {
-        top: minY + 'px',
-        left: minX + 'px',
-        width: `${maxX - minX}px`,
-        height: `${maxY - minY}px`,
-      }
-    },
-  },
-
-  methods: {
-    scaledPointerCoordinates(event: MouseEvent): number[] {
-      // @ts-ignore
-      const offsetLeft = this.$refs.overlay?.getBoundingClientRect().left || 0
-      // @ts-ignore
-      const offsetTop = this.$refs.overlay?.getBoundingClientRect().top || 0
-
-      return [
-        event.clientX - offsetLeft,
-        event.clientY - offsetTop,
-      ]
-    },
-
-    setSelectionBoxCoordinates(event: MouseEvent) {
-      const coords = this.scaledPointerCoordinates(event)
-      let newBox = JSON.parse(JSON.stringify(this.selectionBox)) as number[][]
-
-      if (newBox.length === 1 || !newBox[1]) {
-        newBox.push(coords)
-      } else {
-        newBox[1] = coords
-      }
-
-      newBox = newBox.sort((a: number[], b: number[]) => a[0] - b[0])
-      this.selectionBox = newBox
-    },
-
-    onOverlayDragStart(event: MouseEvent) {
-      this.setSelectionBoxCoordinates(event)
-    },
-
-    onOverlayDragEnd(event: MouseEvent) {
-      if (this.selectionBox.length < 1) {
-        this.selectionBox = []
-        return
-      }
-
-      this.setSelectionBoxCoordinates(event)
-      if (this.selectionBox.length > 1 && (
-        this.selectionBox[0][0] === this.selectionBox[1][0] && this.selectionBox[0][1] === this.selectionBox[1][1])
-      ) {
-        this.selectionBox = []
-      }
-    },
-
-    onOverlayMove(event: MouseEvent) {
-      if (this.selectionBox.length < 1) {
-        return
-      }
-
-      this.setSelectionBoxCoordinates(event)
-    },
-  },
-}
-</script>