From e732f4a42dba36cc9e3e35b547df454ef71cc42f Mon Sep 17 00:00:00 2001
From: Christian Wulf <chw@informatik.uni-kiel.de>
Date: Fri, 6 Jun 2014 12:58:23 +0200
Subject: [PATCH] added checkstyle config file; refactored package structure;
 added correct and improved stage state management

---
 .checkstyle                                   |    7 +-
 .classpath                                    |    1 +
 .settings/org.eclipse.jdt.core.prefs          |  284 ++++
 .settings/org.eclipse.jdt.ui.prefs            |   60 +
 conf/cs-conf.xml                              | 1236 +++++++++++++++++
 results/evaluation.xlsx                       |  Bin 10467 -> 10656 bytes
 .../ConcurrentCountWordsAnalysis.java         |  126 +-
 .../countWords/CountWordsAnalysis.java        |   37 +-
 .../countWords/QueuedCountWordsAnalysis.java  |   37 +-
 .../concurrent/StageWorkArrayList.java        |   77 +-
 .../framework/concurrent/WorkerThread.java    |  121 +-
 .../steal/StealIfMayBeDisabledStrategy.java   |   44 -
 .../framework/core/AbstractFilter.java        |   59 +-
 .../teetime/framework/core/AbstractPipe.java  |   19 +-
 .../teetime/framework/core/IInputPort.java    |   14 +-
 .../teetime/framework/core/IPortListener.java |    6 +-
 .../java/teetime/framework/core/IStage.java   |   13 -
 .../teetime/framework/core/InputPortImpl.java |   21 +-
 .../NextStageScheduler.java                   |   35 +-
 .../scheduling/StageStateContainer.java       |   25 +
 .../scheduling/StageStateManager.java         |   84 ++
 .../SynchronizedStageStateContainer.java      |   21 +
 .../UnsynchronizedStageStateContainer.java    |   19 +
 .../ThroughputTimestampAnalysisTest.java      |    4 +-
 24 files changed, 1950 insertions(+), 400 deletions(-)
 create mode 100644 .settings/org.eclipse.jdt.ui.prefs
 create mode 100644 conf/cs-conf.xml
 delete mode 100644 src/main/java/teetime/framework/concurrent/steal/StealIfMayBeDisabledStrategy.java
 rename src/main/java/teetime/framework/{concurrent => scheduling}/NextStageScheduler.java (76%)
 create mode 100644 src/main/java/teetime/framework/scheduling/StageStateContainer.java
 create mode 100644 src/main/java/teetime/framework/scheduling/StageStateManager.java
 create mode 100644 src/main/java/teetime/framework/scheduling/SynchronizedStageStateContainer.java
 create mode 100644 src/main/java/teetime/framework/scheduling/UnsynchronizedStageStateContainer.java

diff --git a/.checkstyle b/.checkstyle
index 5c196046..fd0e0101 100644
--- a/.checkstyle
+++ b/.checkstyle
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <fileset-config file-format-version="1.2.0" simple-config="true" sync-formatter="false">
-  <local-check-config name="Kieker Checkstyle" location="lib/static-analysis/checkstyle-5.6/cs-conf.xml" type="project" description="">
-    <additional-data name="protect-config-file" value="true"/>
+  <local-check-config name="Kieker Checkstyle" location="conf/cs-conf.xml" type="project" description="">
+    <additional-data name="protect-config-file" value="false"/>
   </local-check-config>
-  <fileset name="all" enabled="true" check-config-name="Kieker Checkstyle" local="true">
+  <fileset name="all" enabled="true" check-config-name="Sun Checks" local="false">
     <file-match-pattern match-pattern="." include-pattern="true"/>
   </fileset>
   <filter name="FilesFromPackage" enabled="true">
@@ -16,5 +16,4 @@
     <filter-data value="examples/userguide/appendix-Sigar/src"/>
     <filter-data value="src-gen/analysis"/>
   </filter>
-  <filter name="NonSrcDirs" enabled="true"/>
 </fileset-config>
diff --git a/.classpath b/.classpath
index fd7ad7fb..c9522874 100644
--- a/.classpath
+++ b/.classpath
@@ -12,6 +12,7 @@
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
+	<classpathentry kind="src" path="conf"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6">
 		<attributes>
 			<attribute name="maven.pomderived" value="true"/>
diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 69c31cd4..dd0d799c 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -1,8 +1,292 @@
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
 org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
 org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=165
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=1
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=false
+org.eclipse.jdt.core.formatter.join_wrapped_lines=false
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=165
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/.settings/org.eclipse.jdt.ui.prefs b/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 00000000..c19d56f7
--- /dev/null
+++ b/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,60 @@
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_Kieker - Profile
+formatter_settings_version=12
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;junit;org;com;kieker;kieker.test;
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.staticondemandthreshold=99
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=true
+sp_cleanup.always_use_this_for_non_static_method_access=true
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=false
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=true
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=true
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=true
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=true
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=false
+sp_cleanup.use_this_for_non_static_method_access=true
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=false
diff --git a/conf/cs-conf.xml b/conf/cs-conf.xml
new file mode 100644
index 00000000..4d22e9d8
--- /dev/null
+++ b/conf/cs-conf.xml
@@ -0,0 +1,1236 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE module PUBLIC
+    "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
+    "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
+    
+<module name="Checker">
+
+    <!-- KIEKER default is warning instead of error -->
+    <property name="severity" value="error"/>
+    
+    <!-- KIEKER Filter -->
+    <module name="SuppressWithNearbyCommentFilter">
+        <property name="commentFormat" value="NOCS"/>
+        <property name="checkFormat" value=".*"/>
+        <property name="influenceFormat" value="0"/>
+    </module>
+
+    <!--
+      If you set the basedir property below, then all reported file
+      names will be relative to the specified directory. See
+      http://checkstyle.sourceforge.net/5.x/config.html#Checker
+
+    <property name="basedir"        value="${basedir}"/>
+    <property name="localeCountry"  value=""/> JVM locale country
+    <property name="localeLanguage" value=""/> JVM locale language
+    <property name="charset"        value=""/> JVM file.encoding property
+    !-->
+
+
+    <!--
+     !________________________________________________________________________________________
+     !
+     !     D U P L I C A T E S
+     !________________________________________________________________________________________
+     !-->
+    <!-- Performs a line-by-line comparison of all code lines and reports duplicate code. !-->
+    <!-- See http://checkstyle.sf.net/config_duplicates.html !-->
+    <!-- KIEKER Does not work with headers!! 
+    <module name="StrictDuplicateCode">
+        <property name="min"            value="12"/>
+        <property name="fileExtensions" value=""/>
+    </module>
+    -->
+
+    <!--
+     !________________________________________________________________________________________
+     !
+     !     H E A D E R S
+     !________________________________________________________________________________________
+     !-->
+    <!-- NOTE:  You may enable zero or one of these header checks, but not both. !-->
+
+    <!-- Checks that a source file begins with a specified header. !-->
+    <!-- See http://checkstyle.sf.net/config_header.html   !-->
+    <!-- KIEKER !-->
+    <module name="Header">
+        <!--<property name="headerFile"     value=""/>-->
+        <!--<property name="charset"        value=""/>-->
+        <property name="header"         value="/***************************************************************************\n * Copyright 2013 Kieker Project (http://kieker-monitoring.net)\n *\n * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an &quot;AS IS&quot; BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n ***************************************************************************/\n"/>
+        <property name="ignoreLines"    value="2"/>
+        <property name="fileExtensions" value="java"/>
+    </module>
+
+    <!-- Checks the header of a source file against a header file that contains a regular expression !-->
+    <!-- for each line of the source header. !-->
+    <!-- See http://checkstyle.sf.net/config_header.html   !-->
+    <!-- Default: OFF
+    <module name="RegexpHeader">
+        <property name="headerFile"     value=""/>
+        <property name="charset"        value=""/>
+        <property name="header"         value=""/>
+        <property name="multiLines"     value=""/>
+        <property name="fileExtensions" value=""/>
+    </module>
+    !-->
+
+    <!--
+     !________________________________________________________________________________________
+     !
+     !     J A V A D O C S
+     !________________________________________________________________________________________
+     !-->
+    <!-- Checks that each Java package has a Javadoc file used for commenting. !-->
+    <!-- See http://checkstyle.sourceforge.net/config_javadoc.html#JavadocPackage !-->
+    <!-- KIEKER: OFF
+    <module name="JavadocPackage">
+        <property name="severity" value="info"/>
+        <property name="allowLegacy" value="false"/>
+    </module>
+    !-->
+
+    <!--
+     !________________________________________________________________________________________
+     !
+     !     R E G E X P
+     !________________________________________________________________________________________
+     !-->
+    <!-- A check for detecting that matches across multiple lines. Works with any file type. !-->
+    <!-- See http://checkstyle.sourceforge.net/config_regexp.html#RegexpMultiline !-->
+    <!-- Default: OFF
+    <module name="RegexpMultiline">
+        <property name="format"         value=""/>
+        <property name="message"        value=""/>
+        <property name="ignoreCase"     value="false"/>
+        <property name="minimum"        value="0"/>
+        <property name="maximum"        value="0"/>
+        <property name="fileExtensions" value=""/>
+    </module>
+    !-->
+
+    <!-- A check for detecting single lines that match a supplied regular expression. Works with any file type. !-->
+    <!-- See http://checkstyle.sourceforge.net/config_regexp.html#RegexpSingleline !-->
+    <!-- Default: OFF
+    <module name="RegexpSingleline">
+        <property name="format"         value="\s+$"/>
+        <property name="message"        value=""/>
+        <property name="ignoreCase"     value="false"/>
+        <property name="minimum"        value="0"/>
+        <property name="maximum"        value="0"/>
+        <property name="fileExtensions" value=""/>
+    </module>
+    !-->
+
+    <!--
+     !________________________________________________________________________________________
+     !
+     !     M I S C E L L A N E O U S
+     !________________________________________________________________________________________
+     !-->
+    <!-- Checks whether files end with a new line.                        !-->
+    <!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile !-->
+    <module name="NewlineAtEndOfFile">
+        <property name="lineSeparator"  value="system"/>
+        <property name="fileExtensions" value="*.*"/>
+    </module>
+
+    <!-- Checks that property files contain the same keys.         !-->
+    <!-- See http://checkstyle.sf.net/config_misc.html#Translation !-->
+    <module name="Translation">
+        <property name="fileExtensions" value="properties"/>
+    </module>
+
+
+    <!--
+     !________________________________________________________________________________________
+     !
+     !     S I Z E   V I O L A T I O N S
+     !________________________________________________________________________________________
+     !-->
+    <!-- Checks for long source files. !-->
+    <!-- See http://checkstyle.sf.net/config_sizes.html !-->
+    <module name="FileLength">
+        <property name="max"            value="2000"/>
+        <property name="fileExtensions" value="java"/>
+    </module>
+
+
+    <!--
+     !________________________________________________________________________________________
+     !
+     !     W H I T E S P A C E
+     !________________________________________________________________________________________
+     !-->
+    <!-- Checks that there are no tab characters ('\t') in the source code. !-->
+    <!-- See http://checkstyle.sourceforge.net/config_whitespace.html#FileTabCharacter !-->
+    <!-- KIEKER we use TABs
+    <module name="FileTabCharacter">
+        <property name="eachLine"       value="false"/>
+        <property name="fileExtensions" value=""/>
+    </module>
+    -->
+
+    <module name="TreeWalker">
+        <!-- KIEKER -->
+        <property name="tabWidth" value="4"/>
+        <!-- KIEKER -->
+        <module name="kieker.test.tools.cs.AnalysisComponentConstructorCheck">
+            <property name="ignoreAbstractClasses" value="true"/>
+            <property name="severity" value="${checkstyle.ignoreCustomKieker}" default="ignore"/>
+        </module>
+        <module name="kieker.test.tools.cs.MonitoringRecordFactoryConventionCheck">
+            <property name="ignoreAbstractClasses" value="true"/>
+            <property name="severity" value="${checkstyle.ignoreCustomKieker}" default="ignore"/>
+        </module>
+        <module name="kieker.test.tools.cs.MissingSinceTagCheck">
+            <property name="severity" value="${checkstyle.ignoreCustomKieker}" default="ignore"/>
+        </module>
+        <module name="kieker.test.tools.cs.NotAllowedSinceTagCheck">
+            <property name="severity" value="${checkstyle.ignoreCustomKieker}" default="ignore"/>
+        </module>
+        <module name="kieker.test.tools.cs.NoBlockCommentsCheck">
+            <property name="severity" value="${checkstyle.ignoreCustomKieker}" default="ignore"/>
+        </module>
+        <module name="FileContentsHolder"/>
+
+        <!--
+         !________________________________________________________________________________________
+         !
+         !     A N N O T A T I O N S
+         !________________________________________________________________________________________
+         !-->
+        <!-- This check controls the usage style of annotations. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_annotation.html#AnnotationUseStyle !-->
+        <module name ="AnnotationUseStyle">
+            <property name="elementStyle"       value="compact_no_array"/>
+            <property name="closingParens"      value="never"/>
+            <property name="trailingArrayComma" value="never"/>
+        </module>
+
+        <!-- Verifies that both the java.lang.Deprecated import is present and the @deprecated Javadoc tag is present when either is present. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_annotation.html#MissingDeprecated !-->
+        <!-- KIEKER -->
+        <module name="MissingDeprecated">
+            <property name="severity" value="info"/>        
+        </module>
+
+        <!-- Verifies that the java.lang.Override annotation is present when the {@inheritDoc} javadoc tag is present. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_annotation.html#MissingOverride !-->
+        <!-- problems with Java 1.5
+        <module name="MissingOverride">
+            <property name="javaFiveCompatibility" value="false"/>
+        </module>
+        -->
+
+        <!-- This check makes sure that all package annotations are in the package-info.java file. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_annotation.html#PackageAnnotation !-->
+        <module name="PackageAnnotation"/>
+
+        <!-- This check allows you to specify what warnings that SuppressWarnings is not allowed to suppress. !-->
+        <!-- You can also specify a list of TokenTypes that the configured warning(s) cannot be suppressed on. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_annotation.html#SuppressWarnings !-->
+        <module name="SuppressWarnings">
+            <property name="format" value="^$|^\s+$"/>
+            <property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, ANNOTATION_DEF,
+                                           ANNOTATION_FIELD_DEF, ENUM_CONSTANT_DEF, PARAMETER_DEF,
+                                           VARIABLE_DEF, METHOD_DEF, CTOR_DEF"/>
+        </module>
+
+
+        <!--
+         !________________________________________________________________________________________
+         !
+         !     B L O C K S
+         !________________________________________________________________________________________
+         !-->
+        <!-- Finds nested blocks, i.e. blocks that are used freely in the code. !-->
+        <!-- See http://checkstyle.sf.net/config_blocks.html !-->
+        <!-- KIEKER allowInSwitchCase !-->
+        <module name="AvoidNestedBlocks">
+            <property name="allowInSwitchCase" value="true"/>
+        </module>
+
+        <!-- Checks for empty blocks. !-->
+        <!-- See http://checkstyle.sf.net/config_blocks.html !-->
+        <!-- KIEKER removed LITERAL_CATCH !-->
+        <module name="EmptyBlock">
+            <property name="option" value="stmt"/>
+            <property name="tokens" value="LITERAL_DO,
+                                           LITERAL_ELSE, LITERAL_FINALLY, LITERAL_IF, LITERAL_FOR,
+                                           LITERAL_TRY, LITERAL_WHILE, INSTANCE_INIT, STATIC_INIT"/>
+        </module>
+
+        <!-- Checks for the placement of left curly braces ('{') for code blocks. !-->
+        <!-- See http://checkstyle.sf.net/config_blocks.html !-->
+        <module name="LeftCurly">
+            <property name="option"        value="eol"/>
+            <property name="maxLineLength" value="165"/>
+            <property name="tokens"        value="CLASS_DEF, CTOR_DEF,
+                                                  INTERFACE_DEF, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE,
+                                                  LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_SWITCH,
+                                                  LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE,
+                                                  METHOD_DEF"/>
+        </module>
+
+        <!-- Checks for braces around code blocks. !-->
+        <!-- See http://checkstyle.sf.net/config_blocks.html !-->
+        <module name="NeedBraces">
+            <property name="tokens" value="LITERAL_DO, LITERAL_ELSE, LITERAL_IF, LITERAL_FOR, LITERAL_WHILE"/>
+        </module>
+
+        <!-- Checks the placement of right curly braces ('}') for else, try, and catch tokens. !-->
+        <!-- See http://checkstyle.sf.net/config_blocks.html !-->
+        <module name="RightCurly">
+            <property name="option"          value="same"/>
+            <property name="tokens"          value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE"/>
+            <property name="shouldStartLine" value="true"/>
+        </module>
+
+
+        <!--
+         !________________________________________________________________________________________
+         !
+         !     C L A S S   D E S I G N
+         !________________________________________________________________________________________
+         !-->
+        <!-- Checks that classes are designed for extension. !-->
+        <!-- See http://checkstyle.sf.net/config_design.html !-->
+        <!-- Default: OFF
+        <module name="DesignForExtension"/>
+        !-->
+
+        <!-- Checks that a class which has only private constructors is declared as final. !-->
+        <!-- See http://checkstyle.sf.net/config_design.html !-->
+        <module name="FinalClass"/>
+
+        <!-- Make sure that utility classes (classes that contain only static methods) do not have a public constructor. !-->
+        <!-- See http://checkstyle.sf.net/config_design.html !-->
+        <module name="HideUtilityClassConstructor"/>
+
+        <!-- Check nested (internal) classes/interfaces are declared at the bottom of the class after all method and field declarations. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_design.html#InnerTypeLast !-->
+        <module name="InnerTypeLast"/>
+
+        <!-- Implements Bloch, Effective Java, Item 17 - Use Interfaces only to define types. !-->
+        <!-- See http://checkstyle.sf.net/config_design.html !-->
+        <module name="InterfaceIsType">
+            <property name="allowMarkerInterfaces" value="true"/>
+        </module>
+
+        <!-- Ensures that exceptions (defined as any class name conforming to some regular expression) are immutable. !-->
+        <!-- That is, have only final fields. !-->
+        <!-- See http://checkstyle.sf.net/config_design.html !-->
+        <module name="MutableException">
+            <property name="format" value="^.*Exception$|^.*Error$"/>
+        </module>
+
+        <!-- Restricts throws statements to a specified count. !-->
+        <!-- See http://checkstyle.sf.net/config_design.html !-->
+        <!-- KIEKER off
+        <module name="ThrowsCount">
+            <property name="max" value="1"/>
+        </module>
+        !-->
+
+        <!-- Checks visibility of class members. !-->
+        <!-- See http://checkstyle.sf.net/config_design.html !-->
+        <module name="VisibilityModifier">
+            <property name="packageAllowed"      value="false"/>
+            <property name="protectedAllowed"    value="true"/>
+            <property name="publicMemberPattern" value="^serialVersionUID$"/>
+        </module>
+
+
+        <!--
+         !________________________________________________________________________________________
+         !
+         !     C O D I N G
+         !________________________________________________________________________________________
+         !-->
+        <!-- Checks that array initialization contains a trailing comma. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="ArrayTrailingComma"/>
+
+        <!-- Detects inline conditionals. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="AvoidInlineConditionals"/>
+
+        <!-- Checks that classes that define a covariant equals() method also override method equals(java.lang.Object). !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="CovariantEquals"/>
+
+        <!-- Checks declaration order according to Code Conventions for the Java Programming Language. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="DeclarationOrder">
+            <property name="ignoreConstructors" value="false"/>
+            <property name="ignoreMethods"      value="false"/>
+            <property name="ignoreModifiers"    value="false"/>
+        </module>
+
+        <!-- Check that the default is after all the cases in a switch statement. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="DefaultComesLast"/>
+
+        <!-- The "double-checked locking" idiom (DCL) tries to avoid the runtime cost of synchronization. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <!--<module name="DoubleCheckedLocking"/>-->
+
+        <!-- Detects empty statements (standalone ;). !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="EmptyStatement"/>
+
+        <!-- Checks that any combination of String literals with optional assignment is on the left side of an equals() comparison. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_coding.html#EqualsAvoidNull !-->
+        <module name="EqualsAvoidNull"/>
+
+        <!-- Checks that classes that override equals() also override hashCode(). !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="EqualsHashCode"/>
+
+        <!-- Checks if any class or object member explicitly initialized to default for its type value. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <!-- KIEKER off
+        <module name="ExplicitInitialization"/>
+        !-->
+        
+        <!-- Checks for fall through in switch statements Finds locations where a case contains Java code ... !-->
+        <!-- but lacks a break, return, throw or continue statement. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="FallThrough">
+            <property name="checkLastCaseGroup" value="false"/>
+            <property name="reliefPattern"      value="fallthru|falls??through"/>
+        </module>
+
+        <!-- Checks that local variables that never have their values changed are declared final. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="FinalLocalVariable">
+            <property name="tokens" value="VARIABLE_DEF"/>
+        </module>
+
+        <!-- Checks that a local variable or a parameter does not shadow a field that is defined in the same class. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <!-- KIEKER ignoreConstructorParameter, ignoreSetter -->
+        <module name="HiddenField">
+            <property name="tokens"                     value="PARAMETER_DEF, VARIABLE_DEF"/>
+            <!--
+            <property name="ignoreFormat"               value=""/>
+            !-->
+            <property name="ignoreConstructorParameter" value="true"/>
+            <property name="ignoreSetter"               value="true"/>
+            <property name="ignoreAbstractMethods"      value="false"/>
+        </module>
+
+        <!-- Catching java.lang.Exception, java.lang.Error or java.lang.RuntimeException is almost never acceptable. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="IllegalCatch">
+            <property name="illegalClassNames" value="java.lang.Exception, java.lang.Throwable, java.lang.RuntimeException"/>
+        </module>
+
+        <!-- Checks for illegal instantiations where a factory method is preferred. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <!-- KIEKER on for ??? !-->
+        <module name="IllegalInstantiation">
+            <property name="classes" value="java.lang.Boolean"/>
+        </module>
+
+        <!-- This check can be used to ensure that types are not declared to be thrown. !-->
+        <!-- Declaring to throw java.lang.Error or java.lang.RuntimeException is almost never acceptable. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_coding.html#IllegalThrows !-->
+        <module name="IllegalThrows">
+            <property name="illegalClassNames" value="java.lang.Throwable, java.lang.Error, java.lang.RuntimeException"/>
+        </module>
+
+        <!-- Checks for illegal tokens. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <!-- KIEKER off
+        <module name="IllegalToken">
+            <property name="tokens" value="LITERAL_SWITCH, POST_INC, POST_DEC"/>
+        </module>
+        !-->
+
+        <!-- Checks for illegal token text. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <!-- Default: OFF
+        <module name="IllegalTokenText">
+            <property name="tokens"     value=""/>
+            <property name="format"     value=""/>
+            <property name="ignoreCase" value="false"/>
+            <property name="message"    value=""/>
+        </module>
+        !-->
+
+        <!-- Checks that particular classes are never used as types in variable declarations, return values or parameters. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <!-- KIEKER removed format value="^(.*[\\.])?Abstract.*$" !-->
+        <module name="IllegalType">
+             <property name="tokens"                 value="PARAMETER_DEF, VARIABLE_DEF, METHOD_DEF"/>
+             <property name="illegalClassNames"      value="java.util.GregorianCalendar, java.util.Hashtable,
+                                                            java.util.HashSet, java.util.HashMap, java.util.ArrayList,
+                                                            java.util.LinkedList, java.util.LinkedHashMap,
+                                                            java.util.LinkedHashSet, java.util.TreeSet,
+                                                            java.util.TreeMap, java.util.Vector"/>
+            <property name="legalAbstractClassNames" value=""/>
+            <property name="ignoredMethodNames"      value="getInitialContext, getEnvironment"/>
+            <property name="format"                  value="XXX"/>
+        </module>
+
+        <!-- Checks for assignments in subexpressions, such as in String s = Integer.toString(i = 2);. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="InnerAssignment">
+            <property name="tokens" value="ASSIGN, BAND_ASSIGN, BOR_ASSIGN, BSR_ASSIGN, BXOR_ASSIGN,
+                                           DIV_ASSIGN, MINUS_ASSIGN, MOD_ASSIGN, PLUS_ASSIGN, SL_ASSIGN,
+                                           SR_ASSIGN, STAR_ASSIGN"/>
+        </module>
+
+        <!-- Ensures that the setUp(), tearDown()methods are named correctly, have no arguments, !-->
+        <!-- return void and are either public or protected. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="JUnitTestCase"/>
+
+        <!-- Checks that there are no "magic numbers", where a magic number is a numeric literal !-->
+        <!-- that is not defined as a constant. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <!-- deactivated for Kieker
+        <module name="MagicNumber">
+            <property name="tokens"               value="NUM_DOUBLE, NUM_FLOAT, NUM_INT, NUM_LONG"/>
+            <property name="ignoreNumbers"        value="-1, 0, 1, 2"/>
+            <property name="ignoreHashCodeMethod" value="false"/>
+        </module>
+        !-->
+
+        <!-- Checks that classes (except abtract one) define a ctor and don't rely on the default one. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="MissingCtor"/>
+
+        <!-- Checks that switch statement has "default" clause. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="MissingSwitchDefault"/>
+
+        <!-- Check for ensuring that for loop control variables are not modified inside the for block. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_coding.html#ModifiedControlVariable !-->
+        <module name="ModifiedControlVariable"/>
+
+        <!-- Checks for multiple occurrences of the same string literal within a single file. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_coding.html#MultipleStringLiterals !-->
+        <!-- KIEKER off for now
+        <module name="MultipleStringLiterals">
+            <property name="allowedDuplicates"       value="1"/>
+            <property name="ignoreStringsRegexp"     value='^""$'/>
+            <property name="ignoreOccurrenceContext" value="ANNOTATION"/>
+        </module>
+        !-->
+
+        <!-- Checks that each variable declaration is in its own statement and on its own line. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="MultipleVariableDeclarations"/>
+
+        <!-- Restricts nested for blocks to a specified depth. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_coding.html#NestedForDepth !-->
+        <module name="NestedForDepth">
+            <property name="max" value="2"/>
+        </module>
+
+        <!-- Restricts nested if-else blocks to a specified depth. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="NestedIfDepth">
+            <property name="max" value="3"/>
+        </module>
+
+        <!-- Restricts nested try-catch blocks to a specified depth. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="NestedTryDepth">
+            <property name="max" value="1"/>
+        </module>
+
+        <!-- Checks that the clone method is not overridden from the Object class. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_coding.html#NoClone !-->
+        <module name="NoClone"/>
+
+        <!-- Verifies there are no finalize() methods defined in a class. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_coding.html#NoFinalizer !-->
+        <module name="NoFinalizer"/>
+
+        <!-- Checks there is only one statement per line. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_coding.html#OneStatementPerLine !-->
+        <module name="OneStatementPerLine"/>
+
+        <!-- Ensure a class has a package declaration. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="PackageDeclaration">
+            <property name="ignoreDirectoryName" value="false"/>
+        </module>
+
+        <!-- Disallow assignment of parameters. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="ParameterAssignment"/>
+
+        <!-- Checks for redundant exceptions declared in throws clause such as duplicates, !-->
+        <!-- unchecked exceptions or subclasses of another declared exception. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="RedundantThrows">
+            <property name="allowUnchecked"     value="true"/>
+            <property name="allowSubclasses"    value="false"/>
+            <property name="logLoadErrors"      value="true"/>
+            <property name="suppressLoadErrors" value="false"/>
+        </module>
+
+        <!-- Checks that code doesn't rely on the "this." default. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="RequireThis">
+            <property name="checkFields"  value="true"/>
+            <property name="checkMethods" value="true"/>
+        </module>
+
+        <!-- Restrict the number of return statements. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="ReturnCount">
+            <property name="max"    value="2"/>
+            <property name="format" value=""/>
+        </module>
+
+        <!-- Checks for overly complicated boolean expressions. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        
+        <module name="SimplifyBooleanExpression"/> 
+
+        <!-- Checks for overly complicated boolean return statements. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="SimplifyBooleanReturn"/>
+
+        <!-- Checks that string literals are not used with == or !=. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="StringLiteralEquality"/>
+
+        <!-- Checks that an overriding clone() method invokes super.clone(). !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="SuperClone"/>
+
+        <!-- Checks that an overriding finalize() method invokes super.finalize(). !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="SuperFinalize"/>
+
+        <!-- Checks for the use of unnecessary parentheses. !-->
+        <!-- See http://checkstyle.sf.net/config_coding.html !-->
+        <module name="UnnecessaryParentheses"/>
+
+
+        <!--
+         !________________________________________________________________________________________
+         !
+         !     I M P O R T S
+         !________________________________________________________________________________________
+         !-->
+        <!-- Checks that there are no import statements that use the * notation. !-->
+        <!-- See http://checkstyle.sf.net/config_import.html !-->
+        <module name="AvoidStarImport">
+            <property name="excludes"                 value=""/>
+            <property name="allowClassImports"        value="false"/>
+            <property name="allowStaticMemberImports" value="false"/>
+        </module>
+
+        <!-- Checks that there are no static import statements. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_imports.html#AvoidStaticImport !-->
+        <module name="AvoidStaticImport">
+            <property name="excludes" value=""/>
+        </module>
+
+        <!-- Checks for imports from a set of illegal packages. !-->
+        <!-- See http://checkstyle.sf.net/config_import.html !-->
+        <module name="IllegalImport">
+            <property name="illegalPkgs" value="junit.framework"/>
+            <property name="illegalPkgs" value="sun"/>
+            <property name="illegalPkgs" value="org.apache.commons.logging"/>
+            <property name="illegalPkgs" value="java.util.logging"/>
+        </module>
+
+        <!-- Controls what can be imported in each package. Useful for ensuring that application layering rules !-->
+        <!-- are not violated, especially on large projects. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_imports.html#ImportControl !-->
+        <!-- Default: OFF
+        <module name="ImportControl">
+            <property name="file" value=""/>
+            <property name="url"  value=""/>
+        </module>
+        !-->
+
+        <!-- Checks the ordering/grouping of imports. !-->
+        <!-- See http://checkstyle.sf.net/config_import.html !-->
+        <module name="ImportOrder">
+            <property name="option"        value="under"/>
+            <property name="groups"        value="java,javax,junit,org,com,ch,de,kieker,kieker.test"/>
+            <property name="ordered"       value="true"/>
+            <property name="separated"     value="true"/>
+            <property name="caseSensitive" value="true"/>
+        </module>
+
+        <!-- Checks for redundant import statements. !-->
+        <!-- See http://checkstyle.sf.net/config_import.html !-->
+        <module name="RedundantImport"/>
+
+        <!-- Checks for unused import statements. !-->
+        <!-- See http://checkstyle.sf.net/config_import.html !-->
+        <module name="UnusedImports"/>
+
+
+        <!--
+         !________________________________________________________________________________________
+         !
+         !     J A V A D O C S
+         !________________________________________________________________________________________
+         !-->
+        <!-- Checks to ensure that the javadoc tags exist (if required) !-->
+        <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocMethod !-->
+        <!-- KIEKER: adapted !-->
+        <module name="JavadocMethod">
+            <property name="severity" value="info"/>
+            <property name="scope"                        value="protected"/>
+            <!--
+            <property name="excludeScope"                 value=""/>
+            !-->
+            <property name="allowUndeclaredRTE"           value="false"/>
+            <property name="allowThrowsTagsForSubclasses" value="false"/>
+            <property name="allowMissingParamTags"        value="false"/>
+            <property name="allowMissingThrowsTags"       value="false"/>
+            <property name="allowMissingReturnTag"        value="false"/>
+            <property name="allowMissingJavadoc"          value="false"/>
+            <property name="allowMissingPropertyJavadoc"  value="true"/>
+            <property name="logLoadErrors"                value="true"/>
+            <property name="suppressLoadErrors"           value="false"/>
+            <property name="tokens"                       value="METHOD_DEF, CTOR_DEF"/>
+        </module>
+
+        <!-- Validates Javadoc comments to help ensure they are well formed. !-->
+        <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocStyle !-->
+        <module name="JavadocStyle">
+            <property name="severity"            value="info"/>
+            <property name="scope"               value="private"/>
+            <!--
+            <property name="excludeScope"        value=""/>
+            !-->
+            <property name="checkFirstSentence"  value="true"/>
+<!--TODO:            <property name="endOfSentenceFormat" value="([.?!][ \t\n\r\f<])|([.?!]$)"/> !-->
+            <property name="checkEmptyJavadoc"   value="false"/>
+            <property name="checkHtml"           value="false"/>
+            <property name="tokens"              value="INTERFACE_DEF, CLASS_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
+        </module>
+
+        <!-- Checks Javadoc comments for class and interface definitions. !-->
+        <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocType !-->
+        <module name="JavadocType">
+            <property name="severity" value="info"/>
+            <property name="scope"                 value="private"/>
+            <!--<property name="excludeScope"          value=""/>!-->
+            <property name="authorFormat"          value=""/>
+            <!--<property name="versionFormat"         value=""/>!-->
+            <property name="allowMissingParamTags" value="false"/>
+            <property name="allowUnknownTags"      value="false"/>
+            <property name="tokens"                value="INTERFACE_DEF, CLASS_DEF"/>
+        </module>
+
+        <module name="JavadocType">
+            <property name="severity" value="error"/>
+            <property name="scope" value="package"/>
+            <property name="authorFormat" value="\S"/>
+        </module>
+
+        <!-- Checks that variables have Javadoc comments. !-->
+        <!-- See http://checkstyle.sf.net/config_javadoc.html#JavadocVariable !-->
+        <module name="JavadocVariable">
+            <property name="severity" value="info"/>
+            <property name="scope"        value="protected"/>
+            <!--
+            <property name="excludeScope" value=""/>
+            !-->
+        </module>
+
+        <!-- Outputs a JavaDoc tag as information. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_javadoc.html#WriteTag !-->
+        <!-- KIEKER
+        <module name="WriteTag">
+            <property name="severity" value="info"/>
+            <property name="tag"         value=""/>
+            <property name="tagFormat"   value=""/>
+            <property name="tagSeverity" value="info"/>
+        </module>
+        -->
+
+
+        <!--
+         !________________________________________________________________________________________
+         !
+         !     M E T R I C S
+         !________________________________________________________________________________________
+         !-->
+        <!-- Restrict the number of number of &&, || and ^ in an expression. !-->
+        <!-- See http://checkstyle.sf.net/config_metrics.html !-->
+        <!--  KIEKER Off -->
+        <!-- <module name="BooleanExpressionComplexity">
+            <property name="severity" value="info"/>
+            <property name="max"    value="3"/>
+            <property name="tokens" value="LAND, BAND, LOR, BOR, BXOR"/>
+        </module> -->
+
+        <!-- This metric measures the number of instantiations of other classes within the given class. !-->
+        <!-- See http://checkstyle.sf.net/config_metrics.html !-->
+        <!--  KIEKER Off -->
+        <!-- <module name="ClassDataAbstractionCoupling">
+            <property name="severity" value="info"/>
+            <property name="max" value="7"/>
+        </module> -->
+
+        <!-- The number of other classes a given class relies on. !-->
+        <!-- See http://checkstyle.sf.net/config_metrics.html !-->
+         <!--  KIEKER Off -->
+        <!--<module name="ClassFanOutComplexity">
+            <property name="severity" value="info"/>
+            <property name="max" value="20"/>
+        </module> -->
+
+        <!-- Checks cyclomatic complexity against a specified limit. !-->
+        <!-- See http://checkstyle.sf.net/config_metrics.html !-->
+        <module name="CyclomaticComplexity">
+            <property name="severity" value="ignore"/>
+            <property name="max" value="10"/>
+        </module>
+
+        <!-- Determines complexity of methods, classes and files by counting the Non Commenting Source Statements (NCSS). !-->
+        <!-- See http://checkstyle.sourceforge.net/config_metrics.html#JavaNCSS !-->
+        <!--  KIEKER Off -->
+        <!--<module name="JavaNCSS">
+            <property name="severity" value="info"/>
+            <property name="methodMaximum" value="50"/>
+            <property name="classMaximum"  value="1500"/>
+            <property name="fileMaximum"   value="2000"/>
+        </module> -->
+
+        <!-- The NPATH metric computes the number of possible execution paths through a function. !-->
+        <!-- See http://checkstyle.sf.net/config_metrics.html !-->
+         <!--  KIEKER Off -->
+         <!--<module name="NPathComplexity">
+            <property name="severity" value="info"/>
+            <property name="max" value="200"/>
+        </module> -->
+
+
+        <!--
+         !________________________________________________________________________________________
+         !
+         !     M I S C E L L A N E O U S
+         !________________________________________________________________________________________
+         !-->
+        <!-- Checks the style of array type definitions. !-->
+        <!-- See http://checkstyle.sf.net/config_misc.html !-->
+        <module name="ArrayTypeStyle">
+            <property name="javaStyle" value="true"/>
+        </module>
+
+        <!-- Checks for restricted tokens beneath other tokens. !-->
+        <!-- See http://checkstyle.sf.net/config_misc.html !-->
+        <!-- Default: OFF
+        <module name="DescendantToken">
+            <property name="tokens"         value=""/>
+            <property name="limitedTokens"  value=""/>
+            <property name="minimumDepth"   value="0"/>
+            <property name="maximumDepth"   value="java.lang.Integer.MAX_VALUE"/>
+            <property name="minimumNumber"  value="0"/>
+            <property name="maximumNumber"  value="java.lang.Integer.MAX_VALUE"/>
+            <property name="sumTokenCounts" value="false"/>
+            <property name="minimumMessage" value="descendant.token.min"/>
+            <property name="maximumMessage" value="descendant.token.max"/>
+        </module>
+        !-->
+
+        <!-- Check that method/constructor parameters are final. !-->
+        <!-- See http://checkstyle.sf.net/config_misc.html !-->
+        <module name="FinalParameters">
+            <property name="tokens" value="METHOD_DEF, CTOR_DEF"/>
+        </module>
+
+        <!-- A generic check for code problems - the user can search for any pattern. !-->
+        <!-- See http://checkstyle.sf.net/config_misc.html !-->
+        <!-- Default: OFF
+        <module name="GenericIllegalRegexp">
+            <property name="format"         value="\S\s+$"/>
+            <property name="message"        value="Line has trailing spaces."/>
+            <property name="ignoreCase"     value="false"/>
+            <property name="ignoreComments" value="false"/>
+        </module>
+        !-->
+
+        <!-- Checks correct indentation of Java Code. !-->
+        <!-- See http://checkstyle.sf.net/config_misc.html !-->
+        <!-- KIEKER deactivated for now 
+        <module name="Indentation">
+            <property name="severity"        value="info"/>        
+            <property name="basicOffset"     value="4"/>
+            <property name="braceAdjustment" value="0"/>
+            <property name="caseIndent"      value="0"/>
+        </module>
+        !-->
+
+        <!-- Checks that the outer type name and the file name match. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_misc.html#OuterTypeFilename !-->
+        <module name="OuterTypeFilename"/>
+
+        <!-- A check for TODO: comments. Actually it is a generic regular expression matcher on Java comments. !-->
+        <!-- See http://checkstyle.sf.net/config_misc.html !-->
+        <!-- Kieker !-->
+        <module name="TodoComment">
+            <property name="format" value="TODO"/>
+            <property name="severity" value="warning"/>
+        </module>
+        <module name="TodoComment">
+            <property name="format" value="FIXME"/>
+            <property name="severity" value="error"/>
+        </module>
+
+        <!-- The check to ensure that requires that comments be the only thing on a line. !-->
+        <!-- See http://checkstyle.sf.net/config_misc.html !-->
+        <!-- KIEKER we use them
+        <module name="TrailingComment">
+            <property name="format"       value="^[\\s\\}\\);]*$"/>
+            <property name="legalComment" value=""/>
+        </module>
+        -->
+
+        <!-- Checks for uncommented main() methods (debugging leftovers). !-->
+        <!-- See http://checkstyle.sf.net/config_misc.html !-->
+        <!-- KIEKER do not check for these
+        <module name="UncommentedMain">
+            <property name="severity" value="info"/> 
+            <property name="excludedClasses" value="Main$"/>
+        </module>
+        -->
+
+        <!-- Checks that long constants are defined with an upper ell. That is 'L' and not 'l'. !-->
+        <!-- See http://checkstyle.sf.net/config_misc.html !-->
+        <module name="UpperEll"/>
+
+
+        <!--
+         !________________________________________________________________________________________
+         !
+         !     M O D I F I E R S
+         !________________________________________________________________________________________
+         !-->
+        <!-- Checks that the order of modifiers conforms to the suggestions in the Java Language specification, !-->
+        <!-- sections 8.1.1, 8.3.1 and 8.4.3. !-->
+        <!-- See http://checkstyle.sf.net/config_modifiers.html !-->
+        <module name="ModifierOrder"/>
+
+        <!-- Checks that there are no redundant modifiers. !-->
+        <!-- See http://checkstyle.sf.net/config_modifiers.html !-->
+        <!-- KIEKER off
+        <module name="RedundantModifier">
+            <property name="tokens" value="METHOD_DEF, VARIABLE_DEF, ANNOTATION_FIELD_DEF"/>
+        </module>
+        !-->
+
+        <!--
+         !________________________________________________________________________________________
+         !
+         !     N A M I N G   C O N V E N T I O N S
+         !________________________________________________________________________________________
+         !-->
+        <!-- Checks for abstract class name naming conventions. !-->
+        <!-- See http://checkstyle.sf.net/config_naming.html !-->
+        <!-- KIEKER removed |^.*Factory$ -->
+        <module name="AbstractClassName">
+            <property name="format"         value="^Abstract.*$"/>
+            <property name="ignoreModifier" value="false"/>
+            <property name="ignoreName"     value="false"/>
+        </module>
+
+        <!-- Checks for class type parameter name naming conventions. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_naming.html#ClassTypeParameterName !-->
+        <module name="ClassTypeParameterName">
+            <property name="format" value="^[A-Z]$"/>
+        </module>
+
+        <!-- Checks for constant name naming conventions. !-->
+        <!-- See http://checkstyle.sf.net/config_naming.html !-->
+        <module name="ConstantName">
+            <property name="format"           value="^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/>
+            <property name="applyToPublic"    value="true"/>
+            <property name="applyToProtected" value="true"/>
+            <property name="applyToPackage"   value="true"/>
+            <property name="applyToPrivate"   value="true"/>
+        </module>
+
+        <!-- Checks for local final variable name naming conventions. !-->
+        <!-- See http://checkstyle.sf.net/config_naming.html !-->
+        <module name="LocalFinalVariableName">
+            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
+            <property name="tokens" value="VARIABLE_DEF, PARAMETER_DEF"/>
+        </module>
+
+        <!-- Checks for local variable name naming conventions. !-->
+        <!-- See http://checkstyle.sf.net/config_naming.html !-->
+        <module name="LocalVariableName">
+            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
+            <property name="tokens" value="PARAMETER_DEF"/>
+        </module>
+
+        <!-- Checks for member variable name naming conventions. !-->
+        <!-- See http://checkstyle.sf.net/config_naming.html !-->
+        <module name="MemberName">
+            <property name="format"           value="^[a-z][a-zA-Z0-9]*$"/>
+            <property name="applyToPublic"    value="true"/>
+            <property name="applyToProtected" value="true"/>
+            <property name="applyToPackage"   value="true"/>
+            <property name="applyToPrivate"   value="true"/>
+        </module>
+
+        <!-- Checks for method name naming conventions. !-->
+        <!-- See http://checkstyle.sf.net/config_naming.html !-->
+        <module name="MethodName">
+            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
+        </module>
+
+        <!-- Checks for method type parameter name naming conventions. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_naming.html#MethodTypeParameterName !-->
+        <module name="MethodTypeParameterName">
+            <property name="format" value="^[A-Z]$"/>
+        </module>
+
+        <!-- Checks for package name naming conventions. !-->
+        <!-- See http://checkstyle.sf.net/config_naming.html !-->
+        <module name="PackageName">
+            <property name="format" value="^[a-z]+(\.[a-zA-Z_][a-zA-Z0-9_]*)*$"/>
+        </module>
+
+        <!-- Checks for parameter name naming conventions. !-->
+        <!-- See http://checkstyle.sf.net/config_naming.html !-->
+        <module name="ParameterName">
+            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
+        </module>
+
+        <!-- Checks for static variable name naming conventions. !-->
+        <!-- See http://checkstyle.sf.net/config_naming.html !-->
+        <module name="StaticVariableName">
+            <property name="format"           value="^[a-z][a-zA-Z0-9]*$"/>
+            <property name="applyToPublic"    value="true"/>
+            <property name="applyToProtected" value="true"/>
+            <property name="applyToPackage"   value="true"/>
+            <property name="applyToPrivate"   value="true"/>
+        </module>
+
+        <!-- Checks for type name naming conventions. !-->
+        <!-- See http://checkstyle.sf.net/config_naming.html !-->
+        <!-- KIEKER: modded -->
+        <module name="TypeName">
+            <property name="format"           value="^[A-Z][a-zA-Z0-9]*$"/>
+            <property name="tokens"           value="CLASS_DEF"/>
+            <property name="applyToPublic"    value="true"/>
+            <property name="applyToProtected" value="true"/>
+            <property name="applyToPackage"   value="true"/>
+            <property name="applyToPrivate"   value="true"/>
+        </module>
+
+        <module name="TypeName">
+            <property name="format"           value="^I[A-Z][a-zA-Z0-9]*$"/>
+            <property name="tokens"           value="INTERFACE_DEF"/>
+            <property name="applyToPublic"    value="true"/>
+            <property name="applyToProtected" value="true"/>
+            <property name="applyToPackage"   value="true"/>
+            <property name="applyToPrivate"   value="true"/>
+        </module>
+
+
+        <!--
+         !________________________________________________________________________________________
+         !
+         !     R E G E X P
+         !________________________________________________________________________________________
+         !-->
+        <!-- A check that makes sure that a specified pattern exists, exists less than a set number of times, !-->
+        <!-- or does not exist in the file. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_misc.html#Regexp !-->
+        <!-- Default: OFF
+        <module name="Regexp">
+            <property name="format"         value=""/>
+            <property name="message"        value=""/>
+            <property name="illegalPattern" value="false"/>
+            <property name="duplicateLimit" value="-1"/>
+            <property name="errorLimit"     value="100"/>
+            <property name="ignoreComments" value="false"/>
+        </module>
+        !-->
+
+        <!-- This class is variation on RegexpSingleline for detecting single lines that match a !-->
+        <!-- supplied regular expression in Java files. It supports suppressing matches in Java comments. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_regexp.html#RegexpSinglelineJava !-->
+        <!-- Default: OFF
+        <module name="RegexpSinglelineJava">
+            <property name="format"         value=""/>
+            <property name="message"        value=""/>
+            <property name="ignoreCase"     value="false"/>
+            <property name="minimum"        value="0"/>
+            <property name="maximum"        value="0"/>
+            <property name="ignoreComments" value="false"/>
+        </module>
+        !-->
+
+        <!--
+         !________________________________________________________________________________________
+         !
+         !     S I Z E   V I O L A T I O N S
+         !________________________________________________________________________________________
+         !-->
+        <!-- Checks for long anonymous inner classes. !-->
+        <!-- See http://checkstyle.sf.net/config_sizes.html !-->
+        <!--  KIEKER Set to 50 instead of 20 -->
+        <module name="AnonInnerLength">
+            <property name="severity" value="info"/>
+            <property name="max" value="50"/>
+        </module>
+
+        <!-- Restricts the number of executable statements to a specified limit. !-->
+        <!-- See http://checkstyle.sf.net/config_sizes.html !-->
+        <!-- KIEKER off
+        <module name="ExecutableStatementCount">
+            <property name="severity" value="info"/>
+            <property name="max"    value="30"/>
+            <property name="tokens" value="CTOR_DEF, METHOD_DEF, INSTANCE_INIT, STATIC_INIT"/>
+        </module>
+        !-->
+
+        <!-- See http://checkstyle.sf.net/config_sizes.html !-->
+        <!-- Checks for long lines. !-->
+        <module name="LineLength">
+            <property name="severity" value="info"/>
+            <property name="ignorePattern" value="^$"/>
+            <property name="max"           value="165"/>
+        </module>
+
+        <!-- Checks the number of methods declared in each type. This includes the number of each scope !-->
+        <!-- (private, package, protected and public) as well as an overall total. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_sizes.html#MethodCount !-->
+        <module name="MethodCount">
+            <property name="severity" value="info"/>
+            <property name="maxTotal"     value="100"/>
+            <property name="maxPrivate"   value="100"/>
+            <property name="maxPackage"   value="100"/>
+            <property name="maxProtected" value="100"/>
+            <property name="maxPublic"    value="100"/>
+        </module>
+
+        <!-- Checks for long methods and constructors. !-->
+        <!-- See http://checkstyle.sf.net/config_sizes.html !-->
+        <module name="MethodLength">
+            <property name="severity" value="info"/>
+            <property name="max"        value="150"/>
+            <property name="countEmpty" value="true"/>
+            <property name="tokens"     value="METHOD_DEF, CTOR_DEF"/>
+        </module>
+
+        <!-- Checks for the number of types declared at the outer (or root) level in a file. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_sizes.html#OuterTypeNumber !-->
+        <!-- KIEKER 2 !-->
+        <module name="OuterTypeNumber">
+            <property name="max" value="2"/>
+        </module>
+
+        <!-- Checks the number of parameters of a method or constructor. !-->
+        <!-- See http://checkstyle.sf.net/config_sizes.html !-->
+        <!-- KIEKER off
+        <module name="ParameterNumber">
+            <property name="severity" value="info"/>
+            <property name="max"    value="7"/>
+            <property name="tokens" value="METHOD_DEF, CTOR_DEF"/>
+        </module>
+        !-->
+
+        <!--
+         !________________________________________________________________________________________
+         !
+         !     W H I T E S P A C E
+         !________________________________________________________________________________________
+         !-->
+        <!-- Checks the padding of an empty for initializer. !-->
+        <!-- See http://checkstyle.sf.net/config_whitespace.html !-->
+        <module name="EmptyForInitializerPad">
+            <property name="option" value="nospace"/>
+        </module>
+
+        <!-- Checks the padding of an empty for iterator. !-->
+        <!-- See http://checkstyle.sf.net/config_whitespace.html !-->
+        <module name="EmptyForIteratorPad">
+            <property name="option" value="nospace"/>
+        </module>
+
+        <!-- Checks that the whitespace around the Generic tokens < and > is correct to the typical convention. !-->
+        <!-- See http://checkstyle.sourceforge.net/config_whitespace.html#GenericWhitespace !-->
+        <module name="GenericWhitespace"/>
+
+        <!-- Checks the padding between the identifier of a method definition, !-->
+        <!-- constructor definition, method call, or constructor invocation; and the left parenthesis of the parameter list. !-->
+        <!-- See http://checkstyle.sf.net/config_whitespace.html !-->
+        <module name="MethodParamPad">
+            <property name="allowLineBreaks" value="false"/>
+            <property name="option"          value="nospace"/>
+            <property name="tokens"          value="CTOR_DEF, LITERAL_NEW, METHOD_CALL, METHOD_DEF, SUPER_CTOR_CALL "/>
+        </module>
+
+        <!-- Checks that there is no whitespace after a token. !-->
+        <!-- See http://checkstyle.sf.net/config_whitespace.html !-->
+        <!-- KIEKER removed ARRAY_INIT !-->
+        <module name="NoWhitespaceAfter">
+            <property name="allowLineBreaks" value="true"/>
+            <property name="tokens"          value="BNOT, DEC, DOT, INC, LNOT, UNARY_MINUS, UNARY_PLUS"/>
+        </module>
+
+        <!-- Checks that there is no whitespace before a token. !-->
+        <!-- See http://checkstyle.sf.net/config_whitespace.html !-->
+        <module name="NoWhitespaceBefore">
+            <property name="allowLineBreaks" value="false"/>
+            <property name="tokens"          value="SEMI, POST_DEC, POST_INC"/>
+        </module>
+
+        <!-- Checks the policy on how to wrap lines on operators. !-->
+        <!-- See http://checkstyle.sf.net/config_whitespace.html !-->
+        <module name="OperatorWrap">
+            <property name="option" value="nl"/>
+            <property name="tokens" value="BAND, BOR, BSR, BXOR, COLON, DIV,
+                                           EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF,
+                                           LOR, LT, MINUS, MOD, NOT_EQUAL,
+                                           PLUS, QUESTION, SL, SR, STAR"/>
+        </module>
+
+        <!-- Checks the policy on the padding of parentheses. !-->
+        <!-- See http://checkstyle.sf.net/config_whitespace.html !-->
+        <module name="ParenPad">
+            <property name="option" value="nospace"/>
+            <property name="tokens" value="CTOR_CALL, LPAREN, METHOD_CALL, RPAREN, SUPER_CTOR_CALL"/>
+        </module>
+
+        <!-- Checks the policy on the padding of parentheses for typecasts. !-->
+        <!-- See http://checkstyle.sf.net/config_whitespace.html !-->
+        <module name="TypecastParenPad">
+            <property name="option" value="nospace"/>
+            <property name="tokens" value="TYPECAST, RPAREN"/>
+        </module>
+
+        <!-- Checks that a token is followed by whitespace. !-->
+        <!-- See http://checkstyle.sf.net/config_whitespace.html !-->
+        <module name="WhitespaceAfter">
+            <property name="tokens" value="COMMA, SEMI, TYPECAST"/>
+        </module>
+
+        <!-- Checks that a token is surrounded by whitespace. !-->
+        <!-- See http://checkstyle.sf.net/config_whitespace.html !-->
+        <module name="WhitespaceAround">
+            <property name="tokens" value="ASSIGN, BAND, BAND_ASSIGN, BOR, BOR_ASSIGN, BSR, BSR_ASSIGN,
+                                           BXOR, BXOR_ASSIGN, COLON, DIV, DIV_ASSIGN, EQUAL, GE, GT, LAND,
+                                           LE, LITERAL_ASSERT, LITERAL_CATCH, LITERAL_DO, LITERAL_ELSE,
+                                           LITERAL_FINALLY, LITERAL_FOR, LITERAL_IF, LITERAL_RETURN,
+                                           LITERAL_SYNCHRONIZED, LITERAL_TRY, LITERAL_WHILE, LOR, LT,
+                                           MINUS, MINUS_ASSIGN, MOD, MOD_ASSIGN, NOT_EQUAL, PLUS, PLUS_ASSIGN,
+                                           QUESTION, SL, SLIST, SL_ASSIGN, SR, SR_ASSIGN, STAR, STAR_ASSIGN"/>
+            <property name="allowEmptyConstructors" value="true"/>
+            <property name="allowEmptyMethods"      value="true"/>
+        </module>
+
+    </module>
+
+</module>
diff --git a/results/evaluation.xlsx b/results/evaluation.xlsx
index 237636274d109ea88dcd32de85ac7fe9c492c45b..5a62baf8e4f79279c96fbbb50b562cb8f244eceb 100644
GIT binary patch
delta 7550
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
G^nU>T2Jo!_

