diff --git a/parser/src/command.rs b/parser/src/command.rs
index e9055821de763209aa6b950fba3bc35f9f3314c9..64017f083256704196734cecee459f0a192008e4 100644
--- a/parser/src/command.rs
+++ b/parser/src/command.rs
@@ -10,9 +10,6 @@ use kernel::memory::term::builder::Builder;
 /// The type of commands that can be received by the kernel.
 #[derive(Debug, Eq, PartialEq)]
 pub enum Command<'build> {
-    /// Define a new term and optionally check that its type matches the given one.
-    Define(&'build str, Option<Builder<'build>>, Builder<'build>),
-
     /// Define the given declaration
     Declaration(&'build str, Option<declaration::Builder<'build>>, declaration::Builder<'build>),
 
@@ -37,10 +34,6 @@ impl<'build> fmt::Display for Command<'build> {
         use Command::*;
 
         match self {
-            Define(name, None, t) => write!(f, "def {name} := {t}"),
-
-            Define(name, Some(ty), t) => write!(f, "def {name}: {ty} := {t}"),
-
             Declaration(name, None, t) => write!(f, "def {name} := {t}"),
 
             Declaration(name, Some(ty), t) => write!(f, "def {name}: {ty} := {t}"),
diff --git a/parser/src/parser.rs b/parser/src/parser.rs
index 12186bcd2d3679d96f4296012043c1d4de31c68c..11f2b4dfa80f3f28c7484296f7cd285c1cf983b5 100644
--- a/parser/src/parser.rs
+++ b/parser/src/parser.rs
@@ -161,22 +161,26 @@ fn parse_expr(pair: Pair<Rule>) -> Command {
             let mut iter = pair.into_inner();
             let s = iter.next().unwrap().as_str();
             let term = parse_term(iter.next().unwrap());
-            Command::Define(s, None, term)
+            Command::Declaration(s, None, declaration::Builder::Decl(box term, Vec::new()))
         },
 
         Rule::DefineCheckType => {
             let mut iter = pair.into_inner();
             let s = iter.next().unwrap().as_str();
-            let t = parse_term(iter.next().unwrap());
-            let term = parse_term(iter.next().unwrap());
-            Command::Define(s, Some(t), term)
+            let ty = parse_term(iter.next().unwrap());
+            let decl = parse_term(iter.next().unwrap());
+
+            let ty = declaration::Builder::Decl(box ty, Vec::new());
+            let decl = declaration::Builder::Decl(box decl, Vec::new());
+
+            Command::Declaration(s, Some(ty), decl)
         },
 
         Rule::Declaration => {
             let mut iter = pair.into_inner();
             let mut string_decl = iter.next().unwrap().into_inner();
             let s = string_decl.next().unwrap().as_str();
-            let vars : Vec<&str> = string_decl.next().unwrap().into_inner().map(|name| name.as_str()).collect();
+            let vars: Vec<&str> = string_decl.next().unwrap().into_inner().map(|name| name.as_str()).collect();
             let body = iter.next().map(parse_term).unwrap();
 
             Command::Declaration(s, None, declaration::Builder::Decl(box body, vars))
@@ -186,13 +190,13 @@ fn parse_expr(pair: Pair<Rule>) -> Command {
             let mut iter = pair.into_inner();
             let mut string_decl = iter.next().unwrap().into_inner();
             let s = string_decl.next().unwrap().as_str();
-            let vars : Vec<&str> = string_decl.next().unwrap().into_inner().map(|name| name.as_str()).collect();
-            
-            let t = parse_term(iter.next().unwrap());
-            let body = iter.next().map(parse_term).unwrap();
+            let vars: Vec<&str> = string_decl.next().unwrap().into_inner().map(|name| name.as_str()).collect();
+
+            let ty = parse_term(iter.next().unwrap());
+            let decl = iter.next().map(parse_term).unwrap();
 
-            let ty = declaration::Builder::Decl(box t, vars.clone());
-            let decl = declaration::Builder::Decl(box body, vars);
+            let ty = declaration::Builder::Decl(box ty, vars.clone());
+            let decl = declaration::Builder::Decl(box decl, vars);
             Command::Declaration(s, Some(ty), decl)
         },
 
@@ -335,7 +339,14 @@ mod tests {
 
     #[test]
     fn successful_define_with_type_annotation() {
-        assert_eq!(parse_line("def x : Type := Prop"), Ok(Define("x", Some(Type(box level::Builder::Const(0))), Prop)));
+        assert_eq!(
+            parse_line("def x : Type := Prop"),
+            Ok(Declaration(
+                "x",
+                Some(declaration::Builder::Decl(box Type(box level::Builder::Const(0)), Vec::new())),
+                declaration::Builder::Decl(box Prop, Vec::new())
+            ))
+        );
     }
 
     #[test]
@@ -356,7 +367,7 @@ mod tests {
 
     #[test]
     fn successful_define() {
-        assert_eq!(parse_line("def x := Prop"), Ok(Define("x", None, Prop)));
+        assert_eq!(parse_line("def x := Prop"), Ok(Declaration("x", None, declaration::Builder::Decl(box Prop, Vec::new()))));
     }
 
     #[test]
diff --git a/proost/src/evaluator.rs b/proost/src/evaluator.rs
index a5e49ffeccf4111e2cc193d4e5caa18ae15ef378..38947a6789c2cc96082048f42e7f030649054343 100644
--- a/proost/src/evaluator.rs
+++ b/proost/src/evaluator.rs
@@ -139,35 +139,6 @@ impl<'arena> Evaluator {
         importing: &mut Vec<PathBuf>,
     ) -> Result<'arena, Option<Term<'arena>>> {
         match command {
-            Command::Define(s, None, term) => {
-                let term = term.realise(arena)?;
-                if arena.get_binding(s).is_none() {
-                    term.infer(arena)?;
-                    arena.bind(s, term);
-                    Ok(None)
-                } else {
-                    Err(Toplevel(Error {
-                        kind: ErrorKind::BoundVariable(s.to_string()),
-                        location: Location::default(), // TODO (see #38)
-                    }))
-                }
-            },
-
-            Command::Define(s, Some(t), term) => {
-                let term = term.realise(arena)?;
-                let t = t.realise(arena)?;
-                if arena.get_binding(s).is_none() {
-                    term.check(t, arena)?;
-                    arena.bind(s, term);
-                    Ok(None)
-                } else {
-                    Err(Toplevel(Error {
-                        kind: ErrorKind::BoundVariable(s.to_string()),
-                        location: Location::default(), // TODO (see #38)
-                    }))
-                }
-            },
-
             Command::Declaration(s, None, decl) => {
                 let decl = decl.realise(arena)?;
                 if arena.get_binding(s).is_none() {
@@ -186,7 +157,7 @@ impl<'arena> Evaluator {
                 let decl = decl.realise(arena)?;
                 let ty = t.realise(arena)?;
                 if arena.get_binding(s).is_none() {
-                    decl.check(ty,arena)?;
+                    decl.check(ty, arena)?;
                     arena.bind_decl(s, decl);
                     Ok(None)
                 } else {