diff --git a/theories/fin_maps.v b/theories/fin_maps.v
index 2cc3150ab3c2d8f6562cfdcd35c973af11e6c0f6..3c94c7907455fb72efccf6837d32f546d55755f9 100644
--- a/theories/fin_maps.v
+++ b/theories/fin_maps.v
@@ -843,14 +843,6 @@ Proof.
     rewrite elem_of_map_to_list in Hj; simplify_option_eq.
 Qed.
 
-(** Properties of the zip_with function *)
-Lemma map_lookup_zip_with {A B C} (f : A → B → C) m1 m2 i :
-  map_zip_with f m1 m2 !! i = x ← m1 !! i; y ← m2 !! i; Some (f x y).
-Proof.
-  unfold map_zip_with. rewrite lookup_merge by done.
-  by destruct (m1 !! i), (m2 !! i).
-Qed.
-
 (** ** Properties of conversion from collections *)
 Section map_of_to_collection.
   Context {A : Type} `{FinCollection B C}.
@@ -1136,6 +1128,79 @@ Lemma insert_merge_r m1 m2 i x z :
 Proof. by intros; apply partial_alter_merge_r. Qed.
 End more_merge.
 
+(** Properties of the zip_with function *)
+Lemma map_lookup_zip_with {A B C} (f : A → B → C) m1 m2 i :
+  map_zip_with f m1 m2 !! i = x ← m1 !! i; y ← m2 !! i; Some (f x y).
+Proof.
+  unfold map_zip_with. rewrite lookup_merge by done.
+  by destruct (m1 !! i), (m2 !! i).
+Qed.
+
+Lemma map_zip_with_empty {A B C} (f : A → B → C) :
+  map_zip_with f ∅ ∅ = ∅.
+Proof.
+  unfold map_zip_with. by rewrite merge_empty by done.
+Qed.
+
+Lemma map_insert_zip_with {A B C} (f : A → B → C) m1 m2 i x y z :
+  f y z = x →
+  <[i:=x]>(map_zip_with f m1 m2) = map_zip_with f (<[i:=y]>m1) (<[i:=z]>m2).
+Proof.
+  intros Hf. unfold map_zip_with.
+  erewrite insert_merge; [ auto | by compute | by rewrite Hf ].
+Qed.
+
+Lemma map_zip_with_fmap {A' A B' B C} (f : A → B → C)
+      (g1 : A' → A) (g2 : B' → B) m1 m2 :
+  map_zip_with f (g1 <$> m1) (g2 <$> m2) = map_zip_with (λ x y, f (g1 x) (g2 y)) m1 m2.
+Proof.
+  apply map_eq; intro i.
+  rewrite ?map_lookup_zip_with. rewrite ?lookup_fmap.
+  by destruct (m1 !! i), (m2 !! i).
+Qed.
+
+Lemma map_zip_with_fmap_1 {A' A B C} (f : A → B → C)
+      (g : A' → A) m1 m2 :
+  map_zip_with f (g <$> m1) m2 = map_zip_with (λ x y, f (g x) y) m1 m2.
+Proof.
+  rewrite <- (map_fmap_id m2) at 1.
+  by rewrite map_zip_with_fmap; simpl. 
+Qed.
+
+Lemma map_zip_with_fmap_2 {A B' B C} (f : A → B → C)
+      (g : B' → B) m1 m2 :
+  map_zip_with f m1 (g <$> m2) = map_zip_with (λ x y, f x (g y)) m1 m2.
+Proof.
+  rewrite <- (map_fmap_id m1) at 1.
+  by rewrite map_zip_with_fmap; simpl. 
+Qed.
+
+Lemma map_fmap_zip_with {A B C D} (f : A → B → C) (g : C → D) m1 m2 :
+  g <$> map_zip_with f m1 m2 = map_zip_with (λ x y, g (f x y)) m1 m2.
+Proof.
+  apply map_eq; intro i.
+  rewrite lookup_fmap. rewrite ?map_lookup_zip_with.
+  by destruct (m1 !! i), (m2 !! i).
+Qed.
+
+Lemma map_zip_with_map_zip {A B C} (f : A → B → C) m1 m2 :
+  map_zip_with f m1 m2 = curry f <$> map_zip m1 m2.
+Proof.
+  apply map_eq; intro i.
+  rewrite lookup_fmap; rewrite ?map_lookup_zip_with; rewrite ?lookup_fmap.
+  by destruct (m1 !! i), (m2 !! i).
+Qed.
+
+Lemma map_fmap_zip {A' A B' B} (g1 : A' → A) (g2 : B' → B) m1 m2 :
+  map_zip (fmap g1 m1) (fmap g2 m2)
+  = prod_map g1 g2 <$> map_zip m1 m2.
+Proof.
+  rewrite map_zip_with_fmap. 
+  rewrite map_zip_with_map_zip.
+  generalize (map_zip m1 m2); intro m. apply map_eq; intro i.
+  by rewrite ?lookup_fmap; destruct (m !! i) as [[x1 x2]|].
+Qed.
+
 (** ** Properties on the [map_relation] relation *)
 Section Forall2.
 Context {A B} (R : A → B → Prop) (P : A → Prop) (Q : B → Prop).