diff --git a/src/debugger/debugger.ml b/src/debugger/debugger.ml
index 5593a28b5f20ecd4c0016332f0a3b525c0833537..a9e0bb05e4e5d45c0bfb09a9a3fa53fd734c2ca9 100644
--- a/src/debugger/debugger.ml
+++ b/src/debugger/debugger.ml
@@ -58,7 +58,11 @@ let doStep args =
                 | (str::_) -> (int_of_string str)
                 | [] -> 1
     in
-    repeat steps action
+    try repeat steps action
+    with Reasoner.ReasonerError str -> print_endline ("Error: "^str)
+
+let listCores args =
+    CM.graphIterCores (fun core -> print_endline (CM.coreToString core))
 
 let _ =
   if Array.length Sys.argv < 2 then printUsage()
@@ -76,6 +80,7 @@ let _ =
         Repl.bind "step" doStep "Runs another reasoner step" "" ;
         Repl.bind "st" (fun _ -> printStatus ()) "Prints reasoning status" "";
         Repl.bind "status" (fun _ -> printStatus ()) "Prints reasoning status" "";
+        Repl.bind "lscores" listCores "Lists all cores" "";
         Repl.exitBinding
       ];
     }
diff --git a/src/lib/CoAlgMisc.ml b/src/lib/CoAlgMisc.ml
index 7b388db94a07504bd6639e7ce1106c180a329ee3..e667e73789be9c65dfad49da3043f0b432a64464 100644
--- a/src/lib/CoAlgMisc.ml
+++ b/src/lib/CoAlgMisc.ml
@@ -223,6 +223,12 @@ and 'a lazylist = unit -> 'a lazyliststep
 
 and ruleEnumeration = rule lazyliststep
 
+let nodeStatusToString : nodeStatus -> string = function
+  | Expandable -> "Expandable"
+  | Open -> "Open"
+  | Sat -> "Sat"
+  | Unsat -> "Unsat"
+
 let lazylistFromList a_list =
     let list_state = ref (Some a_list) in
     fun () -> begin match !list_state with
@@ -454,6 +460,8 @@ let cssAdd cset css = BsSet.add cset css
 let cssFold fkt css init = BsSet.fold fkt css init
 let cssSingleton cset = BsSet.singleton cset
 let cssEqual css1 css2 = BsSet.equal css1 css2
+let cssIter (action: cset -> unit) css =
+    BsSet.iter action css
 
 
 (*****************************************************************************)
@@ -648,6 +656,29 @@ let lfGetAt (sort, nom) f =
   FHt.find !arrayAt.(sort).(f) nom
 let lfToInt lf = lf
 let lfFromInt num = num
+let lfGetFormula sort f = !arrayFormula.(sort).(f)
+
+let bsetToString sort bset : string =
+    let toFormula (lf:localFormula) (lst: string list) : string list =
+        let formula: C.formula = lfGetFormula sort lf in
+        (C.string_of_formula formula) :: lst
+    in
+    let formulaList = bsetFold toFormula bset [] in
+    "{ "^(String.concat ", " formulaList)^" }"
+
+let csetToString sort cset = bsetToString sort cset
+
+let coreToString core =
+    let helper cset lst : string list =
+        (csetToString core.sortC cset):: lst
+    in
+    let constraints = cssFold helper core.constraintsC [] in
+    "Core {\n"^
+    "  Status: " ^ (nodeStatusToString core.statusC) ^ "\n"^
+    "  " ^ bsetToString core.sortC core.bsC ^ "\n" ^
+    "  Constraints: { "^(String.concat "\n                 " constraints)^" }\n"^
+    "}"
+    
 
 let atFormulaGetSubformula f = !arrayDest1.(0).(f)
 let atFormulaGetNominal f =
diff --git a/src/lib/CoAlgMisc.mli b/src/lib/CoAlgMisc.mli
index a2531f203a9b104dcc26b6607482df2061dc1199..1e53ea105cc850408de8ac3bd1e91fcb8e2d114a 100644
--- a/src/lib/CoAlgMisc.mli
+++ b/src/lib/CoAlgMisc.mli
@@ -204,7 +204,7 @@ val cssAdd : cset -> csetSet -> csetSet
 val cssFold : (cset -> 'a -> 'a) -> csetSet -> 'a -> 'a
 val cssSingleton : cset -> csetSet
 val cssEqual : csetSet -> csetSet -> bool
