diff --git a/META-INF/aop.xml b/META-INF/aop.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2b6d3ad69dae076efe52bf91c89c22747906bd40
--- /dev/null
+++ b/META-INF/aop.xml
@@ -0,0 +1,129 @@
+<!DOCTYPE aspectj PUBLIC "-//AspectJ//DTD//EN" "http://www.aspectj.org/dtd/aspectj_1_5_0.dtd">
+
+<aspectj>
+	<weaver options="-showWeaveInfo"> <!-- options="-verbose -showWeaveInfo -Xjoinpoints:synchronization" -->
+
+		<!--
+			 Use the exclude/include directives to specify which classes are (not) to be considered for weaving.
+		     Some examples are given below. Please refer to the AspectJ documentation to learn more on the 
+		     allowed patterns, including wildcards. 
+		-->
+
+		<!-- 
+			Use * to consider all classes in all packages. In this case, you typically need some additional excludes. 
+		-->
+		<include within="teetime.stage..*"/>
+
+		<!--
+			Include/exclude examples for specific libraries:
+		-->
+
+		<!-- 
+		     Important: The logger library that is configured to be used by Kieker must always be excluded!
+		     (Particularly important when using the include-all directive from above.) 
+		--> 
+		<exclude within="org.apache.commons.logging..*" /> 
+		<exclude within="org.slf4j..*" /> 
+		<exclude within="java.util.logging..*" /> 
+		<exclude within="org.apache.log4j..*" />
+
+		<!-- Instrument all kieker.tests: -->
+		<!-- <include within="kieker.tests..*" /> -->
+
+		<!-- Example instrumentation for the iBATIS JPetStore -->
+		<!-- <include within="com.ibatis.jpetstore..*"/> -->
+		<!-- <include within="org.apache.struts.action.ActionServlet" /> -->
+
+		<!-- Include this to enable javac compilation (instead of ajc) of the probes: -->
+		<!-- <include within="kieker.monitoring.probe.aspectj..*"/> -->
+	</weaver>
+
+	<aspects>
+		<!-- 
+			Aspects are configured in this section of the AspectJ configuration file.
+			Specific examples for Kieker monitoring aspects are given below.
+			Usually, only one aspect should be active at a time. 
+		-->
+
+		<!-- 1. STATE-BASED MONITORING (OPERATION EXECUTIONS)
+			 The following directives enable aspects for monitoring operation executions. These aspects intercept 
+			 an execution of a software operation resulting in a single Kieker monitoring record of type 
+			 OperationExecutionRecord. 
+			 Depending on the used directives, i. all, ii. only annotated (@OperationExecutionMonitoringProbe), 
+			 or ii. only specific methods are monitored. Note that the noGetterAndSetter aspects also exclude 
+			 is..() methods for boolean getters. The Servlet aspects additionally extract session information 
+			 from Servlet entry point methods (do* with HttpServletRequest and HttpServletResponse parameters.)  
+		 -->
+		
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.operationExecution.OperationExecutionAspectAnnotation"/> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.operationExecution.OperationExecutionAspectAnnotationServlet"/> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.operationExecution.OperationExecutionAspectFull"/> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.operationExecution.OperationExecutionAspectFullNoGetterAndSetter"/> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.operationExecution.OperationExecutionAspectFullServlet"/> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.operationExecution.OperationExecutionAspectFullNoGetterAndSetterServlet"/> -->
+		
+		<!-- 2. EVENT-BASED MONITORING		
+			 The following directives enable aspects for monitoring control flow events, resulting in different 
+			 types of monitoring records to be found in the kieker.common.record.flow package.  
+			 Depending on the used directives, i. all, ii. only annotated, or iii. only specific methods are 
+			 monitored. Again, the noGetterAndSetter aspects also exclude is.. for boolean getters. 
+		-->
+		
+		<!-- Concurrency (beta stated): -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.concurrency.ThreadingAspect" /> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.concurrency.SynchronizedAspect" /> -->
+		
+		<!-- Constructors and constructor calls: -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.construction.FullInstrumentation" /> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.construction.Annotation" /> -->
+
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.constructorExecution.FullInstrumentation" /> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.constructorExecution.Annotation" /> -->
+
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.constructorExecutionObject.FullInstrumentation" /> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.constructorExecutionObject.Annotation" /> -->
+		
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.constructorExecutionObjectInterface.FullInstrumentation" /> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.constructorExecutionObjectInterface.Annotation" /> -->
+
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.constructorCall.FullInstrumentation" /> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.constructorCall.Annotation" /> -->
+
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.constructorCallObject.FullInstrumentation" /> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.constructorCallObject.Annotation" /> -->
+		
+		<!-- Method executions and method calls: -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.operationExecution.FullInstrumentation" /> -->
+<!-- 		<aspect name="kieker.monitoring.probe.aspectj.flow.operationExecution.FullInstrumentationNoGetterAndSetter" /> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.operationExecution.Annotation" /> -->
+		
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.operationExecutionObject.FullInstrumentation" /> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.operationExecutionObject.FullInstrumentationNoGetterAndSetter" />  -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.operationExecutionObject.Annotation" /> -->
+		
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.operationExecutionObjectInterface.FullInstrumentation" /> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.operationExecutionObjectInterface.FullInstrumentationNoGetterAndSetter" />  -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.operationExecutionObjectInterface.Annotation" /> -->
+
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.operationCall.FullInstrumentation" /> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.operationCall.FullInstrumentationNoGetterAndSetter" /> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.operationCall.Annotation" /> -->
+		
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.operationCallObject.FullInstrumentation" /> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.operationCallObject.FullInstrumentationNoGetterAndSetter" /> -->
+		<!-- <aspect name="kieker.monitoring.probe.aspectj.flow.operationCallObject.Annotation" /> -->
+		
+		<!--
+			Definition of additional targeted aspects (example for a single additional getter). 
+			Use these directives to create additional aspects without the need to actually implement them. -->
+		<concrete-aspect name="kieker.monitoring.probe.aspectj.flow.operationExecution.TargetedAspect" extends="kieker.monitoring.probe.aspectj.flow.operationExecution.AbstractAspect">
+<!-- 			<pointcut name="monitoredOperation" expression="execution(* teetime.framework.Stage+.execute())" /> -->
+<!-- 			<pointcut name="monitoredOperation" expression="call(* teetime.framework.OutputPort.send(..))" /> -->
+			<pointcut name="a" expression="execution(* teetime.stage.string.Tokenizer.execute(..))" />
+			<pointcut name="b" expression="execution(* teetime.stage.string.ToLowerCase.execute(..))" />
+			<pointcut name="c" expression="execution(* teetime.stage.MappingCounter.execute(..))" />
+			<pointcut name="monitoredOperation" expression="a() || b() || c()" />
+		</concrete-aspect>
+		
+	</aspects>
+</aspectj>
diff --git a/META-INF/kieker.monitoring.properties b/META-INF/kieker.monitoring.properties
new file mode 100644
index 0000000000000000000000000000000000000000..aef66a5f1e53aeac605bdb0e1224cb27d226714c
--- /dev/null
+++ b/META-INF/kieker.monitoring.properties
@@ -0,0 +1,680 @@
+## In order to use a custom Kieker.Monitoring configuration, create a copy of 
+## this file and modify it according to your needs. 
+##
+## The location of the file is passed to Kieker.Monitoring via the JVM parameter
+## kieker.monitoring.configuration. For example, with a configuration file named 
+## my.kieker.monitoring.properties in the folder META-INF you would pass this location 
+## to the JVM when starting your application:
+##
+##  java -Dkieker.monitoring.configuration=META-INF/my.kieker.monitoring.properties [...]
+##
+## If no configuration file is passed, Kieker tries to use a configuration file in
+## META-INF/kieker.monitoring.properties
+## If this also fails, a default configuration is being used according to the values in 
+## this default file.
+
+## The name of the Kieker instance.
+kieker.monitoring.name=KIEKER
+
+## Whether a debug mode is activated.
+## This changes a few internal id generation mechanisms to enable 
+## easier debugging. Additionally, it is possible to enable debug 
+## logging in the settings of the used logger. 
+## This setting should usually not be set to true. 
+kieker.monitoring.debug=false
+
+## Enable/disable monitoring after startup (true|false; default: true)
+## If monitoring is disabled, the MonitoringController simply pauses.
+## Furthermore, probes should stop collecting new data and monitoring 
+## writers stop should stop writing existing data.
+kieker.monitoring.enabled=true
+
+## The name of the VM running Kieker. If empty the name will be determined 
+## automatically, else it will be set to the given value.
+kieker.monitoring.hostname=
+
+## The initial ID associated with all experiments. (currently not used)
+kieker.monitoring.initialExperimentId=1
+
+## Automatically add a metadata record to the monitoring log when writing
+## the first monitoring record. The metadata record contains infromation 
+## on the configuration of the monitoring controller.
+kieker.monitoring.metadata=true
+
+## Enables/disable the automatic assignment of each record's logging timestamp.
+## (true|false; default: true) 
+kieker.monitoring.setLoggingTimestamp=true
+
+## Whether a shutdown hook should be registered.
+## This ensures that necessary cleanup steps are finished and no 
+## information is lost due to asynchronous writers.
+## This should usually not be set to false.
+kieker.monitoring.useShutdownHook=true
+
+## Whether any JMX functionality is available
+kieker.monitoring.jmx=false
+kieker.monitoring.jmx.domain=kieker.monitoring
+
+## Enable/Disable the MonitoringController MBean
+kieker.monitoring.jmx.MonitoringController=true
+kieker.monitoring.jmx.MonitoringController.name=MonitoringController
+
+## Controls JMX remote access
+kieker.monitoring.jmx.remote=false
+kieker.monitoring.jmx.remote.port=59999
+kieker.monitoring.jmx.remote.name=JMXServer
+## If the SUN-JMX Bootstrap class is not available, a fallback to the 
+## default implementation can be used. The fallback solution prevents 
+## the VM from terminating.
+## A graceful shutdown is done by connecting to the JMXServer, there to
+## kieker.monitoring.JMXServer and using the operation stop()
+kieker.monitoring.jmx.remote.fallback=true
+## These properties will be forwarded to configure the JMX server
+com.sun.management.jmxremote.local.only=false
+com.sun.management.jmxremote.authenticate=false
+com.sun.management.jmxremote.ssl=false
+
+## The size of the thread pool used to execute registered periodic sensor jobs.
+## The thread pool is also used to periodically read the config file for adaptive
+## monitoring.
+## Set to 0 to deactivate scheduling.
+kieker.monitoring.periodicSensorsExecutorPoolSize=1
+
+## Enable or disable adaptive monitoring.
+kieker.monitoring.adaptiveMonitoring.enabled=false
+#
+## Default location of the adaptive monitoring configuration File
+kieker.monitoring.adaptiveMonitoring.configFile=META-INF/kieker.monitoring.adaptiveMonitoring.conf
+#
+## Enable/disable the updating of the pattern file by activating or deactivating
+## probes through the api.
+kieker.monitoring.adaptiveMonitoring.updateConfigFile=false
+#
+## The delay in seconds in which the pattern file is checked for changes.
+## Requires kieker.monitoring.periodicSensorsExecutorPoolSize > 0.
+## Set to 0 to disable the observation.
+kieker.monitoring.adaptiveMonitoring.readInterval=30
+#
+## The maximal size of the signature cache. This is a weak limit, as the cache can exceed this size
+## slightly in practical application.
+## Set to -1 for an unbounded cache.
+kieker.monitoring.adaptiveMonitoring.maxCacheSize=-1
+#
+## The behaviour of the signature cache, if the maximal size is bounded.
+## 0: The cache ignores entries once the maximal size is reached.
+## 1: The cache removes a (semi)random entry from the cache once the maximal size is exceeded.
+## 2: The cache is completely cleared once the maximal size is reached. 
+kieker.monitoring.adaptiveMonitoring.boundedCacheBehaviour=0
+
+###########################
+#######    TIMER    #######
+###########################
+## Selection of the timer used by Kieker (classname)
+## The value must be a fully-qualified classname of a class implementing 
+## kieker.monitoring.timer.ITimeSource and providing a constructor that 
+## accepts a single Configuration. 
+kieker.monitoring.timer=kieker.monitoring.timer.SystemNanoTimer
+
+####
+#kieker.monitoring.timer=kieker.monitoring.timer.SystemMilliTimer
+#
+## A timer with millisecond precision.
+#
+## The offset of the timer. The time returned is since 1970-1-1 
+## minus this offset. If the offset is empty it is set to the current 
+## time.
+## The offset must be specified in milliseconds.
+kieker.monitoring.timer.SystemMilliTimer.offset=0
+## The timeunit used to report the timestamp. 
+## Accepted values:
+##  0 - nanoseconds
+##  1 - microseconds
+##  2 - milliseconds
+##  3 - seconds 
+kieker.monitoring.timer.SystemMilliTimer.unit=0
+
+####
+#kieker.monitoring.timer=kieker.monitoring.timer.SystemNanoTimer
+#
+## A timer with nanosecond precision.
+#
+## The offset of the timer. The time returned is since 1970-1-1 
+## minus this offset. If the offset is empty it is set to the current 
+## time.
+## The offset must be specified in milliseconds.
+kieker.monitoring.timer.SystemNanoTimer.offset=0
+## The timeunit used to report the timestamp. 
+## Accepted values:
+##  0 - nanoseconds
+##  1 - microseconds
+##  2 - milliseconds
+##  3 - seconds 
+kieker.monitoring.timer.SystemNanoTimer.unit=0
+
+
+###########################
+#######    WRITER   #######
+###########################
+## Selection of monitoring data writer (classname)
+## The value must be a fully-qualified classname of a class implementing 
+## kieker.monitoring.writer.IMonitoringWriter and providing a constructor that 
+## accepts a single Configuration. 
+kieker.monitoring.writer=kieker.monitoring.writer.filesystem.AsyncFsWriter
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.DummyWriter
+#
+## Configuration Properties of the DummyWriter
+kieker.monitoring.writer.DummyWriter.key=value
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.AsyncDummyWriter
+#
+## Configuration Properties of the AsyncDummyWriter
+kieker.monitoring.writer.AsyncDummyWriter.key=value
+#
+## Asynchronous writers need to store monitoring records in an internal buffer.
+## This parameter defines its capacity in terms of the number of records. 
+kieker.monitoring.writer.AsyncDummyWriter.QueueSize=10000
+#
+## Asynchronous writers need to store specific monitoring records in a prioritized internal buffer.
+## This parameter defines its capacity in terms of the number of records. 
+kieker.monitoring.writer.AsyncDummyWriter.PrioritizedQueueSize=100
+#
+## Behavior of the asynchronous writer when the internal queue is full:
+## 0: terminate Monitoring with an error (default)
+## 1: writer blocks until queue capacity is available
+## 2: writer discards new records until space is available
+##  Be careful when using the value '1' since then, the asynchronous writer
+##  is no longer decoupled from the monitored application.
+kieker.monitoring.writer.AsyncDummyWriter.QueueFullBehavior=0
+#
+## Maximum time to wait for the writer threads to finish (in milliseconds).
+## A MaxShutdownDelay of -1 means infinite waiting.
+kieker.monitoring.writer.AsyncDummyWriter.MaxShutdownDelay=-1
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.PrintStreamWriter
+#
+## The PrintStream used to print the monitoring records.
+## Either STDOUT or STDERR.
+## Other values are used as a filenames for a target log file.
+## You should use another writer instead of this writer for logging to files!
+kieker.monitoring.writer.PrintStreamWriter.Stream=STDOUT
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.filesystem.SyncFsWriter
+#
+## In order to use a custom directory, set customStoragePath as desired. Examples:
+## /var/kieker or C:\\KiekerData (ensure the folder exists).
+## Otherwise the default temporary directory will be used
+kieker.monitoring.writer.filesystem.SyncFsWriter.customStoragePath=
+#
+## The maximal number of entries (records) per created file.
+## Must be greater than zero.
+kieker.monitoring.writer.filesystem.SyncFsWriter.maxEntriesInFile=25000
+#
+## The maximal file size of the generated monitoring log. Older files will be 
+## deleted if this file size is exceeded. Given in MiB.
+## At least one file will always remain, regardless of size!
+## Use -1 to ignore this functionality. 
+kieker.monitoring.writer.filesystem.SyncFsWriter.maxLogSize=-1
+#
+## The maximal number of log files generated. Older files will be 
+## deleted if this number is exceeded.
+## At least one file will always remain, regardless of size!
+## Use -1 to ignore this functionality. 
+kieker.monitoring.writer.filesystem.SyncFsWriter.maxLogFiles=-1
+#
+## When flushing is disabled, it could require a lot of records before
+## finally any writing is done.
+kieker.monitoring.writer.filesystem.SyncFsWriter.flush=true
+#
+## When flushing is disabled, records are buffered in memory before written.
+## This setting configures the size of the used buffer in bytes.
+kieker.monitoring.writer.filesystem.SyncFsWriter.bufferSize=8192
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.filesystem.AsyncFsWriter
+#
+## In order to use a custom directory, set customStoragePath as desired. Examples:
+## /var/kieker or C:\\KiekerData (ensure the folder exists).
+## Otherwise the default temporary directory will be used
+kieker.monitoring.writer.filesystem.AsyncFsWriter.customStoragePath=I:\\Repositories\\teetime\\target
+#
+## The maximal number of entries (records) per created file.
+## Must be greater than zero.
+kieker.monitoring.writer.filesystem.AsyncFsWriter.maxEntriesInFile=25000
+#
+## The maximal file size of the generated monitoring log. Older files will be 
+## deleted if this file size is exceeded. Given in MiB.
+## At least one file will always remain, regardless of size!
+## Use -1 to ignore this functionality. 
+kieker.monitoring.writer.filesystem.AsyncFsWriter.maxLogSize=-1
+#
+## The maximal number of log files generated. Older files will be 
+## deleted if this number is exceeded.
+## At least one file will always remain, regardless of size!
+## Use -1 to ignore this functionality. 
+kieker.monitoring.writer.filesystem.AsyncFsWriter.maxLogFiles=-1
+#
+## When flushing is disabled, it could require a lot of records before
+## finally any writing is done.
+kieker.monitoring.writer.filesystem.AsyncFsWriter.flush=true
+#
+## When flushing is disabled, records are buffered in memory before written.
+## This setting configures the size of the used buffer in bytes.
+kieker.monitoring.writer.filesystem.AsyncFsWriter.bufferSize=8192
+#
+## Asynchronous writers need to store monitoring records in an internal buffer.
+## This parameter defines its capacity in terms of the number of records. 
+kieker.monitoring.writer.filesystem.AsyncFsWriter.QueueSize=100000
+#
+## Asynchronous writers need to store specific monitoring records in a prioritized internal buffer.
+## This parameter defines its capacity in terms of the number of records.
+kieker.monitoring.writer.filesystem.AsyncFsWriter.PrioritizedQueueSize=100
+
+## Behavior of the asynchronous writer when the internal queue is full:
+## 0: terminate Monitoring with an error (default)
+## 1: writer blocks until queue capacity is available
+## 2: writer discards new records until space is available
+##  Be careful when using the value '1' since then, the asynchronous writer
+##  is no longer decoupled from the monitored application.
+kieker.monitoring.writer.filesystem.AsyncFsWriter.QueueFullBehavior=2
+#
+## Maximum time to wait for the writer threads to finish (in milliseconds).
+## A MaxShutdownDelay of -1 means infinite waiting.
+kieker.monitoring.writer.filesystem.AsyncFsWriter.MaxShutdownDelay=-1
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter
+#
+## In order to use a custom directory, set customStoragePath as desired. Examples:
+## /var/kieker or C:\\KiekerData (ensure the folder exists).
+## Otherwise the default temporary directory will be used
+kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.customStoragePath=
+#
+## The maximal number of entries (records) per created file.
+## Must be greater than zero.
+kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.maxEntriesInFile=25000
+#
+## The maximal file size of the generated monitoring log. Older files will be 
+## deleted if this file size is exceeded. Given in MiB.
+## At least one file will always remain, regardless of size!
+## Use -1 to ignore this functionality. 
+kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.maxLogSize=-1
+#
+## The maximal number of log files generated. Older files will be 
+## deleted if this number is exceeded.
+## At least one file will always remain, regardless of size!
+## Use -1 to ignore this functionality. 
+kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.maxLogFiles=-1
+#
+## Whether the generated log files are compressed before writing to disk.
+## Supported values are: NONE, DEFLATE, GZIP, ZIP
+kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.compress=NONE
+#
+## Records are buffered in memory before written to disk.
+## This setting configures the size of the used buffer in bytes.
+kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.bufferSize=8192
+#
+## Asynchronous writers need to store monitoring records in an internal buffer.
+## This parameter defines its capacity in terms of the number of records. 
+kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.QueueSize=10000
+#
+## Asynchronous writers need to store specific monitoring records in a prioritized internal buffer.
+## This parameter defines its capacity in terms of the number of records.
+kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.PrioritizedQueueSize=100
+
+## Behavior of the asynchronous writer when the internal queue is full:
+## 0: terminate Monitoring with an error (default)
+## 1: writer blocks until queue capacity is available
+## 2: writer discards new records until space is available
+##  Be careful when using the value '1' since then, the asynchronous writer
+##  is no longer decoupled from the monitored application.
+kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.QueueFullBehavior=0
+#
+## Maximum time to wait for the writer threads to finish (in milliseconds).
+## A MaxShutdownDelay of -1 means infinite waiting.
+kieker.monitoring.writer.filesystem.AsyncBinaryFsWriter.MaxShutdownDelay=-1
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.filesystem.AsyncBinaryNFsWriter
+#
+## In order to use a custom directory, set customStoragePath as desired. Examples:
+## /var/kieker or C:\\KiekerData (ensure the folder exists).
+## Otherwise the default temporary directory will be used
+kieker.monitoring.writer.filesystem.AsyncBinaryNFsWriter.customStoragePath=
+#
+## The maximal number of entries (records) per created file.
+## Must be greater than zero.
+kieker.monitoring.writer.filesystem.AsyncBinaryNFsWriter.maxEntriesInFile=25000
+#
+## The maximal file size of the generated monitoring log. Older files will be 
+## deleted if this file size is exceeded. Given in MiB.
+## At least one file will always remain, regardless of size!
+## Use -1 to ignore this functionality. 
+kieker.monitoring.writer.filesystem.AsyncBinaryNFsWriter.maxLogSize=-1
+#
+## The maximal number of log files generated. Older files will be 
+## deleted if this number is exceeded.
+## At least one file will always remain, regardless of size!
+## Use -1 to ignore this functionality. 
+kieker.monitoring.writer.filesystem.AsyncBinaryNFsWriter.maxLogFiles=-1
+#
+## Records are buffered in memory before written to disk.
+## This setting configures the size of the used buffer in bytes.
+kieker.monitoring.writer.filesystem.AsyncBinaryNFsWriter.bufferSize=65535
+#
+## Asynchronous writers need to store monitoring records in an internal buffer.
+## This parameter defines its capacity in terms of the number of records. 
+kieker.monitoring.writer.filesystem.AsyncBinaryNFsWriter.QueueSize=10000
+#
+## Asynchronous writers need to store specific monitoring records in a prioritized internal buffer.
+## This parameter defines its capacity in terms of the number of records.
+kieker.monitoring.writer.filesystem.AsyncBinaryNFsWriter.PrioritizedQueueSize=100
+
+## Behavior of the asynchronous writer when the internal queue is full:
+## 0: terminate Monitoring with an error (default)
+## 1: writer blocks until queue capacity is available
+## 2: writer discards new records until space is available
+##  Be careful when using the value '1' since then, the asynchronous writer
+##  is no longer decoupled from the monitored application.
+kieker.monitoring.writer.filesystem.AsyncBinaryNFsWriter.QueueFullBehavior=0
+#
+## Maximum time to wait for the writer threads to finish (in milliseconds).
+## A MaxShutdownDelay of -1 means infinite waiting.
+kieker.monitoring.writer.filesystem.AsyncBinaryNFsWriter.MaxShutdownDelay=-1
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.filesystem.AsyncAsciiZipWriter
+#
+## In order to use a custom directory, set customStoragePath as desired. Examples:
+## /var/kieker or C:\\KiekerData (ensure the folder exists).
+## Otherwise the default temporary directory will be used
+kieker.monitoring.writer.filesystem.AsyncAsciiZipWriter.customStoragePath=
+#
+## The maximal number of entries (records) per created file.
+## Must be greater than zero.
+kieker.monitoring.writer.filesystem.AsyncAsciiZipWriter.maxEntriesInFile=25000
+#
+## Records are buffered in memory before written to disk.
+## This setting configures the size of the used buffer in bytes.
+kieker.monitoring.writer.filesystem.AsyncAsciiZipWriter.bufferSize=8192
+#
+## Asynchronous writers need to store monitoring records in an internal buffer.
+## This parameter defines its capacity in terms of the number of records. 
+kieker.monitoring.writer.filesystem.AsyncAsciiZipWriter.QueueSize=10000
+#
+## Asynchronous writers need to store specific monitoring records in a prioritized internal buffer.
+## This parameter defines its capacity in terms of the number of records.
+kieker.monitoring.writer.filesystem.AsyncAsciiZipWriter.PrioritizedQueueSize=100
+
+## Behavior of the asynchronous writer when the internal queue is full:
+## 0: terminate Monitoring with an error (default)
+## 1: writer blocks until queue capacity is available
+## 2: writer discards new records until space is available
+##  Be careful when using the value '1' since then, the asynchronous writer
+##  is no longer decoupled from the monitored application.
+kieker.monitoring.writer.filesystem.AsyncAsciiZipWriter.QueueFullBehavior=0
+#
+## Maximum time to wait for the writer threads to finish (in milliseconds).
+## A MaxShutdownDelay of -1 means infinite waiting.
+kieker.monitoring.writer.filesystem.AsyncAsciiZipWriter.MaxShutdownDelay=-1
+#
+## Sets the compression level. The only valid values are:
+## -1: default compression
+## 0: no compression
+## 1-9: from best speed to best compression 
+kieker.monitoring.writer.filesystem.AsyncAsciiZipWriter.compressionLevel=-1
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.filesystem.AsyncBinaryZipWriter
+#
+## In order to use a custom directory, set customStoragePath as desired. Examples:
+## /var/kieker or C:\\KiekerData (ensure the folder exists).
+## Otherwise the default temporary directory will be used
+kieker.monitoring.writer.filesystem.AsyncBinaryZipWriter.customStoragePath=
+#
+## The maximal number of entries (records) per created file.
+## Must be greater than zero.
+kieker.monitoring.writer.filesystem.AsyncBinaryZipWriter.maxEntriesInFile=25000
+#
+## Records are buffered in memory before written to disk.
+## This setting configures the size of the used buffer in bytes.
+kieker.monitoring.writer.filesystem.AsyncBinaryZipWriter.bufferSize=8192
+#
+## Asynchronous writers need to store monitoring records in an internal buffer.
+## This parameter defines its capacity in terms of the number of records. 
+kieker.monitoring.writer.filesystem.AsyncBinaryZipWriter.QueueSize=10000
+#
+## Asynchronous writers need to store specific monitoring records in a prioritized internal buffer.
+## This parameter defines its capacity in terms of the number of records.
+kieker.monitoring.writer.filesystem.AsyncBinaryZipWriter.PrioritizedQueueSize=100
+
+## Behavior of the asynchronous writer when the internal queue is full:
+## 0: terminate Monitoring with an error (default)
+## 1: writer blocks until queue capacity is available
+## 2: writer discards new records until space is available
+##  Be careful when using the value '1' since then, the asynchronous writer
+##  is no longer decoupled from the monitored application.
+kieker.monitoring.writer.filesystem.AsyncBinaryZipWriter.QueueFullBehavior=0
+#
+## Maximum time to wait for the writer threads to finish (in milliseconds).
+## A MaxShutdownDelay of -1 means infinite waiting.
+kieker.monitoring.writer.filesystem.AsyncBinaryZipWriter.MaxShutdownDelay=-1
+#
+## Sets the compression level. The only valid values are:
+## -1: default compression
+## 0: no compression
+## 1-9: from best speed to best compression 
+kieker.monitoring.writer.filesystem.AsyncBinaryZipWriter.compressionLevel=-1
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.namedRecordPipe.PipeWriter
+#
+## The name of the pipe used (must not be empty).
+kieker.monitoring.writer.namedRecordPipe.PipeWriter.pipeName=kieker-pipe
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.jms.AsyncJMSWriter
+#
+## The url of the jndi provider that knows the jms service
+## - ActiveMQ: tcp://127.0.0.1:61616/
+## - HornetQ:  jnp://localhost:1099/
+## - OpenJMS:  tcp://127.0.0.1:3035/
+kieker.monitoring.writer.jms.AsyncJMSWriter.ProviderUrl=tcp://127.0.0.1:61616/
+#
+## The topic at the jms server which is used in the publisher/subscribe communication.
+kieker.monitoring.writer.jms.AsyncJMSWriter.Topic=queue1
+#
+## The type of the jms factory implementation, e.g.
+## - ActiveMQ: org.apache.activemq.jndi.ActiveMQInitialContextFactory
+## - HornetQ:  org.jnp.interfaces.NamingContextFactory
+## - OpenJMS:  org.exolab.jms.jndi.InitialContextFactory
+kieker.monitoring.writer.jms.AsyncJMSWriter.ContextFactoryType=org.apache.activemq.jndi.ActiveMQInitialContextFactory
+#
+## The service name for the jms connection factory.
+kieker.monitoring.writer.jms.AsyncJMSWriter.FactoryLookupName=ConnectionFactory
+#
+## The time that a jms message will be kept alive at the jms server before 
+## it is automatically deleted.
+kieker.monitoring.writer.jms.AsyncJMSWriter.MessageTimeToLive=10000
+#
+## Asynchronous writers need to store monitoring records in an internal buffer.
+## This parameter defines its capacity in terms of the number of records. 
+kieker.monitoring.writer.jms.AsyncJMSWriter.QueueSize=10000
+#
+## Asynchronous writers need to store specific monitoring records in a prioritized internal buffer.
+## This parameter defines its capacity in terms of the number of records.
+kieker.monitoring.writer.jms.AsyncJMSWriter.PrioritizedQueueSize=100
+
+#
+## Behavior of the asynchronous writer when the internal queue is full:
+## 0: terminate Monitoring with an error (default)
+## 1: writer blocks until queue capacity is available
+## 2: writer discards new records until space is available
+##  Be careful when using the value '1' since then, the asynchronous writer
+##  is no longer decoupled from the monitored application.
+kieker.monitoring.writer.jms.AsyncJMSWriter.QueueFullBehavior=0
+#
+## Maximum time to wait for the writer threads to finish (in milliseconds).
+## A MaxShutdownDelay of -1 means infinite waiting.
+kieker.monitoring.writer.jms.AsyncJMSWriter.MaxShutdownDelay=-1
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.database.SyncDbWriter
+#
+## Database driver classname
+## Examples:
+##   MySQL:   com.mysql.jdbc.Driver
+##   DerbyDB: org.apache.derby.jdbc.EmbeddedDriver
+kieker.monitoring.writer.database.SyncDbWriter.DriverClassname=org.apache.derby.jdbc.EmbeddedDriver
+#
+## Connection string
+## Examples:
+##   MySQL:   jdbc:mysql://HOSTNAME/DBNAME?user=DBUSER&password=DBPASS
+##   DerbyDB: jdbc:derby:DBNAME;user=DBUSER;password=DBPASS
+kieker.monitoring.writer.database.SyncDbWriter.ConnectionString=jdbc:derby:tmp/KIEKER;user=DBUSER;password=DBPASS;create=true
+#
+## Prefix for the names of the database tables
+kieker.monitoring.writer.database.SyncDbWriter.TablePrefix=kieker
+#
+## Drop already existing tables or terminate monitoring with an error. 
+kieker.monitoring.writer.database.SyncDbWriter.DropTables=false
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.database.AsyncDbWriter
+#
+## Database driver classname
+##   MySQL:   com.mysql.jdbc.Driver
+##   DerbyDB: org.apache.derby.jdbc.EmbeddedDriver
+kieker.monitoring.writer.database.AsyncDbWriter.DriverClassname=org.apache.derby.jdbc.EmbeddedDriver
+#
+## Connection string
+## Examples:
+##   MySQL:   jdbc:mysql://HOSTNAME/DBNAME?user=DBUSER&password=DBPASS
+##   DerbyDB: jdbc:derby:DBNAME;user=DBUSER;password=DBPASS
+kieker.monitoring.writer.database.AsyncDbWriter.ConnectionString=jdbc:derby:tmp/KIEKER;user=DBUSER;password=DBPASS;create=true
+#
+## Prefix for the names of the database tables
+kieker.monitoring.writer.database.AsyncDbWriter.TablePrefix=kieker
+#
+## Drop already existing tables or terminate monitoring with an error. 
+kieker.monitoring.writer.database.AsyncDbWriter.DropTables=false
+#
+## The number of concurrent Database connections.
+kieker.monitoring.writer.database.AsyncDbWriter.numberOfConnections=4
+#
+## Asynchronous writers need to store monitoring records in an internal buffer.
+## This parameter defines its capacity in terms of the number of records. 
+kieker.monitoring.writer.database.AsyncDbWriter.QueueSize=10000
+#
+## Asynchronous writers need to store specific monitoring records in a prioritized internal buffer.
+## This parameter defines its capacity in terms of the number of records.
+kieker.monitoring.writer.database.AsyncDbWriter.PrioritizedQueueSize=100
+#
+## Behavior of the asynchronous writer when the internal queue is full:
+## 0: terminate Monitoring with an error (default)
+## 1: writer blocks until queue capacity is available
+## 2: writer discards new records until space is available
+##  Be careful when using the value '1' since then, the asynchronous writer
+##  is no longer decoupled from the monitored application.
+kieker.monitoring.writer.database.AsyncDbWriter.QueueFullBehavior=0
+#
+## Maximum time to wait for the writer threads to finish (in milliseconds).
+## A MaxShutdownDelay of -1 means infinite waiting.
+kieker.monitoring.writer.database.AsyncDbWriter.MaxShutdownDelay=-1
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.jmx.JMXWriter
+#
+## The domain used to register the MonitoringLog. If empty, the value
+## of "kieker.monitoring.jmx.domain" will be used.
+kieker.monitoring.writer.jmx.JMXWriter.domain=
+#
+## The name of the MonitoringLog in the domain.
+kieker.monitoring.writer.jmx.JMXWriter.logname=MonitoringLog
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.tcp.TCPWriter
+#
+## The hostname the TCPWriter connects to.
+kieker.monitoring.writer.tcp.TCPWriter.hostname=localhost
+#
+## The ports the TCPWriter connects to.
+kieker.monitoring.writer.tcp.TCPWriter.port1=10133
+kieker.monitoring.writer.tcp.TCPWriter.port2=10134
+#
+## The size of the buffer used by the TCPWriter in bytes.
+## Should be large enough to fit at least single string records (> 1KiB).
+kieker.monitoring.writer.tcp.TCPWriter.bufferSize=65535
+#
+## Should each record be immediately sent?
+kieker.monitoring.writer.tcp.TCPWriter.flush=false
+#
+## Asynchronous writers need to store monitoring records in an internal buffer.
+## This parameter defines its capacity in terms of the number of records. 
+kieker.monitoring.writer.tcp.TCPWriter.QueueSize=10000
+kieker.monitoring.writer.tcp.TCPWriter.QueueSize=100
+#
+## Behavior of the asynchronous writer when the internal queue is full:
+## 0: terminate Monitoring with an error (default)
+## 1: writer blocks until queue capacity is available
+## 2: writer discards new records until space is available
+##  Be careful when using the value '1' since then, the asynchronous writer
+##  is no longer decoupled from the monitored application.
+kieker.monitoring.writer.tcp.TCPWriter.QueueFullBehavior=0
+#
+## Maximum time to wait for the writer threads to finish (in milliseconds).
+## A MaxShutdownDelay of -1 means infinite waiting.
+kieker.monitoring.writer.tcp.TCPWriter.MaxShutdownDelay=-1
+
+
+#####
+#kieker.monitoring.writer=kieker.monitoring.writer.explorviz.ExplorVizExportWriter
+#
+## The hostname the ExplorVizExportWriter connects to.
+kieker.monitoring.writer.explorviz.ExplorVizExportWriter.hostname=localhost
+#
+## The ports the TCPWriter connects to.
+kieker.monitoring.writer.explorviz.ExplorVizExportWriter.port=10133
+#
+## The size of the buffer used by the TCPWriter in bytes.
+## Should be large enough to fit at least single string records (> 1KiB).
+kieker.monitoring.writer.explorviz.ExplorVizExportWriter.bufferSize=65535
+#
+## Should each record be immediately sent?
+kieker.monitoring.writer.explorviz.ExplorVizExportWriter.flush=false
+#
+## Asynchronous writers need to store monitoring records in an internal buffer.
+## This parameter defines its capacity in terms of the number of records. 
+kieker.monitoring.writer.explorviz.ExplorVizExportWriter.QueueSize=1000000
+kieker.monitoring.writer.explorviz.ExplorVizExportWriter.QueueSize=100
+#
+## Behavior of the asynchronous writer when the internal queue is full:
+## 0: terminate Monitoring with an error
+## 1: writer blocks until queue capacity is available (default)
+## 2: writer discards new records until space is available
+##  Be careful when using the value '1' since then, the asynchronous writer
+##  is no longer decoupled from the monitored application.
+kieker.monitoring.writer.explorviz.ExplorVizExportWriter.QueueFullBehavior=1
+#
+## Maximum time to wait for the writer threads to finish (in milliseconds).
+## A MaxShutdownDelay of -1 means infinite waiting.
+kieker.monitoring.writer.explorviz.ExplorVizExportWriter.MaxShutdownDelay=-1
diff --git a/META-INF/monitor.cmd b/META-INF/monitor.cmd
new file mode 100644
index 0000000000000000000000000000000000000000..9f055ea6048e2cd24b866c3329e59655ba06fbd3
--- /dev/null
+++ b/META-INF/monitor.cmd
@@ -0,0 +1,5 @@
+java ^
+	-javaagent:kieker-1.11-aspectj.jar ^
+	-cp .;target\*;target\dependency\*; ^
+	teetime.examples.wordcounter.WordCounterTest ^
+	4 1 target\classes\hugetext.txt
\ No newline at end of file
diff --git a/src/main/java/teetime/stage/string/Tokenizer.java b/src/main/java/teetime/stage/string/Tokenizer.java
index 9d7641090a12e046a7742e64ab1e3d0210a4bd23..275b60cda406b836c5cb7b72bf3eaf48a7d9f203 100644
--- a/src/main/java/teetime/stage/string/Tokenizer.java
+++ b/src/main/java/teetime/stage/string/Tokenizer.java
@@ -15,6 +15,8 @@
  */
 package teetime.stage.string;
 
