diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBZ3Target.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBZ3Target.scala
index be9844a31d5ec0f6d5b419af4c417c3e0433e43e..b15bd9102a19f73cddf2ea6a3f357e42c6ff701d 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBZ3Target.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBZ3Target.scala
@@ -9,13 +9,11 @@ import purescala.Expressions._
 import purescala.Constructors._
 import purescala.Types._
 import purescala.Definitions._
-
 import _root_.smtlib.parser.Terms.{Identifier => SMTIdentifier, _}
 import _root_.smtlib.parser.Commands.{FunDef => SMTFunDef, _}
 import _root_.smtlib.interpreters.Z3Interpreter
 import _root_.smtlib.theories.Core.{Equals => SMTEquals, _}
 import _root_.smtlib.theories.ArraysEx
-
 import utils.Bijection
 
 trait SMTLIBZ3Target extends SMTLIBTarget {
@@ -90,11 +88,11 @@ trait SMTLIBZ3Target extends SMTLIBTarget {
     case Some(fd) => fd
     case _ => throw new Exception("Could not find function "+s+" in program")
   }
-  lazy val list_size = lookupFunDef("leon.collection.List.size")
-  lazy val list_++ = lookupFunDef("leon.collection.List.++")
-  lazy val list_take = lookupFunDef("leon.collection.List.take")
-  lazy val list_drop = lookupFunDef("leon.collection.List.drop")
-  lazy val list_slice = lookupFunDef("leon.collection.List.slice")
+  lazy val list_size = lookupFunDef("leon.collection.List.size").typed(Seq(CharType))
+  lazy val list_++ = lookupFunDef("leon.collection.List.++").typed(Seq(CharType))
+  lazy val list_take = lookupFunDef("leon.collection.List.take").typed(Seq(CharType))
+  lazy val list_drop = lookupFunDef("leon.collection.List.drop").typed(Seq(CharType))
+  lazy val list_slice = lookupFunDef("leon.collection.List.slice").typed(Seq(CharType))
   
   
   override protected def fromSMT(t: Term, otpe: Option[TypeTree] = None)
@@ -188,13 +186,14 @@ trait SMTLIBZ3Target extends SMTLIBTarget {
       }
       toSMT(stringEncoding)
     case StringLength(a)           =>
-      toSMT(functionInvocation(list_size, Seq(a)))
+      FunctionApplication(declareFunction(list_size), Seq(toSMT(a)))
     case StringConcat(a, b)        =>
-      toSMT(functionInvocation(list_++, Seq(a, b)))
+      FunctionApplication(declareFunction(list_++), Seq(toSMT(a), toSMT(b)))
     case SubString(a, start, Plus(start2, length)) if start == start2  =>
-      toSMT(functionInvocation(list_take, Seq(functionInvocation(list_drop, Seq(a, start)), length)))
+      FunctionApplication(declareFunction(list_take),
+          Seq(FunctionApplication(declareFunction(list_drop), Seq(toSMT(a), toSMT(start))), toSMT(length)))
     case SubString(a, start, end)  => 
-      toSMT(functionInvocation(list_slice, Seq(a, start, end)))
+      FunctionApplication(declareFunction(list_slice), Seq(toSMT(a), toSMT(start), toSMT(end)))
     case _ =>
       super.toSMT(e)
   }