diff --git a/mytest/Bubble.scala b/mytest/Bubble.scala
index 33ad5c1039ad7955a3504005683a0b562eb9f8a7..4e274e2707b0cff262e712ab4b78b53eee0db990 100644
--- a/mytest/Bubble.scala
+++ b/mytest/Bubble.scala
@@ -5,7 +5,7 @@ import leon.Utils._
 object Bubble {
 
   def sort(a: Map[Int, Int], size: Int): Map[Int, Int] = ({
-    require(size <= 5 && isArray(a, size))
+    require(size < 5 && isArray(a, size))
     var i = size - 1
     var j = 0
     var sortedArray = a
@@ -24,12 +24,12 @@ object Bubble {
             i < size &&
             isArray(sortedArray, size) && 
             partitioned(sortedArray, size, 0, i, i+1, size-1) &&
-            partitioned(sortedArray, size, 0, j-1, j, j) &&
-            sorted(sortedArray, size, i, size-1)
+            sorted(sortedArray, size, i, size-1) &&
+            partitioned(sortedArray, size, 0, j-1, j, j)
           )
       i = i - 1
     }) invariant(
-          i >= -1 &&
+          i >= 0 &&
           i < size &&
           isArray(sortedArray, size) && 
           partitioned(sortedArray, size, 0, i, i+1, size-1) &&
@@ -49,29 +49,81 @@ object Bubble {
     }) invariant(k <= u && k >= l)
     isSorted
   }
+  /*
+    //  --------------------- sorted --------------------
+    def sorted(a: Map[Int,Int], size: Int, l: Int, u: Int) : Boolean = {
+      require(isArray(a, size) && size < 5 && l >= 0 && l <= u && u < size)
+      val t = sortedWhile(true, l, l, u, a, size)
+      t._1
+    }
+
+    def sortedWhile(isSorted: Boolean, k: Int, l: Int, u: Int, a: Map[Int,Int], size: Int) : (Boolean, Int) = {
+      require(isArray(a, size) && size < 5 && l >= 0 && l <= u && u < size && k >= l && k <= u)
+      if(k < u) {
+        sortedWhile(if(a(k) > a(k + 1)) false else isSorted, k + 1, l, u, a, size)
+      } else (isSorted, k)
+    }
+    */
   
