diff --git a/project/build/funcheck.scala b/project/build/funcheck.scala
index d649b73b58147e2f806da2774bf0d645502243ec..0ef9fb71aef6c1eef440e5334ade8f1db3f763e7 100644
--- a/project/build/funcheck.scala
+++ b/project/build/funcheck.scala
@@ -5,12 +5,13 @@ class FunCheckProject(info: ProjectInfo) extends DefaultProject(info) with FileT
   override def dependencyPath      = "lib"
   override def shouldCheckOutputDirectories = false
 
-  lazy val purescala  = project(".", "PureScala Definitions", new PureScalaProject(_))
-  lazy val plugin     = project(".", "FunCheck Plugin", new PluginProject(_), purescala)
-  lazy val multisets  = project(".", "Multiset Solver", new MultisetsProject(_), plugin, purescala)
-  lazy val orderedsets = project(".", "Ordered Sets Solver", new OrderedSetsProject(_), plugin, purescala)
+  lazy val purescala      = project(".", "PureScala Definitions", new PureScalaProject(_))
+  lazy val plugin         = project(".", "FunCheck Plugin", new PluginProject(_), purescala)
+  lazy val multisets      = project(".", "Multiset Solver", new MultisetsProject(_), plugin, purescala)
+  lazy val orderedsets    = project(".", "Ordered Sets Solver", new OrderedSetsProject(_), plugin, purescala)
+  lazy val setconstraints = project(".", "Type inference with set constraints", new SetConstraintsProject(_), plugin, purescala)
 
-  lazy val extensionJars : List[Path] = multisets.jarPath :: orderedsets.jarPath :: Nil
+  lazy val extensionJars : List[Path] = multisets.jarPath :: orderedsets.jarPath :: setconstraints.jarPath :: Nil
 
   val scriptPath: Path = "." / "scalac-funcheck"
 
@@ -89,4 +90,9 @@ class FunCheckProject(info: ProjectInfo) extends DefaultProject(info) with FileT
     override def mainScalaSourcePath = "src" / "orderedsets"
     override def unmanagedClasspath = super.unmanagedClasspath +++ purescala.jarPath
   }
+  class SetConstraintsProject(info: ProjectInfo) extends PersonalizedProject(info) {
+    override def outputPath = "bin" / "setconstraints"
+    override def mainScalaSourcePath = "src" / "setconstraints"
+    override def unmanagedClasspath = super.unmanagedClasspath +++ purescala.jarPath
+  }
 }
diff --git a/src/funcheck/FunCheckPlugin.scala b/src/funcheck/FunCheckPlugin.scala
index 97b26656377462d4e42f7f1d5793ba1053f452ab..63ecdb8eb0282fc6bb411d52ed6db0adea85ba44 100644
--- a/src/funcheck/FunCheckPlugin.scala
+++ b/src/funcheck/FunCheckPlugin.scala
@@ -17,7 +17,7 @@ class FunCheckPlugin(val global: Global) extends Plugin {
   override val optionsHelp: Option[String] = Some(
     "  -P:funcheck:uniqid             When pretty-printing funcheck trees, show identifiers IDs" + "\n" +
     "  -P:funcheck:with-code          Allows the compiler to keep running after the static analysis" + "\n" +
-    "  -P:funcheck:extensions=ex1,... Specifies a list of qualified class names of extensions to be loaded"
+    "  -P:funcheck:extensions=ex1:... Specifies a list of qualified class names of extensions to be loaded"
   )
 
   /** Processes the command-line options. */
diff --git a/src/purescala/Extensions.scala b/src/purescala/Extensions.scala
index 0a3d96c004afbb815ef65ae7e45074f820d1b94f..1ba2efa3fceca7c137265a290042e43797056a8a 100644
--- a/src/purescala/Extensions.scala
+++ b/src/purescala/Extensions.scala
@@ -17,14 +17,14 @@ object Extensions {
   abstract class Analyser(reporter: Reporter) extends Extension(reporter) {
     // Does whatever the analysis should. Uses the reporter to
     // signal results and/or errors.
-    def analyze(program: Program) : Unit
+    def analyse(program: Program) : Unit
   }
 
   // the following is for dynamically loading extensions
   type AnyClass = Class[_]
 
   def loadAll(reporter: Reporter) : Seq[Extension] = {
-    val allNames = Settings.extensionNames.split(':')
+    val allNames: Seq[String] = Settings.extensionNames.split(':').map(_.trim).filter(!_.isEmpty)
     if(!allNames.isEmpty) {
       val classLoader = Extensions.getClass.getClassLoader
 
diff --git a/src/setconstraints/Main.scala b/src/setconstraints/Main.scala
new file mode 100644
index 0000000000000000000000000000000000000000..14ef5594d01a4e419450c3cfe9be498aa0bd6902
--- /dev/null
+++ b/src/setconstraints/Main.scala
@@ -0,0 +1,14 @@
+package setconstraints
+
+import purescala.Extensions._
+import purescala.Definitions._
+import purescala.Trees._
+import purescala.Reporter
+
+class Main(reporter: Reporter) extends Analyser(reporter) {
+  val description: String = "Analyser for advanced type inference based on set constraints"
+
+  def analyse(program: Program) : Unit = {
+    reporter.info("Nothing to do in this analysis.")
+  }
+}