diff --git a/src/kernel_internals/parsing/clexer.mll b/src/kernel_internals/parsing/clexer.mll
index 7c6a861097dd908090f4bb84631bababca4e97fa..5aef82eb76078dc339d8181e66e6b00258daed77 100644
--- a/src/kernel_internals/parsing/clexer.mll
+++ b/src/kernel_internals/parsing/clexer.mll
@@ -567,6 +567,16 @@ rule initial = parse
 	    end
 	end
     }
+| "\\ghost"
+    { if is_ghost_code () || is_oneline_ghost () then begin
+        GHOST (currentLoc())
+      end else begin
+        let start = Lexing.lexeme_start_p lexbuf in
+        let source = Cil_datatype.Position.of_lexing_pos start in
+        Kernel.abort ~source "Use of \\ghost out of ghost code"
+      end
+    }
+
 |		blank			{initial lexbuf}
 |               '\n'                    { E.newline ();
                                           if !pragmaLine then
diff --git a/src/kernel_internals/parsing/cparser.mly b/src/kernel_internals/parsing/cparser.mly
index 294bcc29d272c0b36a71ebde7ebb80732cc66766..084eb5824356fed1965266ae9e5e5b895929c637 100644
--- a/src/kernel_internals/parsing/cparser.mly
+++ b/src/kernel_internals/parsing/cparser.mly
@@ -335,6 +335,7 @@ let in_ghost_block ?(battrs=[]) l =
 %token<Cabs.cabsloc> SIGNED UNSIGNED LONG SHORT
 %token<Cabs.cabsloc> VOLATILE EXTERN STATIC CONST RESTRICT AUTO REGISTER
 %token<Cabs.cabsloc> THREAD
+%token<Cabs.cabsloc> GHOST
 
 %token<Cabs.cabsloc> SIZEOF ALIGNOF
 
@@ -1463,8 +1464,17 @@ cvspec:
   | CONST                    { SpecCV(CV_CONST), $1 }
   | VOLATILE                 { SpecCV(CV_VOLATILE), $1 }
   | RESTRICT                 { SpecCV(CV_RESTRICT), $1 }
-  | ATTRIBUTE_ANNOT          { let annot, loc = $1 in
-			       SpecCV(CV_ATTRIBUTE_ANNOT annot), loc }
+  | GHOST                    { SpecCV(CV_GHOST), $1 }
+  | ATTRIBUTE_ANNOT
+    {
+      let annot, loc = $1 in
+      if String.compare annot "\\ghost" = 0 then begin
+        let start = Parsing.symbol_start_pos () in
+        let source = Cil_datatype.Position.of_lexing_pos start in
+        Kernel.abort ~source "Use of \\ghost out of ghost code"
+      end else
+        SpecCV(CV_ATTRIBUTE_ANNOT annot), loc
+    }
 ;
 
 /*** GCC attributes ***/
@@ -1507,6 +1517,7 @@ attribute:
 |   CONST                 { ("const", []), $1 }
 |   RESTRICT              { ("restrict",[]), $1 }
 |   VOLATILE              { ("volatile",[]), $1 }
+|   GHOST                 { ("ghost",[]), $1 }
 |   ATTRIBUTE_ANNOT       { let annot, loc = $1 in
 			    ("$annot:" ^ annot, []), loc }
 ;
diff --git a/src/kernel_internals/typing/cabs2cil.ml b/src/kernel_internals/typing/cabs2cil.ml
index e8e0f215dfae702cabb820957ec3f6f1402ec119..3f3d36715e0563dc0b212c9075ccb9fa584e22ed 100644
--- a/src/kernel_internals/typing/cabs2cil.ml
+++ b/src/kernel_internals/typing/cabs2cil.ml
@@ -4780,6 +4780,7 @@ and convertCVtoAttr (src: A.cvspec list) : A.attribute list =
   | CV_VOLATILE :: tl -> ("volatile",[]) :: (convertCVtoAttr tl)
   | CV_RESTRICT :: tl -> ("restrict",[]) :: (convertCVtoAttr tl)
   | CV_ATTRIBUTE_ANNOT a :: tl -> (mkAttrAnnot a, []) :: convertCVtoAttr tl
+  | CV_GHOST    :: tl -> ("ghost",[]) :: (convertCVtoAttr tl)
 
 and makeVarInfoCabs
     ~(ghost:bool)
diff --git a/src/kernel_services/ast_printing/cabs_debug.ml b/src/kernel_services/ast_printing/cabs_debug.ml
index f7ea40bd18f2c9b3c9e3acf4a2369ae078021e2e..90a28b89a7125de34b7b761d84e88fc50bf62e6e 100644
--- a/src/kernel_services/ast_printing/cabs_debug.ml
+++ b/src/kernel_services/ast_printing/cabs_debug.ml
@@ -44,6 +44,7 @@ let pp_cvspec  fmt = function
   |     CV_VOLATILE -> fprintf fmt "CV_VOLATILE"
   |     CV_RESTRICT -> fprintf fmt "CV_RESTRICT"
   |     CV_ATTRIBUTE_ANNOT s -> fprintf fmt "CV_ATTRIBUTE_ANNOT %s" s
+  |     CV_GHOST -> fprintf fmt "CV_GHOST"
 
 let pp_const fmt = function
   |     CONST_INT s -> fprintf fmt "CONST_INT %s" s
diff --git a/src/kernel_services/ast_printing/cil_printer.ml b/src/kernel_services/ast_printing/cil_printer.ml
index 9643993773619485c7a2ec8b4e11b6e5c6f67acd..67cf0d4b22607ec80cd290b78298599e5361c196 100644
--- a/src/kernel_services/ast_printing/cil_printer.ml
+++ b/src/kernel_services/ast_printing/cil_printer.ml
@@ -2003,6 +2003,7 @@ class cil_printer () = object (self)
        | "aconst", [] when not (Cil.msvcMode ()) -> fprintf fmt "__const__"; true
        | "thread", [] when not (Cil.msvcMode ()) -> fprintf fmt "__thread"; false
        | "volatile", [] -> self#pp_keyword fmt "volatile"; false
+       | "ghost", [] -> self#pp_keyword fmt "\\ghost"; false
        | "restrict", [] -> fprintf fmt "__restrict"; false
        | "missingproto", [] ->
          if self#display_comment () then fprintf fmt "/* missing proto */";
diff --git a/src/kernel_services/ast_printing/cprint.ml b/src/kernel_services/ast_printing/cprint.ml
index 36b2a4797aae3cf09a6df313fa153a663d157dac..d083883d14b84fdfd3d9c87c67dddb6ec12d3389 100644
--- a/src/kernel_services/ast_printing/cprint.ml
+++ b/src/kernel_services/ast_printing/cprint.ml
@@ -193,6 +193,7 @@ let rec print_specifiers fmt (specs: spec_elem list) =
     | SpecCV CV_VOLATILE -> fprintf fmt "volatile"
     | SpecCV CV_RESTRICT -> fprintf fmt "restrict"
     | SpecCV (CV_ATTRIBUTE_ANNOT a) -> fprintf fmt "/*@@ %s */" a
+    | SpecCV CV_GHOST -> fprintf fmt "\\ghost"
     | SpecAttr al -> print_attribute fmt al
     | SpecType bt -> print_type_spec fmt bt
     | SpecPattern name -> fprintf fmt "@@specifier(%s)" name
diff --git a/src/kernel_services/parsetree/cabs.ml b/src/kernel_services/parsetree/cabs.ml
index 462f4edd55adad2feecc6fb1b61de3ddd09ed363..3db49d24d3d2dd9ef8516e864685491acf10eba8 100644
--- a/src/kernel_services/parsetree/cabs.ml
+++ b/src/kernel_services/parsetree/cabs.ml
@@ -82,7 +82,7 @@ and funspec =
 
 and cvspec =
   | CV_CONST | CV_VOLATILE | CV_RESTRICT
-  | CV_ATTRIBUTE_ANNOT of string
+  | CV_ATTRIBUTE_ANNOT of string | CV_GHOST
 
 (* Type specifier elements. These appear at the start of a declaration *)
 (* Everywhere they appear in this file, they appear as a 'spec_elem list', *)
@@ -160,7 +160,7 @@ and enum_item = string * expression * cabsloc
 ** Declaration definition (at toplevel)
 *)
 and definition =
