diff --git a/theories/fin_map_dom.v b/theories/fin_map_dom.v
index d7e7d0d85e23ee200c8375b53e22d617ff5a56de..f0e3e9b1361e5d7976daea9245013125d247672a 100644
--- a/theories/fin_map_dom.v
+++ b/theories/fin_map_dom.v
@@ -165,59 +165,37 @@ Proof.
 Qed.
 
 Lemma dom_singleton_inv {A} (m : M A) i :
-  dom D m ≡ {[i]} → ∃ v, m = {[i := v]}.
+  dom D m ≡ {[i]} → ∃ x, m = {[i := x]}.
 Proof.
-  intros Hdom.
-  destruct (m !! i) as [x|] eqn:He.
-  - exists x. rewrite <-insert_empty.
-    apply map_eq; intros i'.
-    destruct (decide (i = i')); subst.
-    + rewrite lookup_insert; eauto.
-    + rewrite lookup_insert_ne; eauto.
-      rewrite lookup_empty.
-      apply not_elem_of_dom. set_solver.
-  - cut (i ∈ dom D m); [|set_solver].
-    rewrite elem_of_dom, He.
-    intros [x ?]; congruence.
+  intros Hdom. assert (is_Some (m !! i)) as [x ?].
+  { apply (elem_of_dom (D:=D)); set_solver. }
+  exists x. apply map_eq; intros j.
+  destruct (decide (i = j)); simplify_map_eq; [done|].
+  apply not_elem_of_dom. set_solver.
 Qed.
-Lemma dom_union_inv `{!RelDecision (∈@{D})} {A} (m : M A) (d1 d2 : D) :
-  d1 ## d2 →
-  dom D m ≡ d1 ∪ d2 →
-  ∃ m1 m2, m1 ##ₘ m2 ∧ m = m1 ∪ m2 ∧ dom D m1 ≡ d1 ∧ dom D m2 ≡ d2.
+
+Lemma dom_union_inv `{!RelDecision (∈@{D})} {A} (m : M A) (X1 X2 : D) :
+  X1 ## X2 →
+  dom D m ≡ X1 ∪ X2 →
+  ∃ m1 m2, m = m1 ∪ m2 ∧ m1 ##ₘ m2 ∧ dom D m1 ≡ X1 ∧ dom D m2 ≡ X2.
 Proof.
-  revert d1 d2.
-  induction m as [|a v m Hfresh IHm] using map_ind; intros d1 d2 Hdisj Hdom.
-  - eexists ∅, ∅.
-    rewrite dom_empty in Hdom. rewrite dom_empty.
-    rewrite (left_id_L _ (∪)).
-    split_and!; [ apply map_disjoint_empty_l | set_solver .. ].
-  - rename select (m !! a = None) into Hma.
-    apply not_elem_of_dom in Hma.
-    rewrite dom_insert in Hdom.
-    assert (a ∈ d1 ∨ a ∈ d2) as [Ha|Ha] by set_solver.
-    (* With ssreflect we could do a [wlog] proof here since these
-       two cases are symmetric. *)
-    + rewrite (union_difference_singleton a d1) in Hdom by done.
-      rewrite <-(assoc _) in Hdom.
-      apply union_cancel_l in Hdom; [ | set_solver.. ].
-      apply IHm in Hdom as (m1&m2&Hmdisj&Hmunion&Hm1&Hm2); [ | set_solver ].
-      exists (<[a:=v]> m1), m2.
-      split_and!; auto.
-      * apply map_disjoint_dom. rewrite dom_insert. set_solver -Hma Hmdisj Hmunion.
-      * rewrite <-insert_union_l. congruence.
-      * rewrite dom_insert, Hm1. by rewrite <-union_difference_singleton.
-    + rewrite (union_difference_singleton a d2) in Hdom by done.
-      rewrite (assoc _), (comm _ d1), <-(assoc _) in Hdom.
-      apply union_cancel_l in Hdom; [ | set_solver.. ].
-      apply IHm in Hdom as (m1&m2&Hmdisj&Hmunion&Hm1&Hm2); [ | set_solver ].
-      exists m1, (<[a:=v]>m2).
-      split_and!; auto.
-      * apply map_disjoint_dom. rewrite dom_insert. set_solver -Hma Hmdisj Hmunion.
-      * rewrite !insert_union_singleton_l, (assoc _).
-        rewrite (map_union_comm m1), <-(assoc _), Hmunion; [done|].
-        apply map_disjoint_dom. rewrite dom_singleton, Hm1.
-        set_solver -Hma Hmdisj Hmunion.
-      * rewrite dom_insert, Hm2. by rewrite <-union_difference_singleton.
+  intros.
+  exists (filter (λ '(k,x), k ∈ X1) m), (filter (λ '(k,x), k ∉ X1) m).
+  assert (filter (λ '(k, _), k ∈ X1) m ##ₘ filter (λ '(k, _), k ∉ X1) m).
+  { apply map_disjoint_filter. }
+  split_and!; [|done| |].
+  - apply map_eq; intros i. apply option_eq; intros x.
+    rewrite lookup_union_Some, !map_filter_lookup_Some by done.
+    destruct (decide (i ∈ X1)); naive_solver.
+  - apply dom_filter; intros i; split; [|naive_solver].
+    intros. assert (is_Some (m !! i)) as [x ?] by (apply (elem_of_dom (D:=D)); set_solver).
+    naive_solver.
+  - apply dom_filter; intros i; split.
+    + intros. assert (is_Some (m !! i)) as [x ?] by (apply (elem_of_dom (D:=D)); set_solver).
+      naive_solver.
+    + intros (x&?&?). apply dec_stable; intros ?.
+      assert (m !! i = None) by (apply not_elem_of_dom; set_solver).
+      naive_solver.
 Qed.
 
 (** If [D] has Leibniz equality, we can show an even stronger result.  This is a
@@ -265,12 +243,12 @@ Section leibniz.
     dom D (list_to_map l : M A) = list_to_set l.*1.
   Proof. unfold_leibniz. apply dom_list_to_map. Qed.
   Lemma dom_singleton_inv_L {A} (m : M A) i :
-  dom D m = {[i]} → ∃ v, m = {[i := v]}.
+    dom D m = {[i]} → ∃ x, m = {[i := x]}.
   Proof. unfold_leibniz. apply dom_singleton_inv. Qed.
-  Lemma dom_union_inv_L `{!RelDecision (∈@{D})} {A} (m : M A) (d1 d2 : D) :
-    d1 ## d2 →
-    dom D m = d1 ∪ d2 →
-    ∃ m1 m2, m1 ##ₘ m2 ∧ m = m1 ∪ m2 ∧ dom D m1 = d1 ∧ dom D m2 = d2.
+  Lemma dom_union_inv_L `{!RelDecision (∈@{D})} {A} (m : M A) (X1 X2 : D) :
+    X1 ## X2 →
+    dom D m = X1 ∪ X2 →
+    ∃ m1 m2, m = m1 ∪ m2 ∧ m1 ##ₘ m2 ∧ dom D m1 = X1 ∧ dom D m2 = X2.
   Proof. unfold_leibniz. apply dom_union_inv. Qed.
 End leibniz.