diff --git a/src/mol-util/marker-action.ts b/src/mol-util/marker-action.ts
index 7ebe4f7b82d219c4435b68f8716e5917353fd7c1..324b625b6a313fa368026c68150e3f68a3b31a54 100644
--- a/src/mol-util/marker-action.ts
+++ b/src/mol-util/marker-action.ts
@@ -68,11 +68,19 @@ export function applyMarkerAction(array: Uint8Array, set: OrderedSet, action: Ma
     if (Interval.is(set)) {
         const start = Interval.start(set);
         const end = Interval.end(set);
-        const view = new Uint32Array(array.buffer, 0, array.buffer.byteLength >> 2);
-
         const viewStart = (start + 3) >> 2;
         const viewEnd = viewStart + ((end - 4 * viewStart) >> 2);
 
+        if (viewEnd <= viewStart) {
+            // avoid edge cases with overlapping front/end intervals
+            for (let i = start; i < end; ++i) {
+                applyMarkerActionAtPosition(array, i, action);
+            }
+            return true;
+        }
+
+        const view = new Uint32Array(array.buffer, 0, array.buffer.byteLength >> 2);
+
         const frontStart = start;
         const frontEnd = Math.min(4 * viewStart, end);
         const backStart = Math.max(start, 4 * viewEnd);
@@ -105,13 +113,8 @@ export function applyMarkerAction(array: Uint8Array, set: OrderedSet, action: Ma
             applyMarkerActionAtPosition(array, i, action);
         }
 
-        // to prevent applying "toggle" twice check for edge case where
-        // viewEnd <= viewStart, which resolves to the "front" and "back"
-        // intervals being the same range
-        if (frontStart !== backStart) {
-            for (let i = backStart; i < backEnd; ++i) {
-                applyMarkerActionAtPosition(array, i, action);
-            }
+        for (let i = backStart; i < backEnd; ++i) {
+            applyMarkerActionAtPosition(array, i, action);
         }
     } else {
         switch (action) {