-
+val cssIter : (cset -> unit) -> csetSet -> unit
 
 (*****************************************************************************)
 (*      "Module type" and a specific implementation of state nodes           *)
@@ -246,6 +246,7 @@ val coreGetSolver : core -> Minisat.solver
 val coreGetFht : core -> fht
 val coreGetConstraintParents : core -> cset list
 val coreAddConstraintParent : core -> cset -> unit
+val coreToString : core -> string
 
 
 (*****************************************************************************)
@@ -304,6 +305,7 @@ val bsetIter : (localFormula -> unit) -> bset -> unit
 val bsetFilter : bset -> (localFormula -> bool) -> bset
 val bsetAddTBox : sort -> bset -> bset
 val bsetCopy : bset -> bset
+val bsetToString : sort -> bset -> string
 
 val csetMake : unit -> cset
 val csetAdd : cset -> atFormula -> unit
@@ -314,6 +316,7 @@ val csetAddDot : cset -> unit
 val csetRemDot : cset -> unit
 val csetAddTBox : sort -> cset -> bset
 val csetIter : cset -> (atFormula -> unit) -> unit
+val csetToString : sort -> cset -> string
 
 
 (*****************************************************************************)
@@ -332,6 +335,7 @@ val lfGetNeg : sort -> localFormula -> localFormula option
 val lfGetAt : nominal -> localFormula -> atFormula
 val lfToInt : localFormula -> int
 val lfFromInt : int -> localFormula
+val lfGetFormula : sort -> localFormula -> CoAlgFormula.formula
 
 val atFormulaGetSubformula : atFormula -> localFormula
 val atFormulaGetNominal : atFormula -> nominal
@@ -340,3 +344,4 @@ val lfToAt : sort -> localFormula -> atFormula
 
 val ppFormulae : (string -> sort option) -> CoAlgFormula.sortedFormula list -> CoAlgFormula.sortedFormula ->
     CoAlgFormula.sortedFormula list * CoAlgFormula.sortedFormula * bset
+
diff --git a/src/lib/CoAlgReasoner.ml b/src/lib/CoAlgReasoner.ml
index cb7912aa26afd4fd0c8c62437101ae2888b13857..023314926482d70fcf6b8a495e675f5cf587bda6 100644
--- a/src/lib/CoAlgReasoner.ml
+++ b/src/lib/CoAlgReasoner.ml
@@ -17,6 +17,7 @@ type assumptions = CoAlgFormula.sortedFormula list
 
 type input = sortTable * nomTable * assumptions * CoAlgFormula.sortedFormula
 
+exception ReasonerError of string
 
 (*****************************************************************************)
 (*                     Propagation of Satisfiability                         *)
@@ -26,7 +27,7 @@ let propSatFindSucc setCnstr cset =
   if csetHasDot cset then false
   else
     match graphFindCnstr cset with
-      | None -> assert false
+      | None -> raise (ReasonerError "?")
       | Some SatC -> true
       | Some (OpenC _) -> setMemCnstr setCnstr cset
       | Some (UnexpandedC _)
@@ -139,7 +140,7 @@ let rec propagateUnsat = function
         | UState (state, idxopt) -> begin
             match stateGetStatus state with
             | Unsat -> tl
-            | Sat -> assert false
+            | Sat -> raise (ReasonerError "Propagation tells node is unsat, but it is already sat")
             | Open
             | Expandable ->
                 let mbs =
@@ -170,7 +171,7 @@ let rec propagateUnsat = function
         | UCore (core, comesFromCnstr) -> begin
             match coreGetStatus core with
             | Unsat -> tl
-            | Sat -> assert false
+            | Sat -> raise (ReasonerError "Propagation tells node is unsat, but it is already sat")
             | Open
             | Expandable ->
                 let mbs =
diff --git a/src/lib/CoAlgReasoner.mli b/src/lib/CoAlgReasoner.mli
index c96f0f943fea65da024216eae0f7b5439305e713..8070ccd301bff46ea2abf433f272672e5e12a0a3 100644
--- a/src/lib/CoAlgReasoner.mli
+++ b/src/lib/CoAlgReasoner.mli
@@ -11,6 +11,8 @@ type assumptions = CoAlgFormula.sortedFormula list
 
 type input = sortTable * nomTable * assumptions * CoAlgFormula.sortedFormula
 
+exception ReasonerError of string
+
 val isSat : ?verbose:bool -> sortTable -> (string -> CoAlgFormula.sort option) ->
   CoAlgFormula.sortedFormula list -> CoAlgFormula.sortedFormula -> bool