diff --git a/_CoqProject b/_CoqProject
index e73a99ff9b6cf3e34b5eec2a0b02681e08713de6..96e568205726a5fbe9b5c2d11f8b4b3e1097244f 100644
--- a/_CoqProject
+++ b/_CoqProject
@@ -52,6 +52,7 @@ theories/base_logic/bi.v
 theories/base_logic/derived.v
 theories/base_logic/proofmode.v
 theories/base_logic/base_logic.v
+theories/base_logic/bupd_alt.v
 theories/base_logic/lib/iprop.v
 theories/base_logic/lib/own.v
 theories/base_logic/lib/saved_prop.v
diff --git a/theories/base_logic/bupd_alt.v b/theories/base_logic/bupd_alt.v
new file mode 100644
index 0000000000000000000000000000000000000000..9cc3208a990027a434ec535e9456bf2b827b894e
--- /dev/null
+++ b/theories/base_logic/bupd_alt.v
@@ -0,0 +1,101 @@
+From iris.base_logic Require Export base_logic.
+From iris.proofmode Require Import tactics.
+
+(** This file contains an alternative version of basic updates, that is
+expression in terms of just the plain modality [â– ]. *)
+Definition bupd_alt `{BiPlainly PROP} (P : PROP) : PROP :=
+  (∀ R, (P -∗ ■ R) -∗ ■ R)%I.
+
+(** This definition is stated for any BI with a plain modality. The above
+definition is akin to the continuation monad, where one should think of [â–  R]
+being the final result that one wants to get out of the basic update in the end
+of the day (via [bupd_alt (■ P) ⊢ ■ P]).
+
+We show that:
+
+1. [bupd_alt] enjoys the usual rules of the basic update modality.
+2. [bupd_alt] entails any other modality that enjoys the laws of a basic update
+   modality (see [bupd_bupd_alt]).
+3. The ordinary basic update modality [|==>] on [uPred] entails [bupd_alt]
+   (see [bupd_alt_bupd]). This result is proven in the model of [uPred].
+
+The first two points are shown for any BI with a plain modality. *)
+
+Section bupd_alt.
+  Context `{BiPlainly PROP}.
+  Implicit Types P Q R : PROP.
+  Notation bupd_alt := (@bupd_alt PROP _).
+
+  Global Instance bupd_alt_ne : NonExpansive bupd_alt.
+  Proof. solve_proper. Qed.
+  Global Instance bupd_alt_proper : Proper ((≡) ==> (≡)) bupd_alt.
+  Proof. solve_proper. Qed.
+  Global Instance bupd_alt_mono' : Proper ((⊢) ==> (⊢)) bupd_alt.
+  Proof. solve_proper. Qed.
+  Global Instance bupd_alt_flip_mono' : Proper (flip (⊢) ==> flip (⊢)) bupd_alt.
+  Proof. solve_proper. Qed.
+
+  (** The laws of the basic update modality hold *)
+  Lemma bupd_alt_intro P : P ⊢ bupd_alt P.
+  Proof. iIntros "HP" (R) "H". by iApply "H". Qed.
+  Lemma bupd_alt_mono P Q : (P ⊢ Q) → bupd_alt P ⊢ bupd_alt Q.
+  Proof. by intros ->. Qed.
+  Lemma bupd_alt_trans P : bupd_alt (bupd_alt P) ⊢ bupd_alt P.
+  Proof. iIntros "HP" (R) "H". iApply "HP". iIntros "HP". by iApply "HP". Qed.
+  Lemma bupd_alt_frame_r P Q : bupd_alt P ∗ Q ⊢ bupd_alt (P ∗ Q).
+  Proof.
+    iIntros "[HP HQ]" (R) "H". iApply "HP". iIntros "HP". iApply ("H" with "[$]").
+  Qed.
+  Lemma bupd_alt_plainly P : bupd_alt (■ P) ⊢ ■ P.
+  Proof. iIntros "H". iApply ("H" $! P with "[]"); auto. Qed.
+
+  (** Any modality conforming with [BiBUpdPlainly] entails the alternative
+  definition *)
+  Lemma bupd_bupd_alt `{!BiBUpd PROP, BiBUpdPlainly PROP} P : (|==> P) ⊢ bupd_alt P.
+  Proof. iIntros "HP" (R) "H". by iMod ("H" with "HP") as "?". Qed.
+
+  (** We get the usual rule for frame preserving updates if we have an [own]
+  connective satisfying the following rule w.r.t. interaction with plainly. *)
+  Context {M : ucmraT} (own : M → PROP).
+  Context (own_updateP_plainly : ∀ x Φ R,
+    x ~~>: Φ →
+    own x ∗ (∀ y, ⌜Φ y⌝ -∗ own y -∗ ■ R) ⊢ ■ R).
+
+  Lemma own_updateP x (Φ : M → Prop) :
+    x ~~>: Φ → own x ⊢ bupd_alt (∃ y, ⌜Φ y⌝ ∧ own y).
+  Proof.
+    iIntros (Hup) "Hx"; iIntros (R) "H".
+    iApply (own_updateP_plainly with "[$Hx H]"); first done.
+    iIntros (y ?) "Hy". iApply "H"; auto.
+  Qed.
+End bupd_alt.
+
+(** The alternative definition entails the ordinary basic update *)
+Lemma bupd_alt_bupd {M} (P : uPred M) : bupd_alt P ⊢ |==> P.
+Proof.
+  rewrite /bupd_alt. uPred.unseal; split=> n x Hx H k y ? Hxy.
+  unshelve refine (H {| uPred_holds k _ :=
+    ∃ x' : M, ✓{k} (x' ⋅ y) ∧ P k x' |} k y _ _ _).
+  - intros n1 n2 x1 x2 (z&?&?) _ ?.
+    eauto using cmra_validN_le, uPred_mono.
+  - done.
+  - done.
+  - intros k' z ?? HP. exists z. by rewrite (comm op).
+Qed.
+
+Lemma bupd_alt_bupd_iff {M} (P : uPred M) : bupd_alt P ⊣⊢ |==> P.
+Proof. apply (anti_symm _). apply bupd_alt_bupd. apply bupd_bupd_alt. Qed.
+
+(** The law about the interaction between [uPred_ownM] and plainly holds. *)
+Lemma ownM_updateP {M : ucmraT} x (Φ : M → Prop) (R : uPred M) :
+  x ~~>: Φ →
+  uPred_ownM x ∗ (∀ y, ⌜Φ y⌝ -∗ uPred_ownM y -∗ ■ R) ⊢ ■ R.
+Proof.
+  uPred.unseal=> Hup; split; intros n z Hv (?&z2&?&[z1 ?]&HR); ofe_subst.
+  destruct (Hup n (Some (z1 â‹… z2))) as (y&?&?); simpl in *.
+  { by rewrite assoc. }
+  refine (HR y n z1 _ _ _ n y _ _ _); auto.
+  - rewrite comm. by eapply cmra_validN_op_r.
+  - by rewrite (comm _ _ y) (comm _ z2).
+  - apply (reflexivity (R:=includedN _)).
+Qed.