diff --git a/barrier/barrier.v b/barrier/barrier.v
index 8a6c48c6ccc54ea5f5d55cc1eba5b295ee0ed307..50569b44e6882e64ce1f71618389087c5b67c643 100644
--- a/barrier/barrier.v
+++ b/barrier/barrier.v
@@ -98,6 +98,8 @@ Section proof.
   Context `{stsG heap_lang Σ sts}.
   Context `{savedPropG heap_lang Σ}.
 
+  Local Hint Immediate i_states_closed low_states_closed.
+
   Notation iProp := (iPropG heap_lang Σ).
 
   Definition waiting (P : iProp) (I : gset gname) : iProp :=
@@ -161,10 +163,7 @@ Section proof.
       eapply sep_elim_True_r; last eapply sep_mono_l.
       { rewrite -later_intro. apply wand_intro_l. by rewrite right_id. }
       rewrite (sts_own_weaken ⊤ _ _ (i_states i ∩ low_states) _ ({[ Change i ]} ∪ {[ Send ]})).
-      + apply pvs_mono. rewrite sts_ownS_op; first done.
-        * set_solver.
-        * apply i_states_closed.
-        * apply low_states_closed.
+      + apply pvs_mono. rewrite sts_ownS_op; eauto; []. set_solver.
       + rewrite /= /tok /=. apply elem_of_equiv=>t. rewrite elem_of_difference elem_of_union.
         rewrite !mkSet_elem_of /change_tokens.
         (* TODO: destruct t; set_solver does not work. What is the best way to do on? *)
@@ -173,12 +172,9 @@ Section proof.
           exfalso. apply Hn. left. set_solver.
         * move=>[[EQ]|?]; last discriminate. set_solver. 
       + apply elem_of_intersection. rewrite !mkSet_elem_of /=. set_solver.
-      + apply sts.closed_op.
-        * apply i_states_closed.
-        * apply low_states_closed.
-        * set_solver.
-        * apply (non_empty_inhabited (State Low {[ i ]})). apply elem_of_intersection.
-          rewrite !mkSet_elem_of /=. set_solver.
+      + apply sts.closed_op; eauto; first set_solver; [].
+        apply (non_empty_inhabited (State Low {[ i ]})). apply elem_of_intersection.
+        rewrite !mkSet_elem_of /=. set_solver.
   Qed.
 
   Lemma signal_spec l P (Q : val → iProp) :