diff --git a/theories/fin_maps.v b/theories/fin_maps.v
index d7b147cf4d057e4280fd99f7dd540ff1065c562e..d279c4e7d65e48bd141450ab1b312a16b7a68b15 100644
--- a/theories/fin_maps.v
+++ b/theories/fin_maps.v
@@ -1190,6 +1190,9 @@ Proof.
 Qed.
 Lemma map_Forall_delete m i : map_Forall P m → map_Forall P (delete i m).
 Proof. intros Hm j x; rewrite lookup_delete_Some. naive_solver. Qed.
+Lemma map_Forall_foldr_delete m is :
+  map_Forall P m → map_Forall P (foldr delete m is).
+Proof. induction is; eauto using map_Forall_delete. Qed.
 Lemma map_Forall_ind (Q : M A → Prop) :
   Q ∅ →
   (∀ m i x, m !! i = None → P i x → map_Forall P m → Q m → Q (<[i:=x]>m)) →
@@ -1604,6 +1607,9 @@ Proof. intros A ?. by apply union_with_idemp. Qed.
 Lemma lookup_union {A} (m1 m2 : M A) i :
   (m1 ∪ m2) !! i = union_with (λ x _, Some x) (m1 !! i) (m2 !! i).
 Proof. apply lookup_union_with. Qed.
+Lemma lookup_union_r {A} (m1 m2 : M A) i :
+  m1 !! i = None → (m1 ∪ m2) !! i = m2 !! i.
+Proof. intros Hi. by rewrite lookup_union, Hi, (left_id_L _ _).  Qed.
 Lemma lookup_union_Some_raw {A} (m1 m2 : M A) i x :
   (m1 ∪ m2) !! i = Some x ↔
     m1 !! i = Some x ∨ (m1 !! i = None ∧ m2 !! i = Some x).
@@ -1761,6 +1767,22 @@ Qed.
 Lemma delete_union {A} (m1 m2 : M A) i :
   delete i (m1 ∪ m2) = delete i m1 ∪ delete i m2.
 Proof. apply delete_union_with. Qed.
+Lemma map_Forall_union_11 {A} (m1 m2 : M A) P :
+  map_Forall P (m1 ∪ m2) → map_Forall P m1.
+Proof. intros HP i x ?. apply HP, lookup_union_Some_raw; auto. Qed.
+Lemma map_Forall_union_12 {A} (m1 m2 : M A) P :
+  m1 ##ₘ m2 → map_Forall P (m1 ∪ m2) → map_Forall P m2.
+Proof. intros ? HP i x ?. apply HP, lookup_union_Some; auto. Qed.
+Lemma map_Forall_union_2 {A} (m1 m2 : M A) P :
+  map_Forall P m1 → map_Forall P m2 → map_Forall P (m1 ∪ m2).
+Proof. intros ???? [|[]]%lookup_union_Some_raw; eauto. Qed.
+Lemma map_Forall_union {A} (m1 m2 : M A) P :
+  m1 ##ₘ m2 →
+  map_Forall P (m1 ∪ m2) ↔ map_Forall P m1 ∧ map_Forall P m2.
+Proof.
+  naive_solver eauto using map_Forall_union_11,
+    map_Forall_union_12, map_Forall_union_2.
+Qed.
 
 (** ** Properties of the [union_list] operation *)
 Lemma map_disjoint_union_list_l {A} (ms : list (M A)) (m : M A) :
@@ -1795,9 +1817,21 @@ Proof.
   induction is; simpl; [done |]. rewrite elem_of_cons; intros.
   rewrite lookup_delete_ne; intuition.
 Qed.
+Lemma lookup_foldr_delete_Some {A} (m : M A) is j y :
+  foldr delete m is !! j = Some y ↔ j ∉ is ∧ m !! j = Some y.
+Proof. induction is; simpl; rewrite ?lookup_delete_Some; set_solver. Qed.
 Lemma foldr_delete_notin {A} (m : M A) is :
   Forall (λ i, m !! i = None) is → foldr delete m is = m.
 Proof. induction 1; simpl; [done |]. rewrite delete_notin; congruence. Qed.
+Lemma foldr_delete_commute {A} (m : M A) is j :
+  delete j (foldr delete m is) = foldr delete (delete j m) is.
+Proof. induction is as [|?? IH]; [done| ]. simpl. by rewrite delete_commute, IH. Qed.
+Lemma foldr_delete_insert {A} (m : M A) is j x :
+  j ∈ is → foldr delete (<[j:=x]>m) is = foldr delete m is.
+Proof.
+  induction 1 as [i is|j i is ? IH]; simpl; [|by rewrite IH].
+  by rewrite !foldr_delete_commute, delete_insert_delete.
+Qed.
 Lemma foldr_delete_insert_ne {A} (m : M A) is j x :
   j ∉ is → foldr delete (<[j:=x]>m) is = <[j:=x]>(foldr delete m is).
 Proof.