diff --git a/examples/bts/126_apply.mlw b/examples/bts/126_apply.mlw
new file mode 100644
index 0000000000000000000000000000000000000000..4e0303ca6d65e556fbd41cd8b47ebf45bfee09cd
--- /dev/null
+++ b/examples/bts/126_apply.mlw
@@ -0,0 +1,16 @@
+
+module A
+
+  use import int.Int
+
+  inductive even (n: int) =
+    | Zero : even 0
+    | Pair : forall n. even n -> even (n+2)
+
+  goal a: even 4
+
+  inductive unit = tt : unit
+  
+  goal g : unit
+
+end
\ No newline at end of file
diff --git a/examples/bts/126_apply/why3session.xml b/examples/bts/126_apply/why3session.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c4094e6eeca6539abf5d9b1d6ee052dcf75f63ed
--- /dev/null
+++ b/examples/bts/126_apply/why3session.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE why3session PUBLIC "-//Why3//proof session v5//EN"
+"http://why3.lri.fr/why3session.dtd">
+<why3session shape_version="4">
+<file name="../126_apply.mlw" proved="true">
+<theory name="A" proved="true">
+ <goal name="a" proved="true">
+ <transf name="replace" proved="true" arg1="4" arg2="(2+2)">
+  <goal name="a.0" proved="true">
+  <transf name="apply" proved="true" arg1="Pair">
+   <goal name="a.0.0" proved="true">
+   <transf name="replace" proved="true" arg1="2" arg2="(0 + 2)">
+    <goal name="a.0.0.0" proved="true">
+    <transf name="apply" proved="true" arg1="Pair">
+     <goal name="a.0.0.0.0" proved="true">
+     <transf name="apply" proved="true" arg1="Zero">
+     </transf>
+     </goal>
+    </transf>
+    </goal>
+    <goal name="a.0.0.1" proved="true">
+    <transf name="compute_in_goal" proved="true" >
+    </transf>
+    </goal>
+   </transf>
+   </goal>
+  </transf>
+  </goal>
+  <goal name="a.1" proved="true">
+  <transf name="compute_in_goal" proved="true" >
+  </transf>
+  </goal>
+ </transf>
+ </goal>
+ <goal name="g" proved="true">
+ <transf name="apply" proved="true" arg1="tt">
+ </transf>
+ </goal>
+</theory>
+</file>
+</why3session>
diff --git a/examples/bts/126_apply/why3shapes.gz b/examples/bts/126_apply/why3shapes.gz
new file mode 100644
index 0000000000000000000000000000000000000000..d461d058c9e552304313e060f7e909f82212c410
Binary files /dev/null and b/examples/bts/126_apply/why3shapes.gz differ
diff --git a/src/session/itp_server.ml b/src/session/itp_server.ml
index b04ae219c4a7ef368213a9c26f840f984ecb074d..e6ba1c6cb174fd9af590b725df5c0cb43c602fce 100644
--- a/src/session/itp_server.ml
+++ b/src/session/itp_server.ml
@@ -247,6 +247,8 @@ let get_exception_message ses id e =
       Pp.sprintf "Error in transformation %s. Cannot infer type of polymorphic element" s, Loc.dummy_position, ""
   | Args_wrapper.Arg_qid_not_found q ->
       Pp.sprintf "Following hypothesis was not found: %a \n" Typing.print_qualid q, Loc.dummy_position, ""
+  | Args_wrapper.Arg_pr_not_found pr ->
+      Pp.sprintf "Property not found: %a" (print_pr ses id) pr, Loc.dummy_position, ""
   | Args_wrapper.Arg_error s ->
       Pp.sprintf "Transformation raised a general error: %s \n" s, Loc.dummy_position, ""
   | Args_wrapper.Arg_theory_not_found s ->
diff --git a/src/transform/apply.ml b/src/transform/apply.ml
index ab70f0990037b24767931106699704e01b9a9591..a8536b04120e944430b7a6dc0eb6577a08520701 100644
--- a/src/transform/apply.ml
+++ b/src/transform/apply.ml
@@ -43,20 +43,6 @@ let term_decl d =
   | Decl ({d_node = Dprop (_pk, _pr, t)}) -> t
   | _ -> raise (Arg_trans "term_decl")
 
