diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/BiopetExecutable.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/BiopetExecutable.scala
index ea0098b9f6a8dd4b79371a2317cf9c6f9ccf61fd..0acc5f348c65a878926d64e3482008ff037505f8 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/BiopetExecutable.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/BiopetExecutable.scala
@@ -1,8 +1,9 @@
 package nl.lumc.sasc.biopet.core
 
 import java.util.Properties
+import org.apache.log4j.Logger
 
-object BiopetExecutable {
+object BiopetExecutable extends Logging {
 
   val modules: Map[String, List[MainCommand]] = Map(
     "pipeline" -> List(
@@ -108,4 +109,17 @@ object BiopetExecutable {
     prop.load(getClass.getClassLoader.getResourceAsStream("git.properties"))
     prop.getProperty("git.commit.id.abbrev")
   }
+
+  def checkDirtyBuild(logger: Logger) {
+    val prop = new Properties()
+    prop.load(getClass.getClassLoader.getResourceAsStream("git.properties"))
+    val describeShort = prop.getProperty("git.commit.id.describe-short")
+    if (describeShort.endsWith("-dirty")) {
+      logger.warn("**********************************************************")
+      logger.warn("* This JAR was built while there are uncommited changes. *")
+      logger.warn("* Reproducible results are *not* guaranteed.             *")
+      logger.warn("**********************************************************")
+    }
+  }
+  checkDirtyBuild(logger)
 }
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/Logging.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/Logging.scala
new file mode 100644
index 0000000000000000000000000000000000000000..9b8197de1acdc1ca492760b931180e09176068bb
--- /dev/null
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/Logging.scala
@@ -0,0 +1,27 @@
+package nl.lumc.sasc.biopet.core
+
+import java.text.SimpleDateFormat
+import java.util.Calendar
+import org.apache.log4j.Logger
+import org.apache.log4j.WriterAppender
+import org.apache.log4j.helpers.DateLayout
+
+trait Logging {
+  protected val logger = Logger.getLogger(getClass.getSimpleName.split("\\$").last)
+
+  private[core] val logLayout = new DateLayout() {
+    val ignoresThrowable = false
+    def format(event: org.apache.log4j.spi.LoggingEvent): String = {
+      val calendar: Calendar = Calendar.getInstance
+      calendar.setTimeInMillis(event.getTimeStamp)
+      val formatter: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+      val formattedDate: String = formatter.format(calendar.getTime)
+      var logLevel = event.getLevel.toString
+      while (logLevel.size < 6) logLevel += " "
+      logLevel + " [" + formattedDate + "] [" + event.getLoggerName + "] " + event.getMessage + "\n"
+    }
+  }
+  private[core] val stderrAppender = new WriterAppender(logLayout, sys.process.stderr)
+  logger.setLevel(org.apache.log4j.Level.INFO)
+  logger.addAppender(stderrAppender)
+}
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/PipelineCommand.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/PipelineCommand.scala
index 52fff146557defe6fbad314106024ca42d83f792..6a245cdfd121fc45b2be6d153397d7f88bb06072 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/PipelineCommand.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/PipelineCommand.scala
@@ -1,8 +1,8 @@
 package nl.lumc.sasc.biopet.core
 
-import org.broadinstitute.gatk.queue.util.Logging
+import org.broadinstitute.gatk.queue.util.{ Logging => GatkLogging }
 
-trait PipelineCommand extends MainCommand with Logging {
+trait PipelineCommand extends MainCommand with GatkLogging {
 
   def pipeline = "/" + getClass.getName.stripSuffix("$").replaceAll("\\.", "/") + ".class"
 
diff --git a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/ToolCommand.scala b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/ToolCommand.scala
index 067194d3175c91563c041fd3cec06e2fa2bd7678..0a5dc8428cec541fd6cf1b967893e7266bcb1575 100644
--- a/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/ToolCommand.scala
+++ b/biopet-framework/src/main/scala/nl/lumc/sasc/biopet/core/ToolCommand.scala
@@ -1,14 +1,9 @@
 package nl.lumc.sasc.biopet.core
 
-import java.text.SimpleDateFormat
-import java.util.Calendar
-import org.apache.log4j.Logger
 import org.apache.log4j.WriterAppender
-import org.apache.log4j.helpers.DateLayout
-import org.apache.log4j.spi.LoggingEvent
 import java.io.File
 
-trait ToolCommand extends MainCommand {
+trait ToolCommand extends MainCommand with Logging {
   abstract class AbstractArgs {
   }
 
@@ -45,22 +40,4 @@ trait ToolCommand extends MainCommand {
 
   type Args <: AbstractArgs
   type OptParser <: AbstractOptParser
-
-  protected val logger = Logger.getLogger(commandName)
-
-  private val logLayout = new DateLayout() {
-    val ignoresThrowable = false
-    def format(event: org.apache.log4j.spi.LoggingEvent): String = {
-      val calendar: Calendar = Calendar.getInstance
-      calendar.setTimeInMillis(event.getTimeStamp)
-      val formatter: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-      val formattedDate: String = formatter.format(calendar.getTime)
-      var logLevel = event.getLevel.toString
-      while (logLevel.size < 6) logLevel += " "
-      logLevel + " [" + formattedDate + "] [" + event.getLoggerName + "] " + event.getMessage + "\n"
-    }
-  }
-  private val stderrAppender = new WriterAppender(logLayout, sys.process.stderr)
-  logger.setLevel(org.apache.log4j.Level.INFO)
-  logger.addAppender(stderrAppender)
 }
\ No newline at end of file