-   FUNDEF of 
+   FUNDEF of
        (Logic_ptree.spec*cabsloc) option * single_name * block *
          cabsloc * cabsloc
  | DECDEF of (Logic_ptree.spec*cabsloc) option * init_name_group * cabsloc
@@ -196,7 +196,7 @@ and asm_details =
     { aoutputs: (string option * string * expression) list; (* optional name, constraints and expressions for outputs *)
       ainputs: (string option * string * expression) list; (* optional name, constraints and expressions for inputs *)
       aclobbers: string list; (* clobbered registers *)
-      alabels: string list (* the labels for "asm goto" statements in gcc >= 4.6 *) 
+      alabels: string list (* the labels for "asm goto" statements in gcc >= 4.6 *)
     }
 
 and raw_statement =
@@ -234,7 +234,7 @@ and raw_statement =
      C parser, but can be used by external front-ends.
   *)
  | TRY_CATCH of statement * (single_name option * statement) list * cabsloc
-   (** [TRY_CATCH(s,clauses,loc)] catches exceptions thrown by execution of 
+   (** [TRY_CATCH(s,clauses,loc)] catches exceptions thrown by execution of
        [s], according to [clauses]. An
        exception [e] is caught by the first clause
        [(spec,(name, decl, _, _)),body]
diff --git a/tests/syntax/oracle/ghost_cv_parsing_errors.0.res.oracle b/tests/syntax/oracle/ghost_cv_parsing_errors.0.res.oracle
index 50c3496685c56cc5f99c6deb4a4d4694218cd4e2..c9a4f54903239d12c44e6f4483016d28e1eda919 100644
--- a/tests/syntax/oracle/ghost_cv_parsing_errors.0.res.oracle
+++ b/tests/syntax/oracle/ghost_cv_parsing_errors.0.res.oracle
@@ -1,4 +1,6 @@
 [kernel] Parsing tests/syntax/ghost_cv_parsing_errors.c (with preprocessing)
 [kernel] tests/syntax/ghost_cv_parsing_errors.c:13: User Error: 
   Use of \ghost out of ghost code
+[kernel] User Error: stopping on file "tests/syntax/ghost_cv_parsing_errors.c" that has errors.
+  Add '-kernel-msg-key pp' for preprocessing command.
 [kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/oracle/ghost_cv_parsing_errors.1.res.oracle b/tests/syntax/oracle/ghost_cv_parsing_errors.1.res.oracle
index 462ee3a754f02ce6d87f010875c86e44d30c0137..e5d6e9f1545603d3084395f99831a23d76d37721 100644
--- a/tests/syntax/oracle/ghost_cv_parsing_errors.1.res.oracle
+++ b/tests/syntax/oracle/ghost_cv_parsing_errors.1.res.oracle
@@ -1,4 +1,6 @@
 [kernel] Parsing tests/syntax/ghost_cv_parsing_errors.c (with preprocessing)
 [kernel] tests/syntax/ghost_cv_parsing_errors.c:19: User Error: 
   Use of \ghost out of ghost code
+[kernel] User Error: stopping on file "tests/syntax/ghost_cv_parsing_errors.c" that has errors.
+  Add '-kernel-msg-key pp' for preprocessing command.
 [kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/oracle/ghost_cv_parsing_errors.2.res.oracle b/tests/syntax/oracle/ghost_cv_parsing_errors.2.res.oracle
index 3c22db369c63563b4d65575069212ddd06a0e8d9..2cb2aecf5c426c0fb746d2375780ee122af350d9 100644
--- a/tests/syntax/oracle/ghost_cv_parsing_errors.2.res.oracle
+++ b/tests/syntax/oracle/ghost_cv_parsing_errors.2.res.oracle
@@ -1,4 +1,6 @@
 [kernel] Parsing tests/syntax/ghost_cv_parsing_errors.c (with preprocessing)
 [kernel] tests/syntax/ghost_cv_parsing_errors.c:25: User Error: 
   Use of \ghost out of ghost code
+[kernel] User Error: stopping on file "tests/syntax/ghost_cv_parsing_errors.c" that has errors.
+  Add '-kernel-msg-key pp' for preprocessing command.
 [kernel] Frama-C aborted: invalid user input.