+  /*
+    // ------------- partitioned ------------------
+    def partitioned(a: Map[Int,Int], size: Int, l1: Int, u1: Int, l2: Int, u2: Int) : Boolean = {
+      require(isArray(a, size) && size < 5 && l1 >= 0 && u1 < l2 && u2 < size)
+      if(l2 > u2 || l1 > u1) 
+        true
+      else {
+        val t = partitionedWhile(l2, true, l1, l1, size, u2, l2, u1, a)
+        t._2
+      }
+    }
+    def partitionedWhile(j: Int, isPartitionned: Boolean, i: Int, l1: Int, size: Int, u2: Int, l2: Int, u1: Int, a: Map[Int,Int]) : (Int, Boolean, Int) = {
+      require(isArray(a, size) && size < 5 && l1 >= 0 && l1 <= u1 && u1 < l2 && l2 <= u2 && u2 < size && i >= l1)
+
+      if(i <= u1) {
+        val t = partitionedNestedWhile(isPartitionned, l2, i, l1, u1, size, u2, a, l2)
+        partitionedWhile(t._2, t._1, i + 1, l1, size, u2, l2, u1, a)
+      } else (j, isPartitionned, i)
+    }
+    def partitionedNestedWhile(isPartitionned: Boolean, j: Int, i: Int, l1: Int, u1: Int, size: Int, u2: Int, a: Map[Int,Int], l2: Int): (Boolean, Int) = {
+      require(isArray(a, size) && size < 5 && l1 >= 0 && l1 <= u1 && u1 < l2 && l2 <= u2 && u2 < size && j >= l2 && i >= l1 && i <= u1)
+
+      if (j <= u2) {
+        partitionedNestedWhile(
+          (if (a(i) > a(j))
+            false
+          else
+            isPartitionned), 
+          j + 1, i, l1, u1, size, u2, a, l2)
+      } else (isPartitionned, j)
+    }
+    */
+
   def partitioned(a: Map[Int, Int], size: Int, l1: Int, u1: Int, l2: Int, u2: Int): Boolean = {
-    require(l1 >= 0 && l1 <= u1 && u1 < l2 && l2 <= u2 && u2 < size && isArray(a, size) && size < 5)
-    var i = l1
-    var j = l2
-    var isPartitionned = true
-    (while(i <= u1) {
-      j = l2
-      (while(j <= u2) {
-        if(a(i) > a(j))
-          isPartitionned = false
-        j = j + 1
-      }) invariant(j >= l2 && i <= u1)
-      i = i + 1
-    }) invariant(i >= l1)
-    isPartitionned
+    require(l1 >= 0 && u1 < l2 && u2 < size && isArray(a, size) && size < 5)
+    if(l2 > u2 || l1 > u1)
+      true
+    else {
+      var i = l1
+      var j = l2
+      var isPartitionned = true
+      (while(i <= u1) {
+        j = l2
+        (while(j <= u2) {
+          if(a(i) > a(j))
+            isPartitionned = false
+          j = j + 1
+        }) invariant(j >= l2 && i <= u1)
+        i = i + 1
+      }) invariant(i >= l1)
+      isPartitionned
+    }
   }
 
   def isArray(a: Map[Int, Int], size: Int): Boolean = {
     def rec(i: Int): Boolean = if(i >= size) true else {
       if(a.isDefinedAt(i)) rec(i+1) else false
     }
-    if(size < 0)
+    if(size <= 0)
       false
     else
       rec(0)
diff --git a/mytest/BubbleFun.scala b/mytest/BubbleFun.scala
index e4d551a7c9c894707e3ed281c425e0ef26008863..5962eea28e93cbd3d496ae9c7dd92af3a1297d15 100644
--- a/mytest/BubbleFun.scala
+++ b/mytest/BubbleFun.scala
@@ -8,7 +8,7 @@ object BubbleFun {
       val i = size - 1
       val t = sortWhile(0, a, i, size)
       t._2
-    }) ensuring(res => isArray(res, size) && sorted(res, size, 0, size-1) && content(res, size) == content(a, size))
+    }) ensuring(res => isArray(res, size) && sorted(res, size, 0, size-1) /*&& content(res, size) == content(a, size)*/)
 
     def sortWhile(j: Int, sortedArray: Map[Int,Int], i: Int, size: Int) : (Int, Map[Int,Int], Int) = ({
       require(i >= 0 && i < size && isArray(sortedArray, size) && size < 5 &&
@@ -22,7 +22,7 @@ object BubbleFun {
     }) ensuring(res => isArray(res._2, size) && 
                        sorted(res._2, size, res._3, size - 1) &&
                        partitioned(res._2, size, 0, res._3, res._3+1, size-1) &&
-                       res._3 >= 0 && res._3 <= 0 && content(res._2, size) == content(sortedArray, size)
+                       res._3 >= 0 && res._3 <= 0 /*&& content(res._2, size) == content(sortedArray, size)*/
                )
 
 
@@ -43,7 +43,7 @@ object BubbleFun {
                        sorted(res._1, size, i, size - 1) &&
                        partitioned(res._1, size, 0, i, i+1, size-1) &&
                        partitioned(res._1, size, 0, res._2-1, res._2, res._2) &&
-                       res._2 >= i && res._2 >= 0 && res._2 <= i && content(res._1, size) == content(sortedArray, size))
+                       res._2 >= i && res._2 >= 0 && res._2 <= i /*&& content(res._1, size) == content(sortedArray, size)*/)
 
 
     //some intermediate results
diff --git a/mytest/BubbleWeakInvariant.scala b/mytest/BubbleWeakInvariant.scala
new file mode 100644
index 0000000000000000000000000000000000000000..d335cb81ffce8831f0dc1c203ab47c227d761e7f
--- /dev/null
+++ b/mytest/BubbleWeakInvariant.scala
@@ -0,0 +1,132 @@
+import leon.Utils._
+
+/* The calculus of Computation textbook */
+
+object Bubble {
+
+  def sort(a: Map[Int, Int], size: Int): Map[Int, Int] = ({
+    require(size < 5 && isArray(a, size))
+    var i = size - 1
+    var j = 0
+    var sortedArray = a
+    (while(i > 0) {
+      j = 0
+      (while(j < i) {
+        if(sortedArray(j) > sortedArray(j+1)) {
+          val tmp = sortedArray(j)
+          sortedArray = sortedArray.updated(j, sortedArray(j+1))
+          sortedArray = sortedArray.updated(j+1, tmp)
+        }
+        j = j + 1
+      }) invariant(
+            j >= 0 &&
+            j <= i &&
+            i < size &&
+            isArray(sortedArray, size) && 
+            partitioned(sortedArray, size, 0, i, i+1, size-1) &&
+            //partitioned(sortedArray, size, 0, j-1, j, j) &&
+            sorted(sortedArray, size, i, size-1)
+          )
+      i = i - 1
+    }) invariant(
+          i >= 0 &&
+          i < size &&
+          isArray(sortedArray, size) && 
+          partitioned(sortedArray, size, 0, i, i+1, size-1) &&
+          sorted(sortedArray, size, i, size-1)
+       )
+    sortedArray
+  }) ensuring(res => sorted(res, size, 0, size-1))
+
+  def sorted(a: Map[Int, Int], size: Int, l: Int, u: Int): Boolean = {
+    require(isArray(a, size) && size < 5 && l >= 0 && u < size && l <= u)
+    var k = l
+    var isSorted = true
+    (while(k < u) {
+      if(a(k) > a(k+1))
+        isSorted = false
+      k = k + 1
+    }) invariant(k <= u && k >= l)
+    isSorted
+  }
+  /*
+    //  --------------------- sorted --------------------
+    def sorted(a: Map[Int,Int], size: Int, l: Int, u: Int) : Boolean = {
+      require(isArray(a, size) && size < 5 && l >= 0 && l <= u && u < size)
+      val t = sortedWhile(true, l, l, u, a, size)
+      t._1
+    }
+
+    def sortedWhile(isSorted: Boolean, k: Int, l: Int, u: Int, a: Map[Int,Int], size: Int) : (Boolean, Int) = {
+      require(isArray(a, size) && size < 5 && l >= 0 && l <= u && u < size && k >= l && k <= u)
+      if(k < u) {
+        sortedWhile(if(a(k) > a(k + 1)) false else isSorted, k + 1, l, u, a, size)
+      } else (isSorted, k)
+    }
+    */
+  
+  /*
+    // ------------- partitioned ------------------
+    def partitioned(a: Map[Int,Int], size: Int, l1: Int, u1: Int, l2: Int, u2: Int) : Boolean = {
+      require(isArray(a, size) && size < 5 && l1 >= 0 && u1 < l2 && u2 < size)
+      if(l2 > u2 || l1 > u1) 
+        true
+      else {
+        val t = partitionedWhile(l2, true, l1, l1, size, u2, l2, u1, a)
+        t._2
+      }
+    }
+    def partitionedWhile(j: Int, isPartitionned: Boolean, i: Int, l1: Int, size: Int, u2: Int, l2: Int, u1: Int, a: Map[Int,Int]) : (Int, Boolean, Int) = {
+      require(isArray(a, size) && size < 5 && l1 >= 0 && l1 <= u1 && u1 < l2 && l2 <= u2 && u2 < size && i >= l1)
+
+      if(i <= u1) {
+        val t = partitionedNestedWhile(isPartitionned, l2, i, l1, u1, size, u2, a, l2)
+        partitionedWhile(t._2, t._1, i + 1, l1, size, u2, l2, u1, a)
+      } else (j, isPartitionned, i)
+    }
+    def partitionedNestedWhile(isPartitionned: Boolean, j: Int, i: Int, l1: Int, u1: Int, size: Int, u2: Int, a: Map[Int,Int], l2: Int): (Boolean, Int) = {
+      require(isArray(a, size) && size < 5 && l1 >= 0 && l1 <= u1 && u1 < l2 && l2 <= u2 && u2 < size && j >= l2 && i >= l1 && i <= u1)
+
+      if (j <= u2) {
+        partitionedNestedWhile(
+          (if (a(i) > a(j))
+            false
+          else
+            isPartitionned), 
+          j + 1, i, l1, u1, size, u2, a, l2)
+      } else (isPartitionned, j)
+    }
+    */
+
+  def partitioned(a: Map[Int, Int], size: Int, l1: Int, u1: Int, l2: Int, u2: Int): Boolean = {
+    require(l1 >= 0 && u1 < l2 && u2 < size && isArray(a, size) && size < 5)
+    if(l2 > u2 || l1 > u1)
+      true
+    else {
+      var i = l1
+      var j = l2
+      var isPartitionned = true
+      (while(i <= u1) {
+        j = l2
+        (while(j <= u2) {
+          if(a(i) > a(j))
+            isPartitionned = false
+          j = j + 1
+        }) invariant(j >= l2 && i <= u1)
+        i = i + 1
+      }) invariant(i >= l1)
+      isPartitionned
+    }
+  }
+
+  def isArray(a: Map[Int, Int], size: Int): Boolean = {
+    def rec(i: Int): Boolean = if(i >= size) true else {
+      if(a.isDefinedAt(i)) rec(i+1) else false
+    }
+    if(size <= 0)
+      false
+    else
+      rec(0)
+  }
+
+}
diff --git a/src/main/scala/leon/Settings.scala b/src/main/scala/leon/Settings.scala
index 6593e418c28a4f49f5b8a798b527b468e9f3040c..797a209e57d08d863f24dcd5f97008d4fc875bf7 100644
--- a/src/main/scala/leon/Settings.scala
+++ b/src/main/scala/leon/Settings.scala
@@ -23,4 +23,5 @@ object Settings {
   var useParallel : Boolean = false
   // When this is None, use real integers
   var bitvectorBitwidth : Option[Int] = None
+  var verbose : Boolean = false
 }
diff --git a/src/main/scala/leon/plugin/LeonPlugin.scala b/src/main/scala/leon/plugin/LeonPlugin.scala
index b059ad59dbf218ea9042eb6923484778c3ae5c46..5de24fa44bbf489350371d2bce9775231ebf3e1d 100644
--- a/src/main/scala/leon/plugin/LeonPlugin.scala
+++ b/src/main/scala/leon/plugin/LeonPlugin.scala
@@ -39,7 +39,8 @@ class LeonPlugin(val global: Global, val actionAfterExtraction : Option[Program=
     "  --cores              Use UNSAT cores in the unrolling/refinement step" + "\n" +
     "  --quickcheck         Use QuickCheck-like random search" + "\n" +
     "  --parallel           Run all solvers in parallel" + "\n" +
-    "  --noLuckyTests       Do not perform additional tests to potentially find models early"
+    "  --noLuckyTests       Do not perform additional tests to potentially find models early" + "\n" +
+    "  --verbose            Print debugging informations"
   )
 
   /** Processes the command-line options. */
@@ -62,6 +63,7 @@ class LeonPlugin(val global: Global, val actionAfterExtraction : Option[Program=
         case "quickcheck" =>                     leon.Settings.useQuickCheck = true
         case "parallel"   =>                     leon.Settings.useParallel = true
         case "noLuckyTests" =>                   leon.Settings.luckyTest = false
+        case "verbose"    =>                     leon.Settings.verbose = true
         case s if s.startsWith("unrolling=") =>  leon.Settings.unrollingLevel = try { s.substring("unrolling=".length, s.length).toInt } catch { case _ => 0 }
         case s if s.startsWith("functions=") =>  leon.Settings.functionsToAnalyse = Set(splitList(s.substring("functions=".length, s.length)): _*)
         case s if s.startsWith("extensions=") => leon.Settings.extensionNames = splitList(s.substring("extensions=".length, s.length))