diff --git a/ParseMe.scala b/ParseMe.scala
index 62be61d7543aabe1e040e708dda1bf12b88c4e34..06e6c03b278f693138a65439011ed44d3720c705 100644
--- a/ParseMe.scala
+++ b/ParseMe.scala
@@ -1,7 +1,6 @@
 import scala.collection.immutable.Set
 
 object ParseMe {
-
   sealed abstract class Tree
   case class Node(left: Tree, value: Int, right: Tree) extends Tree
   case class Leaf() extends Tree
diff --git a/src/funcheck/CodeExtraction.scala b/src/funcheck/CodeExtraction.scala
index b9877ef63547d7920ccf2d94c276d0f80bde54e5..c9d257546d391a892612b7916dbb7e42891b563f 100644
--- a/src/funcheck/CodeExtraction.scala
+++ b/src/funcheck/CodeExtraction.scala
@@ -79,16 +79,18 @@ trait CodeExtraction extends Extractors {
           case ExAbstractClass(o2, sym) => {
             if(scalaClassNames.contains(o2)) {
               unit.error(t.pos, "A class with the same name already exists.")
+            } else {
+              scalaClassSyms += (sym -> o2)
+              scalaClassNames += o2
             }
-            scalaClassSyms += (sym -> o2)
-            scalaClassNames += o2
           }
           case ExCaseClass(o2, sym, tpl) => {
             if(scalaClassNames.contains(o2)) {
               unit.error(t.pos, "A class with the same name already exists.")
+            } else {
+              scalaClassSyms += (sym -> o2)
+              scalaClassNames += o2
             }
-            scalaClassSyms += (sym -> o2)
-            scalaClassNames += o2
             // println("***")
             // println(tpl)
             // println("***")
@@ -133,17 +135,17 @@ trait CodeExtraction extends Extractors {
       })
 
       // TODO
-      // resolve all inheritance links (look at 
       // add all fields to case classes
 
-      println(classesToClasses)
+      // println(classesToClasses)
+      classDefs = classesToClasses.valuesIterator.toList
 
       tmpl.body.foreach(
         _ match {
           case ExCaseClassSyntheticJunk() => ;
-          case ExObjectDef(o2, t2) => { objectDefs = extractObjectDef(o2, t2) :: objectDefs }
-          case ExAbstractClass(o2,sym) => ; //println("That seems to be an abstract class: [[" + o2  + "]]")
-          case ExCaseClass(_,_,_) => ; //println(o2)
+          // case ExObjectDef(o2, t2) => { objectDefs = extractObjectDef(o2, t2) :: objectDefs }
+          case ExAbstractClass(o2,sym) => ; 
+          case ExCaseClass(_,_,_) => ; 
           case ExConstructorDef() => ;
           case ExMainFunctionDef() => ;
           case ExFunctionDef(n,p,t,b) => { funDefs = extractFunDef(n,p,t,b) :: funDefs }
diff --git a/src/funcheck/Extractors.scala b/src/funcheck/Extractors.scala
index b0e1c8d080470a0f4113a80c8e02d05398489a19..72c4d6f785b4a59f108d580e6221f96e6ee331d5 100644
--- a/src/funcheck/Extractors.scala
+++ b/src/funcheck/Extractors.scala
@@ -76,7 +76,10 @@ trait Extractors {
     object ExCaseClass {
       def unapply(cd: ClassDef): Option[(String,Symbol,Tree)] = cd match {
         case ClassDef(_, name, tparams, impl) if (cd.symbol.isCase && !cd.symbol.isAbstractClass && tparams.isEmpty && impl.body.size >= 8) => {
-          
+          impl.children.filter(child => child match {
+            case DefDef(_, nn, _, _, _, _) => true
+            case _ => false
+          }).foreach(child => println(child))
           Some((name.toString, cd.symbol, impl))
         }
         case _ => None
diff --git a/src/purescala/Definitions.scala b/src/purescala/Definitions.scala
index 13792638d00aad627d2c585adeb6a552cc2308ce..48d22082e095bb99703b469d5419f5165b592224 100644
--- a/src/purescala/Definitions.scala
+++ b/src/purescala/Definitions.scala
@@ -86,19 +86,23 @@ object Definitions {
    * implicitely define extractors) and explicitely defined unapply methods. */
   sealed trait ExtractorTypeDef
 
+  /** Abstract classes. */
   object AbstractClassDef {
     def unapply(acd: AbstractClassDef): Option[(Identifier,Option[AbstractClassDef])] = {
-      Some((acd.id, acd.parent))
+      if(acd == null) None else Some((acd.id, acd.parent))
     }
   }
-
-  /** Abstract classes. */
   class AbstractClassDef(val id: Identifier, var parent: Option[AbstractClassDef]) extends ClassTypeDef {
     var fields: VarDecls = Nil
     val isAbstract = true
   }
 
   /** Case classes. */
+  object CaseClassDef {
+    def unapply(ccd: CaseClassDef): Option[(Identifier,Option[AbstractClassDef],VarDecls)] =  {
+      if(ccd == null) None else Some((ccd.id, ccd.parent, ccd.fields))
+    }
+  }
   class CaseClassDef(val id: Identifier, var parent: Option[AbstractClassDef]) extends ClassTypeDef with ExtractorTypeDef {
     var fields: VarDecls = Nil
     val isAbstract = false
diff --git a/src/purescala/PrettyPrinter.scala b/src/purescala/PrettyPrinter.scala
index 597d11232696ac31e5d3109d0683ff925e33bcd7..3d302749deabcfc89866ee948e9287e1ae62f990 100644
--- a/src/purescala/PrettyPrinter.scala
+++ b/src/purescala/PrettyPrinter.scala
@@ -152,6 +152,29 @@ object PrettyPrinter {
         nsb
       }
 
+      case CaseClassDef(id, parent, varDecls) => {
+        var nsb = sb
+        ind(nsb)
+        nsb.append("case class ")
+        nsb.append(id)
+        nsb.append("(")
+        var c = 0
+        val sz = varDecls.size
+
+        varDecls.foreach(vd => {
+          nsb = pp(vd.tpe, nsb)
+          nsb.append(" ")
+          nsb.append(vd.id.toString)
+          if(c < sz - 1) {
+            nsb.append(", ")
+          }
+          c = c + 1
+        })
+        nsb.append(")")
+        parent.foreach(p => nsb.append(" extends " + p.id))
+        nsb
+      }
+
       case FunDef(id, rt, args, body, pre, post) => {
         var nsb = sb