diff --git a/ProofMode.md b/ProofMode.md
index ae2233edfd6bb004cc9aeccc786a8834ed4d570b..8137c2c6c140c5e1b9d0885e161e4cfa169b62f4 100644
--- a/ProofMode.md
+++ b/ProofMode.md
@@ -40,8 +40,10 @@ Context management
   `H`.
 - `iAssert P with "spat" as "ipat"` : create a new goal with conclusion `P` and
   put `P` in the context of the original goal. The specialization pattern
-  `spat` specifies which hypotheses will be consumed by proving `P` and the
+  `spat` specifies which hypotheses will be consumed by proving `P`. The
   introduction pattern `ipat` specifies how to eliminate `P`.
+- `iAssert P with "spat" as %cpat` : assert `P` and eliminate it using the Coq
+  introduction pattern `cpat`.
 
 Introduction of logical connectives
 -----------------------------------
diff --git a/proofmode/tactics.v b/proofmode/tactics.v
index 382e488aeb006550b1a2ce9a051a65217daea921..11ca3016c3a879cddd72da7f05b6d2dcc0702754 100644
--- a/proofmode/tactics.v
+++ b/proofmode/tactics.v
@@ -833,7 +833,7 @@ Tactic Notation "iLöb" "(" ident(x1) ident(x2) ident(x3) ident(x4)
               ltac:(iIntros ( x1 x2 x3 x4 x5 x6 x7 x8 )).
 
 (** * Assert *)
-Tactic Notation "iAssert" open_constr(Q) "with" constr(Hs) "as" constr(pat) :=
+Tactic Notation "iAssertCore" open_constr(Q) "with" constr(Hs) "as" tactic(tac) :=
   let H := iFresh in
   let Hs := spec_pat.parse Hs in
   lazymatch Hs with
@@ -842,7 +842,7 @@ Tactic Notation "iAssert" open_constr(Q) "with" constr(Hs) "as" constr(pat) :=
        [env_cbv; reflexivity
        |(*goal*)
        |apply _ || fail "iAssert:" Q "not persistent"
-       |iDestructHyp H as pat]
+       |tac H]
   | [SGoal ?k ?lr ?Hs] =>
      eapply tac_assert with _ _ _ lr Hs H Q _; (* (js:=Hs) (j:=H) (P:=Q) *)
        [match k with
@@ -851,13 +851,21 @@ Tactic Notation "iAssert" open_constr(Q) "with" constr(Hs) "as" constr(pat) :=
         end
        |env_cbv; reflexivity || fail "iAssert:" Hs "not found"
        |env_cbv; reflexivity|
-       |iDestructHyp H as pat]
+       |tac H]
   | ?pat => fail "iAssert: invalid pattern" pat
   end.
 
+Tactic Notation "iAssert" open_constr(Q) "with" constr(Hs) "as" constr(pat) :=
+  iAssertCore Q with Hs as (fun H => iDestructHyp H as pat).
 Tactic Notation "iAssert" open_constr(Q) "as" constr(pat) :=
   iAssert Q with "[]" as pat.
 
+Tactic Notation "iAssert" open_constr(Q) "with" constr(Hs)
+    "as" "%" simple_intropattern(pat) :=
+  iAssertCore Q with Hs as (fun H => iPure H as pat).
+Tactic Notation "iAssert" open_constr(Q) "as" "%" simple_intropattern(pat) :=
+  iAssert Q with "[]" as %pat.
+
 (** * Rewrite *)
 Local Ltac iRewriteFindPred :=
   match goal with