diff --git a/opam.pins b/opam.pins
index 15d94cd4a1f8d99f6a8e7adab12e6e7a725d0d35..7d18e2a452ab70b11663145d9e7415d9b4134e0b 100644
--- a/opam.pins
+++ b/opam.pins
@@ -1 +1 @@
-coq-iris https://gitlab.mpi-sws.org/FP/iris-coq f987ca782d1301d319cf6c4ba8e2ab449ebe903a
+coq-iris https://gitlab.mpi-sws.org/FP/iris-coq 35551d40f927c1d567993ff27eeb46f64788efca
diff --git a/theories/lang/lang.v b/theories/lang/lang.v
index cadfc173b2fd073ac2ef99ac059a58897edb4cff..f0bcd83173baa9706a06b00b26b729f54112321f 100644
--- a/theories/lang/lang.v
+++ b/theories/lang/lang.v
@@ -182,8 +182,11 @@ Proof.
 Qed.
 
 (** The stepping relation *)
+Definition Z_of_bool (b : bool) : Z :=
+  if b then 1 else 0.
+
 Definition lit_of_bool (b : bool) : base_lit :=
-  LitInt (if b then 1 else 0).
+  LitInt $ Z_of_bool b.
 
 Definition shift_loc (l : loc) (z : Z) : loc := (l.1, l.2 + z).
 
diff --git a/theories/lang/lib/lock.v b/theories/lang/lib/lock.v
index 3322d10b0665e3a58985764b75f6912c9cfa3e02..c6b8b6e2093103cffccc9d35ca36e2c73dc4fb28 100644
--- a/theories/lang/lib/lock.v
+++ b/theories/lang/lib/lock.v
@@ -40,22 +40,24 @@ Section proof.
 
   Global Instance lock_inv_ne γ l : NonExpansive (lock_inv γ l).
   Proof. solve_proper. Qed.
-  Global Instance is_lock_ne l : NonExpansive (is_lock γ l).
-  Proof. solve_proper. Qed.
+  Global Instance is_lock_contractive γ l : Contractive (is_lock γ l).
+  Proof. solve_contractive. Qed.
+  Global Instance is_lock_ne γ l : NonExpansive (is_lock γ l).
+  Proof. exact: contractive_ne. Qed.
 
-  (** The main proofs. *)
   Global Instance is_lock_persistent γ l R : PersistentP (is_lock γ l R).
   Proof. apply _. Qed.
   Global Instance locked_timeless γ : TimelessP (locked γ).
   Proof. apply _. Qed.
 
-  Lemma newlock_inplace (E : coPset) (R : iProp Σ) l :
-    ▷ R -∗ l ↦ #false ={E}=∗ ∃ γ, is_lock γ l R ∗ own_lock γ 1%Qp.
+  (** The main proofs. *)
+  Lemma newlock_inplace (E : coPset) (R : iProp Σ) l (b : bool) :
+    l ↦ #b -∗ (if b then True else ▷ R) ={E}=∗ ∃ γ, is_lock γ l R ∗ own_lock γ 1%Qp.
   Proof.
-    iIntros "HR Hl".
+    iIntros "Hl HR".
     iMod (own_alloc (Excl ())) as (γ) "Hγ"; first done.
     iMod (cinv_alloc _ N (lock_inv γ l R) with "[-]") as (γ') "Hlock".
-    { iNext. iExists false. by iFrame. }
+    { iExists b. destruct b; by iFrame. }
     iModIntro. iExists (_, _). eauto.
   Qed.
 
@@ -65,18 +67,18 @@ Section proof.
     iIntros (Φ) "HR HΦ". iApply wp_fupd.
     wp_seq. wp_alloc l vl as "Hl" "H†". inv_vec vl=>x.
     rewrite heap_mapsto_vec_singleton. (* FIXME shouldn't this also compute now, like bigops do? *)
-    wp_let. wp_write.
-    iMod (newlock_inplace with "HR Hl") as (γ) "?".
+    wp_let. wp_write. iMod (newlock_inplace with "Hl HR") as (γ) "?".
     by iApply "HΦ".
   Qed.
 
   Lemma destroy_lock E γ l R :
     ↑N ⊆ E → 
-    is_lock γ l R -∗ own_lock γ 1%Qp ={E}=∗ ∃ (b : bool), l ↦ #b.
+    is_lock γ l R -∗ own_lock γ 1%Qp ={E}=∗ ∃ (b : bool), l ↦ #b ∗ if b then True else ▷ R.
   Proof.
     iIntros (?) "#Hinv Hown".
-    iMod (cinv_cancel with "Hinv Hown") as (b) "[>Hl _]"; first done.
-    eauto.
+    iMod (cinv_cancel with "Hinv Hown") as (b) "[>Hl HR]"; first done.
+    iExists b. destruct b; first by eauto.
+    iDestruct "HR" as "[_ $]". done.
   Qed.
 
   Lemma try_acquire_spec γ l R q :