delta 7301
zcmZ8lWmH^Cmu(=pySp~-?$$`~;1Cj=;4bOVxCd(-5+Jy1a19=U2X}V~);Pm^Gix&6
z)Sp|c_NjGmowIM%uAQT^sfDkpitvg6fCNAR006WAA)fYxk2U!G@DST~;dU7;6xYH|
zO4ZajWR0I~p)7(JPmfDy<NR=hL8^I7e_+*=*aL@!>Uuci!kLjW3&f~%OLi8+ufb!I
zeq(ep+InRRhJ(FGnlT`lch7u30uzNJ4?bZ6BmwUNjV!d};@xe&ORiRLXKvElZFJor
z@DVKA@`OFGfa*JmIfNe^EX!f9vNGG&uFET=$56HSkwcd$3HE)6utu}F_KsS4j4*Ua
zrWHKT?GYszFlhj%sZ%6LVvV6gV{XB+r8No=c&pgrp6q5x5SIMsrfWunyPmno^mwDA
ziK5$9iHUW*=)+vA$?W++Xx~z^f*;k^<nLaBg3r8ORreT>HoF*J&R}wMyGMmJEXrO9
zBwqijRGjysC<%fBYZX&eGOcNBgwh(3t&MHX0iAQEKz;YofPAlJ&w2Vi5r6+l=$iQX
zZxk0_!fTEC&nLb}LDEQAahC>l)Fi%JCZ=AtHW^5tLX7)KMeh)yG{gjm-*vg^FYA6G
zP{BjW6V)_&xG};`l^((eVbja;II^nVGD@wqZ~Oz4m$1Ko&SM~7?qsIGc|#VA0D`pp
zKm1%=7XN%ONPE4(UmlG|AV%NdT@jXg=jw^f%H)=!=vuzsi|aLgHGQ29Qt@T+YL8<r
zYbwrF9a^PVocbeQgEPjdPlk$LKoLeHksb&!>Q^&dF~6yVo0io%t_Z7c6v{b(j%7k-
zQwsMnr6NRLA5Eqc4!WD$%vXX39cZs^$#ivWMeM50zq*Oi`I=cebX~}2cH%#RIn=WT
zwdwfrZg|H)1B^LW5TknjKf_;qdxcPY$_CGdf}*L5SKt7E=Vt`KUlu~SiC-ZGN+zXV
z)SV-7!a=mvRC~E`+R>lFxxF*J2yy2<xaf{_53x~(>Vb<)w0!=TtK_ULrUo;rTnNr#
zzNaGtUN8Zy4FvqFZnokmyjOns4yR&>&LbBi2q@;q6;weWM0~uXgTu08bgT?_{AS6-
zLH4f%!aFxCjHKatg>>?l&68pLA4a)7c|W+1Q#$^9$;NQ~R={0|&QV2BePbg{2GDx@
zxmj-U8Yw%-mwMuY6jfOq(-$zY_nVgOrd#0}<-F~|TFrOVzB}&@W1FH(m8w)g0vzT+
z6Fvx{h5!@Yx4)&g>YlE9$lm`1b}pW?4_}^IZw(DhuLAzz0)%a2Z8Gg8FSGCf0QSpY
z>EpoV?d)c6?(A&O>Eq}SlQ`_O$c>`_L%hR&1><4t)<W;`7^mSlP{XCMt1TQ#P)Os7
ze`5(d6idoskQOv_eJjqF+H*WIPj(K^V|OZCp-;%Tmao4+De`!Kb9f-e2t+Rm`GY0g
zF8xiYwaTmkk{4GL3}X%gqzWIqW0ChK9(706pTkjDi&9q%?)B5F(gtakAP>$|7nT}X
zhkAK1Ic(UFbR5=)h;bpKbB@KMC|XiTU5Vz0T5sF9==DzFROUCr;UYVFbiCG7DPKB@
z8wI&?v)r4Qaar<9<y53hFt2VCew!2DLT>l$JMc?^v@LoqbWJ@R$%mYQ<|g|z&E<be
zC6DF^J5F5Dw;|3X_0le3Exc=ZTa_7AyL`xcLNDVG=0klI9Z$@jD=)*01f_Q6P?d`j
zIxMssUatMYjA`N5Ly(%4{awd@i$JP(`-_D7x=n@Kn4L}|$IkAY^Z0<IyWe9)MxpuX
z_|#+#f1d}QP~;~TYB=O9^ZReeeUAKOu2l!T<i?fC?-`=lK)|fCm9F3?WCq!R{kUfT
zTWIU^e-}>hR4d5krEr)C006;%7tY=Gy_=P#j)$9_la2d7)l1S|R_Wm;X(tAU<KQrP
z*^AAp<yY9ILj!d@dWLZq=M*!!zTei0tPT^O4aFSE+BTwdxsQ6gjl%HXf(H}JeJVnO
zBJL#O@UTjLzS_by{Z-X!lVocdU!x5d2iXg=_rs;83NfOuF&f9^z$tT|own;{oRZLW
zt^O5V$|!eV?yj#dV3W=%3^Hu_G)CT%h?>Koi^Tm6!QNiFjr^-aV28%0X0&iGNwX(B
zlkc86MN8*eN*ae#s<-}>D=)-k^fYCt=f+LaiI7x8r?iELae*n5-FQ3y;;|qu6B6QG
zPkxI0G2&gedA-K^$9sm7AmW61fivcW_cEgJgO%}iH77)+5^4AO^H?Y=re${(k@^@0
z%@eY)>f+>~=$|zEIq_aQuk|Ww9_k)EN4yrEkX8vnx-&*+3(}*x$<u47wT&~R5eahY
zUjkk`Nm6cLGwWlKVzrFHQ}SA|DdH#&)7U;G7f&jkJ-?g%>iz(wCMK-Y#~_2l3a&cX
z{EP$uY?1>2_yFh{Ga=;2aKwpR2&aR1PYmay2K#)X1!)3;YRZP7tNENt6h#T)_u;fw
zllUac<)|%#9O;Sry#i@x2?9q125GMSsV23FLg}};a&C+XM1+fxflqx%4w3h+!dcmI
zd`o4sRF)W&c(lN=Osy+7Mp=fq+khQqzLu%Ow?@(NZ-lAe^}9nRWBTP4X9ZUvr>t-F
zfkP-kx6LL4BP_b524+TyJQx<f>BJ1-HgcT2<!fb1DM;|tflDzQ9Qv$fs-%U!A#PcL
zbBjH+pHUC&5+?fPeZsqEO_U{Y_-d*Y@SVfDv9L<XXa{OXUWxXWlXi<D`2VKIeiK5H
zf=0!k7j+w%B3KFGT)%R|(?Q=6y=d7f%F<USp<vGxP?*f-G&-Ik({Cs|#|$X(H7T01
z^Dfo#MGDv?@%rHDYBkehKRqK~h)_$tYt_hhr7|)gcCNqU;Z$!_;g|Qj4^4pPzD6+I
ztgL)SFjb-r&Jg?w%go-fVX=&AC4k-E6Kl17(xBqj2SEiwI)c43zL2}@1pI_X>efIR
zQUwRD(Eee=5)o$SvCkMLt{-jA(F1GVgO^4i)#C?!Fo~y)rHxt?K17eAf3udQN>a?O
z-;zvtQwFi$(NW`yn??27na?#C#k5n4k3r;k!*_?1uZXoZeQ|0g0f~Am0dadcoBz|3
z9ZM}C>VE^tOWsyn>i6AH2j3psK>Qzh?l$*@xTqnx{i?*zhuGN<=NG&0X|`q^p1C@}
z=ZkgBTpf3puv04JwM=-JsZX4>{5Rt*l;b}b*VY)D_Ud;VU_L)!;R;4p&{4o%tct{1
z1&=kYN%T#BD_ek(Y}aAl{nyI-5)vSp!L4G3Zx@7e)G#_a2hM5lI|VvS(HHNnNsP%7
zReyNy_eEit$s#FXR|!t-MT2uuua0}_y2*OTmOSla3^fj3npd3mSfv<0k;!?kER5yD
zdoq6Ixa)T547G(q(i<xZZ5)&1dFx%y53WQDS41M03Gp~-h)JioJL!K!seoCb^4Bi?
zCc%)^URF$CvlLNH^q~^sS9O%lVm=z}u$?8MYO{fTA?|9!@nbQEtXrkrJsG7PwO`HA
zOB=|?1U3qqHW@{n*9g7<+NcRmecBr=7@s@@S!xZO+j^?K(R}Yg*CdCpQD7Lb$4rlV
zw(a@j5lm4>%M@l6a3(=DX8R<nZ9`!2_zF@oyPD7<k*uD0$3zj3`+GrBW;@#DSr&fv
zM;<s;dh{1`PwdHmV08lWwUc=Jysz#$rZ}+2#<Qhlp)OS6KAyLssy}8asn99aMI5t*
z+m;M%N>@Fzi7qtGDtc`lFK~o{q3JH7)I+KdG3iEkDu}6;;EU257u4iVQo#{!5n9M%
zeIo(d$ElJTPi%{HIrHy5$X-5u$GS!4uXi)j{C#T2qljE)`t&N>md$m`re*7HjmyZU
zF@S!?nNFl&;Z6aPEF=5_s#nu^2EK%q81*OPnC}&l7ET)CvYQmRKIL*I0;%FBL4K<j
zlBHzKYUWmWig48X9Tx=DB4q;gbBz##V|I17)G`hOr;YZ;Ka=_MUwxH#k0U)Sn=`Z6
zL7<UhEwf4xOTPjinQSH|bsc;gr)No|A-uP44W8hUhMF~gC7-k4kN1Y5nfUgwX3US`
znkXd=)vq0G(?C`z)k`L5B#)_w?`EPG0zO{~jhkCx2CX|!!5{6lreK6K=v6}MzTmpE
znFAP;&lBj(r6?(KCCMWtFivK3(e6n#QDL-UxR=CD3sW<KabP!2=xDnppRic0VZuhD
zlV_AV@B9xnDh*HW)$#^Ki8*6U@4Ds-=f3<0M8`hN&F6W&OJ8_m0yc!>KoX}EL`6}v
zOk85t?JijbmCeckdx0KG91e(!1V$Wf@tXhQ1M!yTbEAljRa$+Rq|WigD^#@I1QkTu
zR%unHJ9S(=jxkQQ#N?pY@*)R6f0QmWhlgD8BUc{ONyq|2THZqwkuXjyA8uENF%Fnp
z25*b>Bn8vQjH&hxx>5|ho=EKzGUV<?wZ>7tekv@?nC!O4x^}1fo>BwZ@oF=Xy3jK2
z62M>LWQ&MQi%OeMWxSI<{v)xb_v%#A!8eqqlxzM6f?ZJk<y`oWp%=|D`OTqQTd$G$
ztztK(ui?J>Y$*FDs0u8r|0|KrliOR)j*dI=>>5?{j}2aI%K;^{b{d7noN-K_V_ai=
zhj%(qHXrZT_BedDxy@Aw7E)2M*R*k4FzzSe6IVrNUoYRF|0DlUC#T)3f4@k-KByQ0
z4dl&{V<lH)op7}&yBa3JUKHGMKs#$g7Rq#A{5I!&HH4Z`EVhow*xNUfAwyhLJU?yA
zd?5Wo>5W{0l9tN}eRzay${Ppm%Y8}j-9bBkB1UWNc!Fc)V9wgvszk+8(&k0HZ<GNz
zYEcbFv*=^?Q5@?{BB=tnX9bB-7MP&#e;^q~xF&*35qw;ikLd$EgvD|OXB&((6lLKJ
zUg$&i<@*`Dr7$9Nkv0Pp=a4r(BLN4TX&V~>j@TM&A{<E$mIY&QqflK1^z$UEqdqDc
zD`mz|r!3h9*<d|@qmzL+%B{lI4wT31t>GltlZppHHK2_h$N>F0k%NI#M-(Ws4-x0&
z$+K7ZY#b_Lbw5f$7ED+N+a%EDQye?nOGOG|u|Oyr#{tNt1c+v^B=mIe!(jJhmBgBZ
zSp9d8{U7trBvJCT0&KW`C4PUy$UmwT7YtM-DdES_^{5jlOA&aeESSl0OGzSd&hPq_
zKN*NYu2e)5vz)$jXY%FUDJ!U69I|`Y@*20k1b4kURQ}E}e3la9iKL>3s#{&UTq@kt
zYdQdeC*g})Lc7rIIda{|VTPZ)2%7ZnN40){a93c(-zu%(yCSDkOr-)_1VTtWe6maH
zoPbkr#Oc}JrL<a<yhivTqS|8q`GfT~PtTfmic8=8VjbUVL$W7ClIaFG2!XiAoc;Pf
zZnE=zF^rTq=!8W%)VT08JPs&&A{C$5AWqRHISDG^kdKPJA7v9HPW;kgw>H#$P#;ye
zw>W)n+Sc+@&ijOG_ryb%PAE2oO(^3nr+%6EwcPXhz3t6I&t45Z9+^NICm9lg%GJ;{
zaD~zlNJi=OYqKt|A7R1b1mr4wu?h-2-NBb~DdH3N-mO#K+R?(Pw4U15O#;!MOsu+M
zgSk*zZk+}}=xQSG-%xz;EFPajQwZARO5`q?Q}G#i&OSo^S0AI%vWOw^zNj!XQm7;`
z6(rwq(JfCH=hJHGBXSh1J3_2dSO;ne9?t*pp)S=XXgdwffIWWr*Q_(TGKl~}X3_=D
zz;1DC-@YC_kT`oaYRM;8_e;&@4~7&+vdgquQ!lVd8sxG0fgoLRnPI>*v5wv}P0H5M
zzvJPtF<M_wVj5Y696_AoFx1yJ!%Z@C8nPcqr0iIeNEJ9=SE@vIV<a(pQ2TADQh@b5
z-D0u3T&Xq>DE_MqcJuE3Q_3WHiX`#n911hx2o!0@jJmc~Zzbwd;v_2H&yQ28pq!<<
zPcFq~ByOg}j$j{r;bW<L9^d2MiOZ#&e0n|H^(mo%ux!4grfd22Ymb{>f7rhU7D0xi
zO_4OZtb|xw%+kyTA7Yz!j?TXk?w!VT%(QoYX7X(+5>X>>2^LRBntcweVU~13h{xnS
z^a6ON=c`@IR@r@ZAEVkjGb8QWq_sAUd0J&%sU4Yz{hXWlbe<(N%l^!~C=eb>YTR3g
zFd#&Dh5XTU>gdmSR~EoAH2u_nX&fRNdf8RZPJ#ialM?KG<48bS#TPH+i$6vyj=y+L
zAr*t-{Um*8o$i`lm>@Ze$z}<r`-I9BdkLRi^&?ufJbtc*ykj+z?MqjY$3_TLOXio?
z$r%t+$yTA`6cHC&jK}PqvFgp6l<FlW40t<0_9RWi!?>4m0@KkN+=8?#*EpmV1N9e(
z0qIH8o#B-4*zISuPJYiHKV`~MZ>G|36@8ic%A8!R*B_+G0ob1DXN9sm)l7;%(GDW9
zpWyRy-+U;3PF0oVwC2*BDq*O)%dc>s&Bz^Hz7zrNc3g|-@1}qc(D7MoGZTyA3@|}A
zcM(@E@;PyH7@&~5h+`M|{5VL{v6Mo&`)b(CE5s&pELZirQJMr(L75nA%Q`Mf8Pe8C
zC5A_VxE}kW3WUt(oGeie!uJnlU6IlKT#P4c7_1b#YU{$rKcz}XDthw(h)smAE=SXP
zAE}dmh^fWuU<q8kzqLJxwqh{?w@&&m*G+H0UrcTM*dJHA#F-U8vlN9aC3v7@H7QjV
z^ine1tE?Bx&Z2=z9g`sS<&AhS^DHbGY0<1|4z{a9ei=2_r-oziDr{D)9p*kQps5|h
zTY&gk{>Dng20SyawinP9o2}A?zx8|Xr#1jVY-Uo|7aIBA3jXRgl;*oaRF|LSDFC0&
zuTTItwMKyAM&fQDGd^T3jzM}YFq(oB@#L0eiY+p{2|-z0aZ?B$=9)K;w&ZD&1&|Te
z!?<r>!8S@<<rh$_h09EJuZ7zwa>!x)Sdic&a@GZ%M^UV$b-`OlV)%pey*v5G#L*1e
zz`W*DLUu)$1hb+7gbk%buHieZTWL7_cvU1S__k?-Eb=fL`77j&IE9wUnp1?)mG(wc
zZaG2hHHUp9G7CO=B*?%u5NfOW90ch5RPl72kTQlnWK$33mIB7kTqY}SkiC3AVVoiX
zaZ|9^i|B;=fWj7P(U(k}f26qXGe+-XV9cV>7_=sE(q7cRZtEVq@lLX`NzuH|cTKr(
z6SoiXL|&=80MaX$|666<Hlczr_P{dF<+pePe7F!04a|nJh(_Puuc1-iu6sLwMlsa<
z*t8=Wt>A2-QHn)>(*bE}P7T3d_b#J@XP7Ic*Ay~hgYN_gQU<!!CWjn08-R!A^xh%U
ze*~L;0y90WRVLbon=V;+5H)&^s?UnYkZ76VNctCWKng<RjL%Ey&lc<H&kpP9$J-hc
zX|yOXusYAvY-LWLuaH3c)Y<Q)N;|x?$&0IM5U!qKCaV2d4T&g&Ybmk@H#{rzs_0Vv
zpWZhA2;Wr$t*LXN%EI$%no+vsB}mYBUW$~>+A>cCu0VHZ1g|}+NX43ifM!Tf)w4?G
z<6FrJkO<y-DtbXmo?<WDo=AA)Q|batldUUtq;Fk)YSm4j*q|W4)HiYSHG*y}&Q;Fu
zRrMq9O?|Ya5o{Pce><M)8zK<b9W25*T?3c;=ZPX(ZOXOG*3MJ!+lxlr?UIz0%kGbu
zO^SOyCh3xz;5F*Q(CaL9br=mT$dJ1ryfo*T!n~Wrix1EEYAIhk^e-@++R8>M+p)tk
z|77`VlokqVU;lFca=US&nMZzHufJNf?xHdGNW6J2_3v5oO7trMew{ZJKODpo$|JWJ
z`130TiXOqLtXm^uCO^Z3)ALIG@&{zOLDdrxSSxetR#|W*l-lL3K%q20JqsK?S;?<T
zY3FHC({H`VP7GD#2#BIVptAF8CgPOH{_bdd_NJUJ<^)S|{08ZJ9QK~MXbIbsx;<{K
zB|-HIoGPbq4q`JfvX9~*yuCb%$$6J6^6O(IdFFfq`bq!R7G$NsTqH~;pVxd*&uws7
z*ZSmsRvW)rDICF5z>_47KAPB*VEw!r$Hnq5FdlRNC@Ddx6AhWN!$xc)+Ex$Gf&K^W
zOIKu+K?bCEa!YmRk`Qp|O!1LdTH<{YC#$RhM6xx3_|Y^cH%BA*nQ^kUK6sSPZ_FB9
zF$I5vlzXe=0XjiLg2*#;kKYPCp^>9BNKB|)-08VSxUV%e_EbvC1W{(YgJV6#oBbvT
zq3X0`klI=#ybi>%s>0J%HO;5WfP{sckkp7PD}q}!RHHi`<KSH8W=|tJN>kk1g}`56
z)PR;KMOQGDT?vK_tLjYzAH6_xQ3db|@AjdJQz~*!u=x7y#<_ZyYZ#H$Hucd(Y5iDI
zmRss2yvwUkkRj(m-LrjpL0jTdSr-R0DmA$$NO}dCqxj-nKMinHX_62fyT#=jHq5;r
z+cSI~SKLb=%pgga-$Zhy;<WQIZESK{wB2lsYG-yo3r#hts%De+araBdgsT1F_z<?%
zfP}6j;nCJ9^|Nb)=StlMwlkE|Z_*YVqJWON+&|FPaa|s5@iyp$CoS?OEpu-9XMcu?
ziB-MfO#v_ad?fEt#iY3qzj59qnu!G(x7=#cvH=QSA&rrCeIw>`OA?_ITN6+7a<&Wd
zO6fQG(qp?^^lfpZBBwGAFSh641&KTzfpIAXOk+Kq<8dcS+JQ^zf7uG1qZ3AZmxIAw
z%U!zyM+POO=Xho53HTR7t=zL3gub|jz&cxcS~$pGa~B@Qvwa!(BZq`QJ&4`tcR;e`
zh&FvRiUM9%<U81*s!9Y0v!RtxT(np?AA$b;3K4=l|B9|dGm9ad`h9<sY2V4=Vl;KR
zw05P|j9Bp;T)gSfSavVd9UuYYT>?9WUO7D)+o+cJIGag+gX))=fwx*Jo3Zzh1_83l
zcK?%Z+)no4Q;O?Xm4Q2S6qxf{O=Np{g`a2Bv8fN_l)AKke@&`T!>%QGNQ%g&HOM0@
zm>phK1jTg}Y*<%yqe(hP$+sguQeaZn4u}&PSFo2)Nzb!J)7+HMoJen5IVDB1^huY&
z@!uNc+@{X>4n=jM(OT#^Xil&|K&V2)g_bdn(oyFV1I$MN6hw`n65%lSV{t*VZ8w7a
zHIp<<rug5&pmI#ZE~#Th1;20~5oRh<rWI71%-h0r_l`e9c9U$U-%o?x!hZ`ZcE)`C
zaj$uAuW(j7dhu<}i&YlN>0$z_p*fjk${S%iRBxu_=gMgO41NgT-yPn@YE-x_c<udV
z`jyn9>n$~uf{6_7BUFe<n)vd?(S7}LFGGKM{%!TpSSC8S3up}!;j8%<Z3}%wB7<%*
z;gJ7-7ys`R3@A1;9r^z^i~r&i(AUf|aPH7pW<m1*G%o+f005t%tISN~|9e?{c{S$$
zg#oHi8WtMzzmgjOAo&km1!~N~#`e!PD)mA>t(S%2{s&%52>@6+TWGpDySQ^%IJ;Rv
z|1cAf|GTTa#JB&C#r<~*3v`V|2A+@(x<dzqz6Rn@{4cLxLUI1az4Wr^pgur4BrC>$
GM*j=c40@md

diff --git a/src/main/java/teetime/examples/countWords/ConcurrentCountWordsAnalysis.java b/src/main/java/teetime/examples/countWords/ConcurrentCountWordsAnalysis.java
index 4fa50362..70243758 100644
--- a/src/main/java/teetime/examples/countWords/ConcurrentCountWordsAnalysis.java
+++ b/src/main/java/teetime/examples/countWords/ConcurrentCountWordsAnalysis.java
@@ -17,7 +17,6 @@
 package teetime.examples.countWords;
 
 import java.io.File;
-import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -28,11 +27,13 @@ import teetime.framework.concurrent.StageTerminationPolicy;
 import teetime.framework.concurrent.WorkerThread;
 import teetime.framework.core.Analysis;
 import teetime.framework.core.IInputPort;
+import teetime.framework.core.IInputPort.PortState;
 import teetime.framework.core.IOutputPort;
 import teetime.framework.core.IPipeline;
 import teetime.framework.core.ISink;
 import teetime.framework.core.ISource;
 import teetime.framework.core.IStage;
+import teetime.framework.core.Pipeline;
 import teetime.framework.sequential.MethodCallPipe;
 import teetime.framework.sequential.QueuePipe;
 import teetime.stage.basic.RepeaterSource;
@@ -51,7 +52,7 @@ public class ConcurrentCountWordsAnalysis extends Analysis {
 	private static final String START_DIRECTORY_NAME = ".";
 	private static final int SECONDS = 1000;
 
-	private static final int MAX_NUM_THREADS = 3;
+	private static final int MAX_NUM_THREADS = 2; // 1:2150, 2:1400, 3:~1400, 4:~1400
 
 	private WorkerThread[] ioThreads;
 	private WorkerThread[] nonIoThreads;
@@ -82,6 +83,7 @@ public class ConcurrentCountWordsAnalysis extends Analysis {
 
 		int numThreads = Runtime.getRuntime().availableProcessors();
 		numThreads = Math.min(MAX_NUM_THREADS, numThreads); // only for testing purposes
+		System.out.println("Using " + numThreads + " Threads.");
 
 		this.nonIoThreads = new WorkerThread[numThreads];
 		for (int i = 0; i < this.nonIoThreads.length; i++) {
@@ -142,6 +144,9 @@ public class ConcurrentCountWordsAnalysis extends Analysis {
 		distributor.setAccessesDeviceId(1);
 
 		// add each stage to a stage list
+		final List<IStage> startStages = new LinkedList<IStage>();
+		startStages.add(repeaterSource);
+
 		final List<IStage> stages = new LinkedList<IStage>();
 		stages.add(repeaterSource);
 		stages.add(directoryName2Files);
@@ -152,34 +157,11 @@ public class ConcurrentCountWordsAnalysis extends Analysis {
 		QueuePipe.connect(directoryName2Files.fileOutputPort, distributor.genericInputPort);
 
 		repeaterSource.START.setAssociatedPipe(new MethodCallPipe<Boolean>(Boolean.TRUE));
+		repeaterSource.START.setState(PortState.CLOSED);
 
-		final IPipeline pipeline = new IPipeline() {
-			@Override
-			@SuppressWarnings("unchecked")
-			public List<? extends IStage> getStartStages() {
-				return Arrays.asList(repeaterSource);
-			}
-
-			@Override
-			public List<IStage> getStages() {
-				return stages;
-			}
-
-			@Override
-			public void fireStartNotification() throws Exception {
-				for (final IStage stage : this.getStartStages()) {
-					stage.notifyPipelineStarts();
-				}
-			}
-
-			@Override
-			public void fireStopNotification() {
-				for (final IStage stage : this.getStartStages()) {
-					stage.notifyPipelineStops();
-				}
-			}
-		};
-
+		final Pipeline pipeline = new Pipeline();
+		pipeline.setStartStages(startStages);
+		pipeline.setStages(stages);
 		return pipeline;
 	}
 
@@ -191,6 +173,9 @@ public class ConcurrentCountWordsAnalysis extends Analysis {
 		final Merger<Pair<File, Integer>> merger = new Merger<Pair<File, Integer>>();
 
 		// add each stage to a stage list
+		final List<IStage> startStages = new LinkedList<IStage>();
+		startStages.add(distributor);
+
 		final List<IStage> stages = new LinkedList<IStage>();
 		stages.add(distributor);
 		stages.add(countWordsStage0);
@@ -207,33 +192,9 @@ public class ConcurrentCountWordsAnalysis extends Analysis {
 
 		SingleProducerSingleConsumerPipe.connect(merger.outputPort, printingMerger.getNewInputPort());
 
-		final IPipeline pipeline = new IPipeline() {
-			@Override
-			@SuppressWarnings("unchecked")
-			public List<? extends IStage> getStartStages() {
-				return Arrays.asList(distributor);
-			}
-
-			@Override
-			public List<IStage> getStages() {
-				return stages;
-			}
-
-			@Override
-			public void fireStartNotification() throws Exception {
-				for (final IStage stage : this.getStartStages()) {
-					stage.notifyPipelineStarts();
-				}
-			}
-
-			@Override
-			public void fireStopNotification() {
-				for (final IStage stage : this.getStartStages()) {
-					stage.notifyPipelineStops();
-				}
-			}
-		};
-
+		final Pipeline pipeline = new Pipeline();
+		pipeline.setStartStages(startStages);
+		pipeline.setStages(stages);
 		return pipeline;
 	}
 
@@ -245,6 +206,9 @@ public class ConcurrentCountWordsAnalysis extends Analysis {
 		outputWordsCountStage.setAccessesDeviceId(2);
 
 		// add each stage to a stage list
+		final List<IStage> startStages = new LinkedList<IStage>();
+		startStages.add(merger);
+
 		final List<IStage> stages = new LinkedList<IStage>();
 		stages.add(merger);
 		stages.add(outputWordsCountStage);
@@ -252,33 +216,9 @@ public class ConcurrentCountWordsAnalysis extends Analysis {
 		// connect stages by pipes
 		QueuePipe.connect(merger.outputPort, outputWordsCountStage.fileWordcountTupleInputPort);
 
-		final IPipeline pipeline = new IPipeline() {
-			@Override
-			@SuppressWarnings("unchecked")
-			public List<? extends IStage> getStartStages() {
-				return Arrays.asList(merger);
-			}
-
-			@Override
-			public List<IStage> getStages() {
-				return stages;
-			}
-
-			@Override
-			public void fireStartNotification() throws Exception {
-				for (final IStage stage : this.getStartStages()) {
-					stage.notifyPipelineStarts();
-				}
-			}
-
-			@Override
-			public void fireStopNotification() {
-				for (final IStage stage : this.getStartStages()) {
-					stage.notifyPipelineStops();
-				}
-			}
-		};
-
+		final Pipeline pipeline = new Pipeline();
+		pipeline.setStartStages(startStages);
+		pipeline.setStages(stages);
 		return pipeline;
 	}
 
@@ -327,8 +267,8 @@ public class ConcurrentCountWordsAnalysis extends Analysis {
 				System.out.println(stage); // NOPMD (Just for example purposes)
 			}
 
-//			final long durationInNs = thread.getDurationInNs();
-//			System.out.println(thread + " takes " + TimeUnit.NANOSECONDS.toMillis(durationInNs) + " ms");
+			// final long durationInNs = thread.getDurationInNs();
+			// System.out.println(thread + " takes " + TimeUnit.NANOSECONDS.toMillis(durationInNs) + " ms");
 		}
 
 		for (final WorkerThread thread : this.nonIoThreads) {
@@ -337,16 +277,16 @@ public class ConcurrentCountWordsAnalysis extends Analysis {
 				System.out.println(stage); // NOPMD (Just for example purposes)
 			}
 
-//			final long durationInNs = thread.getDurationInNs();
-//			System.out.println(thread + " takes " + TimeUnit.NANOSECONDS.toMillis(durationInNs) + " ms");
+			// final long durationInNs = thread.getDurationInNs();
+			// System.out.println(thread + " takes " + TimeUnit.NANOSECONDS.toMillis(durationInNs) + " ms");
 
-//			if (durationInNs > maxDuration) {
-//				maxDuration = durationInNs;
-//				maxThread = thread;
-//			}
+			// if (durationInNs > maxDuration) {
+			// maxDuration = durationInNs;
+			// maxThread = thread;
+			// }
 		}
 
-//		System.out.println("maxThread: " + maxThread.toString() + " takes " + TimeUnit.NANOSECONDS.toMillis(maxDuration) + " ms"); // NOPMD (Just for example
-																																	// purposes)
+		// System.out.println("maxThread: " + maxThread.toString() + " takes " + TimeUnit.NANOSECONDS.toMillis(maxDuration) + " ms"); // NOPMD (Just for example
+		// purposes)
 	}
 }
diff --git a/src/main/java/teetime/examples/countWords/CountWordsAnalysis.java b/src/main/java/teetime/examples/countWords/CountWordsAnalysis.java
index c958a6e4..1760d8ad 100644
--- a/src/main/java/teetime/examples/countWords/CountWordsAnalysis.java
+++ b/src/main/java/teetime/examples/countWords/CountWordsAnalysis.java
@@ -17,14 +17,15 @@
 package teetime.examples.countWords;
 
 import java.io.File;
-import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 
 import teetime.framework.core.AbstractFilter;
 import teetime.framework.core.Analysis;
+import teetime.framework.core.IInputPort.PortState;
 import teetime.framework.core.IPipeline;
 import teetime.framework.core.IStage;
+import teetime.framework.core.Pipeline;
 import teetime.framework.sequential.MethodCallPipe;
 import teetime.stage.basic.RepeaterSource;
 import teetime.stage.basic.distributor.Distributor;
@@ -79,6 +80,9 @@ public class CountWordsAnalysis extends Analysis {
 		final OutputWordsCountSink outputWordsCountStage = new OutputWordsCountSink();
 
 		// add each stage to a stage list
+		final List<IStage> startStages = new LinkedList<IStage>();
+		startStages.add(repeaterSource);
+
 		final List<IStage> stages = new LinkedList<IStage>();
 		stages.add(repeaterSource);
 		stages.add(findFilesStage);
@@ -98,34 +102,11 @@ public class CountWordsAnalysis extends Analysis {
 		MethodCallPipe.connect(merger.outputPort, outputWordsCountStage.fileWordcountTupleInputPort);
 
 		repeaterSource.START.setAssociatedPipe(new MethodCallPipe<Boolean>(Boolean.TRUE));
+		repeaterSource.START.setState(PortState.CLOSED);
 
-		final IPipeline pipeline = new IPipeline() {
-			@Override
-			@SuppressWarnings("unchecked")
-			public List<? extends AbstractFilter<?>> getStartStages() {
-				return Arrays.asList(repeaterSource);
-			}
-
-			@Override
-			public List<IStage> getStages() {
-				return stages;
-			}
-
-			@Override
-			public void fireStartNotification() throws Exception {
-				for (final IStage stage : this.getStartStages()) {
-					stage.notifyPipelineStarts();
-				}
-			}
-
-			@Override
-			public void fireStopNotification() {
-				for (final IStage stage : this.getStartStages()) {
-					stage.notifyPipelineStops();
-				}
-			}
-		};
-
+		final Pipeline pipeline = new Pipeline();
+		pipeline.setStartStages(startStages);
+		pipeline.setStages(stages);
 		return pipeline;
 	}
 
diff --git a/src/main/java/teetime/examples/countWords/QueuedCountWordsAnalysis.java b/src/main/java/teetime/examples/countWords/QueuedCountWordsAnalysis.java
index 3047df1c..afb82bbc 100644
--- a/src/main/java/teetime/examples/countWords/QueuedCountWordsAnalysis.java
+++ b/src/main/java/teetime/examples/countWords/QueuedCountWordsAnalysis.java
@@ -17,7 +17,6 @@
 package teetime.examples.countWords;
 
 import java.io.File;
-import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -25,8 +24,10 @@ import teetime.framework.concurrent.StageTerminationPolicy;
 import teetime.framework.concurrent.WorkerThread;
 import teetime.framework.core.AbstractFilter;
 import teetime.framework.core.Analysis;
+import teetime.framework.core.IInputPort.PortState;
 import teetime.framework.core.IPipeline;
 import teetime.framework.core.IStage;
+import teetime.framework.core.Pipeline;
 import teetime.framework.sequential.MethodCallPipe;
 import teetime.framework.sequential.QueuePipe;
 import teetime.stage.basic.RepeaterSource;
@@ -81,6 +82,9 @@ public class QueuedCountWordsAnalysis extends Analysis {
 		final OutputWordsCountSink outputWordsCountStage = new OutputWordsCountSink();
 
 		// add each stage to a stage list
+		final List<IStage> startStages = new LinkedList<IStage>();
+		startStages.add(repeaterSource);
+
 		final List<IStage> stages = new LinkedList<IStage>();
 		stages.add(repeaterSource);
 		stages.add(findFilesStage);
@@ -100,34 +104,11 @@ public class QueuedCountWordsAnalysis extends Analysis {
 		QueuePipe.connect(merger.outputPort, outputWordsCountStage.fileWordcountTupleInputPort);
 
 		repeaterSource.START.setAssociatedPipe(new MethodCallPipe<Boolean>(Boolean.TRUE));
+		repeaterSource.START.setState(PortState.CLOSED);
 
-		final IPipeline pipeline = new IPipeline() {
-			@Override
-			@SuppressWarnings("unchecked")
-			public List<? extends IStage> getStartStages() {
-				return Arrays.asList(repeaterSource);
-			}
-
-			@Override
-			public List<IStage> getStages() {
-				return stages;
-			}
-
-			@Override
-			public void fireStartNotification() throws Exception {
-				for (final IStage stage : this.getStartStages()) {
-					stage.notifyPipelineStarts();
-				}
-			}
-
-			@Override
-			public void fireStopNotification() {
-				for (final IStage stage : this.getStartStages()) {
-					stage.notifyPipelineStops();
-				}
-			}
-		};
-
+		final Pipeline pipeline = new Pipeline();
+		pipeline.setStartStages(startStages);
+		pipeline.setStages(stages);
 		return pipeline;
 	}
 
diff --git a/src/main/java/teetime/framework/concurrent/StageWorkArrayList.java b/src/main/java/teetime/framework/concurrent/StageWorkArrayList.java
index 9f70d0b7..6f9f2c3f 100644
--- a/src/main/java/teetime/framework/concurrent/StageWorkArrayList.java
+++ b/src/main/java/teetime/framework/concurrent/StageWorkArrayList.java
@@ -15,21 +15,15 @@
  ***************************************************************************/
 package teetime.framework.concurrent;
 
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
 
 import teetime.framework.core.IOutputPort;
-import teetime.framework.core.IPipe;
-import teetime.framework.core.IPipeCommand;
 import teetime.framework.core.IPipeline;
 import teetime.framework.core.IStage;
 
 /**
  * @author Christian Wulf
- * 
+ *
  * @since 1.10
  */
 public class StageWorkArrayList implements IStageWorkList {
@@ -41,7 +35,6 @@ public class StageWorkArrayList implements IStageWorkList {
 		public int numToBeExecuted;
 	}
 
-	private final IPipeline pipeline;
 	private final int accessesDeviceId;
 
 	/** sorted array where the last stage has highest priority */
@@ -53,75 +46,25 @@ public class StageWorkArrayList implements IStageWorkList {
 	 * @since 1.10
 	 */
 	public StageWorkArrayList(final IPipeline pipeline, final int accessesDeviceId) {
-		this.pipeline = pipeline;
 		this.accessesDeviceId = accessesDeviceId;
-		final List<IStage> localStages = this.init();
 
-		this.stages = new SchedulableStage[localStages.size()];
-		for (int i = 0; i < localStages.size(); i++) {
+		this.stages = new SchedulableStage[pipeline.getStages().size()];
+		for (IStage stage : pipeline.getStages()) {
 			final SchedulableStage schedulableStage = new SchedulableStage();
-			schedulableStage.stage = localStages.get(i);
+			schedulableStage.stage = stage;
 			schedulableStage.numToBeExecuted = 0;
-			this.stages[i] = schedulableStage;
-		}
-	}
-
-	private List<IStage> init() {
-		this.setDepthForEachStage();
-
-		final List<IStage> stageList = new ArrayList<IStage>(this.pipeline.getStages());
-		final Comparator<? super IStage> depthComparator = new Comparator<IStage>() {
-			public int compare(final IStage o1, final IStage o2) {
-				if (o1.getDepth() == o2.getDepth()) {
-					return 0;
-				} else if (o1.getDepth() < o2.getDepth()) {
-					return -1;
-				} else {
-					return 1;
-				}
-			}
-		};
-
-		Collections.sort(stageList, depthComparator);
-
-		for (int i = 0; i < stageList.size(); i++) {
-			stageList.get(i).setSchedulingIndex(i);
-		}
-
-		return stageList;
-	}
-
-	private void setDepthForEachStage() {
-		final IPipeCommand setDepthCommand = new IPipeCommand() {
-			public void execute(final IPipe<?> pipe) throws Exception {
-				final IStage sourceStage = pipe.getSourcePort().getOwningStage();
-				final IStage owningStage = pipe.getTargetPort().getOwningStage();
-				if (owningStage.getDepth() == IStage.DEPTH_NOT_SET) {
-					owningStage.setDepth(sourceStage.getDepth() + 1);
-					owningStage.notifyOutputPipes(this);
-				}
-			}
-		};
-
-		for (final IStage startStage : this.pipeline.getStartStages()) {
-			startStage.setDepth(0);
-		}
-
-		for (final IStage startStage : this.pipeline.getStartStages()) {
-			try {
-				startStage.notifyOutputPipes(setDepthCommand);
-			} catch (final Exception e) {
-				throw new IllegalStateException("may not happen", e);
-			}
+			this.stages[stage.getSchedulingIndex()] = schedulableStage;
 		}
 	}
 
+	@Override
 	public void pushAll(final Collection<? extends IStage> stages) {
 		for (final IStage stage : stages) {
 			this.push(stage);
 		}
 	}
 
+	@Override
 	public void pushAll(final IOutputPort<?, ?>[] outputPorts) {
 		for (final IOutputPort<?, ?> outputPort : outputPorts) {
 			if (outputPort != null) {
@@ -148,12 +91,12 @@ public class StageWorkArrayList implements IStageWorkList {
 		return isValid;
 	}
 
+	@Override
 	public IStage pop() {
 		final SchedulableStage schedulableStage = this.stages[this.lastIndex];
 		// schedulableStage.numToBeExecuted--;
 		schedulableStage.numToBeExecuted = 0;
-		cond:
-		if (schedulableStage.numToBeExecuted == 0)
+		cond: if (schedulableStage.numToBeExecuted == 0)
 		{
 			for (int i = this.lastIndex - 1; i >= this.firstIndex; i--) {
 				if (this.stages[i].numToBeExecuted > 0) {
@@ -167,11 +110,13 @@ public class StageWorkArrayList implements IStageWorkList {
 		return schedulableStage.stage;
 	}
 
+	@Override
 	public IStage read() {
 		final SchedulableStage schedulableStage = this.stages[this.lastIndex];
 		return schedulableStage.stage;
 	}
 
+	@Override
 	public boolean isEmpty() {
 		return this.lastIndex == -1;
 	}
diff --git a/src/main/java/teetime/framework/concurrent/WorkerThread.java b/src/main/java/teetime/framework/concurrent/WorkerThread.java
index ca1e5e77..d1dff2d1 100644
--- a/src/main/java/teetime/framework/concurrent/WorkerThread.java
+++ b/src/main/java/teetime/framework/concurrent/WorkerThread.java
@@ -16,11 +16,20 @@
 
 package teetime.framework.concurrent;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.LinkedList;
 import java.util.List;
 
+import teetime.framework.core.IInputPort;
+import teetime.framework.core.IInputPort.PortState;
+import teetime.framework.core.IPipe;
+import teetime.framework.core.IPipeCommand;
 import teetime.framework.core.IPipeline;
 import teetime.framework.core.IStage;
+import teetime.framework.scheduling.NextStageScheduler;
+import teetime.framework.scheduling.StageStateManager;
 import teetime.util.StopWatch;
 
 /**
@@ -30,8 +39,11 @@ import teetime.util.StopWatch;
  */
 public class WorkerThread extends Thread {
 
+	private static final int NUM_ITERATIONS_TO_MEASURE = 10000;
+
 	private final IPipeline pipeline;
 	private IStageScheduler stageScheduler;
+	private StageStateManager stageStateManager;
 
 	private volatile StageTerminationPolicy terminationPolicy;
 	private volatile boolean shouldTerminate = false;
@@ -40,15 +52,72 @@ public class WorkerThread extends Thread {
 
 	// statistics
 	private final StopWatch stopWatch = new StopWatch();
-	private final List<Long> durationPer10000IterationsInNs = new LinkedList<Long>();
+	private final List<Long> durationPerXIterationsInNs = new LinkedList<Long>();
 	private int iterations;
 
 	public WorkerThread(final IPipeline pipeline, final int accessesDeviceId) {
 		this.pipeline = pipeline;
+		this.accessesDeviceId = accessesDeviceId;
+	}
+
+	private void initStages(final IPipeline pipeline) {
 		for (final IStage stage : pipeline.getStages()) {
 			stage.setOwningThread(this);
 		}
-		this.accessesDeviceId = accessesDeviceId;
+
+		this.setDepthForEachStage(pipeline);
+		this.setSchedulingIndexForEachhStage(pipeline);
+	}
+
+	private void setDepthForEachStage(final IPipeline pipeline) {
+		final IPipeCommand setDepthCommand = new IPipeCommand() {
+			@Override
+			public void execute(final IPipe<?> pipe) throws Exception {
+				final IStage sourceStage = pipe.getSourcePort().getOwningStage();
+				final IStage owningStage = pipe.getTargetPort().getOwningStage();
+				if (owningStage.getDepth() == IStage.DEPTH_NOT_SET) {
+					owningStage.setDepth(sourceStage.getDepth() + 1);
+					owningStage.notifyOutputPipes(this);
+				}
+			}
+		};
+
+		for (final IStage startStage : pipeline.getStartStages()) {
+			startStage.setDepth(0);
+		}
+
+		for (final IStage startStage : pipeline.getStartStages()) {
+			try {
+				startStage.notifyOutputPipes(setDepthCommand);
+			} catch (final Exception e) {
+				throw new IllegalStateException("may not happen", e);
+			}
+		}
+	}
+
+	private List<IStage> setSchedulingIndexForEachhStage(final IPipeline pipeline) {
+		final List<IStage> stageList = new ArrayList<IStage>(pipeline.getStages());
+
+		final Comparator<? super IStage> depthComparator = new Comparator<IStage>() {
+			@Override
+			public int compare(final IStage o1, final IStage o2) {
+				if (o1.getDepth() == o2.getDepth()) {
+					return 0;
+				} else if (o1.getDepth() < o2.getDepth()) {
+					return -1;
+				} else {
+					return 1;
+				}
+			}
+		};
+
+		Collections.sort(stageList, depthComparator);
+
+		for (int i = 0; i < stageList.size(); i++) {
+			stageList.get(i).setSchedulingIndex(i);
+		}
+
+		return stageList;
 	}
 
 	@Override
@@ -94,38 +163,37 @@ public class WorkerThread extends Thread {
 			// stageExecutionStopWatch.getDurationInNs(); //4952
 
 			// 6268 -> 5350 (w/o after) -> 4450 (w/o before) -> 3800 (w/o stage)
-//			final long schedulingOverhead = this.iterationStopWatch.getDurationInNs();
+			// final long schedulingOverhead = this.iterationStopWatch.getDurationInNs();
 			// final long schedulingOverhead = beforeStageExecutionStopWatch.getDurationInNs(); //327
 			// final long schedulingOverhead = stageExecutionStopWatch.getDurationInNs(); //1416
 			// final long schedulingOverhead = afterStageExecutionStopWatch.getDurationInNs(); //2450
 			// rest: ~2000 (measurement overhead?)
-			if ((iterations % 10000) == 0) {
+			if ((this.iterations % NUM_ITERATIONS_TO_MEASURE) == 0) {
 				this.stopWatch.end();
-				this.durationPer10000IterationsInNs.add(stopWatch.getDurationInNs());
+				this.durationPerXIterationsInNs.add(this.stopWatch.getDurationInNs());
 				this.stopWatch.start();
 			}
 		}
 
 		this.stopWatch.end();
-		this.durationPer10000IterationsInNs.add(stopWatch.getDurationInNs());
+		this.durationPerXIterationsInNs.add(this.stopWatch.getDurationInNs());
 
 		this.cleanUpDatastructures();
 	}
 
 	private void executeTerminationPolicy(final IStage executedStage, final boolean executedSuccessfully) {
-		// System.out.println("WorkerThread.executeTerminationPolicy(): " + this.terminationPolicy +
-		// ", executedSuccessfully=" + executedSuccessfully
-		// + ", mayBeDisabled=" + executedStage.mayBeDisabled());
+//		 System.out.println("executeTerminationPolicy executedStage=" + executedStage + ", executedSuccessfully=" + executedSuccessfully);
+//		 System.out.println("executeTerminationPolicy areAllInputPortsClosed(executedStage)=" + this.stageStateManager.areAllInputPortsClosed(executedStage));
 
 		switch (this.terminationPolicy) {
 		case TERMINATE_STAGE_AFTER_NEXT_EXECUTION:
-			if (executedStage.mayBeDisabled()) {
+			if (this.stageStateManager.areAllInputPortsClosed(executedStage)) {
 				this.stageScheduler.disable(executedStage);
 			}
 			break;
 		case TERMINATE_STAGE_AFTER_UNSUCCESSFUL_EXECUTION:
 			if (!executedSuccessfully) {
-				if (executedStage.mayBeDisabled()) {
+				if (this.stageStateManager.areAllInputPortsClosed(executedStage)) {
 					this.stageScheduler.disable(executedStage);
 				}
 			}
@@ -141,8 +209,20 @@ public class WorkerThread extends Thread {
 	}
 
 	private void initDatastructures() throws Exception {
+		// stages need to be initialized here, because in a concurrent context some stages (e.g., a merger) is executed after its pipeline has been created.
+		this.initStages(this.pipeline);
+		this.stageStateManager = new StageStateManager(this.pipeline);
+		this.stageScheduler = new NextStageScheduler(this.pipeline, this.accessesDeviceId, this.stageStateManager);
+
+		for (final IStage startStage : this.pipeline.getStartStages()) {
+			for (IInputPort<IStage, ?> inputPort : startStage.getInputPorts()) {
+				if (inputPort.getState() == PortState.CLOSED) {
+					inputPort.close();
+				}
+			}
+		}
+
 		this.pipeline.fireStartNotification();
-		this.stageScheduler = new NextStageScheduler(this.pipeline, this.accessesDeviceId);
 	}
 
 	private void startStageExecution(final IStage stage) {
@@ -150,18 +230,13 @@ public class WorkerThread extends Thread {
 	}
 
 	private void finishStageExecution(final IStage stage, final boolean executedSuccessfully) {
-		// System.out.println("Executed stage " + stage + " successfully: " + executedSuccessfully);
 		if (!executedSuccessfully) { // statistics
 			this.executedUnsuccessfullyCount++;
 		}
 	}
 
 	private void cleanUpDatastructures() {
-		// System.out.println("Cleaning up datastructures...");
-		// System.out.println("Firing stop notification...");
 		this.pipeline.fireStopNotification();
-		// System.out.println("Thread terminated:" + this);
-		// System.out.println(this.getName() + ": executedUnsuccessfullyCount=" + this.executedUnsuccessfullyCount);
 	}
 
 	public IPipeline getPipeline() {
@@ -171,9 +246,11 @@ public class WorkerThread extends Thread {
 	// BETTER remove this method since it is not intuitive; add a check to onStartPipeline so that a stage automatically
 	// disables itself if it has no input ports
 	public void terminate(final StageTerminationPolicy terminationPolicyToUse) {
-		for (final IStage startStage : this.pipeline.getStartStages()) {
-			startStage.fireSignalClosingToAllInputPorts();
-		}
+//		for (final IStage startStage : this.pipeline.getStartStages()) {
+//			if (this.stageStateManager.areAllInputPortsClosed(startStage)) {
+//				startStage.fireSignalClosingToAllInputPorts();
+//			}
+//		}
 
 		this.setTerminationPolicy(terminationPolicyToUse);
 	}
@@ -193,14 +270,14 @@ public class WorkerThread extends Thread {
 	}
 
 	public List<Long> getDurationPer10000IterationsInNs() {
-		return durationPer10000IterationsInNs;
+		return this.durationPerXIterationsInNs;
 	}
 
 	/**
 	 * @since 1.10
 	 */
 	public int getIterations() {
-		return iterations;
+		return this.iterations;
 	}
 
 }
diff --git a/src/main/java/teetime/framework/concurrent/steal/StealIfMayBeDisabledStrategy.java b/src/main/java/teetime/framework/concurrent/steal/StealIfMayBeDisabledStrategy.java
deleted file mode 100644
index f153f60b..00000000
--- a/src/main/java/teetime/framework/concurrent/steal/StealIfMayBeDisabledStrategy.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/***************************************************************************
- * Copyright 2014 Kieker Project (http://kieker-monitoring.net)
- *
- * 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.framework.concurrent.steal;
-
-import java.util.Collection;
-
-import teetime.framework.concurrent.ConcurrentWorkStealingPipe;
-import teetime.framework.core.IInputPort;
-import teetime.framework.core.IStage;
-
-/**
- * @author Christian Wulf
- * 
- * @since 1.10
- */
-public class StealIfMayBeDisabledStrategy<T> implements IStealStrategy<T> {
-
-	public <S extends IStage> T steal(final IInputPort<S, T> inputPort, final Collection<ConcurrentWorkStealingPipe<T>> pipesToStealFrom) {
-		if (inputPort.getOwningStage().mayBeDisabled()) {
-			for (final ConcurrentWorkStealingPipe<T> pipe : pipesToStealFrom) {
-				final T stolenElement = pipe.steal();
-				if (stolenElement != null) {
-					return stolenElement;
-				}
-			}
-		}
-		// BETTER improve stealing efficiency by stealing multiple elements at once
-		return null; // do not expose internal impl details (here: CircularWorkStealingDeque); instead return null
-	}
-
-}
diff --git a/src/main/java/teetime/framework/core/AbstractFilter.java b/src/main/java/teetime/framework/core/AbstractFilter.java
index 16b7cabb..6222eabb 100644
--- a/src/main/java/teetime/framework/core/AbstractFilter.java
+++ b/src/main/java/teetime/framework/core/AbstractFilter.java
@@ -34,9 +34,7 @@ import teetime.util.concurrent.workstealing.exception.DequePopException;
  *            the extending stage
  *
  */
-public abstract class AbstractFilter<S extends IStage> extends AbstractStage implements ISink<S>, ISource, IPortListener<S> {
-
-	protected volatile boolean mayBeDisabled; // BETTER write only non-concurrent code in a stage
+public abstract class AbstractFilter<S extends IStage> extends AbstractStage implements ISink<S>, ISource {
 
 	/**
 	 * @author Christian Wulf
@@ -78,7 +76,6 @@ public abstract class AbstractFilter<S extends IStage> extends AbstractStage imp
 		}
 	};
 
-	private int enabledInputPorts = 0;
 	/**
 	 * 0=in-memory, x>0=disk0, disk1, display0, display1, socket0, socket1 etc.
 	 */
@@ -172,48 +169,6 @@ public abstract class AbstractFilter<S extends IStage> extends AbstractStage imp
 		// default empty implementation
 	}
 
-	/**
-	 * @since 1.10
-	 */
-	@Override
-	public void onPortIsClosed(final IInputPort<S, ?> inputPort) {
-		// inputPort.setState(IInputPort.State.CLOSING);
-		this.enabledInputPorts--;	// FIXME not thread-safe
-		// this.logger.info("Closed " + "(" + this.enabledInputPorts + " remaining) " + inputPort + " of " + this);
-
-		if (this.enabledInputPorts < 0) {
-			this.logger.error("Closed port more than once: portIndex=" + inputPort.getIndex() + " for stage " + this);
-		}
-
-		this.checkWhetherThisStageMayBeDisabled();
-	}
-
-	/**
-	 * @since 1.10
-	 */
-	private void checkWhetherThisStageMayBeDisabled() {
-		if (this.enabledInputPorts == 0) {
-			this.mayBeDisabled = true;
-			// this.logger.info(this.toString() + " can now be disabled by the pipeline scheduler.");
-		}
-	}
-
-	/**
-	 * @since 1.10
-	 */
-	@Override
-	public void fireSignalClosingToAllInputPorts() {
-		// this.logger.info("Fire closing signal to all input ports of: " + this);
-
-		if (!this.inputPorts.isEmpty()) {
-			for (final IInputPort<S, ?> port : this.inputPorts) {
-				port.close();
-			}
-		} else {
-			this.checkWhetherThisStageMayBeDisabled();
-		}
-	}
-
 	/**
 	 * @since 1.10
 	 */
@@ -222,18 +177,10 @@ public abstract class AbstractFilter<S extends IStage> extends AbstractStage imp
 		try {
 			this.notifyOutputPipes(this.closeCommand);
 		} catch (final Exception e) {
-			throw new IllegalStateException("may not happen");
+			throw new IllegalStateException("may not happen", e);
 		}
 	}
 
-	/**
-	 * @since 1.10
-	 */
-	@Override
-	public boolean mayBeDisabled() {
-		return this.mayBeDisabled;
-	}
-
 	@Override
 	public String toString() {
 		final String s = super.toString();
@@ -250,8 +197,6 @@ public abstract class AbstractFilter<S extends IStage> extends AbstractStage imp
 		final InputPortImpl<S, T> inputPort = new InputPortImpl<S, T>((S) this);
 		inputPort.setIndex(this.inputPorts.size());
 		this.inputPorts.add(inputPort);
-		inputPort.setPortListener(this);
-		this.enabledInputPorts++;
 		return inputPort;
 	}
 
diff --git a/src/main/java/teetime/framework/core/AbstractPipe.java b/src/main/java/teetime/framework/core/AbstractPipe.java
index 1e596bf5..14ed5f78 100644
--- a/src/main/java/teetime/framework/core/AbstractPipe.java
+++ b/src/main/java/teetime/framework/core/AbstractPipe.java
@@ -18,9 +18,9 @@ package teetime.framework.core;
 
 /**
  * @author Christian Wulf
- * 
+ *
  * @since 1.10
- * 
+ *
  * @param <T>
  *            The type of the pipe
  * @param <P>
@@ -30,7 +30,7 @@ public abstract class AbstractPipe<T> implements IPipe<T> {
 
 	/**
 	 * @author Christian Wulf
-	 * 
+	 *
 	 * @since 1.10
 	 */
 	public enum PipeState {
@@ -42,19 +42,23 @@ public abstract class AbstractPipe<T> implements IPipe<T> {
 	private IOutputPort<?, ? extends T> sourcePort;
 	private IInputPort<?, T> targetPort;
 
+	@Override
 	public IOutputPort<?, ? extends T> getSourcePort() {
 		return this.sourcePort;
 	}
 
+	@Override
 	public IInputPort<?, T> getTargetPort() {
 		return this.targetPort;
 	}
 
+	@Override
 	public <S extends ISource, A extends T> void setSourcePort(final IOutputPort<S, A> sourcePort) {
 		sourcePort.setAssociatedPipe(this);
 		this.sourcePort = sourcePort;
 	}
 
+	@Override
 	public <S extends ISink<S>, A extends T> void setTargetPort(final IInputPort<S, T> targetPort) {
 		targetPort.setAssociatedPipe(this);
 		this.targetPort = targetPort;
@@ -63,6 +67,7 @@ public abstract class AbstractPipe<T> implements IPipe<T> {
 	// BETTER remove if it does not add any new functionality
 	protected abstract void putInternal(T token);
 
+	@Override
 	public void put(final T token) {
 		this.putInternal(token);
 	}
@@ -70,10 +75,12 @@ public abstract class AbstractPipe<T> implements IPipe<T> {
 	// BETTER remove if it does not add any new functionality
 	protected abstract T tryTakeInternal();
 
+	@Override
 	public final T tryTake() {
 		return this.tryTakeInternal();
 	}
 
+	@Override
 	public final void notifyPipelineStarts() throws Exception {
 		if (this.state == PipeState.UNINITIALIZED) {
 			this.state = PipeState.PIPELINE_STARTED;
@@ -84,13 +91,14 @@ public abstract class AbstractPipe<T> implements IPipe<T> {
 
 	/**
 	 * This method is called exactly once iff the pipeline is started.
-	 * 
+	 *
 	 * @since 1.10
 	 */
 	public void onPipelineStarts() {
 		// empty default implementation
 	}
 
+	@Override
 	public final void notifyPipelineStops() {
 		if (this.state != PipeState.PIPELINE_STOPPED) {
 			this.state = PipeState.PIPELINE_STOPPED;
@@ -101,13 +109,14 @@ public abstract class AbstractPipe<T> implements IPipe<T> {
 
 	/**
 	 * This method is called exactly once iff the pipeline is stopped.
-	 * 
+	 *
 	 * @since 1.10
 	 */
 	public void onPipelineStops() {
 		// empty default implementation
 	}
 
+	@Override
 	public void close() {
 		this.targetPort.close();
 	}
diff --git a/src/main/java/teetime/framework/core/IInputPort.java b/src/main/java/teetime/framework/core/IInputPort.java
index 3d834da7..d463e074 100644
--- a/src/main/java/teetime/framework/core/IInputPort.java
+++ b/src/main/java/teetime/framework/core/IInputPort.java
@@ -1,9 +1,9 @@
 package teetime.framework.core;
 
 /**
- * 
+ *
  * @author Christian Wulf
- * 
+ *
  * @param <S>
  *            the stage, this port belongs to<br>
  *            <i>(used for ensuring type safety)</i>
@@ -14,24 +14,24 @@ public interface IInputPort<S extends IStage, T> extends IPort<S, T> {
 	/**
 	 * @since 1.10
 	 */
-	enum State {
-		OPEN, CLOSING
+	public enum PortState {
+		OPENED, CLOSED
 	}
 
 	/**
 	 * @since 1.10
 	 */
-	public abstract State getState();
+	public abstract PortState getState();
 
 	/**
 	 * @since 1.10
 	 */
-	public abstract void setState(final State state);
+	public abstract void setState(final PortState state);
 
 	/**
 	 * @since 1.10
 	 */
-	public abstract void setPortListener(final IPortListener<S> stageListener);
+	public abstract void setPortListener(final IPortListener portListener);
 
 	/**
 	 * @since 1.10
diff --git a/src/main/java/teetime/framework/core/IPortListener.java b/src/main/java/teetime/framework/core/IPortListener.java
index 71b05c98..b7783c32 100644
--- a/src/main/java/teetime/framework/core/IPortListener.java
+++ b/src/main/java/teetime/framework/core/IPortListener.java
@@ -17,10 +17,10 @@ package teetime.framework.core;
 
 /**
  * @author Christian Wulf
- * 
+ *
  * @since 1.10
  */
-public interface IPortListener<S extends IStage> {
+public interface IPortListener {
 
-	void onPortIsClosed(IInputPort<S, ?> inputPort);
+	void onPortIsClosed(IInputPort<?, ?> inputPort);
 }
diff --git a/src/main/java/teetime/framework/core/IStage.java b/src/main/java/teetime/framework/core/IStage.java
index 19c68d9d..bda94d98 100644
--- a/src/main/java/teetime/framework/core/IStage.java
+++ b/src/main/java/teetime/framework/core/IStage.java
@@ -69,24 +69,11 @@ public interface IStage extends IBaseStage {
 	// an overloaded version with a task bundle of one single input port is useless.
 	// void execute(TaskBundle taskBundle);
 
-	/**
-	 *
-	 * @return <code>true</code> if the stage may be disabled by the pipeline scheduler, <code>false</code> otherwise.
-	 *
-	 * @since 1.10
-	 */
-	boolean mayBeDisabled();
-
 	/**
 	 * @since 1.10
 	 */
 	void fireSignalClosingToAllOutputPorts();
 
-	/**
-	 * @since 1.10
-	 */
-	void fireSignalClosingToAllInputPorts();
-
 	/**
 	 * @since 1.10
 	 */
diff --git a/src/main/java/teetime/framework/core/InputPortImpl.java b/src/main/java/teetime/framework/core/InputPortImpl.java
index fb9c6c2e..021ab567 100644
--- a/src/main/java/teetime/framework/core/InputPortImpl.java
+++ b/src/main/java/teetime/framework/core/InputPortImpl.java
@@ -18,28 +18,35 @@ package teetime.framework.core;
 
 class InputPortImpl<S extends IStage, T> extends AbstractPort<S, T> implements IInputPort<S, T> {
 
-	private volatile State state = State.OPEN;
+	private volatile PortState state = PortState.OPENED;
 
-	private IPortListener<S> stageListener;
+	private IPortListener portListener;
 
 	public InputPortImpl(final S owningStage) {
 		this.setOwningStage(owningStage);
 	}
 
-	public void setState(final State state) {
+	@Override
+	public void setState(final PortState state) {
 		this.state = state;
 	}
 
-	public State getState() {
+	@Override
+	public PortState getState() {
 		return this.state;
 	}
 
-	public void setPortListener(final IPortListener<S> stageListener) {
-		this.stageListener = stageListener;
+	@Override
+	public void setPortListener(final IPortListener portListener) {
+		this.portListener = portListener;
 	}
 
+	@Override
 	public void close() {
-		this.stageListener.onPortIsClosed(this);
+		if (this.portListener == null) {
+			throw new NullPointerException("stage: "+this.getOwningStage().getClass().getName()+", port="+this.getIndex());
+		}
+		this.portListener.onPortIsClosed(this);
 	}
 
 }
diff --git a/src/main/java/teetime/framework/concurrent/NextStageScheduler.java b/src/main/java/teetime/framework/scheduling/NextStageScheduler.java
similarity index 76%
rename from src/main/java/teetime/framework/concurrent/NextStageScheduler.java
rename to src/main/java/teetime/framework/scheduling/NextStageScheduler.java
index 82263b5b..ef7fa67f 100644
--- a/src/main/java/teetime/framework/concurrent/NextStageScheduler.java
+++ b/src/main/java/teetime/framework/scheduling/NextStageScheduler.java
@@ -14,13 +14,14 @@
  * limitations under the License.
  ***************************************************************************/
 
-package teetime.framework.concurrent;
+package teetime.framework.scheduling;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.LinkedHashSet;
+import java.util.Set;
 
+import teetime.framework.concurrent.IStageScheduler;
+import teetime.framework.concurrent.IStageWorkList;
+import teetime.framework.concurrent.StageWorkArrayList;
 import teetime.framework.core.IOutputPort;
 import teetime.framework.core.IPipeline;
 import teetime.framework.core.IStage;
@@ -30,13 +31,14 @@ import teetime.framework.core.IStage;
  *
  * @since 1.10
  */
-public class NextStageScheduler implements IStageScheduler {
+public final class NextStageScheduler implements IStageScheduler {
 
-	protected final Map<IStage, Boolean> statesOfStages = new HashMap<IStage, Boolean>();
-	private final Collection<IStage> highestPrioritizedEnabledStages = new ArrayList<IStage>();
+	private final Set<IStage> highestPrioritizedEnabledStages = new LinkedHashSet<IStage>();
 	private final IStageWorkList workList;
+	private final StageStateManager stageStateManager;
 
-	public NextStageScheduler(final IPipeline pipeline, final int accessesDeviceId) throws Exception {
+	public NextStageScheduler(final IPipeline pipeline, final int accessesDeviceId, final StageStateManager stageStateManager) {
+		this.stageStateManager = stageStateManager;
 		// this.workList = new StageWorkList(accessesDeviceId, pipeline.getStages().size());
 		this.workList = new StageWorkArrayList(pipeline, accessesDeviceId); // faster implementation
 
@@ -45,10 +47,6 @@ public class NextStageScheduler implements IStageScheduler {
 		this.workList.pushAll(this.highestPrioritizedEnabledStages);
 		// System.out.println("Initial work list: " + this.workList);
 		// this.workList.addAll(pipeline.getStages());
-
-		for (final IStage stage : pipeline.getStages()) {
-			this.enable(stage);
-		}
 	}
 
 	@Override
@@ -58,28 +56,23 @@ public class NextStageScheduler implements IStageScheduler {
 
 	@Override
 	public boolean isAnyStageActive() {
-		// System.out.println("workList: " + this.workList);
 		return !this.workList.isEmpty();
 	}
 
-	protected void enable(final IStage stage) {
-		// // / TODO consider to move state (enabled/disabled) of stage to stage for performance reasons
-		this.statesOfStages.put(stage, Boolean.TRUE);
-	}
-
 	@Override
 	public void disable(final IStage stage) {
-		this.statesOfStages.put(stage, Boolean.FALSE);
+		this.stageStateManager.disable(stage);
 
 		if (this.highestPrioritizedEnabledStages.contains(stage)) {
 			this.highestPrioritizedEnabledStages.remove(stage);
 			for (final IStage outputStage : stage.getAllOutputStages()) {
-				if (this.statesOfStages.get(outputStage) == Boolean.TRUE) {
+				if (this.stageStateManager.isStageEnabled(outputStage)) {
 					this.highestPrioritizedEnabledStages.add(outputStage);
 				}
 			}
 		}
 
+//		System.out.println("highestPrioritizedEnabledStages: "+this.highestPrioritizedEnabledStages);
 		stage.fireSignalClosingToAllOutputPorts();
 	}
 
diff --git a/src/main/java/teetime/framework/scheduling/StageStateContainer.java b/src/main/java/teetime/framework/scheduling/StageStateContainer.java
new file mode 100644
index 00000000..667d639d
--- /dev/null
+++ b/src/main/java/teetime/framework/scheduling/StageStateContainer.java
@@ -0,0 +1,25 @@
+package teetime.framework.scheduling;
+
+import teetime.framework.core.IStage;
+
+public abstract class StageStateContainer {
+
+	public static enum StageState {
+		ENABLED, ALL_INPUT_PORTS_CLOSED, DISABLED
+	}
+
+	protected final IStage stage;
+	protected volatile StageState stageState;
+
+	public StageStateContainer(final IStage stage) {
+		this.stage = stage;
+		this.stageState = stage.getInputPorts().size() > 0 ? StageState.ENABLED : StageState.ALL_INPUT_PORTS_CLOSED;
+//		System.out.println("stage=" + stage + ", stageState=" + this.stageState);
+	}
+
+	/**
+	 *
+	 * @return the new value
+	 */
+	public abstract int decNumOpenedPorts();
+}
diff --git a/src/main/java/teetime/framework/scheduling/StageStateManager.java b/src/main/java/teetime/framework/scheduling/StageStateManager.java
new file mode 100644
index 00000000..6412ae9b
--- /dev/null
+++ b/src/main/java/teetime/framework/scheduling/StageStateManager.java
@@ -0,0 +1,84 @@
+package teetime.framework.scheduling;
+
+import java.util.Arrays;
+
+import teetime.framework.core.IInputPort;
+import teetime.framework.core.IPipeline;
+import teetime.framework.core.IPortListener;
+import teetime.framework.core.IStage;
+import teetime.framework.scheduling.StageStateContainer.StageState;
+
+public final class StageStateManager implements IPortListener {
+
+	private final StageStateContainer[] stageStateContainers;
+
+	public StageStateManager(final IPipeline pipeline) {
+		this.stageStateContainers = this.initStageStateContainers(pipeline);
+		this.registerAtAllInputPorts(pipeline);
+	}
+
+	private void registerAtAllInputPorts(final IPipeline pipeline) {
+		for (IStage stage : pipeline.getStages()) {
+			for (IInputPort<IStage, ?> inputPort : stage.getInputPorts()) {
+				inputPort.setPortListener(this);
+			}
+		}
+	}
+
+	private StageStateContainer[] initStageStateContainers(final IPipeline pipeline) {
+		StageStateContainer[] stageStateContainers = new StageStateContainer[pipeline.getStages().size()];
+		for (IStage stage : pipeline.getStages()) {
+			StageStateContainer stageStateContainer;
+			if (this.isConnectedWithAnotherThread(stage)) {
+				stageStateContainer = new SynchronizedStageStateContainer(stage);
+			} else {
+				stageStateContainer = new UnsynchronizedStageStateContainer(stage);
+			}
+			stageStateContainers[stage.getSchedulingIndex()] = stageStateContainer;
+		}
+		return stageStateContainers;
+	}
+
+	private boolean isConnectedWithAnotherThread(final IStage stage) {
+		// TODO Auto-generated method stub
+		return true;
+	}
+
+	@Override
+	public void onPortIsClosed(final IInputPort<?, ?> inputPort) {
+		StageStateContainer stageStateContainer = this.getStageStateContainer(inputPort.getOwningStage());
+
+		int newNumOpenedPorts = stageStateContainer.decNumOpenedPorts();
+		if (newNumOpenedPorts == 0) {
+			stageStateContainer.stageState = StageState.ALL_INPUT_PORTS_CLOSED;
+//			System.out.println("Closed stage: " + stageStateContainer.stage);
+		} else if (newNumOpenedPorts < 0) {
+			// TODO log warning
+			// this.logger.warning("Closed port more than once: portIndex=" + inputPort.getIndex() + " for stage " + this);
+		}
+	}
+
+	public boolean areAllInputPortsClosed(final IStage stage) {
+		StageStateContainer stageStateContainer = this.getStageStateContainer(stage);
+		return stageStateContainer.stageState == StageState.ALL_INPUT_PORTS_CLOSED;
+	}
+
+	public boolean isStageEnabled(final IStage stage) {
+		StageStateContainer stageStateContainer = this.getStageStateContainer(stage);
+		return stageStateContainer.stageState == StageState.ENABLED;
+	}
+
+	public void disable(final IStage stage) {
+		StageStateContainer stageStateContainer = this.getStageStateContainer(stage);
+		stageStateContainer.stageState = StageState.DISABLED;
+	}
+
+	private StageStateContainer getStageStateContainer(final IStage stage) {
+		int schedulingIndex = stage.getSchedulingIndex();
+		StageStateContainer stageStateContainer = this.stageStateContainers[schedulingIndex];
+		if (stageStateContainer == null) {
+			throw new NullPointerException("No container found for index ="+schedulingIndex+"\n=> stageStateContainers="+Arrays.asList(this.stageStateContainers));
+		}
+		return stageStateContainer;
+	}
+}
diff --git a/src/main/java/teetime/framework/scheduling/SynchronizedStageStateContainer.java b/src/main/java/teetime/framework/scheduling/SynchronizedStageStateContainer.java
new file mode 100644
index 00000000..9b70846a
--- /dev/null
+++ b/src/main/java/teetime/framework/scheduling/SynchronizedStageStateContainer.java
@@ -0,0 +1,21 @@
+package teetime.framework.scheduling;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import teetime.framework.core.IStage;
+
+public final class SynchronizedStageStateContainer extends StageStateContainer {
+
+	private final AtomicInteger numOpenedPorts = new AtomicInteger();
+
+	public SynchronizedStageStateContainer(final IStage stage) {
+		super(stage);
+		this.numOpenedPorts.set(stage.getInputPorts().size());
+	}
+
+	@Override
+	public int decNumOpenedPorts() {
+		return this.numOpenedPorts.decrementAndGet();
+	}
+
+}
diff --git a/src/main/java/teetime/framework/scheduling/UnsynchronizedStageStateContainer.java b/src/main/java/teetime/framework/scheduling/UnsynchronizedStageStateContainer.java
new file mode 100644
index 00000000..46556e99
--- /dev/null
+++ b/src/main/java/teetime/framework/scheduling/UnsynchronizedStageStateContainer.java
@@ -0,0 +1,19 @@
+package teetime.framework.scheduling;
+
+import teetime.framework.core.IStage;
+
+public final class UnsynchronizedStageStateContainer extends StageStateContainer {
+
+	private int numOpenedInputPorts;
+
+	public UnsynchronizedStageStateContainer(final IStage stage) {
+		super(stage);
+		this.numOpenedInputPorts = stage.getInputPorts().size();
+	}
+
+	@Override
+	public int decNumOpenedPorts() {
+		return --this.numOpenedInputPorts;
+	}
+
+}
diff --git a/src/test/java/teetime/examples/throughput/ThroughputTimestampAnalysisTest.java b/src/test/java/teetime/examples/throughput/ThroughputTimestampAnalysisTest.java
index a122c8ec..be0e8e86 100644
--- a/src/test/java/teetime/examples/throughput/ThroughputTimestampAnalysisTest.java
+++ b/src/test/java/teetime/examples/throughput/ThroughputTimestampAnalysisTest.java
@@ -19,14 +19,14 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Callable;
 
-import kieker.common.logging.LogFactory;
-
 import org.junit.Before;
 import org.junit.Test;
 
 import teetime.util.StatisticsUtil;
 import teetime.util.StopWatch;
 
+import kieker.common.logging.LogFactory;
+
 /**
  * @author Christian Wulf
  *
-- 
GitLab