diff --git a/channel/heap_lang.v b/channel/heap_lang.v
index 0cb39a93fceec6b5d63340039e23e5a6a8d455c6..4c02bbfb26b43d8f93b59411ca49687dc644d066 100644
--- a/channel/heap_lang.v
+++ b/channel/heap_lang.v
@@ -320,13 +320,24 @@ Proof.
     exists K''; by eauto using f_equal, f_equal2, f_equal3, v2e_inj.
 
   intros Hfill Hred Hnval. 
-  revert K' Hfill; induction K=>K' /= Hfill;
+  Time revert K' Hfill; induction K=>K' /= Hfill;
     first (now eexists; reflexivity);
-    destruct K'; simpl; try discriminate Hfill; try first [
-      bad_red Hfill e' Hred
-    | bad_fill Hfill
-    | good Hfill IHK
-    ].
+    (destruct K'; simpl;
+      (* The first case is: K' is EmpyCtx. *)
+      first (by bad_red Hfill e' Hred);
+      (* Many of the other cases result in contradicting equalities. *)
+      try discriminate Hfill;
+      (* The remaining cases are "compatible" contexts - that result in the same head symbol of the expression.
+         Test whether the context als has the same head, and use the appropriate tactic. *)
+      match goal with
+      | [ |- exists x, ?C _ = ?C _ ] => by good Hfill IHK
+      | [ |- exists x, ?C _ _ = ?C _ _ ] => by good Hfill IHK
+      | [ |- exists x, ?C _ _ _ = ?C _ _ _ ] => by good Hfill IHK
+      | [ |- exists x, ?C _ _ _ _ = ?C _ _ _ _ ] => by good Hfill IHK
+      | [ |- exists x, ?C _ _ _ _ _ = ?C _ _ _ _ _ ] => by good Hfill IHK
+      | [ |- exists x, ?C _ _ _ _ _ _ = ?C _ _ _ _ _ _ ] => by good Hfill IHK
+      | _ => by bad_fill Hfill
+      end).
 Qed.
 End step_by_value.