-let pr_prsymbol pr =
-  match pr with
-  | Decl {d_node = Dprop (_pk, pr, _t)} -> Some pr
-  | _ -> None
-
-(* Looks for the hypothesis name and return it. If not found return None *)
-let find_hypothesis (name:Ident.ident) task =
-  let ndecl = ref None in
-  let _ = task_iter (fun x -> if (
-    match (pr_prsymbol x.td_node) with
-    | None -> false
-    | Some pr -> Ident.id_equal pr.pr_name name) then ndecl := Some x) task in
-  !ndecl
-
 (* [with_terms subst_ty subst lv wt]: Takes the list of variables in lv that are
    not part of the substitution and try to match them with the list of values
    from wt (ordered). *)
@@ -156,13 +142,14 @@ let matching_with_terms ~trans_name slv lv left_term right_term withed_terms =
       with values found in 2).
  *)
 let apply pr withed_terms : Task.task Trans.tlist = Trans.store (fun task ->
-  let name = pr.pr_name in
+  let kn = task_known task in
   let g, task = Task.task_separate_goal task in
   let g = term_decl g in
-  let d = find_hypothesis name task in
-  if d = None then raise (Arg_error "apply");
-  let d = Opt.get d in
-  let t = term_decl d in
+  let t =
+    match find_prop_decl kn pr with
+    | (_, t) -> t
+    | exception Not_found -> raise (Arg_pr_not_found pr)
+  in
   let (lp, lv, nt) = intros t in
   let slv = List.fold_left (fun acc v -> Svs.add v acc) Svs.empty lv in
   match matching_with_terms ~trans_name:"apply" slv lv nt g withed_terms with
diff --git a/src/transform/args_wrapper.ml b/src/transform/args_wrapper.ml
index ba30f16d07dc25fa5a847bd0a0b3e22cbbadf8ce..1f5997b6207ff4f7a64aa2bb0b0d49b5a06eb118 100644
--- a/src/transform/args_wrapper.ml
+++ b/src/transform/args_wrapper.ml
@@ -22,6 +22,7 @@ exception Arg_expected of string * string
 exception Arg_theory_not_found of string
 exception Arg_expected_none of string
 exception Arg_qid_not_found of Ptree.qualid
+exception Arg_pr_not_found of prsymbol
 exception Arg_error of string
 
 let () = Exn_printer.register
diff --git a/src/transform/args_wrapper.mli b/src/transform/args_wrapper.mli
index 919a1f9c488666c773079a37a72cc878cca07edb..1133993d973278fbfd3a9aefb767e38884c8c92f 100644
--- a/src/transform/args_wrapper.mli
+++ b/src/transform/args_wrapper.mli
@@ -23,6 +23,7 @@ exception Parse_error of string
 exception Arg_expected of string * string
 exception Arg_theory_not_found of string
 exception Arg_expected_none of string
+exception Arg_pr_not_found of Decl.prsymbol
 exception Arg_qid_not_found of Ptree.qualid
 exception Arg_error of string
 
diff --git a/src/transform/reflection.ml b/src/transform/reflection.ml
index 0fdb4484dda82a610924853c859ec73f9f2cae70..c08931090aa2d1ed578c82fb2068a6ed3582ee62 100644
--- a/src/transform/reflection.ml
+++ b/src/transform/reflection.ml
@@ -579,10 +579,12 @@ let reflection_by_lemma pr env : Task.task Trans.tlist = Trans.store (fun task -
   let g, prev = Task.task_separate_goal task in
   let g = Apply.term_decl g in
   Debug.dprintf debug_refl "start@.";
-  let d = Apply.find_hypothesis pr.pr_name prev in
-  if d = None then raise (Exit "lemma not found");
-  let d = Opt.get d in
-  let l = Apply.term_decl d in
+  let l =
+    let kn' = task_known prev in (* TODO Do we want kn here ? *)
+    match find_prop_decl kn' pr with
+    | (_, t) -> t
+    | exception Not_found -> raise (Exit "lemma not found")
+  in
   let (lp, lv, rt) = Apply.intros l in
   let nt = Args_wrapper.build_naming_tables task in
   let crc = nt.Trans.coercion in