diff --git a/iris_heap_lang/lib/rw_lock.v b/iris_heap_lang/lib/rw_lock.v
index 35aa7886e2b5f8d46656fb45bde8a87e4e2b378b..6343716c06a74148df186822e2206742b4add110 100644
--- a/iris_heap_lang/lib/rw_lock.v
+++ b/iris_heap_lang/lib/rw_lock.v
@@ -1,6 +1,6 @@
 From iris.base_logic.lib Require Export invariants.
 From iris.bi.lib Require Export fractional.
-From iris.heap_lang Require Import primitive_laws notation.
+From iris.heap_lang Require Import proofmode notation.
 From iris.prelude Require Import options.
 
 (** A general interface for a reader-writer lock.
@@ -63,3 +63,27 @@ Class rwlock `{!heapGS_gen hlc Σ} := RwLock {
     {{{ RET #(); True }}};
 }.
 Global Hint Mode rwlock + + + : typeclass_instances.
+
+Global Instance is_rw_lock_contractive `{!heapGS_gen hlc Σ, !rwlock} γ lk :
+  ∀ n, Proper (pointwise_relation _ (dist_later n) ==> dist n) (is_rw_lock γ lk).
+Proof.
+  intros n Φ1 Φ2 HΦ.
+  set (Φ1' := λne (q : leibnizO Qp), Φ1 q).
+  set (Φ2' := λne (q : leibnizO Qp), Φ2 q).
+  assert (Next Φ1' ≡{n}≡ Next Φ2') as HΦ'.
+  { constructor => m ? q /=. specialize (HΦ q). by eapply dist_later_dist_lt. }
+  clear HΦ. revert n HΦ'. eapply (uPred.internal_eq_entails (M:=iResUR Σ)).
+  rewrite later_equivI. iIntros "#HΦ". iApply prop_ext. iModIntro.
+  iSplit; iIntros "H"; iApply (is_rw_lock_iff with "H"); iIntros "!> !> %q".
+  all: rewrite ofe_morO_equivI; iSpecialize ("HΦ" $! q).
+  all: change (Φ1 q) with (Φ1' q); change (Φ2 q) with (Φ2' q).
+  all: iRewrite "HΦ"; auto.
+Qed.
+
+Global Instance is_rw_lock_proper `{!heapGS_gen hlc Σ, !rwlock} γ lk :
+  Proper (pointwise_relation _ (≡) ==> (≡)) (is_rw_lock γ lk).
+Proof.
+  intros Φ1 Φ2 HΦ.
+  apply equiv_dist=>n. apply is_rw_lock_contractive=>q.
+  constructor=>m _. move: (HΦ q) => /equiv_dist. auto.
+Qed.