diff --git a/src/mol-plugin/state.ts b/src/mol-plugin/state.ts
index 89da2a46133369fcda224d0ea2fc1179568d132d..07127dbf56ca0ea5e03f1781016e64157b99cf3a 100644
--- a/src/mol-plugin/state.ts
+++ b/src/mol-plugin/state.ts
@@ -64,7 +64,7 @@ class PluginState {
     }
 
     async setSnapshot(snapshot: PluginState.Snapshot) {
-        this.animation.stop();
+        await this.animation.stop();
 
         if (snapshot.behaviour) await this.plugin.runTask(this.behaviorState.setSnapshot(snapshot.behaviour));
         if (snapshot.data) await this.plugin.runTask(this.dataState.setSnapshot(snapshot.data));
diff --git a/src/mol-plugin/state/animation/built-in.ts b/src/mol-plugin/state/animation/built-in.ts
index f8211ea444d024033f5ae2d07747094ee0df922e..0e75c918b2ade162140cc336413c63de733fe20f 100644
--- a/src/mol-plugin/state/animation/built-in.ts
+++ b/src/mol-plugin/state/animation/built-in.ts
@@ -90,7 +90,8 @@ export const AnimateAssemblyUnwind = PluginStateAnimation.create({
     name: 'built-in.animate-assembly-unwind',
     display: { name: 'Unwind Assembly' },
     params: () => ({
-        durationInMs: PD.Numeric(3000, { min: 100, max: 10000, step: 100})
+        durationInMs: PD.Numeric(3000, { min: 100, max: 10000, step: 100}),
+        playOnce: PD.Boolean(false)
     }),
     initialState: () => ({ t: 0 }),
     async setup(_, plugin) {
@@ -133,7 +134,13 @@ export const AnimateAssemblyUnwind = PluginStateAnimation.create({
         const update = state.build();
 
         const d = (t.current - t.lastApplied) / ctx.params.durationInMs;
-        const newTime = (animState.t + d) % 1;
+        let newTime = (animState.t + d), finished = false;
+        if (ctx.params.playOnce && newTime >= 1) {
+            finished = true;
+            newTime = 1;
+        } else {
+            newTime = newTime % 1;
+        }
 
         for (const m of anims) {
             update.to(m).update({ t: newTime });
@@ -141,6 +148,7 @@ export const AnimateAssemblyUnwind = PluginStateAnimation.create({
 
         await PluginCommands.State.Update.dispatch(ctx.plugin, { state, tree: update, options: { doNotLogTiming: true } });
 
+        if (finished) return { kind: 'finished' };
         return { kind: 'next', state: { t: newTime } };
     }
 })
diff --git a/src/mol-plugin/ui/controls.tsx b/src/mol-plugin/ui/controls.tsx
index 7985f17542b3a45679209929e24221c6d41ed7ae..3ca349f024b3a36dbcab6de50d1abada76eb3ced 100644
--- a/src/mol-plugin/ui/controls.tsx
+++ b/src/mol-plugin/ui/controls.tsx
@@ -109,7 +109,7 @@ export class StateSnapshotViewportControls extends PluginUIComponent<{}, { isBus
         // TODO: this needs to be diabled when the state is updating!
         this.subscribe(this.plugin.state.snapshots.events.changed, () => this.forceUpdate());
         this.subscribe(this.plugin.behaviors.state.isUpdating, isBusy => this.setState({ isBusy }));
-        this.subscribe(this.plugin.behaviors.state.isAnimating, isAnimating => this.setState({ show: !isAnimating }));
+        this.subscribe(this.plugin.behaviors.state.isAnimating, isBusy => this.setState({ isBusy }));
     }
 
     async update(id: string) {