+import java.util.regex.Pattern;
+
 import teetime.framework.AbstractConsumerStage;
 import teetime.framework.OutputPort;
 
@@ -22,17 +24,26 @@ public final class Tokenizer extends AbstractConsumerStage<String> {
 
 	private final OutputPort<String> outputPort = this.createOutputPort();
 	private final String regex;
+	private final Pattern pattern;
 
 	public Tokenizer(final String regex) {
 		this.regex = regex;
+		pattern = Pattern.compile(regex);
 	}
 
 	@Override
 	protected void execute(final String element) {
+		// Matcher matcher = pattern.matcher(element);
+		// while (matcher.find()) {
+		// String token = element.substring(matcher.start(), matcher.end());
+		// outputPort.send(token);
+		// }
 		String[] tokens = element.split(regex);
 		for (String token : tokens) {
 			outputPort.send(token);
 		}
+		// Scanner is much slower
+		// Pattern is equally fast
 	}
 
 	public OutputPort<String> getOutputPort() {
diff --git a/src/test/java/teetime/examples/wordcounter/WordCounterConfiguration.java b/src/test/java/teetime/examples/wordcounter/WordCounterConfiguration.java
index 034a2c7d5a54ea657687ed2e1f98d8270f8bfb52..a214fadc050b675770eaa5d6f8d614df44ad7a98 100644
--- a/src/test/java/teetime/examples/wordcounter/WordCounterConfiguration.java
+++ b/src/test/java/teetime/examples/wordcounter/WordCounterConfiguration.java
@@ -1,5 +1,5 @@
 /**
- * Copyright (C) 2015 TeeTime (http://teetime.sourceforge.net)
+ * Copyright (C) 2015 Christian Wulf, Nelson Tavares de Sousa (http://christianwulf.github.io/teetime)
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
diff --git a/src/test/java/teetime/examples/wordcounter/WordCounterTest.java b/src/test/java/teetime/examples/wordcounter/WordCounterTest.java
index ae65d4fdd8fc061719eb93c7207cc5a7c56b8d56..cacf432800a9c0ff36d974a501ec663d6967d5c8 100644
--- a/src/test/java/teetime/examples/wordcounter/WordCounterTest.java
+++ b/src/test/java/teetime/examples/wordcounter/WordCounterTest.java
@@ -1,3 +1,18 @@
+/**
+ * Copyright (C) 2015 Christian Wulf, Nelson Tavares de Sousa (http://christianwulf.github.io/teetime)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package teetime.examples.wordcounter;
 
 import java.io.BufferedOutputStream;
diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml
index d713e3777ffefba16ac7f1d9f320c5d3dcbfd31f..01ee6b07199316f28c2b7b0c9b9a904cc24f8a38 100644
--- a/src/test/resources/logback-test.xml
+++ b/src/test/resources/logback-test.xml
@@ -29,6 +29,8 @@
 <!-- 	<logger name="teetime.framework.signal" level="TRACE" /> -->
 <!-- 	<logger name="teetime.stage" level="TRACE" /> -->
 	<logger name="util" level="INFO" />
+	
+	<logger name="kieker" level="ERROR" />
 
 	<root level="WARN">
 		<appender-ref ref="CONSOLE" />