diff --git a/mytest/Abs.scala b/mytest/Abs.scala
index 3774d5daa8940ba06b48c2fee2c1ed7652f2d846..d189299038305f429d5324f5e13d6e9cb506fb3b 100644
--- a/mytest/Abs.scala
+++ b/mytest/Abs.scala
@@ -3,19 +3,22 @@ import leon.Utils._
 object Abs {
 
 
-  def abs(tab: Map[Int, Int], size: Int, j: Int): Map[Int, Int] = {
-    require(j >= 0 && j < size && tab.isDefinedAt(j) && size > 0)
+  def abs(tab: Map[Int, Int], size: Int, j: Int): Map[Int, Int] = ({
+    require(j >= 0 && j < size && size > 0)
     var k = 0
     var tabres = Map.empty[Int, Int]
     (while(k < size) {
-      if(tab(k) < 0)
-        tabres = tabres.updated(k, -tab(k))
-      else
-        tabres = tabres.updated(k, tab(k))
+      if(tab.isDefinedAt(k)) {
+        if(tab(k) < 0)
+          tabres = tabres.updated(k, -tab(k))
+        else
+          tabres = tabres.updated(k, tab(k))
+      } else {
+        tabres = tabres.updated(k, 0)
+      }
       k = k + 1
-    }) invariant(k >= 0)
+    }) invariant(k >= 0 && (if(j < k) tabres(j) >= 0 else true))
     tabres
-
-  }
+  }) ensuring(res => res(j) >= 0)
 
 }
diff --git a/src/main/scala/leon/ImperativeCodeElimination.scala b/src/main/scala/leon/ImperativeCodeElimination.scala
index 17248c50d311b12c769c3bed4a5ad04fd3f4b7e3..f59479c740c1d272ebe79f5aad233805b16f12c7 100644
--- a/src/main/scala/leon/ImperativeCodeElimination.scala
+++ b/src/main/scala/leon/ImperativeCodeElimination.scala
@@ -91,14 +91,15 @@ object ImperativeCodeElimination extends Pass {
               Map(whileFunVars.head.toVariable -> resVar)
             else
               whileFunVars.zipWithIndex.map{ case (v, i) => (v.toVariable, TupleSelect(resVar, i+1).setType(v.getType)) }.toMap
-          val modifiedVars2ResultVars: Map[Expr, Expr] = modifiedVars.map(v => (v.toVariable, modifiedVars2WhileFunVars(v.toVariable))).toMap
+          val modifiedVars2ResultVars: Map[Expr, Expr] = modifiedVars.map(v => (v.toVariable, whileFunVars2ResultVars(modifiedVars2WhileFunVars(v.toVariable)))).toMap
 
           val trivialPostcondition: Option[Expr] = Some(Not(replace(whileFunVars2ResultVars, whileFunCond)))
           val invariantPrecondition: Option[Expr] = wh.invariant.map(expr => replace(modifiedVars2WhileFunVars, expr))
+          val invariantPostcondition: Option[Expr] = wh.invariant.map(expr => replace(modifiedVars2ResultVars, expr))
           whileFunDef.precondition = invariantPrecondition
           whileFunDef.postcondition = trivialPostcondition.map(expr => 
-              And(expr, invariantPrecondition match { 
-                case Some(e) => replace(modifiedVars2ResultVars, e)
+              And(expr, invariantPostcondition match { 
+                case Some(e) => e
                 case None => BooleanLiteral(true)
               }))