diff --git a/src/funcheck/CodeExtraction.scala b/src/funcheck/CodeExtraction.scala
index 9dca1024a59f4d1fa26bcfadc0500e260492ab4b..3fd4b0397a4573f518e006eb7f2fb414cc9202d1 100644
--- a/src/funcheck/CodeExtraction.scala
+++ b/src/funcheck/CodeExtraction.scala
@@ -70,21 +70,48 @@ trait CodeExtraction extends Extractors {
 
       val scalaClassSyms: scala.collection.mutable.Map[Symbol,Identifier] =
         scala.collection.mutable.Map.empty[Symbol,Identifier]
+      val scalaClassNames: scala.collection.mutable.Set[Identifier] = 
+        scala.collection.mutable.Set.empty[Identifier]
 
       // we need the new type definitions before we can do anything...
-      tmpl.body.foreach(
-        _ match {
+      tmpl.body.foreach(t =>
+        t match {
           case ExAbstractClass(o2, sym) => {
+            if(scalaClassNames.contains(o2)) {
+              unit.error(t.pos, "A class with the same name already exists.")
+            }
             scalaClassSyms += (sym -> o2)
+            scalaClassNames += o2
           }
           case ExCaseClass(o2, sym) => {
+            if(scalaClassNames.contains(o2)) {
+              unit.error(t.pos, "A class with the same name already exists.")
+            }
             scalaClassSyms += (sym -> o2)
+            scalaClassNames += o2
           }
           case _ => ;
         }
       )
 
-      println(scalaClassSyms)
+      stopIfErrors
+
+      val classesToClasses: scala.collection.mutable.Map[Symbol,ClassTypeDef] =
+        scala.collection.mutable.Map.empty[Symbol,ClassTypeDef]
+
+      scalaClassSyms.foreach(p => {
+          if(p._1.isAbstractClass) {
+            classesToClasses += (p._1 -> new AbstractClassDef(p._2, None))
+          } else if(p._1.isCase) {
+            classesToClasses += (p._1 -> new CaseClassDef(p._2, None))
+          }
+      })
+
+      // TODO
+      // resolve all inheritance links (look at 
+      // add all fields to case classes
+
+      println(classesToClasses)
 
       tmpl.body.foreach(
         _ match {
diff --git a/src/purescala/Definitions.scala b/src/purescala/Definitions.scala
index 6dd35e86297e2427daa4dd8ffccba9d316d68c3d..13792638d00aad627d2c585adeb6a552cc2308ce 100644
--- a/src/purescala/Definitions.scala
+++ b/src/purescala/Definitions.scala
@@ -77,7 +77,8 @@ object Definitions {
    * patterns (of pattern-matching, that is) */
   sealed trait ClassTypeDef extends Definition {
     val id: Identifier
-    val parent: Option[AbstractClassDef]
+    var parent: Option[AbstractClassDef]
+    val isAbstract: Boolean
     // val fields: VarDecls
   }
 
@@ -85,18 +86,29 @@ object Definitions {
    * implicitely define extractors) and explicitely defined unapply methods. */
   sealed trait ExtractorTypeDef
 
+  object AbstractClassDef {
+    def unapply(acd: AbstractClassDef): Option[(Identifier,Option[AbstractClassDef])] = {
+      Some((acd.id, acd.parent))
+    }
+  }
+
   /** Abstract classes. */
-  class AbstractClassDef(val id: Identifier, val parent: Option[AbstractClassDef]) extends ClassTypeDef {
+  class AbstractClassDef(val id: Identifier, var parent: Option[AbstractClassDef]) extends ClassTypeDef {
     var fields: VarDecls = Nil
+    val isAbstract = true
   }
 
   /** Case classes. */
-  class CaseClassDef(val id: Identifier, val parent: Option[AbstractClassDef]) extends ClassTypeDef with ExtractorTypeDef {
+  class CaseClassDef(val id: Identifier, var parent: Option[AbstractClassDef]) extends ClassTypeDef with ExtractorTypeDef {
     var fields: VarDecls = Nil
+    val isAbstract = false
   }
 
   /** "Regular" classes */
-  case class ClassDef(id: Identifier, parent: Option[AbstractClassDef], fields: VarDecls) extends ClassTypeDef
+  class ClassDef(val id: Identifier, var parent: Option[AbstractClassDef]) extends ClassTypeDef {
+    var fields: VarDecls = Nil
+    val isAbstract = false
+  }
   
   /** Values */
   case class ValDef(varDecl: VarDecl, value: Expr) extends Definition {
diff --git a/src/purescala/PrettyPrinter.scala b/src/purescala/PrettyPrinter.scala
index 5442e0c8cc32c85d21e63227d55e69c2111943f7..a46028e521e2c86b3fc061396a10f3d98363ab01 100644
--- a/src/purescala/PrettyPrinter.scala
+++ b/src/purescala/PrettyPrinter.scala
@@ -143,6 +143,15 @@ object PrettyPrinter {
         ind(nsb); nsb.append("}\n")
       }
 
+      case AbstractClassDef(id, parent) => {
+        var nsb = sb
+        ind(nsb)
+        nsb.append("sealed abstract class ")
+        nsb.append(id)
+        parent.foreach(p => nsb.append("extends " + p.id + " "))
+        nsb
+      }
+
       case FunDef(id, rt, args, body, pre, post) => {
         var nsb = sb