diff --git a/src/main/scala/leon/synthesis/SynthesisPhase.scala b/src/main/scala/leon/synthesis/SynthesisPhase.scala
index a0aff1783163babb86c821e014af7141e0b7ef65..0944851f5a99e73bda0b601e7c099fcffc45aab6 100644
--- a/src/main/scala/leon/synthesis/SynthesisPhase.scala
+++ b/src/main/scala/leon/synthesis/SynthesisPhase.scala
@@ -21,7 +21,7 @@ object SynthesisPhase extends LeonPhase[Program, Program] {
     LeonFlagOptionDef( "inplace",         "--inplace",         "Debug level"),
     LeonFlagOptionDef( "allseeing",       "--allseeing",       "Also synthesize functions using holes"),
     LeonValueOptionDef("parallel",        "--parallel[=N]",    "Parallel synthesis search using N workers", Some("5")),
-    LeonFlagOptionDef( "manual",          "--manual",          "Manual search"),
+    LeonValueOptionDef( "manual",         "--manual[=cmd]",    "Manual search", Some("")),
     LeonFlagOptionDef( "derivtrees",      "--derivtrees",      "Generate derivation trees"),
     LeonFlagOptionDef( "firstonly",       "--firstonly",       "Stop as soon as one synthesis solution is found", true),
     LeonValueOptionDef("timeout",         "--timeout=T",       "Timeout after T seconds when searching for synthesis solutions .."),
@@ -41,8 +41,8 @@ object SynthesisPhase extends LeonPhase[Program, Program] {
     var options = SynthesisSettings()
 
     for(opt <- ctx.options) opt match {
-      case LeonFlagOption("manual", v) =>
-        options = options.copy(manualSearch = v)
+      case LeonValueOption("manual", cmd) =>
+        options = options.copy(manualSearch = Some(cmd))
 
       case LeonFlagOption("allseeing", v) =>
         options = options.copy(allSeeing = v)
@@ -106,7 +106,7 @@ object SynthesisPhase extends LeonPhase[Program, Program] {
       case _ =>
     }
 
-    if (options.manualSearch) {
+    if (options.manualSearch.isDefined) {
       options = options.copy(
         rules = rules.AsChoose +:
                 options.rules
diff --git a/src/main/scala/leon/synthesis/SynthesisSettings.scala b/src/main/scala/leon/synthesis/SynthesisSettings.scala
index 126f7994311615377d6ffe137e360a71f0595316..5f279ee5dec1f65c4a8b2f206a05fbb6cb8bd5b3 100644
--- a/src/main/scala/leon/synthesis/SynthesisSettings.scala
+++ b/src/main/scala/leon/synthesis/SynthesisSettings.scala
@@ -16,7 +16,7 @@ case class SynthesisSettings(
   timeoutMs: Option[Long]             = None,
   costModel: CostModel                = CostModels.default,
   rules: Seq[Rule]                    = Rules.all,
-  manualSearch: Boolean               = false,
+  manualSearch: Option[String]        = None,
   searchBound: Option[Int]            = None,
   selectedSolvers: Set[String]        = Set("fairz3"),
   functionsToIgnore: Set[FunDef]      = Set(),
diff --git a/src/main/scala/leon/synthesis/Synthesizer.scala b/src/main/scala/leon/synthesis/Synthesizer.scala
index b9bae7dad53c9159453e157d1129298b2d717085..6ba4adebfe311713013dc52ce9b4a77866cbd814 100644
--- a/src/main/scala/leon/synthesis/Synthesizer.scala
+++ b/src/main/scala/leon/synthesis/Synthesizer.scala
@@ -28,8 +28,8 @@ class Synthesizer(val context : LeonContext,
   val reporter = context.reporter
 
   def getSearch(): Search = {
-    if (settings.manualSearch) {
-      new ManualSearch(context, ci, problem, settings.costModel)
+    if (settings.manualSearch.isDefined) {
+      new ManualSearch(context, ci, problem, settings.costModel, settings.manualSearch)
     } else if (settings.searchWorkers > 1) {
       ???
       //new ParallelSearch(this, problem, options.searchWorkers)
diff --git a/src/main/scala/leon/synthesis/graph/Search.scala b/src/main/scala/leon/synthesis/graph/Search.scala
index 4e851ef70160b59bcba45e121324dc82ea3ca68d..82e3e1175fe269b07203984478f2ffb607ae0764 100644
--- a/src/main/scala/leon/synthesis/graph/Search.scala
+++ b/src/main/scala/leon/synthesis/graph/Search.scala
@@ -124,7 +124,7 @@ class SimpleSearch(ctx: LeonContext, ci: ChooseInfo, p: Problem, costModel: Cost
   }
 }
 
-class ManualSearch(ctx: LeonContext, ci: ChooseInfo, problem: Problem, costModel: CostModel) extends Search(ctx, ci, problem, costModel) {
+class ManualSearch(ctx: LeonContext, ci: ChooseInfo, problem: Problem, costModel: CostModel, initCmd: Option[String]) extends Search(ctx, ci, problem, costModel) {
   import ctx.reporter._
 
   abstract class Command
@@ -135,7 +135,7 @@ class ManualSearch(ctx: LeonContext, ci: ChooseInfo, problem: Problem, costModel
 
   // Manual search state:
   var cd       = List[Int]()
-  var cmdQueue = List[Command]()
+  var cmdQueue = initCmd.map( str => parseCommands(parseString(str))).getOrElse(Nil)
 
   def getNextCommand(): Command = cmdQueue match {
     case c :: cs =>
@@ -144,13 +144,17 @@ class ManualSearch(ctx: LeonContext, ci: ChooseInfo, problem: Problem, costModel
 
     case Nil =>
       print("Next action? (q to quit) "+cd.mkString(" ")+" $ ")
-      val line = scala.io.StdIn.readLine().trim
-      val parts = line.split("\\s+").toList
+      val line = scala.io.StdIn.readLine()
+      val parts = parseString(line)
 
       cmdQueue = parseCommands(parts)
       getNextCommand()
   }
 
+  def parseString(s: String): List[String] = {
+    s.trim.split("\\s+|,").toList
+  }
+
   def parseCommands(tokens: List[String]): List[Command] = tokens match {
     case "cd" :: ".." :: ts =>
       Parent :: parseCommands(ts)
@@ -167,7 +171,7 @@ class ManualSearch(ctx: LeonContext, ci: ChooseInfo, problem: Problem, costModel
     case "q" :: ts =>
       Quit :: Nil
 
-    case Nil =>
+    case Nil  | "" :: Nil =>
       Nil
 
     case ts =>