diff --git a/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala b/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala
index 9c1c5697c33c171b73947ab19974df968b1d3ebb..296252ddd98d677a901644f4a139af52d5166da2 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriter.scala
@@ -12,15 +12,24 @@ import scala.reflect.io.{ File, Path }
 import scala.tools.nsc.reporters.ConsoleReporter
 import scala.tools.nsc.{ GenericRunnerSettings, Global, Settings }
 import scala.util.control.Breaks._
+import scala.reflect.io.Directory
 
 /** @author Rico Bergmann
   */
-class SModelFSWriter extends SModelVisitor {
+class SModelFSWriter(
+    workingDir: File = File(Files.createTempDirectory("model").toFile),
+    outputDir: Directory = File("output").toDirectory,
+    keepClassFiles: Boolean = false) extends SModelVisitor {
+
+  // TODO enable different output dirs
+  // TODO enable retaining the .scala files
+
+  workingDir.jfile.mkdirs()
+  outputDir.jfile.mkdirs()
 
-  private val baseOutputDir: File = File(Files.createTempDirectory("model").toFile)
   private var sFilesToCompile: List[File] = List.empty
 
-  println(s"... Temp dir (sources) is $baseOutputDir")
+  println(s"... Temp dir (sources) is $workingDir")
 
   override def visit(sModel: SModel): Unit = {
     println(s"... Wrote files (sources) $sFilesToCompile")
@@ -32,28 +41,32 @@ class SModelFSWriter extends SModelVisitor {
     // TODO do we want to reuse the whole classpath? Or just the parts we _actually_ need
     compilationSettings.classpath.value = adaptClassPathToOSEnv(fetchCurrentClassPath).distinct.mkString(File.pathSeparator)
     println(s"Using classpath ${compilationSettings.classpath.value}")
-    compilationSettings.outdir.value = baseOutputDir.toAbsolute.toString
+    compilationSettings.outdir.value = workingDir.toAbsolute.toString
     val reporter = new ConsoleReporter(compilationSettings)
     val compiler = new Global(compilationSettings, reporter)
     val runner = new compiler.Run
     runner.compile(sFilesToCompile.map(_.toAbsolute.toString))
     println("... Compilation done")
 
-    println("... Cleaning up")
-    sFilesToCompile.foreach {
-      _.delete
+    if (!keepClassFiles) {
+      println("... Cleaning up")
+      sFilesToCompile.foreach {
+        _.delete
+      }
+    } else {
+      println("... No clean-up requested")
     }
 
     println("... Generating JAR")
     // see: https://stackoverflow.com/a/1281295/5161760
     val mf = new Manifest
     mf.getMainAttributes.put(Attributes.Name.MANIFEST_VERSION, "1.0")
-    val targetJar = new JarOutputStream(new FileOutputStream("model.jar"), mf)
-    var filesToAdd: List[java.io.File] = baseOutputDir.jfile.listFiles.toList
+    val targetJar = new JarOutputStream(new FileOutputStream(outputDir + File.separator + "model.jar"), mf)
+    var filesToAdd: List[java.io.File] = workingDir.jfile.listFiles.toList
 
     while (filesToAdd.nonEmpty) {
       val file = filesToAdd.head
-      var fname = file.getAbsolutePath.replace(baseOutputDir.jfile.getAbsolutePath + File.separator, "").replaceAll("\\\\", "/")
+      var fname = file.getAbsolutePath.replace(workingDir.jfile.getAbsolutePath + File.separator, "").replaceAll("\\\\", "/")
       println(s"Adding to JAR: $fname")
       if (file.isDirectory) {
         if (!fname.endsWith("/")) {
@@ -94,7 +107,7 @@ class SModelFSWriter extends SModelVisitor {
 
   override def visit(sClass: SClass): Unit = {
     println(s"Writing class $sClass")
-    val classNameWithPath = baseOutputDir.toAbsolute.toString() + File.separator + pckg2Path(sClass.getPackage) + File.separator + s"${sClass.name}.scala"
+    val classNameWithPath = workingDir.toAbsolute.toString() + File.separator + pckg2Path(sClass.getPackage) + File.separator + s"${sClass.name}.scala"
     val writer = new SClassWriter(sClass)
 
     val classFile = File(classNameWithPath)
diff --git a/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriterTest.scala b/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriterTest.scala
index fd675cbbaddd8e7c52630745a49c6a47833b866a..57351db86d1378ee2bbd4771c36b66b9782e5811 100644
--- a/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriterTest.scala
+++ b/src/main/scala/org/rosi_project/model_sync/generator/io/SModelFSWriterTest.scala
@@ -1,10 +1,10 @@
 package org.rosi_project.model_sync.generator.io
 
 import org.rosi_project.model_sync.generator.acr._
-import org.rosi_project.model_sync.generator.sync_model.{GetterSetterGeneratingVisitor, SimpleSModel, SyncEnhancingVisitor}
+import org.rosi_project.model_sync.generator.sync_model.{ GetterSetterGeneratingVisitor, SimpleSModel, SyncEnhancingVisitor }
+import scala.reflect.io.File
 
-/**
-  * @author Rico Bergmann
+/** @author Rico Bergmann
   */
 object SModelFSWriterTest extends App {
 
@@ -23,5 +23,5 @@ object SModelFSWriterTest extends App {
 
   model.accept(getterSetterVisitor)
   model.accept(syncNotificationVisitor)
-  model.accept(new SModelFSWriter)
+  model.accept(new SModelFSWriter(workingDir = File("output/raw"), keepClassFiles = true))
 }