diff --git a/theories/base_logic/lib/cancelable_invariants.v b/theories/base_logic/lib/cancelable_invariants.v
index 9ee7222369e9d9f8d77cd8a79466a2812cb3fec1..762d6e22e3e48c439704931e5abef81ed62c4db9 100644
--- a/theories/base_logic/lib/cancelable_invariants.v
+++ b/theories/base_logic/lib/cancelable_invariants.v
@@ -93,12 +93,12 @@ Section proofs.
 
   Global Instance into_inv_cinv N γ P : IntoInv (cinv N γ P) N.
   Global Instance elim_inv_cinv p γ E N P Q Q' :
-    (∀ R, ElimModal True (|={E,E∖↑N}=> R) R Q Q') →
+    (∀ R, ElimModal True false false (|={E,E∖↑N}=> R) R Q Q') →
     ElimInv (↑N ⊆ E) (cinv N γ P) (cinv_own γ p)
       (▷ P ∗ cinv_own γ p) (▷ P ={E∖↑N,E}=∗ True) Q Q'.
   Proof.
     rewrite /ElimInv /ElimModal. iIntros (Helim ?) "(#H1&Hown&H2)".
-    iApply Helim; [done|]. iSplitR "H2"; [|done].
+    iApply Helim; [done|]; simpl. iSplitR "H2"; [|done].
     iMod (cinv_open E N γ p P with "[#] [Hown]") as "(HP&Hown&Hclose)"; auto. 
     by iFrame.
   Qed.
diff --git a/theories/base_logic/lib/invariants.v b/theories/base_logic/lib/invariants.v
index 7975845aa6c9c03876df8f770dff3a613103d2ec..5ec29362dc650289a17a4cc0c558ea45cfd9e700 100644
--- a/theories/base_logic/lib/invariants.v
+++ b/theories/base_logic/lib/invariants.v
@@ -110,11 +110,11 @@ Qed.
 Global Instance into_inv_inv N P : IntoInv (inv N P) N.
 
 Global Instance elim_inv_inv E N P Q Q' :
-  (∀ R, ElimModal True (|={E,E∖↑N}=> R) R Q Q') →
+  (∀ R, ElimModal True false false (|={E,E∖↑N}=> R) R Q Q') →
   ElimInv (↑N ⊆ E) (inv N P) True (▷ P) (▷ P ={E∖↑N,E}=∗ True) Q Q'.
 Proof.
   rewrite /ElimInv /ElimModal. iIntros (Helim ?) "(#H1&_&H2)".
-  iApply (Helim with "[H2]"); [done|]. iSplitR "H2"; [|done].
+  iApply (Helim with "[H2]"); [done|]; simpl. iSplitR "H2"; [|done].
   iMod (inv_open _ N with "[#]") as "(HP&Hclose)"; auto with iFrame.
 Qed.
 
diff --git a/theories/base_logic/lib/na_invariants.v b/theories/base_logic/lib/na_invariants.v
index 2cd1a8a1af8393534312fbff3b5f120c519bff1f..c1116ef9c88fc20abef6da276e39eb491474c834 100644
--- a/theories/base_logic/lib/na_invariants.v
+++ b/theories/base_logic/lib/na_invariants.v
@@ -113,12 +113,12 @@ Section proofs.
 
   Global Instance into_inv_na p N P : IntoInv (na_inv p N P) N.
   Global Instance elim_inv_na p F E N P Q Q':
-    (∀ R, ElimModal True (|={E}=> R)%I R Q Q') →
+    (∀ R, ElimModal True false false (|={E}=> R)%I R Q Q') →
     ElimInv (↑N ⊆ E ∧ ↑N ⊆ F) (na_inv p N P) (na_own p F)
       (▷ P ∗ na_own p (F∖↑N)) (▷ P ∗ na_own p (F∖↑N) ={E}=∗ na_own p F) Q Q'.
   Proof.
     rewrite /ElimInv /ElimModal. iIntros (Helim (?&?)) "(#H1&Hown&H2)".
-    iApply Helim; [done|]. iSplitR "H2"; [|done].
+    iApply Helim; [done|]; simpl. iSplitR "H2"; [|done].
     iMod (na_inv_open p E F N P with "[#] [Hown]") as "(HP&Hown&Hclose)"; auto.
     by iFrame.
   Qed.
diff --git a/theories/bi/lib/counter_examples.v b/theories/bi/lib/counter_examples.v
index dce6efe035910753c272b8fe09e6e67b32a63b1e..ca5f1707f28b2d4072979c92aa2fa8bfbceaa128 100644
--- a/theories/bi/lib/counter_examples.v
+++ b/theories/bi/lib/counter_examples.v
@@ -29,8 +29,11 @@ Module savedprop. Section savedprop.
 
   Instance bupd_mono' : Proper ((⊢) ==> (⊢)) bupd.
   Proof. intros P Q ?. by apply bupd_mono. Qed.
-  Instance elim_modal_bupd P Q : ElimModal True (|==> P) P (|==> Q) (|==> Q).
-  Proof. by rewrite /ElimModal bupd_frame_r bi.wand_elim_r bupd_trans. Qed.
+  Instance elim_modal_bupd p P Q : ElimModal True p false (|==> P) P (|==> Q) (|==> Q).
+  Proof.
+    by rewrite /ElimModal bi.intuitionistically_if_elim
+      bupd_frame_r bi.wand_elim_r bupd_trans.
+  Qed.
 
   (** A bad recursive reference: "Assertion with name [i] does not hold" *)
   Definition A (i : ident) : PROP := (∃ P, ¬ P ∗ saved i P)%I.
@@ -127,12 +130,18 @@ Module inv. Section inv.
   Lemma fupd_frame_r E P Q : fupd E P ∗ Q ⊢ fupd E (P ∗ Q).
   Proof. by rewrite comm fupd_frame_l comm. Qed.
 
-  Global Instance elim_fupd_fupd E P Q : ElimModal True (fupd E P) P (fupd E Q) (fupd E Q).
-  Proof. by rewrite /ElimModal fupd_frame_r bi.wand_elim_r fupd_fupd. Qed.
+  Global Instance elim_fupd_fupd p E P Q :
+    ElimModal True p false (fupd E P) P (fupd E Q) (fupd E Q).
+  Proof.
+    by rewrite /ElimModal bi.intuitionistically_if_elim
+      fupd_frame_r bi.wand_elim_r fupd_fupd.
+  Qed.
 
-  Global Instance elim_fupd0_fupd1 P Q : ElimModal True (fupd M0 P) P (fupd M1 Q) (fupd M1 Q).
+  Global Instance elim_fupd0_fupd1 p P Q :
+    ElimModal True p false (fupd M0 P) P (fupd M1 Q) (fupd M1 Q).
   Proof.
-    by rewrite /ElimModal fupd_frame_r bi.wand_elim_r fupd_mask_mono fupd_fupd.
+    by rewrite /ElimModal bi.intuitionistically_if_elim
+      fupd_frame_r bi.wand_elim_r fupd_mask_mono fupd_fupd.
   Qed.
 
   Global Instance exists_split_fupd0 {A} E P (Φ : A → PROP) :
diff --git a/theories/program_logic/total_weakestpre.v b/theories/program_logic/total_weakestpre.v
index 8c119ceb30a09f0a6479226cd08cf6a9a8ee6d29..02b02547e8b1daf8203ca441f792330429e673b6 100644
--- a/theories/program_logic/total_weakestpre.v
+++ b/theories/program_logic/total_weakestpre.v
@@ -384,19 +384,28 @@ Section proofmode_classes.
   Global Instance is_except_0_wp s E e Φ : IsExcept0 (WP e @ s; E [{ Φ }]).
   Proof. by rewrite /IsExcept0 -{2}fupd_twp -except_0_fupd -fupd_intro. Qed.
 
-  Global Instance elim_modal_bupd_twp s E e P Φ :
-    ElimModal True (|==> P) P (WP e @ s; E [{ Φ }]) (WP e @ s; E [{ Φ }]).
-  Proof. by rewrite /ElimModal (bupd_fupd E) fupd_frame_r wand_elim_r fupd_twp. Qed.
+  Global Instance elim_modal_bupd_twp p s E e P Φ :
+    ElimModal True p false (|==> P) P (WP e @ s; E [{ Φ }]) (WP e @ s; E [{ Φ }]).
+  Proof.
+    by rewrite /ElimModal intuitionistically_if_elim
+      (bupd_fupd E) fupd_frame_r wand_elim_r fupd_twp.
+  Qed.
 
-  Global Instance elim_modal_fupd_twp s E e P Φ :
-    ElimModal True (|={E}=> P) P (WP e @ s; E [{ Φ }]) (WP e @ s; E [{ Φ }]).
-  Proof. by rewrite /ElimModal fupd_frame_r wand_elim_r fupd_twp. Qed.
+  Global Instance elim_modal_fupd_twp p s E e P Φ :
+    ElimModal True p false (|={E}=> P) P (WP e @ s; E [{ Φ }]) (WP e @ s; E [{ Φ }]).
+  Proof.
+    by rewrite /ElimModal intuitionistically_if_elim
+      fupd_frame_r wand_elim_r fupd_twp.
+  Qed.
 
-  Global Instance elim_modal_fupd_twp_atomic s E1 E2 e P Φ :
+  Global Instance elim_modal_fupd_twp_atomic p s E1 E2 e P Φ :
     Atomic (stuckness_to_atomicity s) e →
-    ElimModal True (|={E1,E2}=> P) P
+    ElimModal True p false (|={E1,E2}=> P) P
             (WP e @ s; E1 [{ Φ }]) (WP e @ s; E2 [{ v, |={E2,E1}=> Φ v }])%I.
-  Proof. intros. by rewrite /ElimModal fupd_frame_r wand_elim_r twp_atomic. Qed.
+  Proof.
+    intros. by rewrite /ElimModal intuitionistically_if_elim
+      fupd_frame_r wand_elim_r twp_atomic.
+  Qed.
 
   Global Instance add_modal_fupd_twp s E e P Φ :
     AddModal (|={E}=> P) P (WP e @ s; E [{ Φ }]).
diff --git a/theories/program_logic/weakestpre.v b/theories/program_logic/weakestpre.v
index 1b33ca16b2f8a9274349348a6c33c62daeb06cc2..8aa18f95e6c7f003ae5ce9af5711d3a4ed884f88 100644
--- a/theories/program_logic/weakestpre.v
+++ b/theories/program_logic/weakestpre.v
@@ -378,19 +378,28 @@ Section proofmode_classes.
   Global Instance is_except_0_wp s E e Φ : IsExcept0 (WP e @ s; E {{ Φ }}).
   Proof. by rewrite /IsExcept0 -{2}fupd_wp -except_0_fupd -fupd_intro. Qed.
 
-  Global Instance elim_modal_bupd_wp s E e P Φ :
-    ElimModal True (|==> P) P (WP e @ s; E {{ Φ }}) (WP e @ s; E {{ Φ }}).
-  Proof. by rewrite /ElimModal (bupd_fupd E) fupd_frame_r wand_elim_r fupd_wp. Qed.
-
-  Global Instance elim_modal_fupd_wp s E e P Φ :
-    ElimModal True (|={E}=> P) P (WP e @ s; E {{ Φ }}) (WP e @ s; E {{ Φ }}).
-  Proof. by rewrite /ElimModal fupd_frame_r wand_elim_r fupd_wp. Qed.
-
-  Global Instance elim_modal_fupd_wp_atomic s E1 E2 e P Φ :
+  Global Instance elim_modal_bupd_wp p s E e P Φ :
+    ElimModal True p false (|==> P) P (WP e @ s; E {{ Φ }}) (WP e @ s; E {{ Φ }}).
+  Proof.
+    by rewrite /ElimModal intuitionistically_if_elim
+      (bupd_fupd E) fupd_frame_r wand_elim_r fupd_wp.
+  Qed.
+
+  Global Instance elim_modal_fupd_wp p s E e P Φ :
+    ElimModal True p false (|={E}=> P) P (WP e @ s; E {{ Φ }}) (WP e @ s; E {{ Φ }}).
+  Proof.
+    by rewrite /ElimModal intuitionistically_if_elim
+      fupd_frame_r wand_elim_r fupd_wp.
+  Qed.
+
+  Global Instance elim_modal_fupd_wp_atomic p s E1 E2 e P Φ :
     Atomic (stuckness_to_atomicity s) e →
-    ElimModal True (|={E1,E2}=> P) P
+    ElimModal True p false (|={E1,E2}=> P) P
             (WP e @ s; E1 {{ Φ }}) (WP e @ s; E2 {{ v, |={E2,E1}=> Φ v }})%I.
-  Proof. intros. by rewrite /ElimModal fupd_frame_r wand_elim_r wp_atomic. Qed.
+  Proof.
+    intros. by rewrite /ElimModal intuitionistically_if_elim
+      fupd_frame_r wand_elim_r wp_atomic.
+  Qed.
 
   Global Instance add_modal_fupd_wp s E e P Φ :
     AddModal (|={E}=> P) P (WP e @ s; E {{ Φ }}).
diff --git a/theories/proofmode/class_instances_bi.v b/theories/proofmode/class_instances_bi.v
index 79a1f0ab04f796821c03c7fffe10381a753f49b3..2696a0e3d83808b469140265f4187aa7a90860d7 100644
--- a/theories/proofmode/class_instances_bi.v
+++ b/theories/proofmode/class_instances_bi.v
@@ -763,37 +763,40 @@ Global Instance into_inv_embed {PROP' : bi} `{BiEmbed PROP PROP'} P N :
   IntoInv P N → IntoInv ⎡P⎤ N.
 
 (* ElimModal *)
-Global Instance elim_modal_wand φ P P' Q Q' R :
-  ElimModal φ P P' Q Q' → ElimModal φ P P' (R -∗ Q) (R -∗ Q').
+Global Instance elim_modal_wand φ p p' P P' Q Q' R :
+  ElimModal φ p p' P P' Q Q' → ElimModal φ p p' P P' (R -∗ Q) (R -∗ Q').
 Proof.
   rewrite /ElimModal=> H Hφ. apply wand_intro_r.
-  rewrite wand_curry -assoc (comm _ P') -wand_curry wand_elim_l; auto.
+  rewrite wand_curry -assoc (comm _ (â–¡?p' _)%I) -wand_curry wand_elim_l; auto.
 Qed.
-Global Instance elim_modal_forall {A} φ P P' (Φ Ψ : A → PROP) :
-  (∀ x, ElimModal φ P P' (Φ x) (Ψ x)) → ElimModal φ P P' (∀ x, Φ x) (∀ x, Ψ x).
+Global Instance elim_modal_forall {A} φ p p' P P' (Φ Ψ : A → PROP) :
+  (∀ x, ElimModal φ p p' P P' (Φ x) (Ψ x)) → ElimModal φ p p' P P' (∀ x, Φ x) (∀ x, Ψ x).
 Proof.
   rewrite /ElimModal=> H ?. apply forall_intro=> a. rewrite (forall_elim a); auto.
 Qed.
-Global Instance elim_modal_absorbingly_here P Q :
-  Absorbing Q → ElimModal True (<absorb> P) P Q Q.
+Global Instance elim_modal_absorbingly_here p P Q :
+  Absorbing Q → ElimModal True p false (<absorb> P) P Q Q.
 Proof.
-  rewrite /ElimModal=> H.
-  by rewrite absorbingly_sep_l wand_elim_r absorbing_absorbingly.
+  rewrite /ElimModal=> ? _. by rewrite intuitionistically_if_elim
+    absorbingly_sep_l wand_elim_r absorbing_absorbingly.
 Qed.
 
-Global Instance elim_modal_bupd `{BiBUpd PROP} P Q :
-  ElimModal True (|==> P) P (|==> Q) (|==> Q).
-Proof. by rewrite /ElimModal bupd_frame_r wand_elim_r bupd_trans. Qed.
+Global Instance elim_modal_bupd `{BiBUpd PROP} p P Q :
+  ElimModal True p false (|==> P) P (|==> Q) (|==> Q).
+Proof.
+  by rewrite /ElimModal
+    intuitionistically_if_elim bupd_frame_r wand_elim_r bupd_trans.
+Qed.
 
 Global Instance elim_modal_embed_bupd_goal `{BiEmbedBUpd PROP PROP'}
-       φ (P P' : PROP') (Q Q' : PROP) :
-  ElimModal φ P P' (|==> ⎡Q⎤)%I (|==> ⎡Q'⎤)%I →
-  ElimModal φ P P' ⎡|==> Q⎤ ⎡|==> Q'⎤.
+    p p' φ (P P' : PROP') (Q Q' : PROP) :
+  ElimModal φ p p' P P' (|==> ⎡Q⎤)%I (|==> ⎡Q'⎤)%I →
+  ElimModal φ p p' P P' ⎡|==> Q⎤ ⎡|==> Q'⎤.
 Proof. by rewrite /ElimModal !embed_bupd. Qed.
 Global Instance elim_modal_embed_bupd_hyp `{BiEmbedBUpd PROP PROP'}
-       φ (P : PROP) (P' Q Q' : PROP') :
-  ElimModal φ (|==> ⎡P⎤)%I P' Q Q' →
-  ElimModal φ ⎡|==> P⎤ P' Q Q'.
+    p p' φ (P : PROP) (P' Q Q' : PROP') :
+  ElimModal φ p p' (|==> ⎡P⎤)%I P' Q Q' →
+  ElimModal φ p p' ⎡|==> P⎤ P' Q Q'.
 Proof. by rewrite /ElimModal !embed_bupd. Qed.
 
 (* AddModal *)
diff --git a/theories/proofmode/class_instances_sbi.v b/theories/proofmode/class_instances_sbi.v
index 7504000d02c61d6651747681909130dd491cc0ba..18c60184ee059465bd5965c73b0a264de20d0857 100644
--- a/theories/proofmode/class_instances_sbi.v
+++ b/theories/proofmode/class_instances_sbi.v
@@ -474,38 +474,45 @@ Global Instance into_except_0_embed `{SbiEmbed PROP PROP'} P Q :
 Proof. rewrite /IntoExcept0=> ->. by rewrite embed_except_0. Qed.
 
 (* ElimModal *)
-Global Instance elim_modal_timeless P Q :
-  IntoExcept0 P P' → IsExcept0 Q → ElimModal True P P' Q Q.
+Global Instance elim_modal_timeless p P Q :
+  IntoExcept0 P P' → IsExcept0 Q → ElimModal True p p P P' Q Q.
 Proof.
-  intros. rewrite /ElimModal (except_0_intro (_ -∗ _)%I).
-  by rewrite (into_except_0 P) -except_0_sep wand_elim_r.
+  intros. rewrite /ElimModal (except_0_intro (_ -∗ _)%I) (into_except_0 P).
+  by rewrite except_0_intuitionistically_if_2 -except_0_sep wand_elim_r.
 Qed.
 
-Global Instance elim_modal_bupd_plain_goal `{BiBUpdPlainly PROP} P Q :
-  Plain Q → ElimModal True (|==> P) P Q Q.
-Proof. intros. by rewrite /ElimModal bupd_frame_r wand_elim_r bupd_plain. Qed.
-Global Instance elim_modal_bupd_plain `{BiBUpdPlainly PROP} P Q :
-  Plain P → ElimModal True (|==> P) P Q Q.
+Global Instance elim_modal_bupd_plain_goal `{BiBUpdPlainly PROP} p P Q :
+  Plain Q → ElimModal True p false (|==> P) P Q Q.
+Proof.
+  intros. by rewrite /ElimModal intuitionistically_if_elim
+    bupd_frame_r wand_elim_r bupd_plain.
+Qed.
+Global Instance elim_modal_bupd_plain `{BiBUpdPlainly PROP} p P Q :
+  Plain P → ElimModal True p p (|==> P) P Q Q.
 Proof. intros. by rewrite /ElimModal bupd_plain wand_elim_r. Qed.
-Global Instance elim_modal_bupd_fupd `{BiBUpdFUpd PROP} E1 E2 P Q :
-  ElimModal True (|==> P) P (|={E1,E2}=> Q) (|={E1,E2}=> Q) | 10.
+Global Instance elim_modal_bupd_fupd `{BiBUpdFUpd PROP} p E1 E2 P Q :
+  ElimModal True p false (|==> P) P (|={E1,E2}=> Q) (|={E1,E2}=> Q) | 10.
 Proof.
-  by rewrite /ElimModal (bupd_fupd E1) fupd_frame_r wand_elim_r fupd_trans.
+  by rewrite /ElimModal intuitionistically_if_elim
+    (bupd_fupd E1) fupd_frame_r wand_elim_r fupd_trans.
 Qed.
 
-Global Instance elim_modal_fupd_fupd `{BiFUpd PROP} E1 E2 E3 P Q :
-  ElimModal True (|={E1,E2}=> P) P (|={E1,E3}=> Q) (|={E2,E3}=> Q).
-Proof. by rewrite /ElimModal fupd_frame_r wand_elim_r fupd_trans. Qed.
+Global Instance elim_modal_fupd_fupd `{BiFUpd PROP} p E1 E2 E3 P Q :
+  ElimModal True p false (|={E1,E2}=> P) P (|={E1,E3}=> Q) (|={E2,E3}=> Q).
+Proof.
+  by rewrite /ElimModal intuitionistically_if_elim
+    fupd_frame_r wand_elim_r fupd_trans.
+Qed.
 
 Global Instance elim_modal_embed_fupd_goal `{BiEmbedFUpd PROP PROP'}
-       φ E1 E2 E3 (P P' : PROP') (Q Q' : PROP) :
-  ElimModal φ P P' (|={E1,E3}=> ⎡Q⎤)%I (|={E2,E3}=> ⎡Q'⎤)%I →
-  ElimModal φ P P' ⎡|={E1,E3}=> Q⎤ ⎡|={E2,E3}=> Q'⎤.
+    p p' φ E1 E2 E3 (P P' : PROP') (Q Q' : PROP) :
+  ElimModal φ p p' P P' (|={E1,E3}=> ⎡Q⎤)%I (|={E2,E3}=> ⎡Q'⎤)%I →
+  ElimModal φ p p' P P' ⎡|={E1,E3}=> Q⎤ ⎡|={E2,E3}=> Q'⎤.
 Proof. by rewrite /ElimModal !embed_fupd. Qed.
 Global Instance elim_modal_embed_fupd_hyp `{BiEmbedFUpd PROP PROP'}
-       φ E1 E2 (P : PROP) (P' Q Q' : PROP') :
-  ElimModal φ (|={E1,E2}=> ⎡P⎤)%I P' Q Q' →
-  ElimModal φ ⎡|={E1,E2}=> P⎤ P' Q Q'.
+    p p' φ E1 E2 (P : PROP) (P' Q Q' : PROP') :
+  ElimModal φ p p' (|={E1,E2}=> ⎡P⎤)%I P' Q Q' →
+  ElimModal φ p p' ⎡|={E1,E2}=> P⎤ P' Q Q'.
 Proof. by rewrite /ElimModal embed_fupd. Qed.
 
 (* AddModal *)
diff --git a/theories/proofmode/classes.v b/theories/proofmode/classes.v
index b36535d964ca4f77556650a11bd101031509cbf2..cf32bcd961878106286e020b6312ac984c0031d3 100644
--- a/theories/proofmode/classes.v
+++ b/theories/proofmode/classes.v
@@ -234,11 +234,30 @@ Arguments IsExcept0 {_} _%I : simpl never.
 Arguments is_except_0 {_} _%I {_}.
 Hint Mode IsExcept0 + ! : typeclass_instances.
 
-Class ElimModal {PROP : bi} (φ : Prop) (P P' : PROP) (Q Q' : PROP) :=
-  elim_modal : φ → P ∗ (P' -∗ Q') ⊢ Q.
-Arguments ElimModal {_} _ _%I _%I _%I _%I : simpl never.
-Arguments elim_modal {_} _ _%I _%I _%I _%I {_}.
-Hint Mode ElimModal + - ! - ! - : typeclass_instances.
+(** The [ElimModal φ p p' P P' Q Q'] class is used by the [iMod] tactic.
+
+The inputs are [p], [P] and [Q], and the outputs are [φ], [p'], [P'] and [Q'].
+
+The class is used to transform a hypothesis [P] into a hypothesis [P'], given
+a goal [Q], which is simultaniously transformed into [Q']. The Booleans [p]
+and [p'] indicate whether the original, respectively, updated hypothesis reside
+in the persistent context (iff [true]). The proposition [φ] can be used to
+express a side-condition that [iMod] will generate (if not [True]).
+
+An example instance is:
+
+  ElimModal True p false (|={E1,E2}=> P) P (|={E1,E3}=> Q) (|={E2,E3}=> Q).
+
+This instance expresses that to eliminate [|={E1,E2}=> P] the goal is
+transformed from [|={E1,E3}=> Q] into [|={E2,E3}=> Q], and the resulting
+hypothesis is moved into the spatial context (regardless of where it was
+originally). A corresponding [ElimModal] instance for the Iris 1/2-style update
+modality, would have a side-condition [φ] on the masks. *)
+Class ElimModal {PROP : bi} (φ : Prop) (p p' : bool) (P P' : PROP) (Q Q' : PROP) :=
+  elim_modal : φ → □?p P ∗ (□?p' P' -∗ Q') ⊢ Q.
+Arguments ElimModal {_} _ _ _ _%I _%I _%I _%I : simpl never.
+Arguments elim_modal {_} _ _ _ _%I _%I _%I _%I {_}.
+Hint Mode ElimModal + - ! - ! - ! - : typeclass_instances.
 
 (* Used by the specialization pattern [ > ] in [iSpecialize] and [iAssert] to
 add a modality to the goal corresponding to a premise/asserted proposition. *)
@@ -556,8 +575,8 @@ Instance into_forall_tc_opaque {PROP : bi} {A} (P : PROP) (Φ : A → PROP) :
 Instance from_modal_tc_opaque {PROP1 PROP2 : bi} {A}
     M (sel : A) (P : PROP2) (Q : PROP1) :
   FromModal M sel P Q → FromModal M sel (tc_opaque P) Q := id.
-Instance elim_modal_tc_opaque {PROP : bi} φ (P P' Q Q' : PROP) :
-  ElimModal φ P P' Q Q' → ElimModal φ (tc_opaque P) P' Q Q' := id.
+Instance elim_modal_tc_opaque {PROP : bi} φ p p' (P P' Q Q' : PROP) :
+  ElimModal φ p p' P P' Q Q' → ElimModal φ p p' (tc_opaque P) P' Q Q' := id.
 Instance into_inv_tc_opaque {PROP : bi} (P : PROP) N :
   IntoInv P N → IntoInv (tc_opaque P) N := id.
 Instance elim_inv_tc_opaque {PROP : bi} φ (Pinv Pin Pout Pclose Q Q' : PROP) :
diff --git a/theories/proofmode/coq_tactics.v b/theories/proofmode/coq_tactics.v
index 3c0d2199b937cb166febae20aaf8bb66ece74752..d8b0f59fd72593a90e12ce242c26f9774306d5d0 100644
--- a/theories/proofmode/coq_tactics.v
+++ b/theories/proofmode/coq_tactics.v
@@ -1054,15 +1054,15 @@ Proof.
 Qed.
 
 (** * Modalities *)
-Lemma tac_modal_elim Δ Δ' i p φ P' P Q Q' :
+Lemma tac_modal_elim Δ Δ' i p p' φ P' P Q Q' :
   envs_lookup i Δ = Some (p, P) →
-  ElimModal φ P P' Q Q' →
+  ElimModal φ p p' P P' Q Q' →
   φ →
-  envs_replace i p false (Esnoc Enil i P') Δ = Some Δ' →
+  envs_replace i p p' (Esnoc Enil i P') Δ = Some Δ' →
   envs_entails Δ' Q' → envs_entails Δ Q.
 Proof.
   rewrite envs_entails_eq => ???? HΔ. rewrite envs_replace_singleton_sound //=.
-  rewrite HΔ intuitionistically_if_elim. by eapply elim_modal.
+  rewrite HΔ. by eapply elim_modal.
 Qed.
 
 (** * Invariants *)
diff --git a/theories/proofmode/monpred.v b/theories/proofmode/monpred.v
index d3dbe02ff9ae86238ca141e3b30406ea9a844508..826536997118a0d416e3bd1bd79fe29a3b2a58a8 100644
--- a/theories/proofmode/monpred.v
+++ b/theories/proofmode/monpred.v
@@ -359,14 +359,14 @@ Proof.
   by rewrite {1}(objective_objectively P) monPred_objectively_unfold.
 Qed.
 
-Global Instance elim_modal_at_bupd_goal `{BiBUpd PROP} φ 𝓟 𝓟' Q Q' i :
-  ElimModal φ 𝓟 𝓟' (|==> Q i) (|==> Q' i) →
-  ElimModal φ 𝓟 𝓟' ((|==> Q) i) ((|==> Q') i).
+Global Instance elim_modal_at_bupd_goal `{BiBUpd PROP} φ p p' 𝓟 𝓟' Q Q' i :
+  ElimModal φ p p' 𝓟 𝓟' (|==> Q i) (|==> Q' i) →
+  ElimModal φ p p' 𝓟 𝓟' ((|==> Q) i) ((|==> Q') i).
 Proof. by rewrite /ElimModal !monPred_at_bupd. Qed.
-Global Instance elim_modal_at_bupd_hyp `{BiBUpd PROP} φ P 𝓟 𝓟' 𝓠 𝓠' i:
+Global Instance elim_modal_at_bupd_hyp `{BiBUpd PROP} φ p p' P 𝓟 𝓟' 𝓠 𝓠' i:
   MakeMonPredAt i P 𝓟 →
-  ElimModal φ (|==> 𝓟) 𝓟' 𝓠 𝓠' →
-  ElimModal φ ((|==> P) i) 𝓟' 𝓠 𝓠'.
+  ElimModal φ p p' (|==> 𝓟) 𝓟' 𝓠 𝓠' →
+  ElimModal φ p p' ((|==> P) i) 𝓟' 𝓠 𝓠'.
 Proof. by rewrite /MakeMonPredAt /ElimModal monPred_at_bupd=><-. Qed.
 
 Global Instance add_modal_at_bupd_goal `{BiBUpd PROP} φ 𝓟 𝓟' Q i :
@@ -465,14 +465,14 @@ Proof.
   by rewrite monPred_at_later.
 Qed.
 
-Global Instance elim_modal_at_fupd_goal `{BiFUpd PROP} φ E1 E2 E3 𝓟 𝓟' Q Q' i :
-  ElimModal φ 𝓟 𝓟' (|={E1,E3}=> Q i) (|={E2,E3}=> Q' i) →
-  ElimModal φ 𝓟 𝓟' ((|={E1,E3}=> Q) i) ((|={E2,E3}=> Q') i).
+Global Instance elim_modal_at_fupd_goal `{BiFUpd PROP} φ p p' E1 E2 E3 𝓟 𝓟' Q Q' i :
+  ElimModal φ p p' 𝓟 𝓟' (|={E1,E3}=> Q i) (|={E2,E3}=> Q' i) →
+  ElimModal φ p p' 𝓟 𝓟' ((|={E1,E3}=> Q) i) ((|={E2,E3}=> Q') i).
 Proof. by rewrite /ElimModal !monPred_at_fupd. Qed.
-Global Instance elim_modal_at_fupd_hyp `{BiFUpd PROP} φ E1 E2 P 𝓟 𝓟' 𝓠 𝓠' i :
+Global Instance elim_modal_at_fupd_hyp `{BiFUpd PROP} φ p p' E1 E2 P 𝓟 𝓟' 𝓠 𝓠' i :
   MakeMonPredAt i P 𝓟 →
-  ElimModal φ (|={E1,E2}=> 𝓟) 𝓟' 𝓠 𝓠' →
-  ElimModal φ ((|={E1,E2}=> P) i) 𝓟' 𝓠 𝓠'.
+  ElimModal φ p p' (|={E1,E2}=> 𝓟) 𝓟' 𝓠 𝓠' →
+  ElimModal φ p p' ((|={E1,E2}=> P) i) 𝓟' 𝓠 𝓠'.
 Proof. by rewrite /MakeMonPredAt /ElimModal monPred_at_fupd=><-. Qed.
 
 Global Instance add_modal_at_fupd_goal `{BiFUpd PROP} E1 E2 𝓟 𝓟' Q i :
diff --git a/theories/proofmode/tactics.v b/theories/proofmode/tactics.v
index e17593eb7c4ef17646f14830c9b0114479a82d7a..87fe3ef6568e3591523ef48d0b3c6c9146e27fe6 100644
--- a/theories/proofmode/tactics.v
+++ b/theories/proofmode/tactics.v
@@ -1012,11 +1012,11 @@ Tactic Notation "iNext" := iModIntro (â–·^_ _)%I.
 
 (** * Update modality *)
 Tactic Notation "iModCore" constr(H) :=
-  eapply tac_modal_elim with _ H _ _ _ _ _;
+  eapply tac_modal_elim with _ H _ _ _ _ _ _;
     [env_reflexivity || fail "iMod:" H "not found"
     |iSolveTC ||
-     let P := match goal with |- ElimModal _ ?P _ _ _ => P end in
-     let Q := match goal with |- ElimModal _ _ _ ?Q _ => Q end in
+     let P := match goal with |- ElimModal _ _ _ ?P _ _ _ => P end in
+     let Q := match goal with |- ElimModal _ _ _ _ _ ?Q _ => Q end in
      fail "iMod: cannot eliminate modality " P "in" Q
     |try fast_done (* optional side-condition *)
     |env_reflexivity|].