diff --git a/lib/toCert.ml b/lib/toCert.ml
index eeb43773e972e66280ce51bd326941bf629663d5..3f1aabdf0bcd118058360be20496de4ecb4e620c 100644
--- a/lib/toCert.ml
+++ b/lib/toCert.ml
@@ -198,9 +198,7 @@ let rec tptp_of (vm : Tt.t B.var CVMap.t) (t : term) : Tt.t =
       let b = B.bind_var x (Tt.lift b) in
       cons (B.unbox b)
   (* Generic transformations. *)
-  | Symbol (_, s) ->
-      let x = B.new_var Tt.mkfree s in
-      Tt.Var x
+  | Symbol (_, s) -> Id s
   | Var x -> Tt.Var (CVMap.find x vm)
   | Appl (t, u) -> Tt.App (tptp_of vm t, tptp_of vm u)
   | Lambda (_, b) ->
diff --git a/lib/tptp.ml b/lib/tptp.ml
index a0f77fedd79dd3ea3e8ef927d342512bd08ebb50..ddd64dbd66c13b8061d48b499f0a3da4c3401a71 100644
--- a/lib/tptp.ml
+++ b/lib/tptp.ml
@@ -1,9 +1,11 @@
+(* TPTP abstract syntax tree and printer. *)
 module B = Bindlib
 
 module Term = struct
   type t =
     | True
     | False
+    | Id of string
     | Var of t B.var
     | App of t * t
     | Not of t
@@ -16,6 +18,7 @@ module Term = struct
     | Lam of (t, t) B.binder
 
   let _Var = B.box_var
+  let _Id s =  B.box (Id s)
   let _App = B.box_apply2 (fun t u -> App (t, u))
   let _Not = B.box_apply (fun t -> Not t)
   let _And = B.box_apply2 (fun t u -> And (t, u))
@@ -35,6 +38,7 @@ module Term = struct
     match t with
     | True -> _True
     | False -> _False
+    | Id s -> _Id s
     | Var x -> _Var x
     | App (t, u) -> _App (l t) (l u)
     | Not t -> _Not (l t)
@@ -46,7 +50,18 @@ module Term = struct
     | Ex b -> lift_bder _Ex b
     | Lam b -> lift_bder _Lam b
 
-  let pp_var ppf (x : t B.var) : unit = Format.fprintf ppf "%s" (B.name_of x)
+  (** [pp_var ppf x] prints variable [x] to formatter [ppf]. Variables
+      are uppercased in TPTP. *)
+  let pp_var ppf (x : t B.var) : unit = 
+    Format.fprintf ppf "%s" (String.capitalize_ascii (B.name_of x))
+
+  (** [pp_id ppf s] prints identifier [s] to formatter [ppf]. Identifiers
+      are lowercased in TPTP. *)
+  let pp_id ppf (s: string): unit =
+    Format.fprintf ppf "%s" (String.lowercase_ascii s)
+
+(* TODO handle name clash if [p] and [P] are both different vars (or
+   different symbols) in some PVS-Cert term. *)
 
   let rec pp (wrap : bool) (ppf : Format.formatter) (t : t) : unit =
     let open Format in
@@ -55,6 +70,7 @@ module Term = struct
     match t with
     | True -> out "$true"
     | False -> out "$false"
+    | Id s -> pp_id ppf s
     | Var x -> pp_var ppf x
     | App (t, u) -> out (wrap "@[%a@ %a@]") (pp false) t (pp true) u
     | Not t -> out (wrap "@[~@ %a@]") (pp false) t
diff --git a/test/lpvs.t b/test/lpvs.t
index f9a6ae2f4895740e030473638104eb201a4d4902..c78933dc65abc86b70133b4ae37e5f985f07db37 100644
--- a/test/lpvs.t
+++ b/test/lpvs.t
@@ -1,5 +1,5 @@
   $ lpvs --lib-root encoding/ false.lp
   symbol false: ∀ prop (\p: prop. p);
   symbol true: ∀ prop (\p: prop. ⇒ p (\_: p. p));
-  fof(false, ! [p] : p).
-  fof(true, ! [p] : p => p).
+  fof(false, ! [P] : P).
+  fof(true, ! [P] : P => P).