diff --git a/README.md b/README.md
index 97e424a7c46d607250e441cb7b1b5fc744eab593..76cfb40631c2aaebca96e28e296cea06cbdb7c9f 100644
--- a/README.md
+++ b/README.md
@@ -104,6 +104,9 @@ hold. It can be one of the following :
 - `\calling` : the property must hold at each function call and can refer to the
   `\called` variable.
 
+In all contexts, the property can refer to the `\func` variable to denote the current
+target function.
+
 ### Flags <a name="flags"></a>
 
 The processing of a meta-property is parameterized by a set of flags that can be
diff --git a/meta_annotate.ml b/meta_annotate.ml
index cb324f2080cd9c846e18e53cf5deda9cfc3b9646..008693d54e53fd6ecb969c230932eed0c0da3ef1 100644
--- a/meta_annotate.ml
+++ b/meta_annotate.ml
@@ -114,7 +114,12 @@ class context_visitor flags all_mp table = object(self)
 
   (* Common method used by the subclasses to instantiate an ump *)
   method instantiate ?(post=None) ?(force_after=false) stmt assoc_list ump =
+    let loc = Property.location ump.ump_ip in
     let kf = Option.get self # current_kf in
+    let vf = Kernel_function.get_vi kf in
+    let func_ptr = Cil_builder.Exp.(cil_term ~loc (addr (var vf))) in
+    let func_assoc = "\\func", RepVariable func_ptr in
+    let assoc_list = func_assoc :: assoc_list in
     (* Do not instantiate anything on ghost statements *)
     if not stmt.ghost then
       let pred = ump.ump_property kf ~stmt assoc_list in
diff --git a/meta_parse.ml b/meta_parse.ml
index fe768bb8dd311bfaeb77b07c1aa881003d080327..1077567b02ca44311f9d012a552b8b5c8b7cce63 100644
--- a/meta_parse.ml
+++ b/meta_parse.ml
@@ -90,7 +90,8 @@ let mp_metavariables = [
   "\\written";
   "\\read";
   "\\called";
-  "\\called_arg"
+  "\\called_arg";
+  "\\func";
 ]
 let mp_utils = [
   "\\diff";
diff --git a/tests/meta/func_meta_var.i b/tests/meta/func_meta_var.i
new file mode 100644
index 0000000000000000000000000000000000000000..afe9e2e02245e199faad5fdce873fa2f085c5a97
--- /dev/null
+++ b/tests/meta/func_meta_var.i
@@ -0,0 +1,16 @@
+/* run.config
+   OPT: @META@ -then-last -print
+*/
+int (*ok)(void);
+
+int x;
+
+int f() {
+  if (ok == f)
+    x = 42;
+  return 0;
+}
+
+/*@ meta \prop, \name(test), \targets(f), \context(\writing),
+         !\separated(\written,&x) ==> ok == \func;
+*/
diff --git a/tests/meta/oracle/func_meta_var.res.oracle b/tests/meta/oracle/func_meta_var.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..e7a707d6665b56d6f8b3873d6f8ba6ada650d847
--- /dev/null
+++ b/tests/meta/oracle/func_meta_var.res.oracle
@@ -0,0 +1,20 @@
+[kernel] Parsing tests/meta/func_meta_var.i (no preprocessing)
+[meta] Translation is enabled
+[meta] Will process 1 properties
+[meta] Successful translation
+/* Generated by Frama-C */
+int (*ok)(void);
+int x;
+int f(void)
+{
+  int __retres;
+  if (ok == & f) 
+    /*@ assert test: meta: ok ≡ &f; */
+    x = 42;
+  __retres = 0;
+  return __retres;
+}
+
+/*@ meta "test";
+*/
+